Mercurial > mercurial > hgweb_qlipbrd.cgi
comparison src/mainframe.cpp @ 0:cb3403ca39b1
First release.
| author | pyon@macmini |
|---|---|
| date | Sun, 30 Aug 2015 21:53:19 +0900 |
| parents | |
| children | e4aa0e7a07ad |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:cb3403ca39b1 |
|---|---|
| 1 // Filename: mainframe.cpp | |
| 2 // Last Change: 2015-08-30 Sun 21:49:16. | |
| 3 // | |
| 4 #include <wx/filedlg.h> | |
| 5 #include <wx/textfile.h> | |
| 6 #include <wx/clipbrd.h> | |
| 7 #include <wx/utils.h> | |
| 8 #include <wx/msgdlg.h> | |
| 9 | |
| 10 #include "mainframe.h" | |
| 11 #include "adddialog.h" | |
| 12 | |
| 13 // resources | |
| 14 #if !defined(__WXMSW__) && !defined(__WXPM__) | |
| 15 #include "sample.xpm" | |
| 16 #endif | |
| 17 | |
| 18 MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) | |
| 19 : wxFrame( parent, id, title, pos, size, style ), m_timer( this, ID_TIMER ) | |
| 20 { | |
| 21 this->SetSizeHints( wxDefaultSize, wxDefaultSize ); | |
| 22 this->SetBackgroundColour( wxColour( wxT("WHEAT") ) ); | |
| 23 SetIcon( wxICON( sample ) ); | |
| 24 | |
| 25 // menu bar | |
| 26 m_menubar = new wxMenuBar( 0 ); | |
| 27 m_menuFile = new wxMenu(); | |
| 28 wxMenuItem* m_menuItemAbout = new wxMenuItem( m_menuFile, ID_MNABOUT, wxString( wxT("About") ), wxEmptyString, wxITEM_NORMAL ); | |
| 29 m_menuFile->Append( m_menuItemAbout ); | |
| 30 | |
| 31 wxMenuItem* m_menuItemExit = new wxMenuItem( m_menuFile, ID_MNEXIT, wxString( wxT("Exit") ), wxEmptyString, wxITEM_NORMAL ); | |
| 32 m_menuFile->Append( m_menuItemExit ); | |
| 33 | |
| 34 m_menubar->Append( m_menuFile, wxT("File") ); | |
| 35 | |
| 36 m_menuPlugin = new wxMenu(); | |
| 37 wxMenuItem* m_menuItemLoadPgin = new wxMenuItem( m_menuPlugin, ID_MNLDPGIN, wxString( wxT("Load") ), wxEmptyString, wxITEM_NORMAL ); | |
| 38 m_menuPlugin->Append( m_menuItemLoadPgin ); | |
| 39 | |
| 40 wxMenuItem* m_menuItemSavePgin = new wxMenuItem( m_menuPlugin, ID_MNSVPGIN, wxString( wxT("Save as") ), wxEmptyString, wxITEM_NORMAL ); | |
| 41 m_menuPlugin->Append( m_menuItemSavePgin ); | |
| 42 | |
| 43 m_menubar->Append( m_menuPlugin, wxT("Plugin") ); | |
| 44 | |
| 45 this->SetMenuBar( m_menubar ); | |
| 46 | |
| 47 // controls | |
| 48 wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL ); | |
| 49 | |
| 50 // | |
| 51 wxBoxSizer* bSizerShow = new wxBoxSizer( wxHORIZONTAL ); | |
| 52 | |
| 53 m_textCtrlShow = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); | |
| 54 bSizerShow->Add( m_textCtrlShow, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); | |
| 55 | |
| 56 m_toggleBtn = new wxToggleButton( this, ID_TGL, wxT("ON"), wxDefaultPosition, wxSize( 60, -1 ), 0 ); | |
| 57 bSizerShow->Add( m_toggleBtn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); | |
| 58 | |
| 59 bSizerTop->Add( bSizerShow, 0, wxEXPAND, 5 ); | |
| 60 | |
| 61 // | |
| 62 wxBoxSizer* bSizerList = new wxBoxSizer( wxHORIZONTAL ); | |
| 63 | |
| 64 m_listView = new wxListView( this, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL ); | |
| 65 bSizerList->Add( m_listView, 1, wxALL|wxEXPAND, 5 ); | |
| 66 wxListItem itemCol; | |
| 67 itemCol.SetText( wxT("No") ); | |
| 68 m_listView->InsertColumn( 0, itemCol ); | |
| 69 m_listView->SetColumnWidth( 0, 40 ); | |
| 70 itemCol.SetText( wxT("text") ); | |
| 71 m_listView->InsertColumn( 1, itemCol ); | |
| 72 m_listView->SetColumnWidth( 1, 80 ); | |
| 73 itemCol.SetText( wxT("time") ); | |
| 74 m_listView->InsertColumn( 2, itemCol ); | |
| 75 m_listView->SetColumnWidth( 2, 40 ); | |
| 76 itemCol.SetText( wxT("type") ); | |
| 77 m_listView->InsertColumn( 3, itemCol ); | |
| 78 m_listView->SetColumnWidth( 3, 40 ); | |
| 79 itemCol.SetText( wxT("desc") ); | |
| 80 m_listView->InsertColumn( 4, itemCol ); | |
| 81 m_listView->SetColumnWidth( 4, 80 ); | |
| 82 //m_listView->EnableAlternateRowColours( true ); | |
| 83 | |
| 84 wxBoxSizer* bSizerBtn = new wxBoxSizer( wxVERTICAL ); | |
| 85 | |
| 86 m_buttonUp = new wxButton( this, ID_BTNUP, wxT("↑"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | |
| 87 bSizerBtn->Add( m_buttonUp, 0, wxALL, 5 ); | |
| 88 | |
| 89 m_buttonDown = new wxButton( this, ID_BTNDOWN, wxT("↓"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | |
| 90 bSizerBtn->Add( m_buttonDown, 0, wxALL, 5 ); | |
| 91 | |
| 92 m_buttonDel = new wxButton( this, ID_BTNDEL, wxT("-"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | |
| 93 bSizerBtn->Add( m_buttonDel, 0, wxALL, 5 ); | |
| 94 | |
| 95 m_buttonAdd = new wxButton( this, ID_BTNADD, wxT("+"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | |
| 96 bSizerBtn->Add( m_buttonAdd, 0, wxALL, 5 ); | |
| 97 | |
| 98 bSizerBtn->Add( 0, 0, 1, wxEXPAND, 5 ); | |
| 99 | |
| 100 m_buttonExit = new wxButton( this, ID_EXIT, wxT("Exit"), wxDefaultPosition, wxSize( 60, -1 ), 0 ); | |
| 101 bSizerBtn->Add( m_buttonExit, 0, wxALL, 5 ); | |
| 102 | |
| 103 bSizerList->Add( bSizerBtn, 0, wxEXPAND, 5 ); | |
| 104 bSizerTop->Add( bSizerList, 1, wxEXPAND, 5 ); | |
| 105 | |
| 106 this->SetSizer( bSizerTop ); | |
| 107 this->Layout(); | |
| 108 | |
| 109 this->Centre( wxBOTH ); | |
| 110 } | |
| 111 | |
| 112 MainFrame::~MainFrame() | |
| 113 { | |
| 114 } | |
| 115 | |
| 116 // Event Table | |
| 117 BEGIN_EVENT_TABLE( MainFrame, wxFrame ) | |
| 118 EVT_MENU( ID_MNABOUT, MainFrame::OnMNAbout ) | |
| 119 EVT_MENU( ID_MNEXIT, MainFrame::OnMNExit ) | |
| 120 EVT_MENU( ID_MNLDPGIN, MainFrame::OnMNLoad ) | |
| 121 EVT_MENU( ID_MNSVPGIN, MainFrame::OnMNSaveAs ) | |
| 122 EVT_LIST_ITEM_ACTIVATED( ID_LIST, MainFrame::OnDClickItem ) | |
| 123 EVT_LIST_ITEM_SELECTED( ID_LIST, MainFrame::OnSelectItem ) | |
| 124 EVT_TIMER( ID_TIMER, MainFrame::OnTimer ) | |
| 125 EVT_BUTTON( ID_BTNUP, MainFrame::OnBtnUp ) | |
| 126 EVT_BUTTON( ID_BTNDOWN, MainFrame::OnBtnDown ) | |
| 127 EVT_BUTTON( ID_BTNDEL, MainFrame::OnBtnDel ) | |
| 128 EVT_BUTTON( ID_BTNADD, MainFrame::OnBtnAdd ) | |
| 129 EVT_BUTTON( ID_EXIT, MainFrame::OnBtnExit ) | |
| 130 EVT_TOGGLEBUTTON( ID_TGL, MainFrame::OnToggle ) | |
| 131 /* | |
| 132 EVT_IDLE( MainFrame::OnIdle ) | |
| 133 EVT_CLOSE( MainFrame::OnClose ) | |
| 134 */ | |
| 135 END_EVENT_TABLE() | |
| 136 | |
| 137 /* Event Handlers & Functions */ | |
| 138 // Event Handlers | |
| 139 void MainFrame::OnMNAbout( wxCommandEvent& WXUNUSED(event) ) | |
| 140 { | |
| 141 wxInfoMessageBox( this ); | |
| 142 } | |
| 143 | |
| 144 void MainFrame::OnMNExit( wxCommandEvent& WXUNUSED(event) ) | |
| 145 { | |
| 146 Close(); | |
| 147 } | |
| 148 | |
| 149 void MainFrame::OnMNLoad( wxCommandEvent& WXUNUSED(event) ) | |
| 150 { | |
| 151 wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin"); | |
| 152 wxFileDialog fd( this, wxT("Select Plug-in file"), plugin_dir, wxEmptyString, wxT("Plug-in files (*.qbrd)|*.qbrd"), wxFD_OPEN|wxFD_FILE_MUST_EXIST ); | |
| 153 if ( fd.ShowModal() == wxID_CANCEL ) return; // the user changed idea... | |
| 154 | |
| 155 wxTextFile file; | |
| 156 file.Open( fd.GetPath() ); | |
| 157 m_listView->DeleteAllItems(); | |
| 158 for ( int i = 0, n = 0; i < file.GetLineCount(); i++ ) { | |
| 159 if ( file[i].StartsWith( wxT("#") ) ) | |
| 160 continue; | |
| 161 wxArrayString s = wxSplit( file[i], ',', '\\' ); | |
| 162 | |
| 163 m_listView->InsertItem( n, wxString::Format( wxT("%d"), n + 1 ) ); | |
| 164 m_listView->SetItem( n, 1, s[0] ); | |
| 165 m_listView->SetItem( n, 2, s[1] ); | |
| 166 m_listView->SetItem( n, 3, s[2] ); | |
| 167 n++; | |
| 168 } | |
| 169 file.Close(); | |
| 170 | |
| 171 m_current = 0; | |
| 172 m_last = m_listView->GetItemText( m_current, 1 ); | |
| 173 m_listView->SetItemState( m_current, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); | |
| 174 } | |
| 175 | |
| 176 void MainFrame::OnMNSaveAs( wxCommandEvent& WXUNUSED(event) ) | |
| 177 { | |
| 178 wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin"); | |
| 179 wxFileDialog fd( this, wxT("Save Plug-in file"), plugin_dir , wxEmptyString, wxT("Plug-in files (*.qbrd)|*.qbrd"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT ); | |
| 180 if ( fd.ShowModal() == wxID_CANCEL ) return; // the user changed idea... | |
| 181 | |
| 182 wxTextFile file( fd.GetPath() ); | |
| 183 if ( file.Exists() ) { | |
| 184 file.Open(); | |
| 185 file.Clear(); | |
| 186 } | |
| 187 else { | |
| 188 file.Create(); | |
| 189 } | |
| 190 for ( int r = 0; r < m_listView->GetItemCount(); r++ ) { | |
| 191 wxArrayString s; | |
| 192 for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) { | |
| 193 s.Add( m_listView->GetItemText( r, c ) ); | |
| 194 } | |
| 195 file.AddLine( wxJoin( s, ',', '\\' ) ); | |
| 196 } | |
| 197 file.Write(); | |
| 198 file.Close(); | |
| 199 } | |
| 200 | |
| 201 void MainFrame::OnDClickItem( wxListEvent& event ) | |
| 202 { | |
| 203 long i = event.GetIndex(); | |
| 204 } | |
| 205 | |
| 206 void MainFrame::OnSelectItem( wxListEvent& event ) | |
| 207 { | |
| 208 long i = event.GetIndex(); | |
| 209 m_current = i; | |
| 210 } | |
| 211 | |
| 212 // ↑ | |
| 213 void MainFrame::OnBtnUp( wxCommandEvent& WXUNUSED(event) ) | |
| 214 { | |
| 215 long item = -1; | |
| 216 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | |
| 217 if ( item == -1 || item == 0 ) return; | |
| 218 SwapListItem( item, item - 1 ); | |
| 219 ReNumberList(); | |
| 220 } | |
| 221 | |
| 222 // ↓ | |
| 223 void MainFrame::OnBtnDown( wxCommandEvent& WXUNUSED(event) ) | |
| 224 { | |
| 225 long item = -1; | |
| 226 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | |
| 227 if ( item == -1 || item == m_listView->GetItemCount() - 1 ) return; | |
| 228 SwapListItem( item, item + 1 ); | |
| 229 ReNumberList(); | |
| 230 } | |
| 231 | |
| 232 // − | |
| 233 void MainFrame::OnBtnDel( wxCommandEvent& WXUNUSED(event) ) | |
| 234 { | |
| 235 long item = -1; | |
| 236 for ( ;; ) { | |
| 237 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | |
| 238 if ( item == -1 ) break; | |
| 239 m_listView->DeleteItem( item ); | |
| 240 ReNumberList(); | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 // + | |
| 245 void MainFrame::OnBtnAdd( wxCommandEvent& WXUNUSED(event) ) | |
| 246 { | |
| 247 long item = -1; | |
| 248 for ( ;; ) { | |
| 249 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | |
| 250 if ( item == -1 ) break; | |
| 251 m_listView->InsertItem( item + 1, wxEmptyString ); | |
| 252 ReNumberList(); | |
| 253 } | |
| 254 /* | |
| 255 AddDialog adlg( this, wxID_ANY, wxT("a"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ); | |
| 256 if ( adlg.ShowModal() == wxID_OK ) { | |
| 257 } | |
| 258 */ | |
| 259 } | |
| 260 | |
| 261 void MainFrame::OnTimer( wxTimerEvent& WXUNUSED(event) ) | |
| 262 { | |
| 263 if ( wxTheClipboard->Open() ) { | |
| 264 | |
| 265 wxTextDataObject data; | |
| 266 wxTheClipboard->GetData( data ); | |
| 267 wxString s = data.GetText(); | |
| 268 if ( !m_last.IsSameAs( s ) ) { // the clipboard was changed by user | |
| 269 wxTheClipboard->Close(); | |
| 270 m_textCtrlShow->SetValue( s ); | |
| 271 for ( int r = 0; r < m_listView->GetItemCount(); r++ ) | |
| 272 m_listView->SetItemState( r, 0, wxLIST_STATE_SELECTED ); | |
| 273 m_counter = 5; | |
| 274 m_current = 0; | |
| 275 m_last = s; | |
| 276 m_timer.StartOnce( (int)m_counter * 1000 ); | |
| 277 return; | |
| 278 } | |
| 279 | |
| 280 wxString text = m_listView->GetItemText( m_current, 1 ); | |
| 281 wxTheClipboard->SetData( new wxTextDataObject( text ) ); | |
| 282 wxTheClipboard->Close(); | |
| 283 m_textCtrlShow->SetValue( text ); | |
| 284 m_listView->SetItemState( ( m_current + m_listView->GetItemCount() ) % m_listView->GetItemCount() - 1, 0, wxLIST_STATE_SELECTED ); | |
| 285 m_listView->SetItemState( m_current, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); | |
| 286 m_last = text; | |
| 287 | |
| 288 wxString time = m_listView->GetItemText( m_current, 2 ); | |
| 289 time.ToLong( &m_counter, 10 ); | |
| 290 m_timer.StartOnce( (int)m_counter * 1000 ); | |
| 291 | |
| 292 if ( m_current == m_listView->GetItemCount() - 1 ) m_current = 0; | |
| 293 else m_current++; | |
| 294 } | |
| 295 } | |
| 296 | |
| 297 void MainFrame::OnToggle( wxCommandEvent& WXUNUSED(event) ) | |
| 298 { | |
| 299 if ( m_toggleBtn->GetValue() ) { | |
| 300 m_toggleBtn->SetLabel( wxT("OFF") ); | |
| 301 EnableButtons( false ); | |
| 302 if ( m_listView->GetItemCount() > 0 ) { | |
| 303 m_timer.StartOnce( 1000 ); | |
| 304 } | |
| 305 } | |
| 306 else { | |
| 307 m_timer.Stop(); | |
| 308 m_toggleBtn->SetLabel( wxT("ON") ); | |
| 309 EnableButtons( true ); | |
| 310 } | |
| 311 } | |
| 312 | |
| 313 void MainFrame::OnBtnExit( wxCommandEvent& WXUNUSED(event) ) | |
| 314 { | |
| 315 Close(); | |
| 316 } | |
| 317 | |
| 318 // Functions | |
| 319 void MainFrame::EnableButtons( bool enable ) | |
| 320 { | |
| 321 if ( enable ) { | |
| 322 m_buttonUp->Enable( true ); | |
| 323 m_buttonDown->Enable( true ); | |
| 324 m_buttonDel->Enable( true ); | |
| 325 m_buttonAdd->Enable( true ); | |
| 326 } | |
| 327 else { | |
| 328 m_buttonUp->Enable( false ); | |
| 329 m_buttonDown->Enable( false ); | |
| 330 m_buttonDel->Enable( false ); | |
| 331 m_buttonAdd->Enable( false ); | |
| 332 } | |
| 333 } | |
| 334 | |
| 335 void MainFrame::ReNumberList() | |
| 336 { | |
| 337 for ( int i = 0; i < m_listView->GetItemCount(); i++ ) { | |
| 338 m_listView->SetItem( i, 0, wxString::Format( wxT("%d"), i + 1 ) ); | |
| 339 } | |
| 340 } | |
| 341 | |
| 342 void MainFrame::SwapListItem( long item1, long item2 ) | |
| 343 { | |
| 344 for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) { | |
| 345 wxString buf = m_listView->GetItemText( item1, c ); | |
| 346 m_listView->SetItem( item1, c, m_listView->GetItemText( item2, c ) ); | |
| 347 m_listView->SetItem( item2, c, buf ); | |
| 348 } | |
| 349 m_listView->SetItemState( item1, 0, wxLIST_STATE_SELECTED ); | |
| 350 m_listView->SetItemState( item2, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); | |
| 351 } | |
| 352 |
