diff src/myframe.cpp @ 2:c066fde99517

Added Batch Print Mode.
author pyon@macmini
date Fri, 23 Aug 2013 18:32:09 +0900
parents 7b6dab24f4b8
children 1a64119ab257
line wrap: on
line diff
--- a/src/myframe.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/myframe.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,14 +1,16 @@
 // Filename   : myframe.cpp
-// Last Change: 04-Aug-2013.
+// Last Change: 23-Aug-2013.
 //
 #include "main.h"
 #include "db.h"
-#include "myframe.h"
 #include "about.h"
 #include "kana.h"
 #include "hist.h"
 #include "index.h"
 #include "mask.h"
+#include "marksheet.h"
+#include "myframe.h"
+#include "bprint.h"
 
 ///////////////////////////////////////////////////////////////
 // カスタム検索ボックス
@@ -44,36 +46,18 @@
         return;
     }
 
-    if ( event.GetKeyCode() == WXK_RETURN ) {
-
-        if ( s.IsSameAs( wxT("+") ) ) {
-            wxMessageBox(wxT("pripri"));
-            return;
-        }
-
-        wxRegEx reHhs( wxT("^0[1238][0-9]{8}$") );
-        if ( reHhs.Matches( s ) ) {
-            wxString t = GetHhsInfoByHhsNo( s );
-            wxArrayString array = GetPathByHhsNo( s );
-            wxMessageBox( t );
-            return;
-        }
-
-        wxRegEx reNo( wxT("^[0-9]{1,2}$") );
-        if ( reNo.Matches( s ) ) {
-            return;
-        }
-
-        //m_parent->SetStatusMessage(wxT("bad input"), 0 );
+    if ( event.GetKeyCode() == WXK_ESCAPE ) {    // clear by ESC
+        this->Clear();
         return;
     }
 
     event.Skip();
 }
 
+
 ///////////////////////////////////////////////////////////////
 // メインフレーム
-#define WINL_W 400
+#define WINL_W 480
 #define LOGO_W 200
 #define LOGO_H  92
 
@@ -86,6 +70,7 @@
     : wxFrame( parent, id, title, pos, size, style )
 {
 	this->SetSizeHints( wxSize( WINL_W, 500 ), wxDefaultSize );
+	this->SetMinSize( wxSize( WINL_W, 500 ) );
 	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) );
     //this->SetBackgroundColour( wxColour(wxT("WHEAT")) );
 	
@@ -96,18 +81,26 @@
 	m_menubar = new wxMenuBar( 0 );
 	m_menuFile = new wxMenu();
 
-	wxMenuItem* m_menuItemViewMode = new wxMenuItem( m_menuFile, ID_MNVIEW, wxString( wxT("ビューモード") ) , wxT("Toggle ViewMode"), wxITEM_CHECK );
-	m_menuFile->Append( m_menuItemViewMode );
+	wxMenuItem* m_menuItemBPrintMode = new wxMenuItem( m_menuFile, ID_MNBPNT, wxString( wxT("バッチ印刷モード\tF12") ) , wxT("Batch Print Mode"), wxITEM_NORMAL );
+	m_menuFile->Append( m_menuItemBPrintMode );
+
+	wxMenuItem* m_menuItemIndex = new wxMenuItem( m_menuFile, ID_MNINDEX, wxString( wxT("インデックス\tF11") ) , wxT("Update index"), wxITEM_NORMAL );
+	m_menuFile->Append( m_menuItemIndex );
 
     m_menuFile->AppendSeparator(); // ----
 
-	wxMenuItem* m_menuItemIndex = new wxMenuItem( m_menuFile, ID_MNINDEX, wxString( wxT("インデックス") ) , wxT("Update index"), wxITEM_NORMAL );
-	m_menuFile->Append( m_menuItemIndex );
+	wxMenuItem* m_menuItemViewStyle = new wxMenuItem( m_menuFile, ID_MNVIEW, wxString( wxT("ビュースタイル\tF10") ) , wxT("Toggle ViewStyle"), wxITEM_CHECK );
+	m_menuFile->Append( m_menuItemViewStyle );
+
+    m_menuFile->AppendSeparator(); // ----
 
-	wxMenuItem* m_menuItemMask = new wxMenuItem( m_menuFile, ID_MNMASKPARAM, wxString( wxT("マスクパラメータ") ) , wxT("Setup mask parameters"), wxITEM_NORMAL );
+	wxMenuItem* m_menuItemBkup = new wxMenuItem( m_menuFile, ID_MNDBBKUP, wxString( wxT("DBバックアップ(&B)") ) , wxT("Backup databases"), wxITEM_NORMAL );
+	m_menuFile->Append( m_menuItemBkup );
+
+	wxMenuItem* m_menuItemMask = new wxMenuItem( m_menuFile, ID_MNMASKPARAM, wxString( wxT("マスクパラメータ(&M)") ) , wxT("Setup mask parameters"), wxITEM_NORMAL );
 	m_menuFile->Append( m_menuItemMask );
 
-	wxMenuItem* m_menuItemAppDir = new wxMenuItem( m_menuFile, ID_MNAPPDIR, wxString( wxT("アプリケーションフォルダを開く") ) , wxT("Open application directory"), wxITEM_NORMAL );
+	wxMenuItem* m_menuItemAppDir = new wxMenuItem( m_menuFile, ID_MNAPPDIR, wxString( wxT("アプリケーションフォルダを開く(&O)") ) , wxT("Open application directory"), wxITEM_NORMAL );
 	m_menuFile->Append( m_menuItemAppDir );
 	
     m_menuFile->AppendSeparator(); // ----
@@ -123,23 +116,23 @@
 	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );
 	
 	m_splitter = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D );
-	wxBoxSizer* bSizerL = new wxBoxSizer( wxVERTICAL );
+	wxBoxSizer* bSizerMain = new wxBoxSizer( wxVERTICAL );
 	
     // left-pane
-	m_panelL = new wxPanel( m_splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+	m_panelMain = new wxPanel( m_splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
 	
     wxString logo = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("logo.png");
     wxBitmap bmp = wxBitmap( logo, wxBITMAP_TYPE_PNG );
-	m_bitmap = new wxStaticBitmap( m_panelL, wxID_ANY, bmp, wxDefaultPosition, wxSize( LOGO_W, LOGO_H ), 0 );
-	bSizerL->Add( m_bitmap, 0, wxALL, 5 );
+	m_bitmap = new wxStaticBitmap( m_panelMain, wxID_ANY, bmp, wxDefaultPosition, wxSize( LOGO_W, LOGO_H ), 0 );
+	bSizerMain->Add( m_bitmap, 0, wxALL, 5 );
 	
-	m_textCtrlName = new wxTextCtrl( m_panelL, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 200, -1 ), 0 );
-	bSizerL->Add( m_textCtrlName, 0, wxALL, 5 );
+	m_textCtrlName = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 200, -1 ), 0 );
+	bSizerMain->Add( m_textCtrlName, 0, wxALL, 5 );
 	
-	m_textCtrlAddr = new wxTextCtrl( m_panelL, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 380, -1 ), 0 );
-	bSizerL->Add( m_textCtrlAddr, 0, wxALL, 5 );
+	m_textCtrlAddr = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 380, -1 ), 0 );
+	bSizerMain->Add( m_textCtrlAddr, 0, wxALL, 5 );
 	
-	m_listCtrl = new wxListCtrl( m_panelL, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT );
+	m_listCtrl = new wxListCtrl( m_panelMain, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT );
     wxListItem itemCol;
     itemCol.SetText( wxT("通番") );
     m_listCtrl->InsertColumn( 0, itemCol );
@@ -150,49 +143,50 @@
     itemCol.SetText( wxT("場所") );
     m_listCtrl->InsertColumn( 2, itemCol );
     m_listCtrl->SetColumnWidth( 2, 300 );
-	bSizerL->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
+	bSizerMain->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
 	
 	wxBoxSizer* bSizerCmd = new wxBoxSizer( wxHORIZONTAL );
 	
-	m_staticText = new wxStaticText( m_panelL, wxID_ANY, wxT("コマンド?"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText = new wxStaticText( m_panelMain, wxID_ANY, wxT("コマンド?"), wxDefaultPosition, wxDefaultSize, 0 );
 	bSizerCmd->Add( m_staticText, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_searchBox = new MySearchBox( m_panelL, ID_SEARCH, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
+	m_searchBox = new MySearchBox( m_panelMain, ID_SEARCH, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
 	#ifndef __WXMAC__
 	m_searchBox->ShowSearchButton( true );
 	#endif
 	m_searchBox->ShowCancelButton( false );
     m_searchBox->SetFocus();
-	bSizerCmd->Add( m_searchBox, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	bSizerCmd->Add( m_searchBox, 1, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_buttonKana = new wxButton( m_panelL, ID_KANA, wxT("カナ検索"), wxDefaultPosition, wxSize( 65, -1 ), 0 );
+	m_buttonKana = new wxButton( m_panelMain, ID_KANA, wxT("カナ検索"), wxDefaultPosition, wxSize( 65, -1 ), 0 );
 	bSizerCmd->Add( m_buttonKana, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 20 );
 	
-	m_buttonHist = new wxButton( m_panelL, ID_HIST, wxT("検索履歴"), wxDefaultPosition, wxSize( 65, -1 ), 0 );
+	m_buttonHist = new wxButton( m_panelMain, ID_HIST, wxT("検索履歴"), wxDefaultPosition, wxSize( 65, -1 ), 0 );
 	bSizerCmd->Add( m_buttonHist, 0, wxALL, 5 );
 	
-	bSizerL->Add( bSizerCmd, 0, wxEXPAND, 5 );
+	bSizerMain->Add( bSizerCmd, 0, wxEXPAND, 5 );
 	
-	m_panelL->SetSizer( bSizerL );
-	m_panelL->Layout();
-	bSizerL->Fit( m_panelL );
+	m_panelMain->SetSizer( bSizerMain );
+	m_panelMain->Layout();
+	bSizerMain->Fit( m_panelMain );
 
     // right-pane
-	m_panelR = new wxPanel( m_splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
-	wxBoxSizer* bSizerR = new wxBoxSizer( wxHORIZONTAL );
-	
-	m_bitmapView = new wxStaticBitmap( m_panelR, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerR->Add( m_bitmapView, 1, wxALL|wxEXPAND, 5 );
+	m_panelView = new wxPanel( m_splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+	wxBoxSizer* bSizerView = new wxBoxSizer( wxHORIZONTAL );
+
+	m_bitmapView = new wxStaticBitmap( m_panelView, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerView->Add( m_bitmapView, 1, wxALL|wxEXPAND, 5 );
 	
-	m_listCtrlThumb = new wxListCtrl( m_panelR, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ICON );
-	bSizerR->Add( m_listCtrlThumb, 0, wxALL|wxEXPAND, 5 );
+	m_listCtrlThumb = new wxListCtrl( m_panelView, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ICON );
+	bSizerView->Add( m_listCtrlThumb, 0, wxALL|wxEXPAND, 5 );
 	
-	m_panelR->SetSizer( bSizerR );
-	m_panelR->Layout();
-	bSizerR->Fit( m_panelR );
+	m_panelView->SetSizer( bSizerView );
+	m_panelView->Layout();
+	bSizerView->Fit( m_panelView );
 
-    m_panelR->Show( false );
-    m_splitter->Initialize( m_panelL );
+    m_panelView->Show( false );
+    //
+    m_splitter->Initialize( m_panelMain );
 	bSizerTop->Add( m_splitter, 1, wxEXPAND, 5 );
 	
 	this->SetSizer( bSizerTop );
@@ -200,7 +194,7 @@
 
     // ステータスバー Statusbar
 	m_statusBar = new  wxStatusBar( this, wxID_ANY, wxST_SIZEGRIP );
-    int widths[] = { 200, 100, -1, 90 };
+    int widths[] = { 200, -1, 10, 90 };
     m_statusBar->SetFieldsCount( 4, widths );
     this->SetStatusBar( m_statusBar );
     SetStatusText( wxT("被保番を入力してスタート!") );
@@ -217,25 +211,57 @@
 BEGIN_EVENT_TABLE( MyFrame, wxFrame )
     EVT_MENU( ID_MNABOUT, MyFrame::OnAbout )
     EVT_MENU( wxID_EXIT, MyFrame::OnQuit )
-    EVT_MENU( ID_MNVIEW, MyFrame::OnViewMode )
+    EVT_MENU( ID_MNBPNT, MyFrame::OnBPrintMode )
+    EVT_MENU( ID_MNVIEW, MyFrame::OnViewStyle )
     EVT_MENU( ID_MNINDEX, MyFrame::OnIndex )
+    EVT_MENU( ID_MNDBBKUP, MyFrame::OnDBBackup )
     EVT_MENU( ID_MNMASKPARAM, MyFrame::OnMaskParam )
     EVT_MENU( ID_MNAPPDIR, MyFrame::OnOpenAppDir )
-    EVT_LIST_ITEM_ACTIVATED( ID_LIST, MyFrame::OnOpenHhsDir )
+    EVT_LIST_ITEM_ACTIVATED( ID_LIST, MyFrame::OnSelectHhsDir )
     EVT_BUTTON( ID_KANA, MyFrame::OnKana )
     EVT_BUTTON( ID_HIST, MyFrame::OnHistory )
     EVT_SIZE( MyFrame::OnWinSize )
     EVT_MOVE( MyFrame::OnWinMove )
     EVT_CLOSE( MyFrame::SaveConfig )
+    EVT_TEXT_ENTER( ID_SEARCH, MyFrame::OnCommand )
 END_EVENT_TABLE()
 
 // Event Handlers & Functions
-/* インデックス作成ダイアログ */
-void MyFrame::OnIndex( wxCommandEvent& WXUNUSED(event) )
+/* エンターキーフック */
+void MyFrame::OnCommand( wxCommandEvent& event )
 {
-    IndexDialog* index = new IndexDialog( this, wxID_ANY, wxT("インデックス作成"), wxDefaultPosition, wxSize( 500, 600 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
-    index->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
-    index->ShowModal();
+    wxString s = m_searchBox->GetValue();
+
+    if ( s.IsSameAs( wxT("99") ) ) {
+        Close();
+        return;
+    }
+
+    if ( s.IsSameAs( wxT("+") ) ) {
+        PrintImages( m_hhsno );
+        return;
+    }
+
+    wxRegEx reHhs( wxT("^0[1238][0-9]{8}$") );
+    if ( reHhs.Matches( s ) ) {
+        m_hhsno = s;
+        UpdateList( m_hhsno );
+        return;
+    }
+
+    wxRegEx reNo( wxT("^[0-9]{1,2}$") );
+    if ( reNo.Matches( s ) ) {
+        long n;
+        s.ToLong( &n, 10 );
+        n--;
+        OpenHhsDir( (int)n );
+        return;
+    }
+
+    SetStatusMessage( wxT("不適切な入力です."), 0 );
+    return;
+
+    event.Skip();
 }
 /* マスクパラメータを設定ファイルから読み込む */
 void MyFrame::LoadMaskParam( void )
@@ -268,21 +294,129 @@
     m_mask3.SetPosition( wxPoint( x, y ) );
     m_mask3.SetSize( wxSize( w, h ) );
 
+    config->Read( wxT("x1o"), &x );
+    config->Read( wxT("y1o"), &y );
+    config->Read( wxT("w1o"), &w );
+    config->Read( wxT("h1o"), &h );
+    m_mask1old.SetPosition( wxPoint( x, y ) );
+    m_mask1old.SetSize( wxSize( w, h ) );
+
+    config->Read( wxT("x2o"), &x );
+    config->Read( wxT("y2o"), &y );
+    config->Read( wxT("w2o"), &w );
+    config->Read( wxT("h2o"), &h );
+    m_mask2old.SetPosition( wxPoint( x, y ) );
+    m_mask2old.SetSize( wxSize( w, h ) );
+
+    config->Read( wxT("x3o"), &x );
+    config->Read( wxT("y3o"), &y );
+    config->Read( wxT("w3o"), &w );
+    config->Read( wxT("h3o"), &h );
+    m_mask3old.SetPosition( wxPoint( x, y ) );
+    m_mask3old.SetSize( wxSize( w, h ) );
+}
+/* 印刷 */
+void MyFrame::PrintImages( wxString hhsno )
+{
+    // 印刷用の html を作成
+    wxArrayString path = GetPathByHhsNo( hhsno );
+    if ( path.IsEmpty() ) return;
+
+    wxDir dir( path[0] );
+    if ( !dir.IsOpened() ) return;
+
+    wxString html;
+    html = html + wxT("<html><body>\n");
+
+    wxString file;
+    bool cout = dir.GetFirst( &file, wxT("*.jpg"), wxDIR_FILES );
+    int n = 0;
+    wxString tmpdir = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH;
+    while ( cout ) {
+        file = path[0] + wxFILE_SEP_PATH + file;
+        file.Replace( wxFILE_SEP_PATH, wxT("/") );
+        wxString tmpjpg = wxString::Format( wxT("%stmp%d.jpg"), tmpdir, n );
+        
+        if ( n == 0 ) {       // 1枚目はマスクする
+            wxImage img_org( file, wxBITMAP_TYPE_JPEG );
+            int ver = GetMarksheetVersion( file );
+            if ( ver == 2 ) {
+                img_org.SetRGB( m_mask1, 255, 255, 255 );   // cm name
+                img_org.SetRGB( m_mask2, 255, 255, 255 );   // cm no.
+                img_org.SetRGB( m_mask3, 255, 255, 255 );   // barcode
+            }
+            else {  // 古いマークシート ver == 1
+                img_org.SetRGB( m_mask1old, 255, 255, 255 );   // cm name
+                img_org.SetRGB( m_mask2old, 255, 255, 255 );   // cm no.
+                img_org.SetRGB( m_mask3old, 255, 255, 255 );   // barcode
+            }
+            img_org.SaveFile( tmpjpg );
+        }
+        else {
+            wxCopyFile( file, tmpjpg, true );
+        }
+        html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>");
+        cout = dir.GetNext( &file );
+        n++;
+    }
+    html = html + wxT("</body></html>");
+
+    // start printing
+    wxHtmlPrintout hpout( wxT("Searcher03") );
+    hpout.SetMargins( 0, 0, 0, 0, 0 );
+    wxPrintDialogData pd;
+    wxPrinter p( &pd );
+
+    hpout.SetHtmlText( html, wxEmptyString, false );
+    p.Print( NULL, &hpout, true );
+
+    // end
+    SetStatusMessage( wxT("被保番かフォルダ番号を."), 0 );
+}
+/* 一括印刷モード */
+void MyFrame::OnBPrintMode( wxCommandEvent& WXUNUSED(event) )
+{
+    FrameBatchPrint* bp = new FrameBatchPrint( this, wxID_ANY, wxT("一括印刷"), wxDefaultPosition, wxSize( 640, 500 ), wxCAPTION|wxFRAME_NO_TASKBAR );
+    bp->SetMask1( m_mask1 );
+    bp->SetMask2( m_mask2 );
+    bp->SetMask3( m_mask3 );
+    bp->SetMask1Old( m_mask1old );
+    bp->SetMask2Old( m_mask2old );
+    bp->SetMask3Old( m_mask3old );
+    bp->Show( true );
+}
+/* インデックス作成ダイアログ */
+void MyFrame::OnIndex( wxCommandEvent& WXUNUSED(event) )
+{
+    wxString rootdir;
+    config->SetPath( wxT("/Index") );
+    config->Read( wxT("rootdir"), &rootdir );
+
+    IndexDialog* index = new IndexDialog( this, wxID_ANY, wxT("インデックス作成"), wxDefaultPosition, wxSize( 700, 600 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+    index->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
+    index->SetRootdir( rootdir );
+    index->ShowModal();
 }
 /* マスクパラメータ設定ダイアログ */
 void MyFrame::OnMaskParam( wxCommandEvent& WXUNUSED(event) )
 {
-    MaskDialog* mask = new MaskDialog( this, wxID_ANY, wxT("マスク位置とサイズの指定"), wxDefaultPosition, wxSize( 400, 210 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+    MaskDialog* mask = new MaskDialog( this, wxID_ANY, wxT("マスク位置とサイズの指定"), wxDefaultPosition, wxSize( 350, 250 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
     mask->SetMask1( m_mask1 );
     mask->SetMask2( m_mask2 );
     mask->SetMask3( m_mask3 );
+    mask->SetMask1Old( m_mask1old );
+    mask->SetMask2Old( m_mask2old );
+    mask->SetMask3Old( m_mask3old );
     mask->LoadParams();
     mask->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
 
     if ( mask->ShowModal() == wxID_OK ) {
-        m_mask1 = mask->GetMask1();
-        m_mask2 = mask->GetMask2();
-        m_mask3 = mask->GetMask3();
+        m_mask1    = mask->GetMask1();
+        m_mask2    = mask->GetMask2();
+        m_mask3    = mask->GetMask3();
+        m_mask1old = mask->GetMask1Old();
+        m_mask2old = mask->GetMask2Old();
+        m_mask3old = mask->GetMask3Old();
 
         config->SetPath( wxT("/Mask") );
 
@@ -301,9 +435,44 @@
         config->Write( wxT("w3"), m_mask3.GetWidth() );
         config->Write( wxT("h3"), m_mask3.GetHeight() );
 
-        delete config;
+        config->Write( wxT("x1o"), m_mask1old.GetX() );
+        config->Write( wxT("y1o"), m_mask1old.GetY() );
+        config->Write( wxT("w1o"), m_mask1old.GetWidth() );
+        config->Write( wxT("h1o"), m_mask1old.GetHeight() );
+
+        config->Write( wxT("x2o"), m_mask2old.GetX() );
+        config->Write( wxT("y2o"), m_mask2old.GetY() );
+        config->Write( wxT("w2o"), m_mask2old.GetWidth() );
+        config->Write( wxT("h2o"), m_mask2old.GetHeight() );
+
+        config->Write( wxT("x3o"), m_mask3old.GetX() );
+        config->Write( wxT("y3o"), m_mask3old.GetY() );
+        config->Write( wxT("w3o"), m_mask3old.GetWidth() );
+        config->Write( wxT("h3o"), m_mask3old.GetHeight() );
+
+        config->Flush( false );
     }
 }
+/* データベースファイルのバックアップ */
+void MyFrame::OnDBBackup( wxCommandEvent& WXUNUSED(event) )
+{
+    wxDateTime now = wxDateTime::Now();
+    wxString str = now.Format( wxT("%Y%m%d%H%M%S") );
+
+    wxString org, bk;
+    wxString dbdir = wxGetCwd() + wxFILE_SEP_PATH + wxT("db");
+
+    org = dbdir + wxFILE_SEP_PATH + wxT("hhs.db");
+    bk  = dbdir + wxFILE_SEP_PATH + str + wxT("_hhs.db");
+    wxCopyFile( org, bk, false );
+
+    org = dbdir + wxFILE_SEP_PATH + wxT("ccn.db");
+    bk  = dbdir + wxFILE_SEP_PATH + str + wxT("_ccn.db");
+    wxCopyFile( org, bk, false );
+    
+    wxMessageBox( wxT("バックアップ終了.") );
+    return;
+}
 /* アプリフォルダを開く */
 void MyFrame::OnOpenAppDir( wxCommandEvent& WXUNUSED(event) )
 {
@@ -311,14 +480,14 @@
     wxString execmd = wxT("explorer ") + appdir;
     wxExecute( execmd );
 }
-/* ビューモードの切替え */
-void MyFrame::OnViewMode( wxCommandEvent& event )
+/* ビューの切替え */
+void MyFrame::OnViewStyle( wxCommandEvent& event )
 {
     if ( event.IsChecked() ) {
         int x, y;
         GetSize( &x, &y );
         SetSize( WINL_W + 500, y );
-        m_splitter->SplitVertically( m_panelL, m_panelR, 0 );
+        m_splitter->SplitVertically( m_panelMain, m_panelView, 0 );
     }
     else {
         m_splitter->Unsplit();
@@ -326,59 +495,104 @@
     }
 }
 /* 被保険者フォルダを開く */
-void MyFrame::OnOpenHhsDir( wxListEvent& event )
+void MyFrame::OnSelectHhsDir( wxListEvent& event )
 {
-    wxString hhsdir;
-    /*
-    hhsdir = m_textCtrlDist->GetValue() + wxFILE_SEP_PATH;
-
     int i = event.GetIndex();
+    OpenHhsDir( i );
+}
+/* 番号で指定したフォルダを開く */
+void MyFrame::OpenHhsDir( int n )
+{
     wxListItem item;
-    item.SetId(i);
-
-    item.SetColumn(1);
-    item.SetMask(wxLIST_MASK_TEXT);
-    m_listCtrlHhsDir->GetItem( item );
-    hhsdir.Append( item.GetText() );
-
-    DirViewFrame* dvf = new DirViewFrame( (wxWindow*)this, wxID_ANY, wxEmptyString );
-    dvf->m_dir = hhsdir;
-    dvf->LoadListImage();
-    dvf->Show(true);
-    */
+    item.SetId( n );
+    item.SetColumn( 2 );
+    item.SetMask( wxLIST_MASK_TEXT );
+    m_listCtrl->GetItem( item );
+    wxString dir = item.GetText();
+    wxString execmd = wxT("explorer ") + dir;
+    wxExecute( execmd );
 }
 
 /* カナ検索ダイアログ */
 void MyFrame::OnKana( wxCommandEvent& WXUNUSED(event) )
 {
-    KanaDialog* kana = new KanaDialog( this, wxID_ANY, wxT("カナ氏名で被保番を検索"), wxDefaultPosition, wxSize( 600, 600 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxRESIZE_BORDER|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+    KanaDialog* kana = new KanaDialog( this, wxID_ANY, wxT("カナ氏名で被保番を検索"), wxDefaultPosition, wxSize( 640, 600 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxRESIZE_BORDER|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
     kana->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
 
     if ( kana->ShowModal() == wxID_OK ) {
-        wxMessageBox( kana->GetHhsNo() );
+        m_hhsno = kana->GetHhsNo();
+        UpdateList( m_hhsno );
     }
-
-    UpdateList();
 }
 /* 検索履歴検索ダイアログ */
 void MyFrame::OnHistory( wxCommandEvent& WXUNUSED(event) )
 {
-	HistDialog* hist = new HistDialog( this, wxID_ANY, wxT("検索履歴"), wxDefaultPosition, wxSize( 550, 500 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+	HistDialog* hist = new HistDialog( this, wxID_ANY, wxT("検索履歴"), wxDefaultPosition, wxSize( 600, 500 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
     hist->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
 
     if ( hist->ShowModal() == wxID_OK ) {
-
+        m_hhsno = hist->GetHhsNo();
+        UpdateList( m_hhsno );
     }
-
-    UpdateList();
 }
 
 /* 検索結果をリストアップ */
-void MyFrame::UpdateList( void )
+void MyFrame::UpdateList( wxString hhsno )
 {
     m_listCtrl->DeleteAllItems();
+    for ( int i = 0; i < m_statusBar->GetFieldsCount(); i++ ) {
+        SetStatusMessage( wxEmptyString, i );
+    }
+
+    //
+    wxArrayString s = wxSplit( GetHhsInfoByHhsNo( hhsno ), '_', '\\' );
+    wxString history;
+    if ( s.IsEmpty() ) {
+        SetStatusMessage( wxT("データベースに存在しない被保険者です."), 0 );
+        history = hhsno + wxT("###");
+    }
+    else {
+        m_textCtrlName->SetValue( s[0] );
+        m_textCtrlAddr->SetValue( s[1] );
+        history = hhsno + wxT("#") + s[0] + wxT("#") + s[1] + wxT("#");
+    }
+    m_searchBox->SetValue( hhsno );
+    m_searchBox->SelectAll();
+    m_searchBox->SetFocus();
+
+    wxArrayString path = GetPathByHhsNo( hhsno );
+    if ( path.IsEmpty() ) {
+        SetStatusMessage( wxT("審査会履歴がありません."), 1 );
+        return;
+    }
+
+    wxRegEx reDate(wxT("(^.*20[0-9]{2}.)(20[0-9]{2})([0-2][0-9])([0-9]{2})(.*$)"));
+    for ( int i = 0; i < path.GetCount(); i++ ) {
+        wxString date = path[i];
+        reDate.ReplaceAll( &date, wxT("\\2-\\3-\\4") );
+
+        m_listCtrl->InsertItem( i, -1 );
+        m_listCtrl->SetItem( i, 0,wxString::Format( wxT("%d"), i + 1 ) , -1 ); // No
+        m_listCtrl->SetItem( i, 1, date, -1 );
+        m_listCtrl->SetItem( i, 2, path[i], -1 );
+
+        if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour( wxT("WHEAT") ) );
+    }
+
+    SetStatusMessage( wxT("「+」キーで通番1を印刷."), 0 );
+
+    //
+    wxString filename = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("history");
+    wxDateTime now = wxDateTime::Now();
+    history = history + now.Format( wxT("%Y-%m-%d %H:%M:%S") );
+
+    wxTextFile hist( filename );
+    hist.Open();
+    hist.RemoveLine( 20 );
+    hist.InsertLine( history, 0 );
+    hist.Write();
+    hist.Close();
 }
-
 /* ステータスバーにメッセージを出力 */
 void MyFrame::SetStatusMessage( wxString msg, long n )
 {