diff src/cache.cpp @ 21:a2ad87cad48b

Enhanced the convenience of Cache dialog.
author pyon@macmini
date Wed, 17 Dec 2014 00:52:43 +0900
parents a8e6e5769e3b
children
line wrap: on
line diff
--- a/src/cache.cpp	Mon Dec 08 19:47:42 2014 +0900
+++ b/src/cache.cpp	Wed Dec 17 00:52:43 2014 +0900
@@ -1,33 +1,165 @@
 // Filename   : cache.cpp
-// Last Change: 21-Nov-2014.
+// Last Change: 15-Dec-2014.
 //
 
 #include "cache.h"
 #include "db.h"
 
+// キャッシュ取得ダイアログ
+CacheGetDialog::CacheGetDialog( 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( wxVERTICAL );
+	
+	m_dirPicker = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString, wxT("Select a directory") );
+	bSizerTop->Add( m_dirPicker, 0, wxALL|wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizerButton = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_buttonGet = new wxButton( this, ID_GETCACHE, wxT("コピィ"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonGet, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	bSizerTop->Add( bSizerButton, 0, wxALIGN_RIGHT, 5 );
+	
+	this->SetSizer( bSizerTop );
+	this->Layout();
+	
+	this->Centre( wxBOTH );
+}
+
+CacheGetDialog::~CacheGetDialog()
+{
+}
+
+// Event Table
+BEGIN_EVENT_TABLE( CacheGetDialog, wxDialog )
+    EVT_BUTTON( ID_GETCACHE, CacheGetDialog::OnGetCache )
+END_EVENT_TABLE()
+
+// Event Handlers & Functions
+void CacheGetDialog::OnGetCache( wxCommandEvent& WXUNUSED(event) )
+{
+    wxString fromdir = m_dirPicker->GetPath();
+
+    wxString cachedir = wxGetCwd() + wxFILE_SEP_PATH + wxT("cache");
+
+    for ( int i = 0; i < m_nocache.GetCount(); i++ ) {
+
+        wxString year = m_nocache[i].Left( 4 );
+        wxString month = m_nocache[i].Mid( 4, 2 );
+
+        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 from = fromdir  + wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + m_nocache[i];
+        wxString to   = cachedir + wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + m_nocache[i];
+
+        wxArrayString files;
+        wxDir::GetAllFiles( from, &files, wxT("*.png"), wxDIR_DEFAULT );
+
+        wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), files.GetCount(), NULL, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE );
+        pd.SetSize( wxSize( 320, 140 ) );
+
+        for ( int j = 0; j < files.GetCount(); j++ ) {
+            wxFileName fn( files[j] );
+
+            wxString ccn = fn.GetPath().BeforeLast( wxFILE_SEP_PATH ).AfterLast( wxFILE_SEP_PATH );
+            wxString hhs = fn.GetPath().AfterLast( wxFILE_SEP_PATH );
+            wxString buf = to + wxFILE_SEP_PATH + ccn + wxFILE_SEP_PATH + hhs + wxFILE_SEP_PATH + fn.GetFullName();
+
+            wxFileName td( buf );
+            if ( !td.Exists() ) td.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
+
+            wxCopyFile( files[j], buf, true );
+            if ( j % 5 == 0 ) wxSleep( 2 ); // ディスクの負荷軽減
+
+            pd.Update( j, hhs + wxT("@") + ccn + wxT("@") + m_nocache[i] + wxT("を処理しました.") );
+        }
+    }
+
+    wxMessageBox( wxT("Getting cache done."), wxT("Message"), wxOK|wxSTAY_ON_TOP );
+    Close();
+}
+
+void CacheGetDialog::SetSyncDates( wxArrayString dates )
+{
+    m_nocache = dates;
+}
+
+// メインダイアログ
 CacheDialog::CacheDialog( 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 );
 	
-	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );
+	wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL );
+	
+    //
+	wxBoxSizer* bSizerList = new wxBoxSizer( wxVERTICAL );
+	
+	m_staticText = new wxStaticText( this, wxID_ANY, wxT("作成対象選択"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerList->Add( m_staticText, 0, wxALL, 5 );
 	
-	m_datePickerBgn = new wxDatePickerCtrl( this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT );
-	bSizerTop->Add( m_datePickerBgn, 0, wxALL, 5 );
+	m_listCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT );
+    wxListItem itemCol;
+    itemCol.SetText( wxT("通番") );
+    m_listCtrl->InsertColumn( 0, itemCol );
+    m_listCtrl->SetColumnWidth( 0, 50 );
+    itemCol.SetText( wxT("審査会年月日") );
+    m_listCtrl->InsertColumn( 1, itemCol );
+    m_listCtrl->SetColumnWidth( 1, 100 );
+    itemCol.SetText( wxT("キャッシュ有無") );
+    m_listCtrl->InsertColumn( 2, itemCol );
+    m_listCtrl->SetColumnWidth( 2, 100 );
+	bSizerList->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
 	
-	m_datePickerEnd = new wxDatePickerCtrl( this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT );
-	bSizerTop->Add( m_datePickerEnd, 0, wxALL, 5 );
+    //
+	wxBoxSizer* bSizerRange = new wxBoxSizer( wxHORIZONTAL );
+
+	m_staticTextRange = new wxStaticText( this, wxID_ANY, wxT("表示範囲指定"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerRange->Add( m_staticTextRange, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_datePickerBgn = new wxDatePickerCtrl( this, ID_RGBGN, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DROPDOWN );
+	bSizerRange->Add( m_datePickerBgn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextBetween = new wxStaticText( this, wxID_ANY, wxT("~"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerRange->Add( m_staticTextBetween, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_datePickerEnd = new wxDatePickerCtrl( this, ID_RGEND, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DROPDOWN );
+	bSizerRange->Add( m_datePickerEnd, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_buttonMake = new wxButton( this, ID_MKCACHE, wxT("作成"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerTop->Add( m_buttonMake, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+	bSizerList->Add( bSizerRange, 0, wxALL|wxEXPAND, 5 );
+
+	bSizerTop->Add( bSizerList, 1, wxEXPAND, 5 );
+
+    //	
+	wxBoxSizer* bSizerButton = new wxBoxSizer( wxVERTICAL );
+
+	m_buttonCache = new wxButton( this, ID_MKCACHE, wxT("作成"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonCache, 0, wxALL, 5 );
 	
-	m_buttonClose = new wxButton( this, ID_CLOSE, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_buttonGet = new wxButton( this, ID_GET, wxT("取得"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonGet, 0, wxALL, 5 );
+	
+	m_buttonClose = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerButton->Add( m_buttonClose, 0, wxALL, 5 );
 	m_buttonClose->SetDefault(); 
-	bSizerTop->Add( m_buttonClose, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+	
+	bSizerTop->Add( bSizerButton, 0, 0, 5 );
+	
 	
 	this->SetSizer( bSizerTop );
 	this->Layout();
-	bSizerTop->Fit( this );
 	
 	this->Centre( wxBOTH );
 }
@@ -38,8 +170,10 @@
 
 // Event Table
 BEGIN_EVENT_TABLE( CacheDialog, wxDialog )
-    EVT_BUTTON( ID_MKCACHE, CacheDialog::OnMakeCache )
-    EVT_BUTTON( ID_CLOSE,   CacheDialog::OnClose )
+    EVT_DATE_CHANGED( ID_RGBGN, CacheDialog::OnDateChange )
+    EVT_DATE_CHANGED( ID_RGEND, CacheDialog::OnDateChange )
+    EVT_BUTTON( ID_MKCACHE,     CacheDialog::OnMakeCache  )
+    EVT_BUTTON( ID_GET,         CacheDialog::OnGetCache   )
 END_EVENT_TABLE()
 
 // Event Handlers & Functions
@@ -48,46 +182,122 @@
     m_rootdir = rootdir;
     m_width   = w;
     m_height  = h;
+
+    m_datePickerBgn->SetValue( wxDateTime::Today() - wxDateSpan::Month() * 2 );
+    m_datePickerEnd->SetValue( wxDateTime::Today() );
+}
+
+void CacheDialog::Listup( void )
+{
+    nocache.Clear();
+    wxDateTime b = m_datePickerBgn->GetValue();
+    wxDateTime e = m_datePickerEnd->GetValue();
+    wxArrayString ccn = GetCcnDate();
+    
+    wxDateTime dt;
+    wxRegEx reDate( wxT("(^20[0-9]{2})([0-1][0-9])([0-3][0-9])$") );
+    m_listCtrl->DeleteAllItems();
+
+    for ( int i = 0; i < ccn.GetCount(); i++ ) {
+
+        dt.ParseFormat( ccn[i], wxT("%Y%m%d") );
+
+        if ( dt.IsBetween( b, e ) ) {
+
+            // cache exists ?
+            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 cache_dir = wxGetCwd() + wxFILE_SEP_PATH + wxT("cache") + wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + dt.Format( wxT("%Y%m%d") );
+
+            wxString cache_ok;
+            wxFileName cd( cache_dir );
+            if ( cd.Exists() ) 
+                cache_ok = wxT("○");
+            else
+                nocache.Insert( dt.Format( wxT("%Y%m%d") ), 0 );
+
+            m_listCtrl->InsertItem( i, -1 );
+            m_listCtrl->SetItem( i, 0, wxString::Format( wxT("%d"), i + 1 ) , -1 ); // No
+            reDate.Replace( &ccn[i], wxT("\\1-\\2-\\3") );
+            m_listCtrl->SetItem( i, 1, ccn[i], -1 );
+            if ( !cache_ok.IsEmpty() ) m_listCtrl->SetItem( i, 2, cache_ok, -1 );
+
+            if ( i % 2 ) m_listCtrl->SetItemBackgroundColour( i, wxColour( wxT("WHEAT") ) );
+        }
+    }
+}
+
+void CacheDialog::OnDateChange( wxDateEvent& WXUNUSED(event) )
+{
+    Listup();
 }
 
 void CacheDialog::OnMakeCache( wxCommandEvent& WXUNUSED(event) )	
 {
-    wxDateTime b = m_datePickerBgn->GetValue();
-    wxDateTime e = m_datePickerEnd->GetValue();
-    
-    MakeCache( b.Format( wxT("%Y%m%d")), e.Format( wxT("%Y%m%d")) );
-}
-
-void CacheDialog::MakeCache( wxString from, wxString to )
-{
-    wxArrayString path = GetPathes( from, to );
+    if ( m_listCtrl->GetSelectedItemCount() < 1 ) {
+        wxMessageBox( wxT("項目を少なくともひとつ選択してください.") );
+        return;
+    }
     wxString cachedir = wxGetCwd() + wxFILE_SEP_PATH + wxT("cache");
 
-    for ( int i = 0; i < path.GetCount(); i++ ) {
+    long item = -1;
+    bool done = false;
+    for ( ;; ) {
+        item = m_listCtrl->GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
+        if ( item == -1 ) break;
 
-        wxArrayString files;
-        wxDir::GetAllFiles( path[i], &files, wxT("*.jpg"), wxDIR_DEFAULT );
+        wxString c = m_listCtrl->GetItemText( item, 2 );
+        if ( c.IsEmpty() ) {
+            wxString date = m_listCtrl->GetItemText( item, 1 );
+            date.Replace( wxT("-"), wxEmptyString, true );
 
-        for ( int j = 0; j < files.GetCount(); j++ ) {
-            wxImage image( files[j], wxBITMAP_TYPE_JPEG );
-            wxImage output = image.Scale( m_width, m_height, wxIMAGE_QUALITY_HIGH );
+            wxArrayString path = GetPathesByDate( date );
+
+            wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), path.GetCount(), NULL, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE );
+            pd.SetSize( wxSize( 320, 140 ) );
+
+            for ( int i = 0; i < path.GetCount(); i++ ) {
 
-            wxString buf = files[j];
-            buf.Replace( m_rootdir, cachedir, false );
-            buf = buf.BeforeLast( '.' ) + wxT(".png");
+                wxArrayString files;
+                wxDir::GetAllFiles( path[i], &files, wxT("*.jpg"), wxDIR_DEFAULT );
+
+                for ( int j = 0; j < files.GetCount(); j++ ) {
+                    wxImage image( files[j], wxBITMAP_TYPE_JPEG );
+                    wxImage output = image.Scale( m_width, m_height, wxIMAGE_QUALITY_HIGH );
 
-            wxFileName tf( buf );
-            if ( !tf.Exists() ) tf.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
-            output.SaveFile( buf, wxBITMAP_TYPE_PNG );
+                    wxString buf = files[j];
+                    buf.Replace( m_rootdir, cachedir, false );
+                    buf = buf.BeforeLast( '.' ) + wxT(".png");
+
+                    wxFileName tf( buf );
+                    if ( !tf.Exists() ) tf.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
+                    output.SaveFile( buf, wxBITMAP_TYPE_PNG );
+                }
+                pd.Update( i, path[i] + wxT("を処理しました.") );
+                wxSleep( 10 );
+            }
+            done = true;
         }
-        wxSleep( 30 );
     }
 
-    wxMessageBox( wxT("cache updated.") );
+    if ( done ) {
+        wxMessageBox( wxT("cache updated."), wxT("Message"), wxOK|wxSTAY_ON_TOP );
+        Listup();
+    }
 }
 
-void CacheDialog::OnClose( wxCommandEvent& WXUNUSED(event) )
+void CacheDialog::OnGetCache( wxCommandEvent& WXUNUSED(event) )
 {
-    Close();
+    CacheGetDialog* cd = new CacheGetDialog( this, wxID_ANY, wxT("キャッシュ取得"), wxDefaultPosition, wxSize( 500, 100 ), wxCAPTION|wxFRAME_NO_TASKBAR );
+    cd->SetSyncDates( nocache );
+    cd->ShowModal();
+    Listup();
 }