view src/ccnframe.cpp @ 21:eb3f5c7c990f

small changes.
author pyon@macmini
date Mon, 25 Jul 2011 05:20:55 +0900
parents 710be7b6a873
children 05f76f9f9186
line wrap: on
line source

// Filename   : ccnframe.cpp
// Last Change: 23-Jul-2011.
//

#include "common.h"
#include "main.h"
#include "ccnframe.h"
#include "wx/wxsqlite3.h"

FrameCcn::FrameCcn( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
    : wxFrame( parent, id, title, pos, size, style )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
    m_Panel = new wxPanel( this );
	
	wxBoxSizer* bSizer;
	bSizer = new wxBoxSizer( wxHORIZONTAL );
	
    // DB表示
	wxFlexGridSizer* fgSizer = new wxFlexGridSizer( 2, 5, 0, 0 );
    fgSizer->AddGrowableRow(1);
	
	m_staticText1 = new wxStaticText( m_Panel, wxID_ANY, wxT("開催年月日"), wxDefaultPosition, wxDefaultSize, 0 );
	fgSizer->Add( m_staticText1, 0, wxALL, 5 );
	
	fgSizer->Add( 0, 0, 1, wxEXPAND, 5 );
	
	m_staticText2 = new wxStaticText( m_Panel, wxID_ANY, wxT("合議体"), wxDefaultPosition, wxDefaultSize, 0 );
	fgSizer->Add( m_staticText2, 0, wxALL, 5 );
	
	fgSizer->Add( 0, 0, 1, wxEXPAND, 5 );
	
	m_staticText3 = new wxStaticText( m_Panel, wxID_ANY, wxT("被保険者"), wxDefaultPosition, wxDefaultSize, 0 );
	fgSizer->Add( m_staticText3, 0, wxALL, 5 );
	
	m_listCtrlYmd = new wxListCtrl( m_Panel, ID_YMD, wxDefaultPosition, wxSize( 220, -1 ), wxLC_REPORT|wxLC_SINGLE_SEL );
	fgSizer->Add( m_listCtrlYmd, 1, wxALL|wxEXPAND, 5 );
	
	m_staticText4 = new wxStaticText( m_Panel, wxID_ANY, wxT("→"), wxDefaultPosition, wxDefaultSize, 0 );
	fgSizer->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
	
	m_listCtrlCcn = new wxListCtrl( m_Panel, ID_CCN, wxDefaultPosition, wxSize( 220, -1 ), wxLC_REPORT|wxLC_SINGLE_SEL );
	fgSizer->Add( m_listCtrlCcn, 1, wxALL|wxEXPAND, 5 );
	
	m_staticText5 = new wxStaticText( m_Panel, wxID_ANY, wxT("→"), wxDefaultPosition, wxDefaultSize, 0 );
	fgSizer->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
	
	m_listCtrlHhs = new wxListCtrl( m_Panel, ID_HHS, wxDefaultPosition, wxSize( 220, -1 ), wxLC_REPORT|wxLC_SINGLE_SEL );
	fgSizer->Add( m_listCtrlHhs, 1, wxALL|wxEXPAND, 5 );
	
	bSizer->Add( fgSizer, 1, wxEXPAND|wxALL, 5 );
	
    // Index作成
	wxGridBagSizer* gbSizer = new wxGridBagSizer( 0, 0 );
	gbSizer->SetFlexibleDirection( wxVERTICAL );
	gbSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
    gbSizer->AddGrowableRow(3);
	
	m_btnPrevThu = new wxButton( m_Panel, ID_PRVTHU, wxT("<< 前木"), wxDefaultPosition, wxDefaultSize, 0 );
	gbSizer->Add( m_btnPrevThu, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 );
	
	m_btnNextThu = new wxButton( m_Panel, ID_NXTTHU, wxT("次木 >>"), wxDefaultPosition, wxDefaultSize, 0 );
	gbSizer->Add( m_btnNextThu, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
	
	m_datePicker = new wxDatePickerCtrl( m_Panel, ID_DTPICKER, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DROPDOWN|wxDP_SHOWCENTURY );
	gbSizer->Add( m_datePicker, wxGBPosition( 1, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER|wxALL, 5 );
	
	m_btnMkIdX = new wxButton( m_Panel, ID_MKIDX, wxT("作成"), wxDefaultPosition, wxDefaultSize, 0 );
	gbSizer->Add( m_btnMkIdX, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
	
	m_btnClose = new wxButton( m_Panel, ID_CLOSE, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
	gbSizer->Add( m_btnClose, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALIGN_BOTTOM|wxALL, 5 );
	
	bSizer->Add( gbSizer, 0, wxEXPAND|wxALL, 5 );
	
	m_Panel->SetSizer( bSizer );
	m_Panel->Layout();
	
    this->SetSize( 1000, 400 );
	this->Centre( wxBOTH );
    InitListCtrl();
}

// Destructor
FrameCcn::~FrameCcn()
{
}

// Event Table
BEGIN_EVENT_TABLE( FrameCcn, wxFrame )
    EVT_LIST_ITEM_SELECTED( ID_YMD, FrameCcn::OnSelectYmd )
    EVT_LIST_ITEM_SELECTED( ID_CCN, FrameCcn::OnSelectCcn )
    EVT_BUTTON( ID_PRVTHU, FrameCcn::OnPrevThu )
    EVT_BUTTON( ID_NXTTHU, FrameCcn::OnNextThu )
    EVT_BUTTON( ID_MKIDX,  FrameCcn::OnMkIndex )
    EVT_BUTTON( ID_CLOSE,  FrameCcn::OnClose )
END_EVENT_TABLE()

// Event Handlers
void FrameCcn::OnSelectYmd(wxListEvent& WXUNUSED(event))
{
    m_listCtrlCcn->DeleteAllItems();

    wxString gszFile = wxGetCwd() + wxT("/db/ccn.db");
    wxSQLite3Database ccndb;
    ccndb.Open( gszFile );

    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT path FROM path WHERE hhsno = ?");
    stmt.Bind( 1, wxT("0300012345") );
    wxSQLite3ResultSet q = stmt.ExecuteQuery();
    if ( q.IsNull(0) ) {
        return;
    }
    long r=0;
    while ( q.NextRow() ) {
        wxString ccn = q.GetString(0);
        //wxString cnt = q.GetString(1);
        m_listCtrlCcn->InsertItem( r, ccn );
        //m_listCtrlCcn->SetItem( r, 1, cnt, -1 );
        r++;
    }
    stmt.Finalize();
    ccndb.Close();
}

void FrameCcn::OnSelectCcn(wxListEvent& WXUNUSED(event))
{
    m_listCtrlHhs->DeleteAllItems();

    wxString gszFile = wxGetCwd() + wxT("/db/ccn.db");
    wxSQLite3Database ccndb;
    ccndb.Open( gszFile );

    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT ymd, MAX(time) FROM ccn GROUP BY ymd ORDER BY ymd DESC, time DESC");
    wxSQLite3ResultSet q = stmt.ExecuteQuery();
    long r=0;
    while ( q.NextRow() ) {
        wxString ymd  = q.GetString(0);
        wxString time = q.GetString(1);
        m_listCtrlHhs->InsertItem( r, wxEmptyString );
        m_listCtrlHhs->SetItemText( r, ymd );
        r++;
    }

    stmt.Finalize();
    ccndb.Close();
}

// 前木
void FrameCcn::OnPrevThu(wxCommandEvent& WXUNUSED(event))
{
	wxDateTime dt = m_datePicker->GetValue();
    wxDateSpan ds( 0, 0, 0, 1 );
    dt -= ds;
    dt.SetToPrevWeekDay( wxDateTime::Thu );
    m_datePicker->SetValue( dt );

}
// 次木
void FrameCcn::OnNextThu(wxCommandEvent& WXUNUSED(event))
{
	wxDateTime dt = m_datePicker->GetValue();
    wxDateSpan ds( 0, 0, 0, 1 );
    dt += ds;
    dt.SetToNextWeekDay( wxDateTime::Thu );
    m_datePicker->SetValue( dt );
}

/* インデックス作成 */
void FrameCcn::OnMkIndex(wxCommandEvent& WXUNUSED(event))
{
	wxDateTime dt = m_datePicker->GetValue();
    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 pathroot = wxGetApp().rootdir + wxFILE_SEP_PATH + year + dt.Format(wxT("\\%Y%m%d"));
    wxDir rootd(pathroot);
    if ( !wxDir::Exists(pathroot) ) {
        wxMessageBox( wxT("フォルダが存在しません.")+pathroot );
        return;
    }

    wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), 200, this, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE );
    pd.SetSize( wxSize(320,140) );
    int count=0;

    wxString ccndir;
    bool cont = rootd.GetFirst( &ccndir, wxT("*.*"), wxDIR_DIRS );
    while ( cont ) {
        wxString gszFile = wxGetCwd() + wxT("/db/ccn.db");
        wxSQLite3Database ccndb;
        ccndb.Open( gszFile );

        wxSQLite3Statement stmt = ccndb.PrepareStatement("INSERT OR REPLACE INTO ccn VALUES( ?, datetime('now','localtime') )");
        stmt.Bind( 1, dt.Format(wxT("%Y-%m-%d")) );
        stmt.ExecuteQuery();

        stmt.Finalize();

        wxDir ccnd( pathroot + wxFILE_SEP_PATH + ccndir );
        if ( !ccnd.IsOpened() ) return;
        wxString hhsdir;
        bool c = ccnd.GetFirst( &hhsdir, wxT("*.*"), wxDIR_DIRS );
	    wxRegEx reHhs(wxT("^0[1238][0-9]{8}$"));	// 被保番チェック
        while ( c ) {
            if ( reHhs.Matches(hhsdir) ) {
                wxString path = pathroot + wxFILE_SEP_PATH + ccndir + wxFILE_SEP_PATH + hhsdir;

                stmt = ccndb.PrepareStatement("INSERT OR REPLACE INTO path VALUES( ?, ? )");
                stmt.Bind( 1, hhsdir );
                stmt.Bind( 2, path );
                stmt.ExecuteQuery();

                stmt.Finalize();
            }
            c = ccnd.GetNext(&hhsdir);
            pd.Update( count++, hhsdir+wxT("@")+ccndir+wxT("を処理しました.") );
        }
        ccndb.Close();

        cont = rootd.GetNext(&ccndir);
    }
    wxMessageBox(wxT("インデックス作成が終了しました."));
}

// 閉じる
void FrameCcn::OnClose(wxCommandEvent& WXUNUSED(event))
{
    this->Close();
}

// Functions
void FrameCcn::InitListCtrl()
{
    wxListItem itemCol;
    itemCol.SetText( wxT("年-月-日") );
    m_listCtrlYmd->InsertColumn( 0, itemCol );
    m_listCtrlYmd->SetColumnWidth( 0, 100 );
    itemCol.SetText( wxT("更新時刻") );
    m_listCtrlYmd->InsertColumn( 1, itemCol );
    m_listCtrlYmd->SetColumnWidth( 1, 200 );

    itemCol.SetText( wxT("合議体名") );
    m_listCtrlCcn->InsertColumn( 0, itemCol );
    m_listCtrlCcn->SetColumnWidth( 0, 100 );
    itemCol.SetText( wxT("件数") );
    m_listCtrlCcn->InsertColumn( 1, itemCol );
    m_listCtrlCcn->SetColumnWidth( 1, 100 );

    itemCol.SetText( wxT("被保険者番号") );
    m_listCtrlHhs->InsertColumn( 0, itemCol );
    m_listCtrlHhs->SetColumnWidth( 0, 100 );
    itemCol.SetText( wxT("氏名") );
    m_listCtrlHhs->InsertColumn( 1, itemCol );
    m_listCtrlHhs->SetColumnWidth( 1, 100 );

    // read from db
    m_listCtrlCcn->DeleteAllItems();

    wxString gszFile = wxGetCwd() + wxT("/db/ccn.db");
    wxSQLite3Database ccndb;
    ccndb.Open( gszFile );

    wxSQLite3Statement stmt = ccndb.PrepareStatement("SELECT ymd, MAX(time) FROM ccn GROUP BY ymd ORDER BY ymd DESC, time DESC");
    wxSQLite3ResultSet q = stmt.ExecuteQuery();
    long r=0;
    while ( q.NextRow() ) {
        wxString ymd  = q.GetString(0);
        wxString time = q.GetString(1);
        m_listCtrlYmd->InsertItem( r, ymd );
        m_listCtrlYmd->SetItem( r, 1, time, -1 );
        r++;
    }

    stmt.Finalize();
    ccndb.Close();
}