Mercurial > mercurial > hgweb_qlipbrd.cgi
comparison src/mainframe.cpp @ 1:e4aa0e7a07ad
Second release.
| author | pyon@macmini |
|---|---|
| date | Sun, 13 Sep 2015 14:56:42 +0900 |
| parents | cb3403ca39b1 |
| children | fd4361d2cbbd |
comparison
equal
deleted
inserted
replaced
| 0:cb3403ca39b1 | 1:e4aa0e7a07ad |
|---|---|
| 1 // Filename: mainframe.cpp | 1 // Filename: mainframe.cpp |
| 2 // Last Change: 2015-08-30 Sun 21:49:16. | 2 // Last Change: 2015-09-13 Sun 14:43:27. |
| 3 // | 3 // |
| 4 #include <wx/filedlg.h> | 4 #include <wx/filedlg.h> |
| 5 #include <wx/textfile.h> | 5 #include <wx/textfile.h> |
| 6 #include <wx/clipbrd.h> | 6 #include <wx/clipbrd.h> |
| 7 #include <wx/utils.h> | 7 #include <wx/utils.h> |
| 8 #include <wx/msgdlg.h> | 8 #include <wx/msgdlg.h> |
| 9 #include "wx/numdlg.h" | |
| 9 | 10 |
| 10 #include "mainframe.h" | 11 #include "mainframe.h" |
| 11 #include "adddialog.h" | 12 #include "adddialog.h" |
| 12 | 13 |
| 13 // resources | 14 // resources |
| 14 #if !defined(__WXMSW__) && !defined(__WXPM__) | 15 #if !defined(__WXMSW__) && !defined(__WXPM__) |
| 15 #include "sample.xpm" | 16 #include "sample.xpm" |
| 16 #endif | 17 #endif |
| 17 | 18 |
| 19 #define COL_NO 0 | |
| 20 #define COL_TEXT 1 | |
| 21 #define COL_OW 2 | |
| 22 #define COL_MLT 3 | |
| 23 #define COL_MAL 4 | |
| 24 #define COL_DESC 5 | |
| 25 #define COL_ID 6 | |
| 26 | |
| 18 MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) | 27 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 ) | 28 : wxFrame( parent, id, title, pos, size, style ), |
| 20 { | 29 m_timer( this, ID_TIMER ), |
| 21 this->SetSizeHints( wxDefaultSize, wxDefaultSize ); | 30 m_counter( 0 ), |
| 31 m_period( 5 ), | |
| 32 m_bottom( true ) | |
| 33 { | |
| 34 this->SetSizeHints( wxSize( 500, 450 ), wxDefaultSize ); | |
| 22 this->SetBackgroundColour( wxColour( wxT("WHEAT") ) ); | 35 this->SetBackgroundColour( wxColour( wxT("WHEAT") ) ); |
| 23 SetIcon( wxICON( sample ) ); | 36 SetIcon( wxICON( sample ) ); |
| 24 | 37 |
| 25 // menu bar | 38 // menu bar |
| 26 m_menubar = new wxMenuBar( 0 ); | 39 m_menubar = new wxMenuBar( 0 ); |
| 27 m_menuFile = new wxMenu(); | 40 m_menuFile = new wxMenu(); |
| 41 wxMenuItem* m_menuItemAppdir = new wxMenuItem( m_menuFile, ID_MNAPPDIR, wxString( wxT("Open App Forlder") ), wxEmptyString, wxITEM_NORMAL ); | |
| 42 m_menuFile->Append( m_menuItemAppdir ); | |
| 43 | |
| 44 wxMenuItem* m_menuItemInterval = new wxMenuItem( m_menuFile, ID_MNINTERVAL, wxString( wxT("Set Interval") ), wxEmptyString, wxITEM_NORMAL ); | |
| 45 m_menuFile->Append( m_menuItemInterval ); | |
| 46 | |
| 28 wxMenuItem* m_menuItemAbout = new wxMenuItem( m_menuFile, ID_MNABOUT, wxString( wxT("About") ), wxEmptyString, wxITEM_NORMAL ); | 47 wxMenuItem* m_menuItemAbout = new wxMenuItem( m_menuFile, ID_MNABOUT, wxString( wxT("About") ), wxEmptyString, wxITEM_NORMAL ); |
| 29 m_menuFile->Append( m_menuItemAbout ); | 48 m_menuFile->Append( m_menuItemAbout ); |
| 30 | 49 |
| 31 wxMenuItem* m_menuItemExit = new wxMenuItem( m_menuFile, ID_MNEXIT, wxString( wxT("Exit") ), wxEmptyString, wxITEM_NORMAL ); | 50 wxMenuItem* m_menuItemExit = new wxMenuItem( m_menuFile, ID_MNEXIT, wxString( wxT("Exit") ), wxEmptyString, wxITEM_NORMAL ); |
| 32 m_menuFile->Append( m_menuItemExit ); | 51 m_menuFile->Append( m_menuItemExit ); |
| 51 wxBoxSizer* bSizerShow = new wxBoxSizer( wxHORIZONTAL ); | 70 wxBoxSizer* bSizerShow = new wxBoxSizer( wxHORIZONTAL ); |
| 52 | 71 |
| 53 m_textCtrlShow = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); | 72 m_textCtrlShow = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); |
| 54 bSizerShow->Add( m_textCtrlShow, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); | 73 bSizerShow->Add( m_textCtrlShow, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); |
| 55 | 74 |
| 75 m_textCtrlRemain = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 40, -1 ), wxTE_READONLY|wxTE_CENTER ); | |
| 76 bSizerShow->Add( m_textCtrlRemain, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); | |
| 77 | |
| 56 m_toggleBtn = new wxToggleButton( this, ID_TGL, wxT("ON"), wxDefaultPosition, wxSize( 60, -1 ), 0 ); | 78 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 ); | 79 bSizerShow->Add( m_toggleBtn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); |
| 58 | 80 |
| 59 bSizerTop->Add( bSizerShow, 0, wxEXPAND, 5 ); | 81 bSizerTop->Add( bSizerShow, 0, wxEXPAND, 5 ); |
| 60 | 82 |
| 61 // | 83 // |
| 62 wxBoxSizer* bSizerList = new wxBoxSizer( wxHORIZONTAL ); | 84 wxBoxSizer* bSizerMain = new wxBoxSizer( wxHORIZONTAL ); |
| 63 | 85 |
| 64 m_listView = new wxListView( this, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL ); | 86 // list |
| 65 bSizerList->Add( m_listView, 1, wxALL|wxEXPAND, 5 ); | 87 wxBoxSizer* bSizerList = new wxBoxSizer( wxVERTICAL ); |
| 88 | |
| 89 m_staticTextCycle = new wxStaticText( this, wxID_ANY, wxT("Cycle list"), wxDefaultPosition, wxDefaultSize, 0 ); | |
| 90 bSizerList->Add( m_staticTextCycle, 0, wxTOP|wxLEFT|wxALIGN_BOTTOM, 5 ); | |
| 91 | |
| 92 m_lisViewCycle = new wxListView( this, ID_LISTVIEW, wxDefaultPosition, wxSize( -1, 100 ), wxLC_REPORT|wxLC_SINGLE_SEL ); | |
| 66 wxListItem itemCol; | 93 wxListItem itemCol; |
| 67 itemCol.SetText( wxT("No") ); | 94 itemCol.SetText( wxT("No") ); m_lisViewCycle->InsertColumn( COL_NO, itemCol ); m_lisViewCycle->SetColumnWidth( COL_NO, 20 ); |
| 68 m_listView->InsertColumn( 0, itemCol ); | 95 itemCol.SetText( wxT("text") ); m_lisViewCycle->InsertColumn( COL_TEXT, itemCol ); m_lisViewCycle->SetColumnWidth( COL_TEXT, 80 ); |
| 69 m_listView->SetColumnWidth( 0, 40 ); | 96 itemCol.SetText( wxT("o/w") ); m_lisViewCycle->InsertColumn( COL_OW, itemCol ); m_lisViewCycle->SetColumnWidth( COL_OW, 40 ); |
| 70 itemCol.SetText( wxT("text") ); | 97 itemCol.SetText( wxT("live") ); m_lisViewCycle->InsertColumn( COL_MLT, itemCol ); m_lisViewCycle->SetColumnWidth( COL_MLT, 50 ); |
| 71 m_listView->InsertColumn( 1, itemCol ); | 98 itemCol.SetText( wxT("active") ); m_lisViewCycle->InsertColumn( COL_MAL, itemCol ); m_lisViewCycle->SetColumnWidth( COL_MAL, 50 ); |
| 72 m_listView->SetColumnWidth( 1, 80 ); | 99 itemCol.SetText( wxT("desc") ); m_lisViewCycle->InsertColumn( COL_DESC, itemCol ); m_lisViewCycle->SetColumnWidth( COL_DESC, 80 ); |
| 73 itemCol.SetText( wxT("time") ); | 100 itemCol.SetText( wxT("id") ); m_lisViewCycle->InsertColumn( COL_ID, itemCol ); m_lisViewCycle->SetColumnWidth( COL_ID, 30 ); |
| 74 m_listView->InsertColumn( 2, itemCol ); | 101 //m_lisViewCycle->EnableAlternateRowColours( true ); |
| 75 m_listView->SetColumnWidth( 2, 40 ); | 102 bSizerList->Add( m_lisViewCycle, 1, wxALL|wxEXPAND, 5 ); |
| 76 itemCol.SetText( wxT("type") ); | 103 |
| 77 m_listView->InsertColumn( 3, itemCol ); | 104 m_staticTextHist = new wxStaticText( this, wxID_ANY, wxT("User input history"), wxDefaultPosition, wxDefaultSize, 0 ); |
| 78 m_listView->SetColumnWidth( 3, 40 ); | 105 bSizerList->Add( m_staticTextHist, 0, wxTOP|wxLEFT|wxALIGN_BOTTOM, 5 ); |
| 79 itemCol.SetText( wxT("desc") ); | 106 |
| 80 m_listView->InsertColumn( 4, itemCol ); | 107 m_listBoxHist = new wxListBox( this, ID_LISTBOX, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE ); |
| 81 m_listView->SetColumnWidth( 4, 80 ); | 108 bSizerList->Add( m_listBoxHist, 1, wxALL|wxEXPAND, 5 ); |
| 82 //m_listView->EnableAlternateRowColours( true ); | 109 |
| 83 | 110 bSizerMain->Add( bSizerList, 1, wxEXPAND, 5 ); |
| 111 | |
| 112 // button | |
| 84 wxBoxSizer* bSizerBtn = new wxBoxSizer( wxVERTICAL ); | 113 wxBoxSizer* bSizerBtn = new wxBoxSizer( wxVERTICAL ); |
| 85 | 114 |
| 115 bSizerBtn->Add( 0, 20, 0, 0, 5 ); | |
| 116 | |
| 86 m_buttonUp = new wxButton( this, ID_BTNUP, wxT("↑"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | 117 m_buttonUp = new wxButton( this, ID_BTNUP, wxT("↑"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); |
| 87 bSizerBtn->Add( m_buttonUp, 0, wxALL, 5 ); | 118 bSizerBtn->Add( m_buttonUp, 0, wxALL, 5 ); |
| 88 | 119 |
| 89 m_buttonDown = new wxButton( this, ID_BTNDOWN, wxT("↓"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); | 120 m_buttonDown = new wxButton( this, ID_BTNDOWN, wxT("↓"), wxDefaultPosition, wxSize( 40, -1 ), 0 ); |
| 90 bSizerBtn->Add( m_buttonDown, 0, wxALL, 5 ); | 121 bSizerBtn->Add( m_buttonDown, 0, wxALL, 5 ); |
| 98 bSizerBtn->Add( 0, 0, 1, wxEXPAND, 5 ); | 129 bSizerBtn->Add( 0, 0, 1, wxEXPAND, 5 ); |
| 99 | 130 |
| 100 m_buttonExit = new wxButton( this, ID_EXIT, wxT("Exit"), wxDefaultPosition, wxSize( 60, -1 ), 0 ); | 131 m_buttonExit = new wxButton( this, ID_EXIT, wxT("Exit"), wxDefaultPosition, wxSize( 60, -1 ), 0 ); |
| 101 bSizerBtn->Add( m_buttonExit, 0, wxALL, 5 ); | 132 bSizerBtn->Add( m_buttonExit, 0, wxALL, 5 ); |
| 102 | 133 |
| 103 bSizerList->Add( bSizerBtn, 0, wxEXPAND, 5 ); | 134 bSizerMain->Add( bSizerBtn, 0, wxEXPAND, 5 ); |
| 104 bSizerTop->Add( bSizerList, 1, wxEXPAND, 5 ); | 135 |
| 136 bSizerTop->Add( bSizerMain, 1, wxEXPAND, 5 ); | |
| 105 | 137 |
| 106 this->SetSizer( bSizerTop ); | 138 this->SetSizer( bSizerTop ); |
| 107 this->Layout(); | 139 this->Layout(); |
| 108 | 140 |
| 109 this->Centre( wxBOTH ); | 141 this->Centre( wxBOTH ); |
| 113 { | 145 { |
| 114 } | 146 } |
| 115 | 147 |
| 116 // Event Table | 148 // Event Table |
| 117 BEGIN_EVENT_TABLE( MainFrame, wxFrame ) | 149 BEGIN_EVENT_TABLE( MainFrame, wxFrame ) |
| 118 EVT_MENU( ID_MNABOUT, MainFrame::OnMNAbout ) | 150 EVT_MENU( ID_MNAPPDIR, MainFrame::OnMNAppdir ) |
| 119 EVT_MENU( ID_MNEXIT, MainFrame::OnMNExit ) | 151 EVT_MENU( ID_MNINTERVAL, MainFrame::OnMNInterval ) |
| 120 EVT_MENU( ID_MNLDPGIN, MainFrame::OnMNLoad ) | 152 EVT_MENU( ID_MNABOUT, MainFrame::OnMNAbout ) |
| 121 EVT_MENU( ID_MNSVPGIN, MainFrame::OnMNSaveAs ) | 153 EVT_MENU( ID_MNEXIT, MainFrame::OnMNExit ) |
| 122 EVT_LIST_ITEM_ACTIVATED( ID_LIST, MainFrame::OnDClickItem ) | 154 EVT_MENU( ID_MNLDPGIN, MainFrame::OnMNLoad ) |
| 123 EVT_LIST_ITEM_SELECTED( ID_LIST, MainFrame::OnSelectItem ) | 155 EVT_MENU( ID_MNSVPGIN, MainFrame::OnMNSaveAs ) |
| 156 EVT_LIST_ITEM_ACTIVATED( ID_LISTVIEW, MainFrame::OnLViewDClickItem ) | |
| 157 EVT_LIST_ITEM_SELECTED( ID_LISTVIEW, MainFrame::OnLViewSelectItem ) | |
| 158 EVT_LISTBOX_DCLICK( ID_LISTBOX, MainFrame::OnLBoxDClickItem ) | |
| 124 EVT_TIMER( ID_TIMER, MainFrame::OnTimer ) | 159 EVT_TIMER( ID_TIMER, MainFrame::OnTimer ) |
| 125 EVT_BUTTON( ID_BTNUP, MainFrame::OnBtnUp ) | 160 EVT_BUTTON( ID_BTNUP, MainFrame::OnBtnUp ) |
| 126 EVT_BUTTON( ID_BTNDOWN, MainFrame::OnBtnDown ) | 161 EVT_BUTTON( ID_BTNDOWN, MainFrame::OnBtnDown ) |
| 127 EVT_BUTTON( ID_BTNDEL, MainFrame::OnBtnDel ) | 162 EVT_BUTTON( ID_BTNDEL, MainFrame::OnBtnDel ) |
| 128 EVT_BUTTON( ID_BTNADD, MainFrame::OnBtnAdd ) | 163 EVT_BUTTON( ID_BTNADD, MainFrame::OnBtnAdd ) |
| 129 EVT_BUTTON( ID_EXIT, MainFrame::OnBtnExit ) | 164 EVT_BUTTON( ID_EXIT, MainFrame::OnBtnExit ) |
| 130 EVT_TOGGLEBUTTON( ID_TGL, MainFrame::OnToggle ) | 165 EVT_TOGGLEBUTTON( ID_TGL, MainFrame::OnToggle ) |
| 131 /* | 166 /* |
| 132 EVT_IDLE( MainFrame::OnIdle ) | 167 EVT_IDLE( MainFrame::OnIdle ) |
| 133 EVT_CLOSE( MainFrame::OnClose ) | 168 EVT_CLOSE( MainFrame::OnClose ) |
| 134 */ | 169 */ |
| 135 END_EVENT_TABLE() | 170 END_EVENT_TABLE() |
| 136 | 171 |
| 137 /* Event Handlers & Functions */ | 172 /* Event Handlers & Functions */ |
| 138 // Event Handlers | 173 // Event Handlers |
| 174 void MainFrame::OnMNAppdir( wxCommandEvent& WXUNUSED(event) ) | |
| 175 { | |
| 176 wxString app_dir = wxGetCwd(); | |
| 177 wxString execmd = wxT("explorer ") + app_dir; | |
| 178 wxExecute( execmd ); | |
| 179 } | |
| 180 | |
| 181 void MainFrame::OnMNInterval( wxCommandEvent& WXUNUSED(event) ) | |
| 182 { | |
| 183 long t = wxGetNumberFromUser( wxT("text changed by user is preserved specified period."), wxT("Input 1-60[sec]."), wxT("Setting"), 5, 1, 60, this, wxDefaultPosition ); | |
| 184 if ( t != -1 ) // canceled | |
| 185 m_period = (int)t; | |
| 186 } | |
| 187 | |
| 139 void MainFrame::OnMNAbout( wxCommandEvent& WXUNUSED(event) ) | 188 void MainFrame::OnMNAbout( wxCommandEvent& WXUNUSED(event) ) |
| 140 { | 189 { |
| 141 wxInfoMessageBox( this ); | 190 wxInfoMessageBox( this ); |
| 142 } | 191 } |
| 143 | 192 |
| 152 wxFileDialog fd( this, wxT("Select Plug-in file"), plugin_dir, wxEmptyString, wxT("Plug-in files (*.qbrd)|*.qbrd"), wxFD_OPEN|wxFD_FILE_MUST_EXIST ); | 201 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... | 202 if ( fd.ShowModal() == wxID_CANCEL ) return; // the user changed idea... |
| 154 | 203 |
| 155 wxTextFile file; | 204 wxTextFile file; |
| 156 file.Open( fd.GetPath() ); | 205 file.Open( fd.GetPath() ); |
| 157 m_listView->DeleteAllItems(); | 206 m_lisViewCycle->DeleteAllItems(); |
| 207 QH.clear(); | |
| 158 for ( int i = 0, n = 0; i < file.GetLineCount(); i++ ) { | 208 for ( int i = 0, n = 0; i < file.GetLineCount(); i++ ) { |
| 159 if ( file[i].StartsWith( wxT("#") ) ) | 209 if ( file[i].StartsWith( wxT("#") ) ) |
| 160 continue; | 210 continue; |
| 161 wxArrayString s = wxSplit( file[i], ',', '\\' ); | 211 wxArrayString s = wxSplit( file[i], ',', '\\' ); |
| 162 | 212 |
| 163 m_listView->InsertItem( n, wxString::Format( wxT("%d"), n + 1 ) ); | 213 m_lisViewCycle->InsertItem( n, wxString::Format( wxT("%d"), n + 1 ) ); |
| 164 m_listView->SetItem( n, 1, s[0] ); | 214 m_lisViewCycle->SetItem( n, COL_TEXT, s[0] ); |
| 165 m_listView->SetItem( n, 2, s[1] ); | 215 m_lisViewCycle->SetItem( n, COL_OW, s[1] ); |
| 166 m_listView->SetItem( n, 3, s[2] ); | 216 m_lisViewCycle->SetItem( n, COL_MLT, s[2] ); |
| 217 m_lisViewCycle->SetItem( n, COL_MAL, s[3] ); | |
| 218 m_lisViewCycle->SetItem( n, COL_DESC, s[4] ); | |
| 219 m_lisViewCycle->SetItem( n, COL_ID, s[5] ); | |
| 167 n++; | 220 n++; |
| 168 } | 221 } |
| 169 file.Close(); | 222 file.Close(); |
| 170 | 223 |
| 171 m_current = 0; | 224 m_current = 0; |
| 172 m_last = m_listView->GetItemText( m_current, 1 ); | 225 m_lisViewCycle->Select( m_current, true ); |
| 173 m_listView->SetItemState( m_current, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); | |
| 174 } | 226 } |
| 175 | 227 |
| 176 void MainFrame::OnMNSaveAs( wxCommandEvent& WXUNUSED(event) ) | 228 void MainFrame::OnMNSaveAs( wxCommandEvent& WXUNUSED(event) ) |
| 177 { | 229 { |
| 178 wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin"); | 230 wxString plugin_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("plugin"); |
| 185 file.Clear(); | 237 file.Clear(); |
| 186 } | 238 } |
| 187 else { | 239 else { |
| 188 file.Create(); | 240 file.Create(); |
| 189 } | 241 } |
| 190 for ( int r = 0; r < m_listView->GetItemCount(); r++ ) { | 242 for ( int r = 0; r < m_lisViewCycle->GetItemCount(); r++ ) { |
| 191 wxArrayString s; | 243 wxArrayString s; |
| 192 for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) { | 244 for ( int c = 0; c < m_lisViewCycle->GetColumnCount(); c++ ) { |
| 193 s.Add( m_listView->GetItemText( r, c ) ); | 245 s.Add( m_lisViewCycle->GetItemText( r, c ) ); |
| 194 } | 246 } |
| 195 file.AddLine( wxJoin( s, ',', '\\' ) ); | 247 file.AddLine( wxJoin( s, ',', '\\' ) ); |
| 196 } | 248 } |
| 197 file.Write(); | 249 file.Write(); |
| 198 file.Close(); | 250 file.Close(); |
| 199 } | 251 } |
| 200 | 252 |
| 201 void MainFrame::OnDClickItem( wxListEvent& event ) | 253 void MainFrame::OnLViewDClickItem( wxListEvent& event ) |
| 254 { | |
| 255 wxString s = event.GetText(); | |
| 256 } | |
| 257 | |
| 258 void MainFrame::OnLViewSelectItem( wxListEvent& event ) | |
| 202 { | 259 { |
| 203 long i = event.GetIndex(); | 260 long i = event.GetIndex(); |
| 204 } | 261 m_current = (int)i; |
| 205 | 262 } |
| 206 void MainFrame::OnSelectItem( wxListEvent& event ) | 263 |
| 207 { | 264 void MainFrame::OnLBoxDClickItem( wxCommandEvent& event ) |
| 208 long i = event.GetIndex(); | 265 { |
| 209 m_current = i; | 266 wxString s = event.GetString(); |
| 210 } | 267 m_counter = m_period; |
| 211 | 268 if ( wxTheClipboard->Open() ) { |
| 212 // ↑ | 269 wxTheClipboard->SetData( new wxTextDataObject( s ) ); |
| 270 wxTheClipboard->Close(); | |
| 271 m_listBoxHist->Delete( event.GetSelection() ); | |
| 272 m_listBoxHist->Insert( s, 0 ); | |
| 273 m_textCtrlShow->SetValue( s ); | |
| 274 m_textCtrlRemain->SetValue( wxString::Format( wxT("%d"), m_period ) ); | |
| 275 } | |
| 276 m_listBoxHist->Deselect( event.GetInt() ); | |
| 277 m_listBoxHist->SetSelection( 0 ); | |
| 278 } | |
| 279 | |
| 280 // [↑] | |
| 213 void MainFrame::OnBtnUp( wxCommandEvent& WXUNUSED(event) ) | 281 void MainFrame::OnBtnUp( wxCommandEvent& WXUNUSED(event) ) |
| 214 { | 282 { |
| 215 long item = -1; | 283 long item = m_lisViewCycle->GetFirstSelected(); |
| 216 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | |
| 217 if ( item == -1 || item == 0 ) return; | 284 if ( item == -1 || item == 0 ) return; |
| 218 SwapListItem( item, item - 1 ); | 285 SwapListItem( item, item - 1 ); |
| 219 ReNumberList(); | 286 ReNumberList(); |
| 220 } | 287 } |
| 221 | 288 |
| 222 // ↓ | 289 // [↓] |
| 223 void MainFrame::OnBtnDown( wxCommandEvent& WXUNUSED(event) ) | 290 void MainFrame::OnBtnDown( wxCommandEvent& WXUNUSED(event) ) |
| 224 { | 291 { |
| 225 long item = -1; | 292 long item = m_lisViewCycle->GetFirstSelected(); |
| 226 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | 293 if ( item == -1 || item == m_lisViewCycle->GetItemCount() - 1 ) return; |
| 227 if ( item == -1 || item == m_listView->GetItemCount() - 1 ) return; | |
| 228 SwapListItem( item, item + 1 ); | 294 SwapListItem( item, item + 1 ); |
| 229 ReNumberList(); | 295 ReNumberList(); |
| 230 } | 296 } |
| 231 | 297 |
| 232 // − | 298 // [−] |
| 233 void MainFrame::OnBtnDel( wxCommandEvent& WXUNUSED(event) ) | 299 void MainFrame::OnBtnDel( wxCommandEvent& WXUNUSED(event) ) |
| 234 { | 300 { |
| 235 long item = -1; | 301 long item = m_lisViewCycle->GetFirstSelected(); |
| 236 for ( ;; ) { | 302 if ( item == -1 ) return; |
| 237 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | 303 |
| 238 if ( item == -1 ) break; | 304 int id = ToInt( m_lisViewCycle->GetItemText( item, COL_ID ) ); |
| 239 m_listView->DeleteItem( item ); | 305 QH.erase( id ); |
| 240 ReNumberList(); | 306 |
| 241 } | 307 m_lisViewCycle->DeleteItem( item ); |
| 242 } | 308 ReNumberList(); |
| 243 | 309 } |
| 244 // + | 310 |
| 311 // [+] | |
| 245 void MainFrame::OnBtnAdd( wxCommandEvent& WXUNUSED(event) ) | 312 void MainFrame::OnBtnAdd( wxCommandEvent& WXUNUSED(event) ) |
| 246 { | 313 { |
| 247 long item = -1; | 314 int r; |
| 248 for ( ;; ) { | 315 long item = m_lisViewCycle->GetFirstSelected(); |
| 249 item = m_listView->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); | 316 if ( item == -1 ) r = 0; |
| 250 if ( item == -1 ) break; | 317 else r = item; |
| 251 m_listView->InsertItem( item + 1, wxEmptyString ); | 318 |
| 252 ReNumberList(); | 319 AddDialog add_dlg( this, wxID_ANY, wxT("Add Item"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ); |
| 253 } | 320 if ( add_dlg.ShowModal() == wxID_OK ) { |
| 254 /* | 321 int id = CreateID(); |
| 255 AddDialog adlg( this, wxID_ANY, wxT("a"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ); | 322 QlipData* q = new QlipData; |
| 256 if ( adlg.ShowModal() == wxID_OK ) { | 323 q->id = id; |
| 257 } | 324 q->text = add_dlg.GetText(); |
| 258 */ | 325 q->overwrite = add_dlg.GetOverwrite(); |
| 326 q->max_active_time = add_dlg.GetMaxActiveTime(); | |
| 327 q->max_live_time = q->overwrite ? add_dlg.GetMaxLiveTime() : 0; | |
| 328 q->desc = add_dlg.GetDesc(); | |
| 329 q->active_time = 0; | |
| 330 q->live_time = 0; | |
| 331 QH[id] = q; | |
| 332 | |
| 333 m_lisViewCycle->InsertItem( r, wxEmptyString ); | |
| 334 m_lisViewCycle->SetItem( r, COL_TEXT, q->text ); | |
| 335 m_lisViewCycle->SetItem( r, COL_OW, wxString::Format( wxT("%s"), q->overwrite ? wxT("true") : wxT("false") ) ); | |
| 336 m_lisViewCycle->SetItem( r, COL_MAL, wxString::Format( wxT("-- / %d"), q->max_active_time ) ); | |
| 337 m_lisViewCycle->SetItem( r, COL_MLT, wxString::Format( wxT("-- / %d"), q->max_live_time ) ); | |
| 338 m_lisViewCycle->SetItem( r, COL_DESC, q->desc ); | |
| 339 m_lisViewCycle->SetItem( r, COL_ID, wxString::Format( wxT("%d"), id ) ); | |
| 340 if ( q->overwrite ) | |
| 341 m_lisViewCycle->SetItemBackgroundColour( r, wxColour( wxT("MEDIUM GOLDENROD") ) ); | |
| 342 else | |
| 343 m_lisViewCycle->SetItemBackgroundColour( r, wxColour( wxT("WHITE") ) ); | |
| 344 } | |
| 345 ReNumberList(); | |
| 259 } | 346 } |
| 260 | 347 |
| 261 void MainFrame::OnTimer( wxTimerEvent& WXUNUSED(event) ) | 348 void MainFrame::OnTimer( wxTimerEvent& WXUNUSED(event) ) |
| 262 { | 349 { |
| 350 wxString clipboard; | |
| 263 if ( wxTheClipboard->Open() ) { | 351 if ( wxTheClipboard->Open() ) { |
| 264 | 352 //wxMessageBox( clipboard ); |
| 265 wxTextDataObject data; | 353 wxTextDataObject data; |
| 266 wxTheClipboard->GetData( data ); | 354 wxTheClipboard->GetData( data ); |
| 267 wxString s = data.GetText(); | 355 clipboard = data.GetText(); |
| 268 if ( !m_last.IsSameAs( s ) ) { // the clipboard was changed by user | 356 wxTheClipboard->Close(); |
| 269 wxTheClipboard->Close(); | 357 |
| 270 m_textCtrlShow->SetValue( s ); | 358 m_textCtrlShow->SetValue( clipboard ); |
| 271 for ( int r = 0; r < m_listView->GetItemCount(); r++ ) | 359 m_textCtrlRemain->SetValue( wxT("∞") ); |
| 272 m_listView->SetItemState( r, 0, wxLIST_STATE_SELECTED ); | 360 UpdateHistory( clipboard ); |
| 273 m_counter = 5; | 361 } |
| 274 m_current = 0; | 362 else { |
| 275 m_last = s; | 363 return; |
| 276 m_timer.StartOnce( (int)m_counter * 1000 ); | 364 } |
| 365 | |
| 366 long list_num = m_lisViewCycle->GetItemCount(); | |
| 367 if ( list_num == 0 ) return; | |
| 368 | |
| 369 if ( m_lisViewCycle->GetSelectedItemCount() == 0 ) { | |
| 370 m_lisViewCycle->Select( 0, true ); | |
| 371 m_current = 0; | |
| 372 } | |
| 373 | |
| 374 AddStackTime(); | |
| 375 UpdateView(); | |
| 376 int r = GetEmptyStack(); | |
| 377 if ( r != -1 && m_bottom ) { | |
| 378 m_timer.Stop(); | |
| 379 | |
| 380 int id = ToInt( m_lisViewCycle->GetItemText( r, COL_ID ) ); | |
| 381 QH[id]->text = clipboard; | |
| 382 m_lisViewCycle->SetItem( r, COL_TEXT, clipboard ); | |
| 383 | |
| 384 wxSleep( 2 ); | |
| 385 m_timer.Start( -1 ); | |
| 386 m_current = 0; | |
| 387 m_lisViewCycle->Select( 0, true ); | |
| 388 return; | |
| 389 } | |
| 390 | |
| 391 // Main Cycle | |
| 392 if ( list_num == 1 ) { | |
| 393 if ( m_counter == m_period ) { | |
| 394 m_counter = 0; | |
| 395 if ( wxTheClipboard->Open() ) { | |
| 396 wxString s = m_lisViewCycle->GetItemText( 0, COL_TEXT ); | |
| 397 wxTheClipboard->SetData( new wxTextDataObject( s ) ); | |
| 398 wxTheClipboard->Close(); | |
| 399 m_textCtrlShow->SetValue( s ); | |
| 400 m_textCtrlRemain->SetValue( wxT("∞") ); | |
| 401 } | |
| 402 } | |
| 403 else { | |
| 404 wxString t = wxString::Format( wxT("%d"), m_period - m_counter ); | |
| 405 m_textCtrlShow->SetValue( clipboard ); | |
| 406 m_textCtrlRemain->SetValue( t ); | |
| 407 m_counter++; | |
| 408 } | |
| 409 | |
| 410 m_lisViewCycle->Select( 0, true ); | |
| 411 m_current = 0; | |
| 412 m_bottom = true; | |
| 413 } | |
| 414 else { | |
| 415 long item = m_lisViewCycle->GetFirstSelected(); | |
| 416 m_current = (int)item; | |
| 417 | |
| 418 int id = ToInt( m_lisViewCycle->GetItemText( item, COL_ID ) ); | |
| 419 QlipData* q = QH[id]; | |
| 420 if ( q->overwrite && !q->IsAlive() ) | |
| 277 return; | 421 return; |
| 422 | |
| 423 if ( q->IsArrived() ) { | |
| 424 m_lisViewCycle->Select( m_current, false ); | |
| 425 if ( ++m_current == list_num ) m_bottom = true; | |
| 426 else m_bottom = false; | |
| 427 m_current = m_current % list_num; | |
| 428 m_lisViewCycle->Select( m_current, true ); | |
| 429 | |
| 430 if ( wxTheClipboard->Open() ) { | |
| 431 int id = ToInt( m_lisViewCycle->GetItemText( m_current, COL_ID ) ); | |
| 432 QlipData* qn = QH[id]; | |
| 433 wxTheClipboard->SetData( new wxTextDataObject( qn->text ) ); | |
| 434 wxTheClipboard->Close(); | |
| 435 m_textCtrlShow->SetValue( qn->text ); | |
| 436 m_textCtrlRemain->SetValue( wxString::Format( wxT("%d"), qn->max_active_time ) ); | |
| 437 } | |
| 278 } | 438 } |
| 279 | 439 else { |
| 280 wxString text = m_listView->GetItemText( m_current, 1 ); | 440 int t = q->max_active_time - q->active_time; |
| 281 wxTheClipboard->SetData( new wxTextDataObject( text ) ); | 441 m_textCtrlRemain->SetValue( wxString::Format( wxT("%d"), t ) ); |
| 282 wxTheClipboard->Close(); | 442 } |
| 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 } | 443 } |
| 295 } | 444 } |
| 296 | 445 |
| 297 void MainFrame::OnToggle( wxCommandEvent& WXUNUSED(event) ) | 446 void MainFrame::OnToggle( wxCommandEvent& WXUNUSED(event) ) |
| 298 { | 447 { |
| 299 if ( m_toggleBtn->GetValue() ) { | 448 if ( m_toggleBtn->GetValue() ) { |
| 300 m_toggleBtn->SetLabel( wxT("OFF") ); | 449 m_toggleBtn->SetLabel( wxT("OFF") ); |
| 301 EnableButtons( false ); | 450 EnableButtons( false ); |
| 302 if ( m_listView->GetItemCount() > 0 ) { | 451 m_timer.Start( 1000 ); |
| 303 m_timer.StartOnce( 1000 ); | |
| 304 } | |
| 305 } | 452 } |
| 306 else { | 453 else { |
| 307 m_timer.Stop(); | 454 m_timer.Stop(); |
| 308 m_toggleBtn->SetLabel( wxT("ON") ); | 455 m_toggleBtn->SetLabel( wxT("ON") ); |
| 309 EnableButtons( true ); | 456 EnableButtons( true ); |
| 332 } | 479 } |
| 333 } | 480 } |
| 334 | 481 |
| 335 void MainFrame::ReNumberList() | 482 void MainFrame::ReNumberList() |
| 336 { | 483 { |
| 337 for ( int i = 0; i < m_listView->GetItemCount(); i++ ) { | 484 for ( int r = 0; r < m_lisViewCycle->GetItemCount(); r++ ) { |
| 338 m_listView->SetItem( i, 0, wxString::Format( wxT("%d"), i + 1 ) ); | 485 m_lisViewCycle->SetItem( r, COL_NO, wxString::Format( wxT("%d"), r + 1 ) ); |
| 486 wxString s = m_lisViewCycle->GetItemText( r, COL_OW ); | |
| 487 if ( s.IsSameAs( wxT("true") ) ) | |
| 488 m_lisViewCycle->SetItemBackgroundColour( r, wxColour( wxT("MEDIUM GOLDENROD") ) ); | |
| 489 else | |
| 490 m_lisViewCycle->SetItemBackgroundColour( r, wxColour( wxT("WHITE") ) ); | |
| 339 } | 491 } |
| 340 } | 492 } |
| 341 | 493 |
| 342 void MainFrame::SwapListItem( long item1, long item2 ) | 494 void MainFrame::SwapListItem( long item1, long item2 ) |
| 343 { | 495 { |
| 344 for ( int c = 0; c < m_listView->GetColumnCount(); c++ ) { | 496 for ( int c = 0; c < m_lisViewCycle->GetColumnCount(); c++ ) { |
| 345 wxString buf = m_listView->GetItemText( item1, c ); | 497 wxString buf = m_lisViewCycle->GetItemText( item1, c ); |
| 346 m_listView->SetItem( item1, c, m_listView->GetItemText( item2, c ) ); | 498 m_lisViewCycle->SetItem( item1, c, m_lisViewCycle->GetItemText( item2, c ) ); |
| 347 m_listView->SetItem( item2, c, buf ); | 499 m_lisViewCycle->SetItem( item2, c, buf ); |
| 348 } | 500 } |
| 349 m_listView->SetItemState( item1, 0, wxLIST_STATE_SELECTED ); | 501 m_lisViewCycle->Select( item1, false ); |
| 350 m_listView->SetItemState( item2, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); | 502 m_lisViewCycle->Select( item2, true ); |
| 351 } | 503 } |
| 352 | 504 |
| 505 int MainFrame::CreateID() | |
| 506 { | |
| 507 long max_id = 1; | |
| 508 if ( m_lisViewCycle->GetItemCount() == 0 ) | |
| 509 return max_id; | |
| 510 | |
| 511 wxArrayString id; | |
| 512 for ( int r = 0; r < m_lisViewCycle->GetItemCount(); r++ ) { | |
| 513 wxString buf = m_lisViewCycle->GetItemText( r, COL_ID ); | |
| 514 id.Add( buf ); | |
| 515 } | |
| 516 id.Sort(); | |
| 517 wxString max = id.Last(); | |
| 518 max.ToLong( &max_id, 10 ); | |
| 519 return ++max_id; | |
| 520 } | |
| 521 | |
| 522 void MainFrame::AddStackTime() | |
| 523 { | |
| 524 QlipDataHash::iterator it; | |
| 525 for ( it = QH.begin(); it != QH.end(); it++ ) { | |
| 526 int id = it->first; | |
| 527 QlipData* q = it->second; | |
| 528 if ( q->overwrite ) { | |
| 529 if ( ++q->live_time == q->max_live_time ) | |
| 530 q->Kill(); | |
| 531 } | |
| 532 QH[id] = q; | |
| 533 } | |
| 534 } | |
| 535 | |
| 536 void MainFrame::UpdateView() | |
| 537 { | |
| 538 for ( int r = 0; r < m_lisViewCycle->GetItemCount(); r++ ) { | |
| 539 int id = ToInt( m_lisViewCycle->GetItemText( r, COL_ID ) ); | |
| 540 | |
| 541 m_lisViewCycle->SetItem( r, COL_TEXT, QH[id]->text ); | |
| 542 | |
| 543 wxString at = wxString::Format( wxT("%d / %d"), QH[id]->active_time, QH[id]->max_active_time ); | |
| 544 m_lisViewCycle->SetItem( r, COL_MAL, at ); | |
| 545 | |
| 546 wxString lt = wxT("-- / --"); | |
| 547 if ( QH[id]->overwrite ) | |
| 548 lt = wxString::Format( wxT("%d / %d"), QH[id]->live_time, QH[id]->max_live_time ); | |
| 549 m_lisViewCycle->SetItem( r, COL_MLT, lt ); | |
| 550 } | |
| 551 } | |
| 552 | |
| 553 void MainFrame::UpdateHistory( wxString s ) | |
| 554 { | |
| 555 if ( s.IsEmpty() ) return; | |
| 556 int row = m_listBoxHist->FindString( s, true ); | |
| 557 if ( row != wxNOT_FOUND ) | |
| 558 m_listBoxHist->Delete( row ); | |
| 559 m_listBoxHist->Insert( s, 0 ); | |
| 560 } | |
| 561 | |
| 562 int MainFrame::GetEmptyStack() | |
| 563 { | |
| 564 int row = -1; | |
| 565 for ( int r = 0; r < m_lisViewCycle->GetItemCount(); r++ ) { | |
| 566 int id = ToInt( m_lisViewCycle->GetItemText( r, COL_ID ) ); | |
| 567 if ( QH[(int)id]->text.IsEmpty() ) row = r; | |
| 568 } | |
| 569 return row; | |
| 570 } | |
| 571 | |
| 572 int MainFrame::ToInt( wxString s ) | |
| 573 { | |
| 574 long n = 0; | |
| 575 s.ToLong( &n, 10 ); | |
| 576 return n; | |
| 577 } | |
| 578 |
