changeset 2:c066fde99517

Added Batch Print Mode.
author pyon@macmini
date Fri, 23 Aug 2013 18:32:09 +0900
parents 7b6dab24f4b8
children 1a64119ab257
files .hgignore Changes Makefile TODO image/logo.png image/sample.ico image/sample.xpm image/samplea.xpm image/takashi.png include/bprint.h include/common.h include/db.h include/hist.h include/index.h include/kana.h include/marksheet.h include/mask.h include/myframe.h info.plist.in sample.rc src/bprint.cpp src/db.cpp src/hist.cpp src/index.cpp src/kana.cpp src/main.cpp src/marksheet.cpp src/mask.cpp src/myframe.cpp wxmac.icns
diffstat 21 files changed, 1491 insertions(+), 249 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Sun Aug 04 21:42:49 2013 +0900
+++ b/.hgignore	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,7 @@
 syntax: glob
 obj/*.o
+*.exe
+*.dll
 img/*
 tmp/*
 db/*
--- a/Changes	Sun Aug 04 21:42:49 2013 +0900
+++ b/Changes	Fri Aug 23 18:32:09 2013 +0900
@@ -1,3 +1,13 @@
+version 03.03
+2013-08-23
+ Added Batch Print Mode.
+
+----
+version 03.02
+2013-08-15
+ Usable Release.
+
+----
 version 03.01
 2013-07-29
  Fix Release.
--- a/Makefile	Sun Aug 04 21:42:49 2013 +0900
+++ b/Makefile	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 # Makefile for wxWidgets Application
-# Last Change: 01-Aug-2013.
+# Last Change: 23-Aug-2013.
 # by Takayuki Mutoh
 #
 
@@ -37,7 +37,9 @@
 	  $(OBJDIR)/hist.o \
 	  $(OBJDIR)/index.o \
 	  $(OBJDIR)/mask.o \
+	  $(OBJDIR)/bprint.o \
 	  $(OBJDIR)/db.o \
+	  $(OBJDIR)/marksheet.o \
 	  $(OBJDIR)/wxsqlite3.o
 
 ifdef COMSPEC
@@ -63,7 +65,7 @@
 	-mkdir -p $(OBJDIR)
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
-$(OBJDIR)/myframe.o: myframe.cpp myframe.h common.h db.h
+$(OBJDIR)/myframe.o: myframe.cpp myframe.h common.h db.h marksheet.h bprint.h
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
 $(OBJDIR)/about.o: about.cpp about.h common.h
@@ -81,9 +83,15 @@
 $(OBJDIR)/mask.o: mask.cpp mask.h common.h
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
+$(OBJDIR)/bprint.o: bprint.cpp bprint.h marksheet.h common.h
+	$(CXX) -c $< -o $@ $(CXXFLAGS)
+
 $(OBJDIR)/db.o: db.cpp db.h common.h
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
+$(OBJDIR)/marksheet.o: marksheet.cpp marksheet.h common.h
+	$(CXX) -c $< -o $@ $(CXXFLAGS)
+
 $(OBJDIR)/wxsqlite3.o: wxsqlite3.cpp
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/bprint.h	Fri Aug 23 18:32:09 2013 +0900
@@ -0,0 +1,51 @@
+// Filename   : bprint.h
+// Last Change: 23-Aug-2013.
+//
+#ifndef __BPRINT_H__
+#define __BPRINT_H__
+
+#include "common.h"
+
+class FrameBatchPrint : public wxDialog
+{
+    DECLARE_EVENT_TABLE()
+	private:
+        wxRect        m_mask1;
+        wxRect        m_mask2;
+        wxRect        m_mask3;
+        wxRect        m_mask1old;
+        wxRect        m_mask2old;
+        wxRect        m_mask3old;
+	
+	protected:
+		wxGrid*     m_grid;
+		wxButton*   m_buttonClear;
+		wxButton*   m_buttonPrint;
+		wxButton*   m_buttonClose;
+	
+	public:
+		FrameBatchPrint( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
+		~FrameBatchPrint();
+	
+        void SetGridReadOnly( void );
+        void OnInput( wxGridEvent& event );
+        void OnClear( wxCommandEvent& WXUNUSED(event) );
+        void OnPrint( wxCommandEvent& WXUNUSED(event) );
+
+        // Accessor
+        void SetMask1( wxRect rect ) { m_mask1 = rect; }
+        void SetMask2( wxRect rect ) { m_mask2 = rect; }
+        void SetMask3( wxRect rect ) { m_mask3 = rect; }
+        void SetMask1Old( wxRect rect ) { m_mask1old = rect; }
+        void SetMask2Old( wxRect rect ) { m_mask2old = rect; }
+        void SetMask3Old( wxRect rect ) { m_mask3old = rect; }
+};
+
+enum
+{
+    ID_BPCLEAR = wxID_HIGHEST + 50,
+    ID_BPPRINT,
+};
+
+#endif //__BPRINT_H__
+
--- a/include/common.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/common.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : common.h
-// Last Change: 02-Aug-2013.
+// Last Change: 23-Aug-2013.
 //
 #ifndef __COMMON_H__
 #define __COMMON_H__
@@ -28,6 +28,7 @@
 #include <wx/sizer.h>
 #include <wx/splitter.h>
 #include <wx/srchctrl.h>
+#include <wx/notebook.h>
 #include <wx/statbmp.h>
 #include <wx/stattext.h>
 #include <wx/statusbr.h>
@@ -36,7 +37,12 @@
 #include <wx/textfile.h>
 #include <wx/tokenzr.h>
 #include <wx/msgdlg.h>
+#include <wx/progdlg.h>
+#include <wx/grid.h>
 #include <wx/regex.h>
+#include <wx/dir.h>
+#include <wx/print.h>
+#include <wx/html/htmprint.h>
 #include <wx/xrc/xmlres.h>
 
 #endif
--- a/include/db.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/db.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,24 +1,29 @@
 // Filename   : db.h
-// Last Change: 02-Aug-2013.
+// Last Change: 23-Aug-2013.
 //
 #ifndef __DB_H__
 #define __DB_H__
 
 #include "common.h"
 
-// $BHoJ]HV$GHoJ]81<T>pJs$r<hF@(B
+// 被保番で被保険者情報を取得
 wxString GetHhsInfoByHhsNo( wxString hhsno );
-// $B;aL>%+%J$GHoJ]81<T$r8!:w(B
+// 氏名カナで被保険者を検索
 wxArrayString GetHhsInfoByKana( wxString kana, bool fuzzy );
-// $BHoJ]81<THV9f$+$i%U%!%$%k%Q%9$r<hF@(B
+// 被保険者番号からファイルパスを取得
 wxArrayString GetPathByHhsNo( wxString hhsno );
-// $B9g5DBN3+:EF|$r<hF@(B
+/* 被保険者が審査会にかかったかどうか */
+bool IsHhsJudged( wxString hhsno );
+// 合議体開催日を取得
 wxArrayString GetCcnDate( void );
+// 日付から審査会を取得
 wxArrayString GetCcnByDate( wxString date );
+// 合議体から被保険者番号を取得
 wxArrayString GetHhsNoByCcn( wxString ccn, wxString date );
-wxArrayString GetPathByHhsNo( wxString hhs );
-// $B%$%s%G%C%/%9$r99?7(B
-void UpdateIndex( wxArrayString paths );
+// インデックスを更新
+void UpdateIndex( wxString datedir, wxString date );
+// DBの整合性をチェック
+wxArrayString CheckDBs( void );
 
 #endif //__DB_H__
 
--- a/include/hist.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/hist.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : hist.h
-// Last Change: 02-Aug-2013.
+// Last Change: 13-Aug-2013.
 //
 #ifndef __HIST_H__
 #define __HIST_H__
@@ -10,6 +10,7 @@
 {
     DECLARE_EVENT_TABLE()
 	private:
+        wxString    m_hhsno;
 	
 	protected:
 		wxListCtrl* m_listCtrl;
@@ -21,9 +22,12 @@
 		HistDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
 		~HistDialog();
         
-        void OnSelectItem( wxListEvent& WXUNUSED(event) );
+        void OnSelectItem( wxListEvent& event );
         void OnSet( wxCommandEvent& WXUNUSED(event) );
         void ReadHistoryList( void );    
+
+        // Accessor
+        wxString GetHhsNo() const { return m_hhsno; }
 };
 
 enum
--- a/include/index.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/index.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : index.h
-// Last Change: 21-Jul-2013.
+// Last Change: 23-Aug-2013.
 //
 
 #ifndef __INDEX_H__
@@ -11,18 +11,27 @@
 {
     DECLARE_EVENT_TABLE()
 	private:
+        wxString m_rootdir;
 	
 	protected:
 		wxListCtrl*     m_listCtrl;
 		wxCalendarCtrl* m_calendar;
 		wxButton*       m_buttonMake;
+        wxRichTextCtrl* m_richText;
 		wxButton*       m_buttonClose;
 	
 	public:
-		
 		IndexDialog( wxWindow*, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
 		~IndexDialog();
-	
+
+        void OnSelect( wxCalendarEvent& WXUNUSED(event) );	
+        void OnMakeIndex( wxCommandEvent& WXUNUSED(event) );
+        void OnPage( wxCalendarEvent& WXUNUSED(event) );
+        void UpdateList( void );
+        void CheckHhs( void );
+
+        // Accessor
+        void SetRootdir( wxString dir ) { m_rootdir = dir; }
 };
 
 enum {
--- a/include/kana.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/kana.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : kana.h
-// Last Change: 04-Aug-2013.
+// Last Change: 05-Aug-2013.
 //
 #ifndef __KANA_H__
 #define __KANA_H__
@@ -10,7 +10,6 @@
 {
     DECLARE_EVENT_TABLE()
 	private:
-        wxArrayString m_hhs;
         wxString      m_hhsno;
 	
 	protected:
@@ -28,7 +27,7 @@
 	
         void OnSearch( wxCommandEvent& WXUNUSED(event) );
         void OnFuzzyCheck( wxCommandEvent& WXUNUSED(event) );
-        void OnSelectItem( wxListEvent& WXUNUSED(event) );
+        void OnSelectItem( wxListEvent& event );
         void OnSet( wxCommandEvent& WXUNUSED(event) );
         void UpdateList( void );
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/marksheet.h	Fri Aug 23 18:32:09 2013 +0900
@@ -0,0 +1,194 @@
+// Filename   : marksheet.h
+// Last Change: 23-Aug-2013.
+//
+#ifndef __MARKSHEET_H__
+#define __MARKSHEET_H__
+
+#include "wx/wxsqlite3.h"
+
+bool IsBlack( int r, int g, int b );
+wxString GuessHhs( wxString& file );
+bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax );
+bool _IsMarksheet( wxString& file, float* brate, long* len );
+wxString GetHhsName( wxString& hhsno );
+int IsHhsno( wxString& hhsno, wxString& name );
+int GetMarksheetVersion( wxString file );
+
+/*
+bool IsBlack( int r, int g, int b ) 
+{
+    if ( r == 0 && g == 0 && b == 0 ) {
+        return true;
+    }
+    return false;
+};
+
+wxString GuessHhs( wxString& file ) 
+{
+    wxString hhs;
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int sx = 1800;  // start x
+    int sy = 315;;  // start y
+    int bw = 60;    // block width
+    int bh = 50;    // block height
+    int area = bw * bh;
+    int black = 0;
+    int x, y;
+    unsigned char r, g, b;
+
+    int max_n;
+    float max;
+    float bk;
+    for ( int c=0; c<10; c++ ) {
+        max = 0.0;
+        max_n = -1;
+        for ( int n=0; n<10; n++ ) {
+
+            for ( x=sx+bw*c; x<sx+bw*(c+1); x++ ) {
+                for ( y=sy+bh*n; y<sy+bh*(n+1); y++ ) {
+                    r = img.GetRed(   x, y );
+                    g = img.GetGreen( x, y );
+                    b = img.GetBlue(  x, y );
+                    if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+                }
+            }
+
+            bk = (float)black / area;
+            if ( max < bk ) {
+                max = bk;
+                max_n = n;
+            }
+            //wxPuts(wxString::Format(wxT("%d %f"),n,bk));
+            black = 0;
+        }
+        hhs.Append( wxString::Format( wxT("%d"), max_n ) );
+    }
+
+    return hhs;
+};
+
+bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax )
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+
+    wxFile f( file );
+    long l = f.Length();
+
+    *brate = z;
+    *len = l;
+    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
+    if ( zmin < z && z < zmax
+      && lmin < l && l < lmax ) {
+        return true;
+    }
+    return false;
+};
+
+bool _IsMarksheet( wxString& file, float* brate, long* len )
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+    float zmin = 0.095713; float zmax = 0.108600;
+
+    wxFile f( file );
+    long l = f.Length();
+    float lmin = 2072393; float lmax = 2346082;
+
+    *brate = z;
+    *len = l;
+    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
+    if ( zmin < z && z < zmax
+      && lmin < l && l < lmax ) {
+        return true;
+    }
+    return false;
+};
+
+wxString GetHhsName( wxString& hhsno )
+{
+    wxString name;
+
+    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("hhs.db");
+    wxSQLite3Database hhsdb;
+    hhsdb.Open( gszFile );
+
+    wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT name FROM hhs_master WHERE hhsno = ?");
+    stmt.Bind( 1, hhsno );
+    wxSQLite3ResultSet q = stmt.ExecuteQuery();
+    if ( !q.IsNull(0) ) {
+        while ( q.NextRow() ) {
+            name = q.GetString(0);
+        }
+    }
+    stmt.Finalize();
+    hhsdb.Close();
+
+    return name;
+};
+
+int IsHhsno( wxString& hhsno, wxString& name )
+{
+	wxRegEx reHhs(wxT("^0[1238][0-9]{8}$"));	// $BHoJ]HV%A%'%C%/(B
+
+    if ( reHhs.Matches( hhsno) ) {
+        name = GetHhsName( hhsno );
+        if ( name.IsEmpty() ) {  // DB$B$K$J$$(B
+            return 1;
+        }
+        return 2;
+    }
+    else {
+        return 0;
+    }
+};
+
+int GetMarksheetVersion( wxString file ) 
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+
+    if ( z > 0.120 ) {
+        return 2;   // 0.130 - 0.140
+    }
+    else {
+        return 1;   // 0.099 - 0.110
+    }
+};
+*/
+
+#endif // __MARKSHEET_H__
+
--- a/include/mask.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/mask.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : mask.h
-// Last Change: 04-Aug-2013.
+// Last Change: 14-Aug-2013.
 //
 
 #ifndef __MASK_H__
@@ -13,8 +13,19 @@
 {
     DECLARE_EVENT_TABLE()
 	private:
+        long          x, y, w, h;
+        wxRect        m_mask1;
+        wxRect        m_mask2;
+        wxRect        m_mask3;
+        wxRect        m_mask1old;
+        wxRect        m_mask2old;
+        wxRect        m_mask3old;
 	
 	protected:
+		wxNotebook*   m_notebook;
+		wxPanel*      m_panel;
+		wxPanel*      m_panelold;
+
 		wxStaticText* m_staticTextDummy0;
 		wxStaticText* m_staticTextX;
 		wxStaticText* m_staticTextY;
@@ -39,14 +50,33 @@
 		wxTextCtrl*   m_textCtrlM3w;
 		wxTextCtrl*   m_textCtrlM3h;
 
+		wxStaticText* m_staticTextDummy0Old;
+		wxStaticText* m_staticTextXOld;
+		wxStaticText* m_staticTextYOld;
+		wxStaticText* m_staticTextWOld;
+		wxStaticText* m_staticTextHOld;
+
+		wxStaticText* m_staticTextMask1Old;
+		wxTextCtrl*   m_textCtrlM1xOld;
+		wxTextCtrl*   m_textCtrlM1yOld;
+		wxTextCtrl*   m_textCtrlM1wOld;
+		wxTextCtrl*   m_textCtrlM1hOld;
+
+		wxStaticText* m_staticTextMask2Old;
+		wxTextCtrl*   m_textCtrlM2xOld;
+		wxTextCtrl*   m_textCtrlM2yOld;
+		wxTextCtrl*   m_textCtrlM2wOld;
+		wxTextCtrl*   m_textCtrlM2hOld;
+
+		wxStaticText* m_staticTextMask3Old;
+		wxTextCtrl*   m_textCtrlM3xOld;
+		wxTextCtrl*   m_textCtrlM3yOld;
+		wxTextCtrl*   m_textCtrlM3wOld;
+		wxTextCtrl*   m_textCtrlM3hOld;
+
 		wxButton*     m_buttonCancel;
 		wxButton*     m_buttonSet;
 	
-        long          x, y, w, h;
-        wxRect        m_mask1;
-        wxRect        m_mask2;
-        wxRect        m_mask3;
-
 	public:
 		
 		MaskDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
@@ -59,9 +89,15 @@
         void SetMask1( wxRect rect ) { m_mask1 = rect; }
         void SetMask2( wxRect rect ) { m_mask2 = rect; }
         void SetMask3( wxRect rect ) { m_mask3 = rect; }
+        void SetMask1Old( wxRect rect ) { m_mask1old = rect; }
+        void SetMask2Old( wxRect rect ) { m_mask2old = rect; }
+        void SetMask3Old( wxRect rect ) { m_mask3old = rect; }
         wxRect GetMask1() const { return m_mask1; }
         wxRect GetMask2() const { return m_mask2; }
         wxRect GetMask3() const { return m_mask3; }
+        wxRect GetMask1Old() const { return m_mask1old; }
+        wxRect GetMask2Old() const { return m_mask2old; }
+        wxRect GetMask3Old() const { return m_mask3old; }
 };
 
 enum {
--- a/include/myframe.h	Sun Aug 04 21:42:49 2013 +0900
+++ b/include/myframe.h	Fri Aug 23 18:32:09 2013 +0900
@@ -1,13 +1,14 @@
 // Filename   : myframe.h
-// Last Change: 04-Aug-2013.
+// Last Change: 23-Aug-2013.
 //
 #ifndef __MYFRAME_H__
 #define __MYFRAME_H__
 
 #include "common.h"
 
+class MyFrame;
 ///////////////////////////////////////////////////////////////
-// $B%+%9%?%`8!:w%\%C%/%9(B
+// カスタム検索ボックス
 class MySearchBox : public wxSearchCtrl
 {
     DECLARE_EVENT_TABLE()
@@ -18,12 +19,11 @@
 		~MySearchBox();
 
         void OnKey( wxKeyEvent& event );
-		void PrintImages();
 };
 
 
 ///////////////////////////////////////////////////////////////
-// $B%a%$%s%U%l!<%`(B
+// メインフレーム
 class MyFrame : public wxFrame 
 {
     DECLARE_EVENT_TABLE()
@@ -33,12 +33,17 @@
         wxRect            m_mask1;
         wxRect            m_mask2;
         wxRect            m_mask3;
+        wxRect            m_mask1old;
+        wxRect            m_mask2old;
+        wxRect            m_mask3old;
+        wxString          m_hhsno;
 	
 	protected:
 		wxMenuBar*        m_menubar;
 		wxMenu*           m_menuFile;
 		wxSplitterWindow* m_splitter;
-		wxPanel*          m_panelL;
+		wxPanel*          m_panelMain;
+		wxPanel*          m_panelView;
 		wxStaticBitmap*   m_bitmap;
 		wxTextCtrl*       m_textCtrlName;
 		wxTextCtrl*       m_textCtrlAddr;
@@ -47,9 +52,8 @@
 		MySearchBox*      m_searchBox;
 		wxButton*         m_buttonKana;
 		wxButton*         m_buttonHist;
-		wxPanel*          m_panelR;
-		wxStaticBitmap*   m_bitmapView;
-		wxListCtrl*       m_listCtrlThumb;
+        wxStaticBitmap*   m_bitmapView;
+        wxListCtrl*       m_listCtrlThumb;
 		wxStatusBar*      m_statusBar;
 	
 	public:
@@ -57,15 +61,20 @@
 		MyFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
 		~MyFrame();
 		
-        void OnViewMode( wxCommandEvent& event );
+        void OnBPrintMode( wxCommandEvent& WXUNUSED(event) );
+        void OnViewStyle( wxCommandEvent& event );
         void OnIndex( wxCommandEvent& WXUNUSED(event) );
         void LoadMaskParam( void );
+        void OnDBBackup( wxCommandEvent& WXUNUSED(event) );
         void OnMaskParam( wxCommandEvent& WXUNUSED(event) );
         void OnOpenAppDir( wxCommandEvent& WXUNUSED(event) );
-        void OnOpenHhsDir( wxListEvent& event );
+        void OnSelectHhsDir( wxListEvent& event );
+        void OpenHhsDir( int n );
         void OnKana( wxCommandEvent& WXUNUSED(event) );
         void OnHistory( wxCommandEvent& WXUNUSED(event) );
-        void UpdateList( void );
+        void OnCommand( wxCommandEvent& WXUNUSED(event) );
+        void UpdateList( wxString hhsno );
+        void PrintImages( wxString hhsno );
 
         void SetStatusMessage( wxString msg, long n );
         void OnWinSize( wxSizeEvent& event );
@@ -74,12 +83,13 @@
         void OnQuit( wxCommandEvent& WXUNUSED(event) );
         void OnAbout( wxCommandEvent& WXUNUSED(event) );
         void SaveConfig( wxCloseEvent& WXUNUSED(event) );
-
 };
 
 enum {
     ID_MNVIEW = wxID_HIGHEST + 10,
+    ID_MNBPNT,
     ID_MNINDEX,
+    ID_MNDBBKUP,
     ID_MNMASKPARAM,
     ID_MNAPPDIR,
     ID_MNABOUT,
@@ -89,6 +99,5 @@
     ID_HIST,
 };
 
-
 #endif //__MYFRAME_H__
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bprint.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -0,0 +1,185 @@
+// Filename   : bprint.cpp
+// Last Change: 23-Aug-2013.
+//
+
+#include "bprint.h"
+#include "marksheet.h"
+#include "db.h"
+
+FrameBatchPrint::FrameBatchPrint( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
+    : wxDialog( parent, id, title, pos, size, style )
+{
+	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+    this->SetBackgroundColour( wxColour( wxT("WHEAT") ) );
+	
+	wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_grid = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+	
+	// Grid
+	m_grid->CreateGrid( 25, 4 );
+	m_grid->EnableEditing( true );
+	m_grid->EnableGridLines( true );
+	m_grid->EnableDragGridSize( false );
+	m_grid->SetMargins( 0, 0 );
+	
+	// Columns
+	m_grid->EnableDragColMove( false );
+	m_grid->EnableDragColSize( true );
+	m_grid->SetColLabelSize( 30 );
+	m_grid->SetColLabelValue( 0, wxT("被保険者番号") );
+	m_grid->SetColLabelValue( 1, wxT("氏名") );
+	m_grid->SetColLabelValue( 2, wxT("最新フォルダ") );
+	m_grid->SetColLabelValue( 3, wxT("ステータス") );
+	m_grid->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+    m_grid->SetColSize( 0, 100 );
+    m_grid->SetColSize( 1, 100 );
+    m_grid->SetColSize( 2, 220 );
+    m_grid->SetColSize( 3,  70 );
+	
+	// Rows
+	m_grid->EnableDragRowSize( true );
+	m_grid->SetRowLabelSize( 30 );
+	m_grid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+	
+	// Cell Defaults
+	m_grid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
+	bSizerTop->Add( m_grid, 1, wxALL|wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizerButton = new wxBoxSizer( wxVERTICAL );
+	
+	bSizerButton->Add( 0, 20, 0, 0, 5 );
+
+	m_buttonClear = new wxButton( this, ID_BPCLEAR, wxT("クリア"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonClear, 0, wxALL, 5 );
+	
+	m_buttonPrint = new wxButton( this, ID_BPPRINT, wxT("印刷"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonPrint, 0, wxALL, 5 );
+	
+	bSizerButton->Add( 0, 20, 0, 0, 5 );
+
+	m_buttonClose = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_buttonClose->SetDefault(); 
+	bSizerButton->Add( m_buttonClose, 0, wxALL, 5 );
+	
+	bSizerTop->Add( bSizerButton, 0, wxEXPAND, 5 );
+	
+	this->SetSizer( bSizerTop );
+	this->Layout();
+	
+	this->Centre( wxBOTH );
+
+    SetGridReadOnly();
+}
+
+FrameBatchPrint::~FrameBatchPrint()
+{
+}
+
+// Event Table
+BEGIN_EVENT_TABLE( FrameBatchPrint, wxDialog )
+    EVT_GRID_CELL_CHANGING( FrameBatchPrint::OnInput )
+    EVT_BUTTON( ID_BPCLEAR, FrameBatchPrint::OnClear )
+    EVT_BUTTON( ID_BPPRINT, FrameBatchPrint::OnPrint )
+END_EVENT_TABLE()
+
+// Event Handlers & Functions
+/* 氏名などを表示 */ 
+void FrameBatchPrint::OnInput( wxGridEvent& event )
+{
+    wxString hhsno = event.GetString();
+    int r = event.GetRow();
+    for ( int c = 1; c < m_grid->GetNumberCols(); c++ )
+        m_grid->SetCellValue( r, c, wxEmptyString );
+
+    wxArrayString info = wxSplit( GetHhsInfoByHhsNo( hhsno ), '_', '\\' );
+    wxArrayString path = GetPathByHhsNo( hhsno );
+
+    if ( info.IsEmpty() ) info.Add( wxEmptyString );
+    if ( path.IsEmpty() ) {
+        wxMessageBox( wxT("ファイルがありません.") );
+        path.Add( wxEmptyString );
+    }
+
+    m_grid->SetCellValue( r, 1, info[0] );
+    m_grid->SetCellValue( r, 2, path[0] );    
+}
+
+/* グリッドをクリア */
+void FrameBatchPrint::OnClear( wxCommandEvent& WXUNUSED(event) )
+{
+    m_grid->ClearGrid();
+}
+
+/* 一括印刷処理 */
+void FrameBatchPrint::OnPrint( wxCommandEvent& WXUNUSED(event) )
+{
+    wxPrintDialogData pd;
+    wxPrinter p( &pd );
+    p.PrintDialog( NULL );
+
+    for ( int r = 0; r < m_grid->GetNumberRows(); r++ ) {
+        wxString path = m_grid->GetCellValue( r, 2 );
+
+        // 印刷用の html を作成
+        if ( path.IsEmpty() ) continue;
+
+        wxDir dir( path );
+        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 + 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 );
+
+        hpout.SetHtmlText( html, wxEmptyString, false );
+        p.Print( NULL, &hpout, false );
+
+        m_grid->SetCellValue( r, 3, wxT("処理済") );
+    }
+}
+
+/* 入力禁止 */
+void FrameBatchPrint::SetGridReadOnly( void )
+{
+    for ( int r = 0; r < m_grid->GetNumberRows(); r++ )
+        for ( int c = 1; c < m_grid->GetNumberCols(); c++ )
+            m_grid->SetReadOnly( r, c, true );
+}
+
+
--- a/src/db.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/db.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,11 +1,12 @@
 // Filename   : db.cpp
-// Last Change: 02-Aug-2013.
+// Last Change: 23-Aug-2013.
 //
 
 #include "db.h"
 #include "wx/wxsqlite3.h"
 
-/* $BHoJ]HV$GHoJ]81<T>pJs$r<hF@(B */
+//********** HHS-DB **********//
+/* 被保番で被保険者情報を取得 */
 wxString GetHhsInfoByHhsNo( wxString hhsno )
 {
     wxString name, addr;
@@ -14,7 +15,7 @@
     wxSQLite3Database hhsdb;
     hhsdb.Open( gszFile );
 
-    wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT name, addr FROM hhs_master WHERE hhsno = ?");
+    wxSQLite3Statement stmt = hhsdb.PrepareStatement( "SELECT name, addr FROM hhs_master WHERE hhsno = ?" );
     stmt.Bind( 1, hhsno );
     wxSQLite3ResultSet q = stmt.ExecuteQuery();
     if ( !q.IsNull(0) ) {
@@ -34,7 +35,7 @@
     }
 }
 
-// $B;aL>%+%J$GHoJ]81<T>pJs$r8!:w(B
+// 氏名カナで被保険者情報を検索
 wxArrayString GetHhsInfoByKana( wxString kana, bool fuzzy )
 {
     wxArrayString data;
@@ -66,33 +67,54 @@
     return data;
 }
 
-/* $BHoJ]81<THV9f$+$i%U%!%$%k%Q%9$r<hF@(B */
+//********** CCN-DB **********//
+/* 被保険者番号からファイルパスを取得 */
 wxArrayString GetPathByHhsNo( wxString hhsno )
 {
-    wxArrayString date_path;
+    wxArrayString path;
 
     wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
     wxSQLite3Database ccndb;
     ccndb.Open( gszFile );
 
-    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT date, path FROM ccn WHERE hhsno = ? ORDER BY date DESC");
+    wxString sql = wxT( "SELECT path FROM path WHERE hhsno = ? ORDER BY path DESC;" );
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( sql );
     stmt.Bind( 1, hhsno );
     wxSQLite3ResultSet q = stmt.ExecuteQuery();
 
     if ( !q.IsNull(0) ) {
-        wxString str;
         while ( q.NextRow() ) {
-            str = q.GetString(0) + "_" + q.GetString(1);
-            date_path.Add( str );
+            path.Add( q.GetString(0) );
         }
     }
     stmt.Finalize();
     ccndb.Close();
 
-    return date_path;
+    return path;
 }
 
-/* $B9g5DBN3+:EF|$r<hF@(B */
+/* 被保険者が審査会にかかったかどうか */
+bool IsHhsJudged( wxString hhsno ) 
+{
+    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
+    wxSQLite3Database ccndb;
+    ccndb.Open( gszFile );
+
+    wxString sql = wxT( "SELECT path FROM path WHERE hhsno = ?;" );
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( sql );
+    stmt.Bind( 1, hhsno );
+    wxSQLite3ResultSet q = stmt.ExecuteQuery();
+
+    bool ret = true;
+    if ( q.IsNull(0) ) ret = false;
+
+    stmt.Finalize();
+    ccndb.Close();
+
+    return ret;
+}
+
+/* 合議体開催日を取得 */
 wxArrayString GetCcnDate( void ) 
 {
     wxArrayString date_cnt;
@@ -101,7 +123,7 @@
     wxSQLite3Database ccndb;
     ccndb.Open( gszFile );
 
-    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT date, count(*) FROM ccn GROUP BY date ORDER BY date desc");
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( "SELECT date, count(*) FROM ccn GROUP BY date ORDER BY date desc" );
     wxSQLite3ResultSet q = stmt.ExecuteQuery();
 
     wxString str;
@@ -117,33 +139,33 @@
     return date_cnt;
 }
 
-/* $BF|IU$+$i?3::2q$r<hF@(B */
+/* 日付から審査会を取得 */
 wxArrayString GetCcnByDate( wxString date ) 
 {
-    wxArrayString ccn_cnt;
+    wxArrayString data;
 
     wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
     wxSQLite3Database ccndb;
     ccndb.Open( gszFile );
 
-    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT ccn, count(*) FROM ccn WHERE date = ? GROUP BY ccn");
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( "SELECT hhsno, path, date FROM path WHERE date = ? ORDER BY path" );
     stmt.Bind( 1, date );
     wxSQLite3ResultSet q = stmt.ExecuteQuery();
 
     wxString str;
     if ( !q.IsNull(0) ) {
         while ( q.NextRow() ) {
-            str = q.GetString(0) + "_" + q.GetString(1);
-            ccn_cnt.Add( str );
+            str = q.GetString(0) + "_" + q.GetString(1) + "_" + q.GetString(2);
+            data.Add( str );
         }
     }
     stmt.Finalize();
     ccndb.Close();
 
-    return ccn_cnt;
+    return data;
 }
 
-/* $B9g5DBN$+$iHoJ]81<THV9f$r<hF@(B */
+/* 合議体から被保険者番号を取得 */
 wxArrayString GetHhsNoByCcn( wxString ccn, wxString date ) 
 {
     wxArrayString hhsno;
@@ -152,7 +174,7 @@
     wxSQLite3Database ccndb;
     ccndb.Open( gszFile );
 
-    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT hhsno FROM ccn WHERE ccn = ? AND date = ? ORDER BY hhsno");
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( "SELECT hhsno FROM ccn WHERE ccn = ? AND date = ? ORDER BY hhsno" );
     stmt.Bind( 1, ccn );
     stmt.Bind( 2, date );
     wxSQLite3ResultSet q = stmt.ExecuteQuery();
@@ -168,32 +190,82 @@
     return hhsno;
 }
 
-/* $B%$%s%G%C%/%9$r99?7(B */
-void UpdateIndex( wxArrayString paths )
+/* インデックスを更新 */
+void UpdateIndex( wxString datedir, wxString date )
 {
     wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
     wxSQLite3Database ccndb;
     ccndb.Open( gszFile );
 
-    wxRegEx regex( wxT("^.+(20[0-9]{2})([01][0-9])([0-3][0-9]).(.+).(0[1238]{8})$") );
-    wxSQLite3Statement stmt = ccndb.PrepareStatement("INSERT OR REPLACE INTO ccn VALUES( ?, ?, ?, ? )");
-    wxString date, ccn, hhsno;
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( "DELETE FROM path WHERE date = ?;" );
+    stmt.Bind( 1, date );
+    stmt.ExecuteQuery();
+    stmt.Finalize();
 
-    for ( int i=0; i<paths.GetCount(); i++ ) {
-        date  = paths[i];
-        ccn   = paths[i];
-        hhsno = paths[i];
-        regex.ReplaceAll( &date, wxT("\\1-\\2-\\3") );
-        regex.ReplaceAll( &date, wxT("\\4") );
-        regex.ReplaceAll( &date, wxT("\\5") );
-        stmt.Bind( 1, date );
-        stmt.Bind( 2, ccn );
-        stmt.Bind( 3, hhsno );
-        stmt.Bind( 4, paths[i] );
-        stmt.ExecuteQuery();
-        stmt.Finalize();
+    wxString ccndir;
+    wxDir dated( datedir );
+    if ( !dated.IsOpened() ) {
+        return;
     }
 
+    wxRegEx reSinsei( wxT("^00000") );
+    bool cont = dated.GetFirst( &ccndir, wxEmptyString, wxDIR_DIRS );
+
+    wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), 240, NULL, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE );
+    pd.SetSize( wxSize( 320, 140 ) );
+    int count = 0;
+
+    while ( cont ) {
+
+        wxDir ccnd( datedir + wxFILE_SEP_PATH + ccndir );
+        if ( !ccnd.IsOpened() ) return;
+        wxString hhsdir;
+        bool c = ccnd.GetFirst( &hhsdir, wxEmptyString, wxDIR_DIRS );
+
+        while ( c ) {
+            if ( ! reSinsei.Matches( hhsdir ) ) {
+
+                wxString path = datedir + wxFILE_SEP_PATH + ccndir + wxFILE_SEP_PATH + hhsdir;
+
+                stmt = ccndb.PrepareStatement( "INSERT INTO path VALUES( ?, ?, ?, datetime( 'now', 'localtime' ) );" );
+                stmt.Bind( 1, hhsdir );
+                stmt.Bind( 2, path );
+                stmt.Bind( 3, date );
+                stmt.ExecuteQuery();
+                stmt.Finalize();
+                pd.Update( count++, hhsdir + wxT("@") + ccndir + wxT("を処理しました.") );
+            }
+            c = ccnd.GetNext( &hhsdir );
+        }
+
+        cont = dated.GetNext( &ccndir );
+    }
     ccndb.Close();
 }
 
+/* DB整合性チェック */
+wxArrayString CheckDBs( void )
+{
+    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
+    wxSQLite3Database ccndb;
+    ccndb.Open( gszFile );
+
+    wxString sql = wxT("ATTACH 'db/hhs.db' AS hhs");
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( sql );
+    wxSQLite3ResultSet q = stmt.ExecuteQuery();
+
+    sql = wxT("SELECT hhsno FROM path EXCEPT SELECT hhsno FROM hhs.hhs_master");
+    stmt = ccndb.PrepareStatement( sql );
+    q = stmt.ExecuteQuery();
+
+    wxArrayString result;
+    while ( q.NextRow() ) {
+        result.Add( q.GetString(0) );
+    }
+
+    stmt.Finalize();
+    ccndb.Close();
+
+    return result;
+}
+
--- a/src/hist.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/hist.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : hist.cpp
-// Last Change: 02-Aug-2013.
+// Last Change: 22-Aug-2013.
 //
 #include "hist.h"
 
@@ -27,7 +27,7 @@
     m_listCtrl->SetColumnWidth( 3, 240 );
     itemCol.SetText( wxT("検索日時") );
     m_listCtrl->InsertColumn( 4, itemCol );
-    m_listCtrl->SetColumnWidth( 4, 80 );
+    m_listCtrl->SetColumnWidth( 4, 120 );
 
 	bSizerTop->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
 	
@@ -60,13 +60,47 @@
 END_EVENT_TABLE()
 
 
-void HistDialog::OnSelectItem( wxListEvent& WXUNUSED(event) )
+void HistDialog::OnSelectItem( wxListEvent& event )
 {
+    int i = event.GetIndex();
+    wxListItem item;
+    item.SetId( i );
+
+    item.SetColumn( 1 );
+    item.SetMask( wxLIST_MASK_TEXT );
+    m_listCtrl->GetItem( item );
+    m_hhsno = item.GetText();
+
+    if ( IsModal() ) 
+        EndModal( wxID_OK );
+    else {
+        SetReturnCode( wxID_OK );
+        Show( false );
+    }
 }
 
 void HistDialog::OnSet( wxCommandEvent& WXUNUSED(event) )
 {
+    long i = -1;
+    for ( ;; ) {
+        i = m_listCtrl->GetNextItem( i, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
+        if ( i == -1 ) break;
 
+        wxListItem item;
+        item.SetId( i );
+
+        item.SetColumn( 1 );
+        item.SetMask( wxLIST_MASK_TEXT );
+        m_listCtrl->GetItem( item );
+        m_hhsno = item.GetText();
+    }
+
+    if ( IsModal() ) 
+        EndModal( wxID_OK );
+    else {
+        SetReturnCode( wxID_OK );
+        Show( false );
+    }
 }
 
 void HistDialog::ReadHistoryList( void )
@@ -77,20 +111,20 @@
 
     if ( file.Open( filename ) ) {
 
-        for ( size_t i = 0; i<file.GetLineCount(); i++ ) {
+        for ( size_t i = 0; i < file.GetLineCount(); i++ ) {
 
             int col = 0;
             m_listCtrl->InsertItem( i, -1 );
             buf.Printf( wxT("%02d"), i + 1 );
             m_listCtrl->SetItem( i, col, buf, -1 ); // No
 
-            wxStringTokenizer tkz( file[i], wxT(":") );
+            wxStringTokenizer tkz( file[i], wxT("#") );
             while ( tkz.HasMoreTokens() ) {
                 col++;
                 wxString token = tkz.GetNextToken();
                 m_listCtrl->SetItem( i, col, token, -1 );
             }
-            if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour(wxT("WHEAT")) );
+            if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour( wxT("WHEAT") ) );
         }
     }
     file.Close();
--- a/src/index.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/index.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,8 +1,10 @@
 // Filename   : index.cpp
-// Last Change: 21-Jul-2013.
+// Last Change: 23-Aug-2013.
 //
 
 #include "index.h"
+#include "db.h"
+#include "wx/wxsqlite3.h"
 
 IndexDialog::IndexDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) 
     : wxDialog( parent, id, title, pos, size, style )
@@ -14,7 +16,7 @@
 	m_listCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT );
 
     wxListItem itemCol;
-    itemCol.SetText( wxT("歴番") );
+    itemCol.SetText( wxT("通番") );
     m_listCtrl->InsertColumn( 0, itemCol );
     m_listCtrl->SetColumnWidth( 0, 50 );
     itemCol.SetText( wxT("年月日") );
@@ -22,13 +24,13 @@
     m_listCtrl->SetColumnWidth( 1, 80 );
     itemCol.SetText( wxT("合議体") );
     m_listCtrl->InsertColumn( 2, itemCol );
-    m_listCtrl->SetColumnWidth( 2, 80 );
+    m_listCtrl->SetColumnWidth( 2, 60 );
     itemCol.SetText( wxT("被保険者番号") );
     m_listCtrl->InsertColumn( 3, itemCol );
     m_listCtrl->SetColumnWidth( 3, 100 );
     itemCol.SetText( wxT("氏名") );
     m_listCtrl->InsertColumn( 4, itemCol );
-    m_listCtrl->SetColumnWidth( 4, 100 );
+    m_listCtrl->SetColumnWidth( 4, 120 );
 
 	bSizerTop->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
 	
@@ -37,15 +39,16 @@
 	m_calendar = new wxCalendarCtrl( this, ID_CALNENDER, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS );
 	bSizerR->Add( m_calendar, 0, wxALL, 5 );
 	
-	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
-	
 	m_buttonMake = new wxButton( this, ID_MKINDEX, wxT("作成"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerBtn->Add( m_buttonMake, 0, wxALL, 5 );
+	bSizerR->Add( m_buttonMake, 0, wxALIGN_RIGHT|wxALL, 5 );
 	
+	bSizerR->Add( 0, 300, 1, wxEXPAND, 5 );
+
+	m_richText = new wxRichTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 100 ), wxVSCROLL|wxBORDER_NONE|wxWANTS_CHARS );
+	bSizerR->Add( m_richText, 0, wxEXPAND|wxALL, 5 );
+
 	m_buttonClose = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerBtn->Add( m_buttonClose, 0, wxALL, 5 );
-	
-	bSizerR->Add( bSizerBtn, 1, wxALIGN_RIGHT, 5 );
+	bSizerR->Add( m_buttonClose, 0, wxALIGN_RIGHT|wxALL, 5 );
 	
 	bSizerTop->Add( bSizerR, 0, wxALIGN_RIGHT, 5 );
 	
@@ -53,6 +56,8 @@
 	this->Layout();
 	
 	this->Centre( wxBOTH );
+
+    CheckHhs();
 }
 
 IndexDialog::~IndexDialog()
@@ -61,7 +66,83 @@
 
 // Event Table
 BEGIN_EVENT_TABLE( IndexDialog, wxDialog )
-    //EVT_LIST_ITEM_ACTIVATED( ID_LIST, MyFrame::OnOpenHhsDir )
-    //EVT_BUTTON( ID_HIST, MyFrame::OnHistory )
+    EVT_CALENDAR_PAGE_CHANGED( ID_CALNENDER, IndexDialog::OnPage )
+    EVT_CALENDAR( ID_CALNENDER, IndexDialog::OnSelect )
+    EVT_BUTTON( ID_MKINDEX, IndexDialog::OnMakeIndex )
 END_EVENT_TABLE()
 
+// Event Handlers & Functions
+void IndexDialog::OnSelect( wxCalendarEvent& WXUNUSED(event) )	
+{
+    UpdateList();
+}
+
+void IndexDialog::OnMakeIndex( wxCommandEvent& WXUNUSED(event) )
+{
+	wxDateTime dt = m_calendar->GetDate();
+    wxString month = dt.Format( wxT("%m") );
+    wxString year  = dt.Format( wxT("%Y") );
+    if ( month.IsSameAs( wxT("01") ) || month.IsSameAs( wxT("02") ) || month.IsSameAs( wxT("03") ) ) {
+        long y;
+        year.ToLong( &y, 10 );
+        y--;
+        year = wxString::Format( wxT("%d"), y );
+    }
+
+
+    wxString date = dt.Format( wxT("%Y%m%d") );
+    wxString datedir = m_rootdir + wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + date;
+    if ( !wxDir::Exists( datedir ) ) {
+        wxMessageBox( wxT("フォルダが存在しません.") + datedir );
+        return;
+    }
+
+    UpdateIndex( datedir, date );
+
+    UpdateList();
+    wxMessageBox( wxT("インデックス作成が終了しました.") );
+}
+
+void IndexDialog::OnPage( wxCalendarEvent& WXUNUSED(event) ) {}
+
+void IndexDialog::UpdateList( void )
+{
+    wxDateTime dt = m_calendar->GetDate();
+    wxString ymd = dt.Format( wxT("%Y%m%d") );
+
+    wxArrayString ccn = GetCcnByDate( ymd );
+
+    m_listCtrl->DeleteAllItems();
+
+    wxString buf;
+    for ( int i = 0; i < ccn.GetCount(); i++ ) {
+        m_listCtrl->InsertItem( i, -1 );
+        buf.Printf( wxT("%02d"), i + 1 );
+        m_listCtrl->SetItem( i, 0, buf, -1 ); // No
+
+        wxArrayString ary = wxSplit( ccn[i], '_', '\\' ); // hhsno, path, date
+        buf = GetHhsInfoByHhsNo( ary[0] );
+        wxString name = buf.BeforeFirst( '_' );
+        wxString ccnn  = ary[1].Mid( 17, 3 );
+
+        m_listCtrl->SetItem( i, 1, ary[2], -1 ); // date
+        m_listCtrl->SetItem( i, 2, ccnn,   -1 ); // ccn
+        m_listCtrl->SetItem( i, 3, ary[0], -1 ); // hhsno
+        m_listCtrl->SetItem( i, 4, name,   -1 ); // name
+
+        if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour(wxT("WHEAT")) );
+    }
+}
+
+void IndexDialog::CheckHhs( void )
+{
+    wxArrayString result = CheckDBs();
+
+    for ( int i = 0; i < result.GetCount(); i++ ) {
+        m_richText->WriteText( wxT("チェック対象 : ") );
+        m_richText->WriteText( result[i] );
+        m_richText->Newline();
+    }
+    m_richText->SetEditable( false );
+}
+
--- a/src/kana.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/kana.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : kana.cpp
-// Last Change: 04-Aug-2013.
+// Last Change: 22-Aug-2013.
 //
 
 #include "kana.h"
@@ -49,24 +49,27 @@
     itemCol.SetText( wxT("住所") );
     m_listCtrl->InsertColumn( 5, itemCol );
     m_listCtrl->SetColumnWidth( 5, 180 );
+    itemCol.SetText( wxT("認定") );
+    m_listCtrl->InsertColumn( 6, itemCol );
+    m_listCtrl->SetColumnWidth( 6, 40 );
 
-	bSizerTop->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
+    bSizerTop->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
 	
     //
-	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
-	
-	m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("キャンセル"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerBtn->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_buttonSet = new wxButton( this, ID_SETKANA, wxT("セット"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerBtn->Add( m_buttonSet, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	bSizerTop->Add( bSizerBtn, 0, wxALIGN_RIGHT|wxALL, 5 );
-	
-	this->SetSizer( bSizerTop );
-	this->Layout();
-	
-	this->Centre( wxBOTH );
+    wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
+
+    m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("キャンセル"), wxDefaultPosition, wxDefaultSize, 0 );
+    bSizerBtn->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+    m_buttonSet = new wxButton( this, ID_SETKANA, wxT("セット"), wxDefaultPosition, wxDefaultSize, 0 );
+    bSizerBtn->Add( m_buttonSet, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+    bSizerTop->Add( bSizerBtn, 0, wxALIGN_RIGHT|wxALL, 5 );
+
+    this->SetSizer( bSizerTop );
+    this->Layout();
+
+    this->Centre( wxBOTH );
 
     m_searchCtrl->SetFocus();
     m_searchCtrl->SetValue( wxT("全角で入力してネ! (性と名の間は全角スペースで)") );
@@ -96,9 +99,17 @@
     UpdateList();
 }
 
-void KanaDialog::OnSelectItem( wxListEvent& WXUNUSED(event) ) 
+void KanaDialog::OnSelectItem( wxListEvent& event ) 
 {
-    m_hhsno = wxT("hoge");
+    int i = event.GetIndex();
+    wxListItem item;
+    item.SetId( i );
+
+    item.SetColumn( 1 );
+    item.SetMask( wxLIST_MASK_TEXT );
+    m_listCtrl->GetItem( item );
+    m_hhsno = item.GetText();
+
     if ( IsModal() ) 
         EndModal( wxID_OK );
     else {
@@ -109,7 +120,20 @@
 
 void KanaDialog::OnSet( wxCommandEvent& WXUNUSED(event) ) 
 {
-    m_hhsno = wxT("hoge");
+    long i = -1;
+    for ( ;; ) {
+        i = m_listCtrl->GetNextItem( i, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
+        if ( i == -1 ) break;
+
+        wxListItem item;
+        item.SetId( i );
+
+        item.SetColumn( 1 );
+        item.SetMask( wxLIST_MASK_TEXT );
+        m_listCtrl->GetItem( item );
+        m_hhsno = item.GetText();
+    }
+
     if ( IsModal() ) 
         EndModal( wxID_OK );
     else {
@@ -137,32 +161,36 @@
     */
 
     bool fuzzy = m_checkBox->IsChecked();
-    m_hhs = GetHhsInfoByKana( s, fuzzy );
+    wxArrayString hhs = GetHhsInfoByKana( s, fuzzy );
 
-    if ( m_hhs.GetCount() > 200 ) {
+    if ( hhs.GetCount() > 200 ) {
         wxMessageBox( wxT("該当件数が 200 件を超えました.\n条件を変えてみてください.") );
         return;
     }
-    else if ( m_hhs.IsEmpty() ){
+    else if ( hhs.IsEmpty() ){
         wxMessageBox( wxT("該当なし.") );
         return;
     }
 
     wxString buf;
-    for ( int i = 0; i < m_hhs.GetCount(); i++ ) {
+    for ( int i = 0; i < hhs.GetCount(); i++ ) {
         int col = 0;
         m_listCtrl->InsertItem( i, -1 );
         buf.Printf( wxT("%02d"), i + 1 );
         m_listCtrl->SetItem( i, col, buf, -1 ); // No
 
-        wxStringTokenizer tkz( m_hhs[i], wxT("_") );
+        wxStringTokenizer tkz( hhs[i], wxT("_") );  // hhsno, kana, name, birth, addr 
         while ( tkz.HasMoreTokens() ) {
             col++;
             wxString token = tkz.GetNextToken();
             m_listCtrl->SetItem( i, col, token, -1 );
+            if ( col == 1 ) {			// ccn
+                if ( IsHhsJudged( token ) ) {
+                    m_listCtrl->SetItem( i, 6, wxT("○"), -1 );
+                }
+            }
         }
-        if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour(wxT("WHEAT")) );
+        if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour( wxT("WHEAT") ) );
     }
 }
 
-
--- a/src/main.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/main.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : main.cpp
-// Last Change: 23-Jul-2013.
+// Last Change: 23-Aug-2013.
 //
 #include "main.h"
 #include "myframe.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/marksheet.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -0,0 +1,181 @@
+// Filename   : marksheet.cpp
+// Last Change: 23-Aug-2013.
+//
+
+#include "common.h"
+#include "marksheet.h"
+
+bool IsBlack( int r, int g, int b ) 
+{
+    if ( r == 0 && g == 0 && b == 0 ) {
+        return true;
+    }
+    return false;
+}
+
+wxString GuessHhs( wxString& file ) 
+{
+    wxString hhs;
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int sx = 1800;  // start x
+    int sy = 315;;  // start y
+    int bw = 60;    // block width
+    int bh = 50;    // block height
+    int area = bw * bh;
+    int black = 0;
+    int x, y;
+    unsigned char r, g, b;
+
+    int max_n;
+    float max;
+    float bk;
+    for ( int c=0; c<10; c++ ) {
+        max = 0.0;
+        max_n = -1;
+        for ( int n=0; n<10; n++ ) {
+
+            for ( x=sx+bw*c; x<sx+bw*(c+1); x++ ) {
+                for ( y=sy+bh*n; y<sy+bh*(n+1); y++ ) {
+                    r = img.GetRed(   x, y );
+                    g = img.GetGreen( x, y );
+                    b = img.GetBlue(  x, y );
+                    if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+                }
+            }
+
+            bk = (float)black / area;
+            if ( max < bk ) {
+                max = bk;
+                max_n = n;
+            }
+            //wxPuts(wxString::Format(wxT("%d %f"),n,bk));
+            black = 0;
+        }
+        hhs.Append( wxString::Format( wxT("%d"), max_n ) );
+    }
+
+    return hhs;
+}
+
+bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax )
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+
+    wxFile f( file );
+    long l = f.Length();
+
+    *brate = z;
+    *len = l;
+    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
+    if ( zmin < z && z < zmax
+      && lmin < l && l < lmax ) {
+        return true;
+    }
+    return false;
+}
+
+bool _IsMarksheet( wxString& file, float* brate, long* len )
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+    float zmin = 0.095713; float zmax = 0.108600;
+
+    wxFile f( file );
+    long l = f.Length();
+    float lmin = 2072393; float lmax = 2346082;
+
+    *brate = z;
+    *len = l;
+    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
+    if ( zmin < z && z < zmax
+      && lmin < l && l < lmax ) {
+        return true;
+    }
+    return false;
+}
+
+wxString GetHhsName( wxString& hhsno )
+{
+    wxString name;
+
+    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("hhs.db");
+    wxSQLite3Database hhsdb;
+    hhsdb.Open( gszFile );
+
+    wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT name FROM hhs_master WHERE hhsno = ?");
+    stmt.Bind( 1, hhsno );
+    wxSQLite3ResultSet q = stmt.ExecuteQuery();
+    if ( !q.IsNull(0) ) {
+        while ( q.NextRow() ) {
+            name = q.GetString(0);
+        }
+    }
+    stmt.Finalize();
+    hhsdb.Close();
+
+    return name;
+}
+
+int IsHhsno( wxString& hhsno, wxString& name )
+{
+	wxRegEx reHhs(wxT("^0[1238][0-9]{8}$"));	// 被保番チェック
+
+    if ( reHhs.Matches( hhsno) ) {
+        name = GetHhsName( hhsno );
+        if ( name.IsEmpty() ) {  // DBにない
+            return 1;
+        }
+        return 2;
+    }
+    else {
+        return 0;
+    }
+}
+
+int GetMarksheetVersion( wxString file ) 
+{
+    wxImage img( file, wxBITMAP_TYPE_JPEG );
+    int black = 0;
+    int x = 2465;
+    int h = 3500;
+    unsigned char r, g, b;
+
+    for ( int y=0; y<h; y++ ) {
+        r = img.GetRed(   x, y );
+        g = img.GetGreen( x, y );
+        b = img.GetBlue(  x, y );
+        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
+    }
+    float z = (float)black / h;
+
+    if ( z > 0.120 ) {
+        return 2;   // 0.130 - 0.140
+    }
+    else {
+        return 1;   // 0.099 - 0.110
+    }
+}
+
--- a/src/mask.cpp	Sun Aug 04 21:42:49 2013 +0900
+++ b/src/mask.cpp	Fri Aug 23 18:32:09 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : mask.cpp
-// Last Change: 04-Aug-2013.
+// Last Change: 14-Aug-2013.
 //
 
 #include "mask.h"
@@ -10,74 +10,154 @@
 	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
 	
 	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );
+
+	m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+	m_panel    = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxSize( 310, -1 ), wxTAB_TRAVERSAL );
+	m_panelold = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
 	
+    // 現マークシートパネル
 	wxFlexGridSizer* fgSizer = new wxFlexGridSizer( 0, 5, 0, 0 );
 	fgSizer->SetFlexibleDirection( wxBOTH );
 	fgSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
 	
-	m_staticTextDummy0 = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextDummy0 = new wxStaticText( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextDummy0, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_staticTextX = new wxStaticText( this, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextX = new wxStaticText( m_panel, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextX, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
 	
-	m_staticTextY = new wxStaticText( this, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextY = new wxStaticText( m_panel, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextY, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
 	
-	m_staticTextW = new wxStaticText( this, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextW = new wxStaticText( m_panel, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextW, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
 	
-	m_staticTextH = new wxStaticText( this, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_staticTextH->Wrap( -1 );
+	m_staticTextH = new wxStaticText( m_panel, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextH, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
 	
-	m_staticTextMask1 = new wxStaticText( this, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextMask1 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextMask1, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM1x = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM1x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM1x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM1y = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM1y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM1y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_textCtrlM1w = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM1w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM1w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM1h = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM1h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM1h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_staticTextMask2 = new wxStaticText( this, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextMask2 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextMask2, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM2x = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM2x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM2x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM2y = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM2y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM2y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_textCtrlM2w = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM2w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM2w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM2h = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM2h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM2h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_staticTextMask3 = new wxStaticText( this, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticTextMask3 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
 	fgSizer->Add( m_staticTextMask3, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM3x = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM3x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM3x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM3y = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM3y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM3y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_textCtrlM3w = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM3w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM3w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
-	m_textCtrlM3h = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxTE_RIGHT );
+	m_textCtrlM3h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
 	fgSizer->Add( m_textCtrlM3h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	bSizerTop->Add( fgSizer, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	m_panel->SetSizer( fgSizer );
+	m_panel->Layout();
+	fgSizer->Fit( m_panel );
+	m_notebook->AddPage( m_panel, wxT("現マークシート"), false );
+
+    // 旧マークシートパネル
+	wxFlexGridSizer* fgSizerOld = new wxFlexGridSizer( 0, 5, 0, 0 );
+	fgSizerOld->SetFlexibleDirection( wxBOTH );
+	fgSizerOld->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	m_staticTextDummy0Old = new wxStaticText( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextDummy0Old, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextXOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextXOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextYOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextYOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextWOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextWOld, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextHOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextHOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextMask1Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask1Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM1wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
 	
+	m_textCtrlM1hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask2Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask2Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM2wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask3Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask3Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM3wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_panelold->SetSizer( fgSizerOld );
+	m_panelold->Layout();
+	fgSizerOld->Fit( m_panelold );
+	m_notebook->AddPage( m_panelold, wxT("旧マークシート"), false );
+
+	bSizerTop->Add( m_notebook, 1, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+    //
 	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
 	
 	m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("キャンセル"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -129,6 +209,27 @@
     m_mask3.SetPosition( wxPoint( x, y ) ); 
     m_mask3.SetSize( wxSize( w, h ) ); 
 
+    buf = m_textCtrlM1xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM1yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM1wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM1hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask1old.SetPosition( wxPoint( x, y ) ); 
+    m_mask1old.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM2xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM2yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM2wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM2hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask2old.SetPosition( wxPoint( x, y ) ); 
+    m_mask2old.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM3xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM3yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM3wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM3hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask3old.SetPosition( wxPoint( x, y ) ); 
+    m_mask3old.SetSize( wxSize( w, h ) ); 
+
     if ( IsModal() ) 
         EndModal( wxID_OK );
     else {
@@ -151,5 +252,18 @@
     m_textCtrlM3y->SetValue( wxString::Format( wxT("%d"), m_mask3.GetY() ) );
     m_textCtrlM3w->SetValue( wxString::Format( wxT("%d"), m_mask3.GetWidth() ) );
     m_textCtrlM3h->SetValue( wxString::Format( wxT("%d"), m_mask3.GetHeight() ) );
+
+    m_textCtrlM1xOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetX() ) );
+    m_textCtrlM1yOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetY() ) );
+    m_textCtrlM1wOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetWidth() ) );
+    m_textCtrlM1hOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetHeight() ) );
+    m_textCtrlM2xOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetX() ) );
+    m_textCtrlM2yOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetY() ) );
+    m_textCtrlM2wOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetWidth() ) );
+    m_textCtrlM2hOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetHeight() ) );
+    m_textCtrlM3xOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetX() ) );
+    m_textCtrlM3yOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetY() ) );
+    m_textCtrlM3wOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetWidth() ) );
+    m_textCtrlM3hOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetHeight() ) );
 }
 
--- 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 )
 {