Mercurial > mercurial > hgweb_searcher2.cgi
comparison src/myframe.cpp @ 0:c174ac668e9f
First commit ! (ver2.8)
author | pyon@macmini |
---|---|
date | Tue, 05 Apr 2011 18:44:57 +0900 |
parents | |
children | e0cf49906039 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c174ac668e9f |
---|---|
1 // Filename : mainframe.cpp | |
2 // Last Change: 31-Mar-2011. | |
3 // | |
4 | |
5 #include "symbol.h" | |
6 #include "common.h" | |
7 #include "myframe.h" | |
8 #include "hhsdb.h" | |
9 #include "htmlhelp.h" | |
10 #include "main.h" | |
11 #include "wx/wxsqlite3.h" | |
12 | |
13 // resources | |
14 // the application icon (under Windows and OS/2 it is in resources and even | |
15 // though we could still include the XPM here it would be unused) | |
16 #if !defined(__WXMSW__) && !defined(__WXPM__) | |
17 #include "sample.xpm" | |
18 #include "print.xpm" | |
19 #include "index.xpm" | |
20 #endif | |
21 | |
22 ////////////////////////////////////////////////////////////////////////// | |
23 // control constructor | |
24 MyCmdBox::MyCmdBox( wxWindow *parent, wxWindowID id, const wxString value, const wxPoint pos, const wxSize size, long style ) | |
25 : wxTextCtrl( parent, id, value, pos, size, style ) | |
26 { | |
27 // for search history | |
28 hist = wxGetApp().searchhist; | |
29 histpos = 5; | |
30 | |
31 // for autocomplete hhs | |
32 wxString gszFile = wxGetCwd() + wxT("/db/ccn.db"); | |
33 wxSQLite3Database ccndb; | |
34 ccndb.Open( gszFile ); | |
35 wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT hhsno FROM path ORDER BY path DESC LIMIT 500"); | |
36 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
37 | |
38 gszFile = wxGetCwd() + wxT("/db/hhs.db"); | |
39 wxSQLite3Database hhsdb; | |
40 hhsdb.Open( gszFile ); | |
41 wxSQLite3ResultSet q2; | |
42 | |
43 wxString hhsno; | |
44 while ( q.NextRow() ) { | |
45 hhsno = q.GetString(0); | |
46 | |
47 recenthhs.Add(hhsno); | |
48 | |
49 wxSQLite3Statement stmt2 = hhsdb.PrepareStatement("SELECT name FROM hhs_master WHERE hhsno = ?"); | |
50 stmt2.Bind( 1, hhsno ); | |
51 q2 = stmt2.ExecuteQuery(); | |
52 if ( !q2.IsNull(0) ) { | |
53 while ( q2.NextRow() ) { | |
54 recentname.Add(q2.GetString(0)); | |
55 } | |
56 } | |
57 else { | |
58 recentname.Add(wxEmptyString); | |
59 } | |
60 stmt2.Finalize(); | |
61 } | |
62 stmt.Finalize(); | |
63 | |
64 hhsdb.Close(); | |
65 ccndb.Close(); | |
66 } | |
67 | |
68 // destructor | |
69 MyCmdBox::~MyCmdBox() | |
70 { | |
71 } | |
72 | |
73 // Event Table | |
74 BEGIN_EVENT_TABLE( MyCmdBox, wxTextCtrl ) | |
75 EVT_CHAR( MyCmdBox::OnChar ) | |
76 EVT_TEXT_ENTER( ID_CMD, MyCmdBox::OnCmd ) | |
77 END_EVENT_TABLE() | |
78 | |
79 // Event Handlers | |
80 void MyCmdBox::OnChar( wxKeyEvent& event ) | |
81 { | |
82 if ( event.GetKeyCode() == 13 ) { | |
83 event.Skip(); | |
84 return; | |
85 } | |
86 | |
87 if ( event.GetKeyCode() == 45 ) { // テンキーの"-"キーで一文字削除 | |
88 wxString s = this->GetStringSelection(); | |
89 if ( s.IsEmpty() ) { | |
90 long p = this->GetInsertionPoint(); | |
91 this->Remove( p-1, p ); | |
92 } | |
93 else { | |
94 this->Cut(); | |
95 } | |
96 return; | |
97 } | |
98 | |
99 MyFrame *mf = (MyFrame*)FindWindowById( ID_MAIN ); | |
100 | |
101 if ( event.GetKeyCode() == WXK_UP ) { // ↑ | |
102 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
103 histpos--; | |
104 if ( histpos < 0 ) histpos = 0; | |
105 this->ChangeValue( hist[histpos] ); | |
106 return; | |
107 } | |
108 else if ( event.GetKeyCode() == WXK_DOWN ) { // ↓ | |
109 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
110 histpos++; | |
111 if ( histpos >= hist.GetCount() ) { | |
112 histpos = hist.GetCount(); | |
113 this->Clear(); | |
114 return; | |
115 } | |
116 this->ChangeValue( hist[histpos] ); | |
117 return; | |
118 } | |
119 | |
120 if ( event.GetKeyCode() == WXK_ESCAPE ) { // clear by ESC | |
121 this->Clear(); | |
122 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
123 return; | |
124 } | |
125 | |
126 this->Cut(); | |
127 int c = event.GetKeyCode(); | |
128 if ( c >= 48 && c <= 57 ) { // [0-9] | |
129 c -= 48; | |
130 wxString input = this->GetLineText(0) + wxString::Format(wxT("%d"),c); | |
131 if ( input.Len() < 5 ) { | |
132 event.Skip(); | |
133 return; | |
134 } | |
135 // autocomplete | |
136 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
137 for ( int i=0; i<recenthhs.GetCount(); i++ ) { | |
138 if ( recenthhs[i].StartsWith( input ) ) { | |
139 this->ChangeValue( recenthhs[i] ); | |
140 this->SetSelection( input.Len(), 10 ); | |
141 | |
142 wxString msg = wxT("もしかして... ") + recentname[i] + wxT(" ?!"); | |
143 mf->m_statusBar->SetStatusText( msg, 0 ); | |
144 | |
145 return; | |
146 } | |
147 } | |
148 event.Skip(); | |
149 return; | |
150 } | |
151 | |
152 event.Skip(); | |
153 } | |
154 | |
155 void MyCmdBox::OnCmd( wxCommandEvent& event ) | |
156 { | |
157 wxHtmlWindow *h = (wxHtmlWindow*)FindWindowById( ID_HTML ); | |
158 wxGrid *g = (wxGrid*)FindWindowById( ID_CCN ); | |
159 wxSplitterWindow *s = (wxSplitterWindow*)FindWindowById( ID_SPLT ); | |
160 s->ReplaceWindow( h, g ); | |
161 h->Show(true); | |
162 g->Show(false); | |
163 | |
164 wxRegEx reHhs(wxT("^0[1238][0-9]{8}$")); // 被保番チェック | |
165 wxRegEx reCno(wxT("^[0-9]{1,2}$")); // 開くフォルダの番号 | |
166 | |
167 wxString cmd; | |
168 cmd = this->GetLineText(0); | |
169 int cond = 0; | |
170 if ( reHhs.Matches( cmd ) ) | |
171 cond = 1; | |
172 else if ( reCno.Matches( cmd ) ) | |
173 cond = 2; | |
174 | |
175 wxString htmlbody; | |
176 | |
177 MyFrame *mf = (MyFrame*)FindWindowById( ID_MAIN ); | |
178 wxHtmlWindow *hr = (wxHtmlWindow*)FindWindowById( ID_HTML ); | |
179 switch (cond) { | |
180 // 被保険者番号が入力されたら | |
181 case 1: { | |
182 wxString hhs = cmd; | |
183 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
184 this->SetSelection( 0, this->GetLastPosition() ); | |
185 | |
186 // 被保険者検索 | |
187 wxString gszFile = wxGetCwd() + wxT("/db/hhs.db"); | |
188 wxSQLite3Database hhsdb; | |
189 hhsdb.Open( gszFile ); | |
190 | |
191 wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT name FROM hhs_master WHERE hhsno = ?"); | |
192 stmt.Bind( 1, hhs ); | |
193 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
194 | |
195 wxString name = wxT("登録なし"); | |
196 if ( q.IsNull(0) ) { | |
197 wxString msg = wxT("データベースに存在しない被保険者です.") + hhs; | |
198 mf->m_statusBar->SetStatusText( msg, 0 ); | |
199 } | |
200 else { | |
201 name = q.GetString(0); | |
202 hist.Add( hhs ); | |
203 histpos++; | |
204 } | |
205 stmt.Finalize(); | |
206 hhsdb.Close(); | |
207 | |
208 // パス検索 | |
209 gszFile = wxGetCwd() + wxT("/db/ccn.db"); | |
210 wxSQLite3Database ccndb; | |
211 ccndb.Open( gszFile ); | |
212 | |
213 stmt = ccndb.PrepareStatement("SELECT path FROM path WHERE hhsno = ? ORDER BY path DESC"); | |
214 stmt.Bind( 1, hhs ); | |
215 q = stmt.ExecuteQuery(); | |
216 if ( q.IsNull(0) ) { | |
217 hr->LoadPage( wxT("html/notfound.html") ); | |
218 mf->m_statusBar->SetStatusText( wxT("データが存在しません."), 0 ); | |
219 return; | |
220 } | |
221 | |
222 path.Clear(); | |
223 htmlbody = wxT("<html><body>"); | |
224 htmlbody += wxT("該当者: "); | |
225 htmlbody += wxT("<b>") + name + wxT("</b>"); | |
226 htmlbody += wxT(" ( ") + hhs + wxT(" )"); | |
227 htmlbody += wxT("<br /><br />検索結果"); | |
228 htmlbody += wxT("<table border=1>"); | |
229 htmlbody += wxT("<tr bgcolor=\"#ffcc33\"><th>番号</th><th>日付</th><th>フォルダ</th></tr>"); | |
230 | |
231 wxRegEx reDate(wxT("(^.*20[0-9]{2}.)(20[0-9]{2})([0-2][0-9])([0-9]{2})(.*$)")); | |
232 | |
233 int i=1; | |
234 int clrflg = 1; | |
235 while ( q.NextRow() ) { | |
236 path.Add(q.GetString(0)); | |
237 wxString date = q.GetString(0); | |
238 reDate.ReplaceAll( &date, wxT("\\2-\\3-\\4") ); | |
239 | |
240 if ( clrflg ) { | |
241 htmlbody += wxT("<tr bgcolor=\"#ffffcc\">"); | |
242 clrflg = 0; | |
243 } | |
244 else { | |
245 htmlbody += wxT("<tr bgcolor=\"#ffff99\">"); | |
246 clrflg = 1; | |
247 } | |
248 htmlbody += wxT("<td align=\"center\">") + wxString::Format(wxT("%d"),i++) + wxT("</td>"); | |
249 htmlbody += wxT("<td>") + date + wxT("</td>"); | |
250 htmlbody += wxT("<td>") + q.GetString(0) + wxT("</td></tr>"); | |
251 } | |
252 stmt.Finalize(); | |
253 ccndb.Close(); | |
254 path.Shrink(); | |
255 | |
256 htmlbody += wxT("</table>"); | |
257 htmlbody += wxT("<br />"); | |
258 htmlbody += wxT("<div>"); | |
259 htmlbody += wxT("フォルダを開くには,番号を入力してください.<br />"); | |
260 htmlbody += wxT("他の被保険者を検索するには,被保番を入力してください."); | |
261 htmlbody += wxT("</div>"); | |
262 htmlbody += wxT("</body></html>"); | |
263 | |
264 hr->SetPage( htmlbody ); | |
265 | |
266 break; | |
267 } | |
268 // フォルダ表示 | |
269 case 2: { | |
270 this->SetSelection( 0, this->GetLastPosition() ); | |
271 long val; | |
272 cmd.ToLong( &val, 10 ); | |
273 val--; | |
274 if ( path.IsEmpty() | |
275 || val < 0 | |
276 || val > path.GetCount()-1 ) { | |
277 mf->m_statusBar->SetStatusText( wxT("不適切な入力です."), 0 ); | |
278 break; | |
279 } | |
280 wxString execmd = wxT("explorer ") + path[val]; | |
281 wxExecute( execmd ); | |
282 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
283 | |
284 // 検索履歴をログに保存 | |
285 wxString logfn = wxGetCwd() + wxT("/db/log.txt"); | |
286 wxTextFile logFile; | |
287 logFile.Open( logfn ); | |
288 wxDateTime now = wxDateTime::Now(); | |
289 wxString log = now.Format() + wxT(" " ) + cmd + wxT(" ") + path[val]; | |
290 logFile.AddLine( log ); | |
291 logFile.Write(); | |
292 logFile.Close(); | |
293 | |
294 break; | |
295 } | |
296 // 制御用コマンド | |
297 case 0: { | |
298 | |
299 path.Clear(); | |
300 if ( cmd.Cmp(wxT("s")) == 0 ) { | |
301 hr->LoadPage( wxT("html/start.html") ); | |
302 this->ChangeValue( wxEmptyString ); | |
303 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
304 return; | |
305 } | |
306 if ( cmd.Cmp(wxT("c")) == 0 ) { | |
307 hr->LoadPage( wxT("Searcher2.conf") ); | |
308 this->ChangeValue( wxEmptyString ); | |
309 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
310 return; | |
311 } | |
312 if ( cmd.Cmp(wxT("t")) == 0 ) { | |
313 hr->LoadPage( wxT("html/todo.html") ); | |
314 this->ChangeValue( wxEmptyString ); | |
315 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
316 return; | |
317 } | |
318 if ( cmd.Cmp(wxT("l")) == 0 ) { | |
319 hr->LoadPage( wxT("db/log.txt") ); | |
320 this->ChangeValue( wxEmptyString ); | |
321 mf->m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
322 return; | |
323 } | |
324 if ( cmd.Cmp(wxT("**")) == 0 ) { | |
325 mf->m_statusBar->SetStatusText( wxT("Now Saving..."), 0 ); | |
326 mf->Close(); | |
327 return; | |
328 } | |
329 | |
330 mf->m_statusBar->SetStatusText( wxT("不適切な入力です."), 0 ); | |
331 this->SetSelection( 0, this->GetLastPosition() ); | |
332 | |
333 break; | |
334 } | |
335 // | |
336 default: { | |
337 break; | |
338 } | |
339 } | |
340 } | |
341 | |
342 ////////////////////////////////////////////////////////////////////////// | |
343 // frame constructor | |
344 MyFrame::MyFrame( wxWindow* parent, wxWindowID id, const wxString& title ) | |
345 : wxFrame( parent, id, title ) | |
346 { | |
347 this->SetSizeHints( wxDefaultSize, wxDefaultSize ); | |
348 // set the frame icon | |
349 SetIcon(wxICON(sample)); | |
350 | |
351 // メニューバー | |
352 m_menubar = new wxMenuBar(); | |
353 | |
354 m_menuFile = new wxMenu(); | |
355 m_menuFile->Append( ID_MUPHHS, wxT("被保険者DB更新"), wxT("Update hhs-db") ); | |
356 m_menuFile->Append( ID_MLSCCN, wxT("インデックス更新一覧"), wxT("List index") ); | |
357 m_menuFile->AppendSeparator(); //---- | |
358 wxMenu *menuMaintain = new wxMenu(); | |
359 m_menuFile->AppendSubMenu( menuMaintain, wxT("メンテナンス") ); | |
360 menuMaintain->Append( ID_MDBBKUP, wxT("データベースバックアップ"), wxT("Backup DBs") ); | |
361 menuMaintain->Append( ID_MDBOPT, wxT("データベース最適化"), wxT("Optimize DBs") ); | |
362 menuMaintain->Enable( ID_MDBOPT, false ); | |
363 menuMaintain->Append( ID_MCHKHHS, wxT("被保者整合性チェック"), wxT("Check hhs") ); | |
364 m_menuFile->AppendSeparator(); //---- | |
365 wxMenu *menuOpendir = new wxMenu(); | |
366 m_menuFile->AppendSubMenu( menuOpendir, wxT("フォルダを開く") ); | |
367 menuOpendir->Append( ID_MOAD, wxT("アプリケーションフォルダ"), wxT("Open App Folder") ); | |
368 menuOpendir->Append( ID_MODD, wxT("データフォルダ"), wxT("Open Data Folder") ); | |
369 m_menuFile->AppendSeparator(); //---- | |
370 m_menuFile->Append( wxID_EXIT, wxT("終了(&X)\tAlt-X"), wxT("Quit this program") ); | |
371 | |
372 m_menuHelp = new wxMenu(); | |
373 m_menuHelp->Append( ID_MHELP, wxT("&Help"), wxT("Show help") ); | |
374 m_menuHelp->Append( wxID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog") ); | |
375 | |
376 // now append the freshly created menu to the menu bar... | |
377 m_menubar->Append( m_menuFile, wxT("ファイル(&F)") ); | |
378 m_menubar->Append( m_menuHelp, wxT("ヘルプ(&H)") ); | |
379 | |
380 this->SetMenuBar( m_menubar ); | |
381 | |
382 // ツールバー | |
383 //m_toolBar = new wxToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxNO_BORDER ); | |
384 //wxBitmap bmpPrint( print_xpm ); | |
385 //wxBitmap bmpIndex( index_xpm ); | |
386 | |
387 // ステータスバー | |
388 int widths[] = { -1, 120, 100 }; | |
389 m_statusBar = this->CreateStatusBar( WXSIZEOF(widths), wxST_SIZEGRIP ); | |
390 m_statusBar->SetStatusWidths( WXSIZEOF(widths), widths ); | |
391 m_statusBar->SetStatusText( wxEmptyString, 0 ); | |
392 | |
393 wxBoxSizer* bSizer; | |
394 bSizer = new wxBoxSizer( wxVERTICAL ); | |
395 | |
396 // controls here | |
397 m_panelHead = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize ); | |
398 wxBoxSizer* bSizerHead; | |
399 bSizerHead = new wxBoxSizer( wxHORIZONTAL ); | |
400 | |
401 /* after version 2.7 | |
402 m_staticTextHname = new wxStaticText( m_panelHead, wxID_ANY, wxT("氏名カナ検索"), wxDefaultPosition, wxDefaultSize, 0 ); | |
403 bSizerHead->Add( m_staticTextHname, 0, wxALL, 5 ); | |
404 | |
405 m_searchCtrlHname = new wxSearchCtrl( m_panelHead, ID_SRCHHHS, wxT("3字以上入力"), wxDefaultPosition, wxSize(200,20), 0 ); | |
406 #ifndef __WXMAC__ | |
407 m_searchCtrlHname->ShowSearchButton( true ); | |
408 #endif | |
409 bSizerHead->Add( m_searchCtrlHname, 0, wxALL, 1 ); | |
410 | |
411 m_bitmapMkidx = new wxStaticBitmap( m_panelHead, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); | |
412 bSizerHead->Add( m_bitmapMkidx, 0, wxALL, 1 ); | |
413 */ | |
414 | |
415 bSizerHead->AddStretchSpacer( 1 ); // spacer | |
416 | |
417 m_staticTextIdx = new wxStaticText( m_panelHead, wxID_ANY, wxT("インデックス"), wxDefaultPosition, wxDefaultSize, 0 ); | |
418 bSizerHead->Add( m_staticTextIdx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); | |
419 | |
420 m_datePicker = new wxDatePickerCtrl( m_panelHead, ID_DTIDX, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_SHOWCENTURY|wxDP_DROPDOWN ); | |
421 bSizerHead->Add( m_datePicker, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); | |
422 | |
423 m_buttonMkidx = new wxButton( m_panelHead, ID_MKIDX, wxT("作成"), wxDefaultPosition, wxSize(50,25), 0 ); | |
424 bSizerHead->Add( m_buttonMkidx, 0, wxALL, 5 ); | |
425 | |
426 m_panelHead->SetSizer( bSizerHead ); | |
427 m_panelHead->Layout(); | |
428 bSizerHead->Fit( m_panelHead ); | |
429 | |
430 // メインペイン | |
431 wxBoxSizer* bSizerHtml; | |
432 bSizerHtml = new wxBoxSizer( wxVERTICAL ); | |
433 m_splitter = new wxSplitterWindow( this, ID_SPLT, wxDefaultPosition, wxDefaultSize, 0 ); | |
434 | |
435 // 検索結果Html | |
436 m_html = new wxHtmlWindow( m_splitter, ID_HTML, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO ); | |
437 m_html->LoadPage( wxT("html/start.html") ); | |
438 | |
439 /* after version 2.7 | |
440 // 被保険者カナ検索Grid | |
441 m_gridHhs = new wxGrid( m_panelHtml, ID_HLST, wxDefaultPosition, wxDefaultSize, 0 ); | |
442 m_gridHhs->CreateGrid( 0, 5 ); | |
443 m_gridHhs->EnableEditing( true ); | |
444 m_gridHhs->EnableGridLines( true ); | |
445 m_gridHhs->EnableDragGridSize( false ); | |
446 m_gridHhs->SetMargins( 0, 0 ); | |
447 | |
448 // Columns | |
449 m_gridHhs->AutoSizeColumns(); | |
450 m_gridHhs->EnableDragColMove( false ); | |
451 m_gridHhs->SetColLabelValue( 0, wxT("番号") ); | |
452 m_gridHhs->SetColLabelValue( 1, wxT("氏名") ); | |
453 m_gridHhs->SetColLabelValue( 2, wxT("カナ") ); | |
454 m_gridHhs->SetColLabelValue( 3, wxT("生年月日") ); | |
455 m_gridHhs->SetColLabelValue( 4, wxT("住所") ); | |
456 m_gridHhs->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); | |
457 | |
458 // Cell Defaults | |
459 m_gridHhs->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_BOTTOM ); | |
460 m_gridHhs->Hide(); | |
461 | |
462 bSizerHtml->Add( m_gridHhs, 0, wxALL, 5 ); | |
463 */ | |
464 | |
465 // 審査会合議体表示Grid | |
466 m_gridCcn = new wxGrid( m_splitter, ID_CCN, wxDefaultPosition, wxDefaultSize, 0 ); | |
467 m_gridCcn->CreateGrid( 0, 2 ); | |
468 m_gridCcn->EnableEditing( true ); | |
469 m_gridCcn->EnableGridLines( true ); | |
470 m_gridCcn->EnableDragGridSize( false ); | |
471 m_gridCcn->SetMargins( 0, 0 ); | |
472 m_gridCcn->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_BOTTOM ); | |
473 m_gridCcn->Show(false); | |
474 | |
475 // Columns | |
476 m_gridCcn->AutoSizeColumns(); | |
477 m_gridCcn->EnableDragColMove( false ); | |
478 m_gridCcn->SetColLabelValue( 0, wxT("審査会年月日") ); | |
479 m_gridCcn->SetColLabelValue( 1, wxT("DB更新時刻") ); | |
480 m_gridCcn->SetColSize( 0, 100 ); | |
481 m_gridCcn->SetColSize( 1, 200 ); | |
482 m_gridCcn->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); | |
483 | |
484 m_splitter->Initialize( m_html ); | |
485 m_splitter->SetSizer( bSizerHtml ); | |
486 m_splitter->Layout(); | |
487 bSizerHtml->Fit( m_splitter ); | |
488 | |
489 // コマンドライン | |
490 m_panelCmd = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize ); | |
491 wxBoxSizer* bSizerCmd; | |
492 bSizerCmd = new wxBoxSizer( wxHORIZONTAL ); | |
493 | |
494 m_staticTextCmd = new wxStaticText( m_panelCmd, wxID_ANY, wxT("コマンド?"), wxDefaultPosition, wxDefaultSize, 0 ); | |
495 bSizerCmd->Add( m_staticTextCmd, 0, wxALL, 5 ); | |
496 | |
497 m_cmdbox = new MyCmdBox( m_panelCmd, ID_CMD, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); | |
498 bSizerCmd->Add( m_cmdbox, 1, wxALL, 3 ); | |
499 m_cmdbox->SetFocus(); | |
500 | |
501 m_panelCmd->SetSizer( bSizerCmd ); | |
502 m_panelCmd->Layout(); | |
503 bSizerCmd->Fit( m_panelCmd ); | |
504 | |
505 | |
506 bSizer->Add( m_panelHead, 0, wxEXPAND|wxTOP, 1 ); | |
507 bSizer->Add( m_splitter, 1, wxEXPAND|wxALL, 1 ); | |
508 bSizer->Add( m_panelCmd, 0, wxEXPAND|wxALL, 0 ); | |
509 | |
510 this->SetSizer( bSizer ); | |
511 this->Layout(); | |
512 } | |
513 | |
514 // destructor | |
515 MyFrame::~MyFrame() | |
516 { | |
517 } | |
518 | |
519 // Event Table | |
520 BEGIN_EVENT_TABLE( MyFrame, wxFrame ) | |
521 EVT_MENU( wxID_EXIT, MyFrame::OnQuit ) | |
522 EVT_MENU( wxID_ABOUT, MyFrame::OnAbout ) | |
523 EVT_MENU( ID_MUPHHS, MyFrame::OnUpdateHhsDb ) | |
524 EVT_MENU( ID_MLSCCN, MyFrame::OnListCcn ) | |
525 EVT_MENU( ID_MDBBKUP, MyFrame::OnBackupDB ) | |
526 EVT_MENU( ID_MDBOPT, MyFrame::OnOptimizeDB ) | |
527 EVT_MENU( ID_MCHKHHS, MyFrame::OnCheckHhs ) | |
528 EVT_MENU( ID_MOAD, MyFrame::OnOpenAppDir ) | |
529 EVT_MENU( ID_MODD, MyFrame::OnOpenDataDir ) | |
530 EVT_MENU( ID_MHELP, MyFrame::OnHelp ) | |
531 | |
532 //EVT_TEXT_ENTER( ID_SRCHHHS, MyFrame::OnHhsSearch ) after version 2.7 | |
533 EVT_BUTTON( ID_MKIDX, MyFrame::OnMkIndex ) | |
534 | |
535 EVT_CLOSE( MyFrame::SaveConfig ) | |
536 END_EVENT_TABLE() | |
537 | |
538 // Event Handlers | |
539 /* 終了 */ | |
540 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) | |
541 { | |
542 Close(true); | |
543 } | |
544 | |
545 /* オンラインヘルプ */ | |
546 void MyFrame::OnHelp(wxCommandEvent& WXUNUSED(event)) | |
547 { | |
548 HtmlHelpFrame *f = (HtmlHelpFrame*)FindWindowById( ID_HELP ); | |
549 | |
550 if ( f == NULL ) { | |
551 HtmlHelpFrame *helpframe = new HtmlHelpFrame( wxT("Online Help"), ID_HELP ); | |
552 helpframe->Show(true); | |
553 } | |
554 else { | |
555 f->Raise(); | |
556 } | |
557 } | |
558 | |
559 /* バージョン情報 */ | |
560 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) | |
561 { | |
562 wxSQLite3Database sqlite; | |
563 wxMessageBox( | |
564 wxString::Format( | |
565 wxT("Version %d.%d ( build %d ) by %s\n") | |
566 wxT("with SQLite library %s\n") | |
567 wxT("running under %s."), | |
568 VER, REV, BLD, wxVERSION_STRING, | |
569 sqlite.GetVersion().c_str(), | |
570 wxGetOsDescription().c_str() | |
571 ), | |
572 wxT("About this program"), wxOK | wxICON_INFORMATION, this ); | |
573 } | |
574 | |
575 /* 被保険者検索 */ | |
576 /* after version 2.7 | |
577 void MyFrame::OnHhsSearch(wxCommandEvent& WXUNUSED(event)) | |
578 { | |
579 this->m_html->Hide(); | |
580 this->m_gridCcn->Hide(); | |
581 this->m_gridHhs->Show(true); | |
582 | |
583 wxString gszFile = wxGetCwd() + wxT("/db/hhs.db"); | |
584 wxSQLite3Database hhsdb; | |
585 hhsdb.Open( gszFile ); | |
586 | |
587 wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT count(*) FROM hhs_master WHERE kana LIKE ?"); | |
588 stmt.Bind( 1, this->m_searchCtrlHname->GetValue() ); | |
589 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
590 wxString cnt = q.GetString(0); | |
591 | |
592 if ( cnt.Cmp(wxT("0")) == '0' ) { | |
593 wxString msg = cnt + wxT("指定した条件の被保険者はいませんでした."); | |
594 } | |
595 else { | |
596 wxString msg = cnt + wxT("件マッチしました."); | |
597 return ; // test now | |
598 | |
599 stmt = hhsdb.PrepareStatement("SELECT hhs, name, kana, addr, birth, sex FROM hhs_master ORDER BY birth DESC"); | |
600 q = stmt.ExecuteQuery(); | |
601 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
602 while ( q.NextRow() ) { | |
603 wxString hhs = q.GetString(0); | |
604 wxString name = q.GetString(1); | |
605 wxString kana = q.GetString(2); | |
606 wxString addr = q.GetString(3); | |
607 wxString birth = q.GetString(4); | |
608 wxString sex = q.GetString(5); | |
609 // ここに gridに 追加するコード | |
610 } | |
611 } | |
612 | |
613 stmt.Finalize(); | |
614 hhsdb.Close(); | |
615 } | |
616 */ | |
617 | |
618 /* インデックス作成 */ | |
619 void MyFrame::OnMkIndex(wxCommandEvent& WXUNUSED(event)) | |
620 { | |
621 wxDateTime dt = m_datePicker->GetValue(); | |
622 wxString month = dt.Format(wxT("%m")); | |
623 wxString year = dt.Format(wxT("%Y")); | |
624 if ( month.IsSameAs(wxT("01")) || month.IsSameAs(wxT("02")) || month.IsSameAs(wxT("03")) ) { | |
625 long y; | |
626 year.ToLong( &y, 10 ); | |
627 y--; | |
628 year = wxString::Format(wxT("%d"),y); | |
629 } | |
630 wxString pathroot = wxGetApp().rootdir + wxFILE_SEP_PATH + year + dt.Format(wxT("\\%Y%m%d")); | |
631 wxDir rootd(pathroot); | |
632 if ( !wxDir::Exists(pathroot) ) { | |
633 wxMessageBox( wxT("フォルダが存在しません.")+pathroot ); | |
634 return; | |
635 } | |
636 | |
637 wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), 200, this, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE ); | |
638 pd.SetSize( wxSize(320,140) ); | |
639 int count=0; | |
640 | |
641 wxString ccndir; | |
642 bool cont = rootd.GetFirst( &ccndir, wxT("*.*"), wxDIR_DIRS ); | |
643 while ( cont ) { | |
644 wxString gszFile = wxGetCwd() + wxT("/db/ccn.db"); | |
645 wxSQLite3Database ccndb; | |
646 ccndb.Open( gszFile ); | |
647 | |
648 wxSQLite3Statement stmt = ccndb.PrepareStatement("INSERT OR REPLACE INTO ccn VALUES( ?, datetime('now','localtime') )"); | |
649 stmt.Bind( 1, dt.Format(wxT("%Y-%m-%d")) ); | |
650 stmt.ExecuteQuery(); | |
651 | |
652 stmt.Finalize(); | |
653 | |
654 wxDir ccnd( pathroot + wxFILE_SEP_PATH + ccndir ); | |
655 if ( !ccnd.IsOpened() ) return; | |
656 wxString hhsdir; | |
657 bool c = ccnd.GetFirst( &hhsdir, wxT("*.*"), wxDIR_DIRS ); | |
658 wxRegEx reHhs(wxT("^0[1238][0-9]{8}$")); // 被保番チェック | |
659 while ( c ) { | |
660 if ( reHhs.Matches(hhsdir) ) { | |
661 wxString path = pathroot + wxFILE_SEP_PATH + ccndir + wxFILE_SEP_PATH + hhsdir; | |
662 | |
663 stmt = ccndb.PrepareStatement("INSERT OR REPLACE INTO path VALUES( ?, ? )"); | |
664 stmt.Bind( 1, hhsdir ); | |
665 stmt.Bind( 2, path ); | |
666 stmt.ExecuteQuery(); | |
667 | |
668 stmt.Finalize(); | |
669 } | |
670 c = ccnd.GetNext(&hhsdir); | |
671 pd.Update( count++, hhsdir+wxT("@")+ccndir+wxT("を処理しました.") ); | |
672 } | |
673 ccndb.Close(); | |
674 | |
675 cont = rootd.GetNext(&ccndir); | |
676 } | |
677 wxMessageBox(wxT("インデックス作成が終了しました.")); | |
678 } | |
679 | |
680 /* インデックス更新一覧 */ | |
681 void MyFrame::OnListCcn(wxCommandEvent& WXUNUSED(event)) | |
682 { | |
683 this->m_splitter->ReplaceWindow( this->m_html, this->m_gridCcn ); | |
684 this->m_gridCcn->Show(true); | |
685 this->m_html->Show(false); | |
686 MyCmdBox *c = (MyCmdBox*)FindWindowById( ID_CMD ); | |
687 c->Clear(); | |
688 | |
689 wxString gszFile = wxGetCwd() + wxT("/db/ccn.db"); | |
690 wxSQLite3Database ccndb; | |
691 ccndb.Open( gszFile ); | |
692 | |
693 wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT ymd, time FROM ccn ORDER BY ymd DESC, time DESC"); | |
694 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
695 int r=0; | |
696 while ( q.NextRow() ) { | |
697 wxString ymd = q.GetString(0); | |
698 wxString time = q.GetString(1); | |
699 this->m_gridCcn->AppendRows(1); | |
700 this->m_gridCcn->SetCellValue(r,0,ymd); | |
701 this->m_gridCcn->SetCellValue(r,1,time); | |
702 r++; | |
703 } | |
704 | |
705 stmt.Finalize(); | |
706 ccndb.Close(); | |
707 } | |
708 | |
709 /* 被保険者DB更新 */ | |
710 void MyFrame::OnUpdateHhsDb(wxCommandEvent& WXUNUSED(event)) | |
711 { | |
712 FrameHhsDB *f = (FrameHhsDB*)FindWindowById( ID_HHSDB ); | |
713 | |
714 if ( f == NULL ) { | |
715 FrameHhsDB *hhsdb = new FrameHhsDB( this, ID_HHSDB ); | |
716 hhsdb->Show(true); | |
717 } | |
718 else { | |
719 f->Raise(); | |
720 } | |
721 return; | |
722 } | |
723 | |
724 /* 被保険者整合性チェック */ | |
725 void MyFrame::OnCheckHhs(wxCommandEvent& WXUNUSED(event)) | |
726 { | |
727 wxString logfn = wxGetCwd() + wxT("/db/checkhhs.log"); | |
728 wxTextFile logFile; | |
729 logFile.Open( logfn ); | |
730 logFile.Clear(); | |
731 | |
732 wxString gszFile = wxGetCwd() + wxT("/db/ccn.db"); | |
733 wxSQLite3Database ccndb; | |
734 ccndb.Open( gszFile ); | |
735 wxSQLite3Statement stmt = ccndb.PrepareStatement("ATTACH 'db/hhs.db' AS hhs"); | |
736 wxSQLite3ResultSet q = stmt.ExecuteQuery(); | |
737 stmt = ccndb.PrepareStatement("SELECT hhsno FROM path EXCEPT SELECT hhsno FROM hhs.hhs_master"); | |
738 q = stmt.ExecuteQuery(); | |
739 | |
740 while ( q.NextRow() ) { | |
741 logFile.AddLine( q.GetString(0) ); | |
742 } | |
743 stmt.Finalize(); | |
744 ccndb.Close(); | |
745 | |
746 logFile.Write(); | |
747 logFile.Close(); | |
748 | |
749 wxString msg = wxT("結果を ") + logfn + wxT(" に保存しました."); | |
750 wxMessageBox( msg ); | |
751 return; | |
752 } | |
753 | |
754 /* DBバックアップ */ | |
755 void MyFrame::OnBackupDB(wxCommandEvent& WXUNUSED(event)) | |
756 { | |
757 wxDateTime now = wxDateTime::Now(); | |
758 wxString nowstr = now.Format(wxT("%Y%m%d%H%M%S")); | |
759 | |
760 wxString org = wxGetCwd() + wxT("/db/ccn.db"); | |
761 wxString bk = wxGetCwd() + wxT("/db/") + nowstr + wxT("_ccn.db"); | |
762 wxCopyFile( org, bk, 0 ); | |
763 | |
764 org = wxGetCwd() + wxT("/db/hhs.db"); | |
765 bk = wxGetCwd() + wxT("/db/") + nowstr + wxT("_hhs.db"); | |
766 wxCopyFile( org, bk, 0 ); | |
767 | |
768 wxMessageBox( wxT("バックアップ終了.") ); | |
769 return; | |
770 } | |
771 | |
772 /* DB最適化 */ | |
773 void MyFrame::OnOptimizeDB(wxCommandEvent& WXUNUSED(event)) | |
774 { | |
775 return; | |
776 } | |
777 | |
778 /* アプリケーションフォルダを開く */ | |
779 void MyFrame::OnOpenAppDir(wxCommandEvent& WXUNUSED(event)) | |
780 { | |
781 wxStandardPaths appdir; | |
782 wxString execmd = wxT("explorer ") + appdir.GetDataDir(); | |
783 wxExecute( execmd ); | |
784 return; | |
785 } | |
786 | |
787 /* データフォルダを開く */ | |
788 void MyFrame::OnOpenDataDir(wxCommandEvent& WXUNUSED(event)) | |
789 { | |
790 wxString datadir = wxGetApp().rootdir; | |
791 wxString execmd = wxT("explorer ") + datadir; | |
792 wxExecute( execmd ); | |
793 return; | |
794 } | |
795 | |
796 | |
797 /* 設定を保存 */ | |
798 void MyFrame::SaveConfig(wxCloseEvent& WXUNUSED(event)) | |
799 { | |
800 if ( !IsIconized() && !IsMaximized() ) { | |
801 wxGetApp().rect = this->GetRect(); | |
802 } | |
803 | |
804 int i = m_cmdbox->hist.GetCount(); | |
805 for ( int j=0; j<5; j++ ) { | |
806 wxGetApp().searchhist[j] = m_cmdbox->hist[--i]; | |
807 } | |
808 | |
809 Destroy(); | |
810 } | |
811 |