Mercurial > mercurial > hgweb_searcher03.cgi
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 ) {