view src/kana.cpp @ 3:1a64119ab257

Equipment Regist print-target by Drag & Drop.
author pyon@macmini
date Tue, 27 Aug 2013 18:50:00 +0900
parents c066fde99517
children a2ad87cad48b
line wrap: on
line source

// Filename   : kana.cpp
// Last Change: 22-Aug-2013.
//

#include "kana.h"
#include "db.h"

KanaDialog::KanaDialog( 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* bSizerSearch = new wxBoxSizer( wxHORIZONTAL );

	m_searchCtrl = new wxSearchCtrl( this, ID_SEARCHKANA, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
	#ifndef __WXMAC__
	m_searchCtrl->ShowSearchButton( true );
	#endif
	m_searchCtrl->ShowCancelButton( false );
	bSizerSearch->Add( m_searchCtrl, 1, wxALL|wxEXPAND, 5 );

    m_checkBox = new wxCheckBox( this, ID_FUZZY, wxT("部分一致"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerSearch->Add( m_checkBox, 0, wxALL|wxEXPAND, 5 );

	bSizerTop->Add( bSizerSearch, 0, wxALL|wxEXPAND, 5 );
	
    //
	m_listCtrl = new wxListCtrl( this, ID_LISTKANA, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL );

    wxListItem itemCol;
    itemCol.SetText( wxT("通番") );
    m_listCtrl->InsertColumn( 0, itemCol );
    m_listCtrl->SetColumnWidth( 0, 40 );
    itemCol.SetText( wxT("被保険者番号") );
    m_listCtrl->InsertColumn( 1, itemCol );
    m_listCtrl->SetColumnWidth( 1, 90 );
    itemCol.SetText( wxT("カナ") );
    m_listCtrl->InsertColumn( 2, itemCol );
    m_listCtrl->SetColumnWidth( 2, 100 );
    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, 60 );
    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 );
	
    //
    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("全角で入力してネ! (性と名の間は全角スペースで)") );
    m_searchCtrl->SelectAll();
}

KanaDialog::~KanaDialog()
{
}

// Event Table
BEGIN_EVENT_TABLE( KanaDialog, wxDialog )
    EVT_TEXT_ENTER( ID_SEARCHKANA, KanaDialog::OnSearch )
    EVT_CHECKBOX( ID_FUZZY, KanaDialog::OnFuzzyCheck )
    EVT_LIST_ITEM_ACTIVATED( ID_LISTKANA, KanaDialog::OnSelectItem )
    EVT_BUTTON( ID_SETKANA, KanaDialog::OnSet )
END_EVENT_TABLE()

// Event Handlers & Functions
void KanaDialog::OnSearch( wxCommandEvent& WXUNUSED(event) ) 
{
    UpdateList();
}

void KanaDialog::OnFuzzyCheck( wxCommandEvent& WXUNUSED(event) ) 
{
    UpdateList();
}

void KanaDialog::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 KanaDialog::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 KanaDialog::UpdateList( void )
{
    m_listCtrl->DeleteAllItems();

    wxString s = m_searchCtrl->GetValue();
    if ( s.Len() < 3 ) {
        wxMessageBox( wxT("指定する文字列は 3文字以上としてください.") );
        return;
    }

    /*
    wxRegEx reKana( "^[アイウエオカキクケコサシスセソナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲコザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォャュョ ]+$" );
    if ( !reKana.Matches( s ) ) {
        wxMessageBox( wxT("カタカナで入力してください.") );
        return;
    }
    */

    bool fuzzy = m_checkBox->IsChecked();
    wxArrayString hhs = GetHhsInfoByKana( s, fuzzy );

    if ( hhs.GetCount() > 200 ) {
        wxMessageBox( wxT("該当件数が 200 件を超えました.\n条件を変えてみてください.") );
        return;
    }
    else if ( hhs.IsEmpty() ){
        wxMessageBox( wxT("該当なし.") );
        return;
    }

    wxString buf;
    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( 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") ) );
    }
}