0
|
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
|