view src/myframe.cpp @ 7:bfa0800f1176

fix text-color
author pyon@macmini
date Sat, 08 Oct 2011 19:49:13 +0900
parents 99d612849255
children b59dfcc84d7a
line wrap: on
line source

// Filename   : mainframe.cpp
// Last Change: 08-Oct-2011.
//
#include "symbol.h"
#include "common.h"
#include "myframe.h"
#include "delwhite.h"
#include "marksheet.h"
#include "main.h"

// resources
// the application icon (under Windows and OS/2 it is in resources and even
// though we could still include the XPM here it would be unused)
#if !defined(__WXMSW__) && !defined(__WXPM__)
    #include "sample.xpm"
#endif

//////////////////////////////////////////////////////////////////////////
// control constructor

// 検索履歴をログに保存
/*
void MyCmdBox::WriteLog( wxString& cmd, wxString& path )
{
    wxString logfn = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("log.txt");
    wxTextFile logFile;
    logFile.Open( logfn );
    wxDateTime now = wxDateTime::Now();
    wxString log = now.Format( wxT("%Y-%m-%d %H:%M:%S") ) + wxT(" ") + cmd + wxT(" ") + path;
    logFile.AddLine( log );
    logFile.Write();
    logFile.Close();

    return;
}
*/

//////////////////////////////////////////////////////////////////////////
// frame constructor
MyFrame::MyFrame( wxWindow* parent, wxWindowID id, const wxString& title )
    : wxFrame( parent, id, title )
{
    this->SetBackgroundColour( wxColour(wxT("WHEAT")) );
    // set the frame icon
    SetIcon(wxICON(sample));
	
    // メニューバー
	m_menubar  = new wxMenuBar();

	m_menuFile = new wxMenu();
    m_menuFile->Append( ID_OPWORK, wxT("作業フォルダを開く"), wxT("Open work folder") );
    m_menuFile->AppendSeparator(); //----
    m_menuFile->Append( wxID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog") );
    m_menuFile->AppendSeparator(); //----
    m_menuFile->Append( wxID_EXIT, wxT("終了(&X)\tAlt-X"), wxT("Quit this program") );

	m_menubar->Append( m_menuFile, wxT("ファイル(&F)") ); 
	
	this->SetMenuBar( m_menubar );

    // ステータスバー
    int widths[] = { -1, 150, 120 };
    m_statusBar = this->CreateStatusBar( WXSIZEOF(widths), wxST_SIZEGRIP );
    m_statusBar->SetStatusWidths( WXSIZEOF(widths), widths );
    m_statusBar->SetStatusText( wxEmptyString, 0 );
	
    // コントロール	
	wxBoxSizer* bSizerTop;
	bSizerTop = new wxBoxSizer( wxVERTICAL );
	
	wxBoxSizer* bSizerWork;
	bSizerWork = new wxBoxSizer( wxHORIZONTAL );
	
	m_staticTextWork = new wxStaticText( this, wxID_ANY, wxT("作業用フォルダ"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerWork->Add( m_staticTextWork, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_dirPickerWork = new wxDirPickerCtrl( this, ID_WORKDIR, wxGetApp().dir, wxT("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DEFAULT_STYLE );
	bSizerWork->Add( m_dirPickerWork, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_buttonDetWhite = new wxButton( this, ID_DTWHITE, wxT("白紙検知"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerWork->Add( m_buttonDetWhite, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	bSizerTop->Add( bSizerWork, 0, wxEXPAND, 5 );
	
	wxBoxSizer* bSizerMoveTo;
	bSizerMoveTo = new wxBoxSizer( wxHORIZONTAL );
	
	m_staticTextMoveTo = new wxStaticText( this, wxID_ANY, wxT("移動先フォルダ"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerMoveTo->Add( m_staticTextMoveTo, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
    wxArrayString drives;
    drives.Add(wxT("C:"));
    drives.Add(wxT("Y:"));
    drives.Add(wxT("Z:"));
	m_comboBoxMoveDrive = new wxComboBox( this, ID_DRIVE, wxT("C:"), wxDefaultPosition, wxSize( 50,-1 ), drives, 0 ); 
	bSizerMoveTo->Add( m_comboBoxMoveDrive, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_datePickerCcn = new wxDatePickerCtrl( this, ID_DATE, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DROPDOWN );
	bSizerMoveTo->Add( m_datePickerCcn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
    wxArrayString ccns;
	ccns.Add(wxT("角館1")); ccns.Add(wxT("角館2")); ccns.Add(wxT("角館3")); ccns.Add(wxT("角館4"));
	ccns.Add(wxT("西仙1")); ccns.Add(wxT("西仙2")); ccns.Add(wxT("西仙3"));
	ccns.Add(wxT("千畑1")); ccns.Add(wxT("千畑2")); ccns.Add(wxT("千畑3"));
	ccns.Add(wxT("大曲1")); ccns.Add(wxT("大曲2")); ccns.Add(wxT("大曲3")); ccns.Add(wxT("大曲4")); ccns.Add(wxT("大曲5")); ccns.Add(wxT("大曲6"));
	ccns.Add(wxT("六郷1")); ccns.Add(wxT("六郷2")); ccns.Add(wxT("六郷3"));
	m_comboBoxCcn = new wxComboBox( this, ID_CCN, wxEmptyString, wxDefaultPosition, wxSize( 100,-1 ), ccns, 0 ); 
	bSizerMoveTo->Add( m_comboBoxCcn, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_buttonSetDir = new wxButton( this, ID_STDIR, wxT("フォルダ指定"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerMoveTo->Add( m_buttonSetDir, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );

	m_buttonMkDir = new wxButton( this, ID_MKDIR, wxT("フォルダ作成"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerMoveTo->Add( m_buttonMkDir, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
	
	bSizerTop->Add( bSizerMoveTo, 0, 0, 5 );
	
	wxBoxSizer* bSizerDoMove;
	bSizerDoMove = new wxBoxSizer( wxHORIZONTAL );
	
	m_staticTextDummy = new wxStaticText( this, wxID_ANY, wxT("移動先ふぉるだ"), wxDefaultPosition, wxDefaultSize, 0 );
	m_staticTextDummy->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) );
	
	bSizerDoMove->Add( m_staticTextDummy, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_textCtrlMoveDir = new wxTextCtrl( this, ID_DIR, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
	m_textCtrlMoveDir->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) );
	
	bSizerDoMove->Add( m_textCtrlMoveDir, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
	
	m_buttonDoMove = new wxButton( this, ID_DOMOVE, wxT("画像移動"), wxDefaultPosition, wxDefaultSize, 0 );
	
	bSizerDoMove->Add( m_buttonDoMove, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
	
	bSizerTop->Add( bSizerDoMove, 0, wxEXPAND, 5 );
	
	m_listCtrl = new wxListCtrl( this, ID_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL );
    wxListItem itemCol;
    itemCol.SetText( wxT("通番") );
    m_listCtrl->InsertColumn( 0, itemCol );
    m_listCtrl->SetColumnWidth( 0, 100 );
    itemCol.SetText( wxT("被保険者番号") );
    m_listCtrl->InsertColumn( 1, itemCol );
    m_listCtrl->SetColumnWidth( 1, 180 );
    itemCol.SetText( wxT("ファイル数") );
    m_listCtrl->InsertColumn( 2, itemCol );
    m_listCtrl->SetColumnWidth( 1, 100 );
	bSizerTop->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 );
	
	this->SetSizer( bSizerTop );
	this->Layout();
	
	this->Centre( wxBOTH );
    m_buttonDetWhite->SetFocus();
}

// destructor
MyFrame::~MyFrame()
{
}

// Event Table
BEGIN_EVENT_TABLE( MyFrame, wxFrame )
    EVT_SIZE( MyFrame::OnSize )
    EVT_MOVE( MyFrame::OnMove )
    EVT_MENU( wxID_EXIT,  MyFrame::OnQuit )
    EVT_MENU( wxID_ABOUT, MyFrame::OnAbout )
    EVT_MENU( ID_OPWORK,  MyFrame::OnOpenWorkDir )
    EVT_BUTTON( ID_DTWHITE, MyFrame::OnDetectWhite )
    EVT_BUTTON( ID_STDIR,   MyFrame::SetDir )
    EVT_BUTTON( ID_MKDIR,   MyFrame::MakeDir )
    EVT_BUTTON( ID_DOMOVE,  MyFrame::MoveImages )
    EVT_LIST_ITEM_ACTIVATED( ID_LIST, MyFrame::OnOpenHhsDir )
    EVT_CLOSE( MyFrame::SaveConfig )
END_EVENT_TABLE()

// Event Handlers
/* サイズ変更 */
void MyFrame::OnSize(wxSizeEvent& event)
{
    this->Refresh( true, NULL );
    TellLocation();
    event.Skip();
}
/* ウィンドウ移動 */
void MyFrame::OnMove(wxMoveEvent& WXUNUSED(event))
{
    TellLocation();
    return;
}
/* ウィンドウ位置とサイズを表示 */
void MyFrame::TellLocation( void ) 
{
    wxRect r = this->GetRect();
    int x = r.GetX();
    int y = r.GetY();
    int w = r.GetWidth();
    int h = r.GetHeight();
    SetStatusText( wxString::Format(wxT("(%d,%d) %dx%d"),x,y,w,h), 2 );
}
/* 終了 */
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(true);
}

/* バージョン情報 */
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
    wxMessageBox(
        wxString::Format(
              wxT("Version %d.%d ( build %d ) by %s\n") 
              wxT("running under %s."), 
              VER, REV, BLD, wxVERSION_STRING, 
              wxGetOsDescription().c_str()
        ),
        wxT("About this program"), wxOK | wxICON_INFORMATION, this );
}

/* 白紙検知 */
void MyFrame::OnDetectWhite(wxCommandEvent& WXUNUSED(event))
{
    FrameDelWhite* dw = new FrameDelWhite( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxCAPTION|wxFRAME_NO_TASKBAR|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
    dw->SetMinSize( wxSize( 580, 680 ) );

    dw->m_dir = m_dirPickerWork->GetPath();
    dw->SetTitle( wxT("Delete White Sheet - ") + dw->m_dir );
    dw->LoadImages();

    dw->Show(true);
}

/* 移動先フォルダセット */
void MyFrame::SetDir(wxCommandEvent& WXUNUSED(event))
{
    wxString dir;
    dir.Append( m_comboBoxMoveDrive->GetValue() );
    dir.Append( wxFILE_SEP_PATH );
    wxDateTime dt = m_datePickerCcn->GetValue();
    dir.Append( dt.Format(wxT("%Y%m%d")) );
    dir.Append( wxFILE_SEP_PATH );
    dir.Append( m_comboBoxCcn->GetValue() );
    m_textCtrlMoveDir->SetValue( dir );
}

/* 移動先フォルダ作成 */
void MyFrame::MakeDir(wxCommandEvent& WXUNUSED(event))
{
    wxString dirname = m_textCtrlMoveDir->GetValue();
    wxString ccn = m_comboBoxCcn->GetValue();
    if ( dirname.Len() < 15 || ccn.IsEmpty() ) {
        wxMessageBox(wxT("フォルダを指定してください."));
        return;
    }

    wxStringTokenizer tkz( dirname, wxFILE_SEP_PATH );
    wxString d;
    while ( tkz.HasMoreTokens() ) {
        d.Append( tkz.GetNextToken() );
        d.Append( wxFILE_SEP_PATH );
        if ( !wxDirExists( d ) ) wxMkdir( d );
    }
}

/* 画像移動 */
void MyFrame::MoveImages(wxCommandEvent& WXUNUSED(event))
{
    wxString dirname = m_textCtrlMoveDir->GetValue();
    wxString ccn = m_comboBoxCcn->GetValue();
    if ( dirname.IsEmpty() || ccn.IsEmpty() ) {
        wxMessageBox(wxT("フォルダを指定してください."));
        return;
    }

    dirname.Append( wxFILE_SEP_PATH );
    if ( !wxDirExists( dirname ) ) {
        wxMessageBox(wxT("フォルダが存在しません."));
        return;
    }

    wxString workdir = m_dirPickerWork->GetPath();
    wxDir dir( workdir );
    if ( !dir.IsOpened() ) return;

    wxString filename;
    bool cout = dir.GetFirst( &filename, wxT("*.jpg"), wxDIR_FILES );

    int cnt=0, r=0;
    wxString hhs;
    m_listCtrl->DeleteAllItems();
    while ( cout ) {
        wxString from = workdir + wxFILE_SEP_PATH + filename;
        if ( IsMarksheet( from ) ) {
            hhs = GuessHhs( from );
            wxString d = dirname + hhs;
            wxMkdir( d );
            m_listCtrl->InsertItem( r, wxString::Format(wxT("%d"),r+1) );
            m_listCtrl->SetItem( r,   1, hhs, -1 ); // 被保険者番号
            if ( r % 2 ) m_listCtrl->SetItemBackgroundColour( r, wxColour(wxT("WHEAT")) );
            r++;
            cnt=1;
        }
        if ( hhs.IsEmpty() ) {
            wxMessageBox(wxT("1枚目のマークシートの画像ファイルを確認してください."));
            return;
        }
        wxString to = dirname + wxFILE_SEP_PATH + hhs + wxFILE_SEP_PATH + filename;
        wxRenameFile( from, to, false );
        m_listCtrl->SetItem( r-1, 2, wxString::Format(wxT("%d"),cnt), -1 ); // ファイル数
        if ( cnt < 5 ) m_listCtrl->SetItemTextColour( r, *wxRED );
        if ( cnt > 5 ) m_listCtrl->SetItemTextColour( r, *wxBLUE );
        cnt++;
        // write log
        cout = dir.GetNext( &filename );
    }

    wxString cmd = wxT("explorer ") + dirname;
    wxExecute( cmd );
}

/* 被保険者のフォルダを開く */
void MyFrame::OnOpenHhsDir(wxListEvent& event)
{
    wxString hhsdir = m_textCtrlMoveDir->GetValue();
    hhsdir.Append( wxFILE_SEP_PATH );

    wxListItem item = event.GetItem();
    item.SetColumn(1);
    item.SetMask(wxLIST_MASK_TEXT);
    m_listCtrl->GetItem( item );
    hhsdir.Append( item.GetText() );
    wxMessageBox(hhsdir);
    //wxString execmd = wxT("explorer ") + hhsdir;
}

/* 作業フォルダを開く */
void MyFrame::OnOpenWorkDir(wxCommandEvent& WXUNUSED(event))
{
    wxString workdir = m_dirPickerWork->GetPath();
    wxString execmd = wxT("explorer ") + workdir;
    wxExecute( execmd );
}


/* 設定を保存 */
void MyFrame::SaveConfig(wxCloseEvent& WXUNUSED(event))
{
    if ( !IsIconized() && !IsMaximized() ) {
        wxGetApp().rect = this->GetRect();
    }
    wxGetApp().dir = m_dirPickerWork->GetPath();

    Destroy();
}