view src/kaigo/horori/mover/src/mover.cpp @ 53:8df74a781c8c

mover: small improve.
author pyon@macmini
date Fri, 15 May 2020 21:28:41 +0900
parents 8384ca56f1b4
children
line wrap: on
line source

// Filename   : mover.cpp
// Last Change: 2020-05-14 木 17:14:42.
//
#include <wx/dir.h>
#include <wx/textfile.h>
#include <wx/splash.h>
#include <wx/msgdlg.h>
#include <wx/fileconf.h>

#include "mover.h"
#include "../../searcher/include/net.h"

MoveFrame::MoveFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) 
	: wxFrame(parent, id, title, pos, size, style)
{
	CreateControls();
	InitializeControlsValue();
	LoadDB();

	this->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnKey));
	m_buttonAuto->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnAuto), NULL, this);
	m_dataViewListCtrl->Connect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MoveFrame::OnSelect), NULL, this);
	m_dataViewListCtrl->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnListChar), NULL, this);
	m_textCtrlName->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnName), NULL, this);
	m_textCtrlHno->Connect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnHnoChar), NULL, this);
	m_textCtrlHno->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnHno), NULL, this);
	m_checkBox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(MoveFrame::OnCheck), NULL, this);
	m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler(MoveFrame::OnThumbDeselected), NULL, this);
	m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(MoveFrame::OnThumbSelected), NULL, this);
	m_listViewThumb->Connect(wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(MoveFrame::OnThumbDClick), NULL, this);
	m_buttonSave->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnSave), NULL, this);
}

MoveFrame::~MoveFrame()
{
	this->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnKey));
	m_buttonAuto->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnAuto), NULL, this);
	m_dataViewListCtrl->Disconnect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MoveFrame::OnSelect), NULL, this);
	m_dataViewListCtrl->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnListChar), NULL, this);
	m_textCtrlName->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnName), NULL, this);
	m_textCtrlHno->Disconnect(wxEVT_CHAR, wxKeyEventHandler(MoveFrame::OnHnoChar), NULL, this);
	m_textCtrlHno->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MoveFrame::OnHno), NULL, this);
	m_checkBox->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(MoveFrame::OnCheck), NULL, this);
	m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler(MoveFrame::OnThumbDeselected), NULL, this);
	m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(MoveFrame::OnThumbSelected), NULL, this);
	m_listViewThumb->Disconnect(wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(MoveFrame::OnThumbDClick), NULL, this);
	m_buttonSave->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MoveFrame::OnSave), NULL, this);
}

/* Functions */
void MoveFrame::CreateControls()
{
	this->SetIcon(wxIcon(wxT("sample")));
	this->SetSizeHints(wxDefaultSize, wxDefaultSize);
	this->SetBackgroundColour(wxColour(210, 210, 255));

	wxGridBagSizer* gbSizer = new wxGridBagSizer(0, 0);
	gbSizer->SetFlexibleDirection(wxBOTH);
	gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);

	m_dirPicker = new wxDirPickerCtrl(this, wxID_ANY, wxEmptyString, wxT("Select a folder"), wxDefaultPosition, wxSize(320, -1), wxDIRP_DIR_MUST_EXIST|wxDIRP_SMALL|wxDIRP_USE_TEXTCTRL);
	gbSizer->Add(m_dirPicker, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5);

	m_buttonAuto = new wxButton(this, wxID_ANY, wxT("一括判定"), wxDefaultPosition, wxDefaultSize, 0);
	m_buttonAuto->SetDefault();
	gbSizer->Add(m_buttonAuto, wxGBPosition(0, 1), wxGBSpan(1, 1), wxALL, 5);

	m_spinCtrlUD = new wxSpinCtrl(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(50, -1), wxSP_ARROW_KEYS, -50, 50, 0);
	gbSizer->Add(m_spinCtrlUD, wxGBPosition(0, 2), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);

	m_spinCtrlLR = new wxSpinCtrl(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(50, -1), wxSP_ARROW_KEYS, -50, 50, 0);
	gbSizer->Add(m_spinCtrlLR, wxGBPosition(0, 3), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);

	m_checkBox = new wxCheckBox(this, wxID_ANY, wxT("申請書モード"), wxDefaultPosition, wxDefaultSize, 0);
	gbSizer->Add(m_checkBox, wxGBPosition(0, 5), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);

	m_dataViewListCtrl = new wxDataViewListCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(320, 1200), wxDV_SINGLE|wxDV_ROW_LINES);
	m_dataViewListColumnNo      = m_dataViewListCtrl->AppendTextColumn(wxT("No"),           wxDATAVIEW_CELL_INERT,    30, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
	m_dataViewListColumnHno     = m_dataViewListCtrl->AppendTextColumn(wxT("被保険者番号"), wxDATAVIEW_CELL_INERT,   100, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
	m_dataViewListColumnName    = m_dataViewListCtrl->AppendTextColumn(wxT("     氏名"),    wxDATAVIEW_CELL_INERT,   150, static_cast<wxAlignment>(wxALIGN_LEFT),   0);
	//m_dataViewListColumnChecked = m_dataViewListCtrl->AppendToggleColumn(wxT("確認"),       wxDATAVIEW_CELL_EDITABLE, -1, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
	m_dataViewListCtrl->SetAlternateRowColour(wxColour(230, 230, 255)) ;
	gbSizer->Add(m_dataViewListCtrl, wxGBPosition(1, 0), wxGBSpan(7, 1), wxALL|wxEXPAND, 5);

	m_bitmapName = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(HNAME_WW, HNAME_WH), 0);
	gbSizer->Add(m_bitmapName, wxGBPosition(1, 1), wxGBSpan(1, 4), wxALL, 5);

    wxFont font(24, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD);
	m_textCtrlName = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(580, -1), wxTE_PROCESS_ENTER);
    m_textCtrlName->SetFont(font);
	gbSizer->Add(m_textCtrlName, wxGBPosition(1, 5), wxGBSpan(1, 4), wxALL|wxALIGN_BOTTOM, 5);

	m_bitmapHno = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(HNO_WW, HNO_WH), 0);
	gbSizer->Add(m_bitmapHno, wxGBPosition(2, 1), wxGBSpan(1, 4), wxALL, 5);

	m_textCtrlHno = new wxTextCtrl(this, wxID_ANY, wxT("0123456789"), wxDefaultPosition, wxSize(200, -1), wxTE_PROCESS_ENTER);
	m_textCtrlHno->SetMaxLength(10);
    m_textCtrlHno->SetFont(font);
	gbSizer->Add(m_textCtrlHno, wxGBPosition(2, 5), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);

	m_staticTextHnoMsg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
	m_staticTextHnoMsg->SetForegroundColour(wxColour(255, 0, 0));
	m_staticTextHnoMsg->SetFont(font);
	gbSizer->Add(m_staticTextHnoMsg, wxGBPosition(2, 6), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);

	m_bitmapTk = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(RIGHT_W, RIGHT_H1), 0);
	gbSizer->Add(m_bitmapTk, wxGBPosition(3, 1), wxGBSpan(1, 6), wxALL, 5);

	m_bitmapIk = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(RIGHT_W, RIGHT_H2), 0);
	gbSizer->Add(m_bitmapIk, wxGBPosition(4, 1), wxGBSpan(1, 6), wxALL, 5);
	
	m_listViewThumb = new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(RIGHT_W, THUMB_H * 2.5), wxLC_ICON);
	m_listViewThumb->SetBackgroundColour(wxColour(230, 230, 255));
	gbSizer->Add(m_listViewThumb, wxGBPosition(5, 1), wxGBSpan(1, 6), wxALL, 5);

	m_staticTextDate = new wxStaticText(this, wxID_ANY, wxT("開催日"), wxDefaultPosition, wxDefaultSize, 0);
	gbSizer->Add(m_staticTextDate, wxGBPosition(6, 1), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);

	m_datePicker = new wxDatePickerCtrl(this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT|wxDP_DROPDOWN|wxDP_SHOWCENTURY);
	gbSizer->Add(m_datePicker, wxGBPosition(6, 2), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);

	m_staticTextCcn = new wxStaticText(this, wxID_ANY, wxT("合議体"), wxDefaultPosition, wxDefaultSize, 0);
	gbSizer->Add(m_staticTextCcn, wxGBPosition(6, 3), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);

	wxArrayString m_choiceCcnChoices;
	m_choiceCcn = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCcnChoices, 0);
	gbSizer->Add(m_choiceCcn, wxGBPosition(6, 4), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);

	m_buttonSave = new wxButton(this, wxID_ANY, wxT("保存"), wxDefaultPosition, wxDefaultSize, 0);
	gbSizer->Add(m_buttonSave, wxGBPosition(6, 5), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);

	m_textCtrlMsg = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, -1), wxTE_READONLY|wxTE_RIGHT);
	m_textCtrlMsg->SetBackgroundColour(wxColour(230, 230, 255));
	gbSizer->Add(m_textCtrlMsg, wxGBPosition(6, 6), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);

	this->SetSizer(gbSizer);
	this->Layout();

	this->Centre(wxBOTH);

	m_buttonAuto->SetFocus();
}

void MoveFrame::InitializeControlsValue()
{
    wxString conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("mover.conf");
    wxFileConfig* conf = new wxFileConfig(wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);

    wxString work;
    conf->SetPath(wxT("/Dirs"));
    conf->Read(wxT("work"), &work);

    conf->SetPath(wxT("/Server"));
    conf->Read(wxT("addr"), &m_addr);
    conf->Read(wxT("port"), &m_port);

	delete conf;

	m_dirPicker->SetPath(work);

	wxDateTime today = wxDateTime::Today();
	wxDateTime sun = today.SetToNextWeekDay(wxDateTime::WeekDay::Sun);
	wxDateTime thu = sun.SetToNextWeekDay(wxDateTime::WeekDay::Thu);
	m_datePicker->SetValue(thu);

	LoadDefaultImages();
}

void MoveFrame::LoadDefaultImages()
{
    wxBitmap bmp;

	bmp.LoadFile(wxT("image/mover.png"), wxBITMAP_TYPE_PNG);
    m_bitmapName->SetBitmap(bmp);

	bmp.LoadFile(wxT("image/0123456789.png"), wxBITMAP_TYPE_PNG);
    m_bitmapHno->SetBitmap(bmp);

	bmp.LoadFile(wxT("image/testpattern.png"), wxBITMAP_TYPE_PNG);
    m_bitmapTk->SetBitmap(bmp);

	bmp.LoadFile(wxT("image/testpattern2.png"), wxBITMAP_TYPE_PNG);
    m_bitmapIk->SetBitmap(bmp);
}

void MoveFrame::LoadDB()
{
    wxString conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("mover.conf");
    wxFileConfig* conf = new wxFileConfig(wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);

    wxString buf;
    conf->SetPath(wxT("/Ccn"));
    conf->Read(wxT("ccn"), &buf);
    wxArrayString ccn = wxSplit(buf, ':');
	for (int i = 0; i < ccn.GetCount(); i++) {
		m_choiceCcn->Append(ccn[i]);
	}
    conf->Read(wxT("sss"), &buf);
    m_sss = wxSplit(buf, ':');

	delete conf;

	wxString hhsdb = wxT("hhsdb.csv");
	wxString url = wxT("/ha/");
	if (!HttpGetFile(m_addr, m_port, url, hhsdb)) return;

	wxTextFile hhsfile;
	hhsfile.Open(hhsdb);
	for (int i = 0; i < hhsfile.GetLineCount(); i++) {
		wxArrayString buf = wxSplit(hhsfile.GetLine(i), ',', '\\');
		m_hhash[buf[0]] = wxString::Format(wxT("%s (%s)"), buf[2], buf[3]);
		if (m_maxhno.Cmp(buf[0]) < 0) m_maxhno = buf[0];
	}
	hhsfile.Close();
}

void MoveFrame::AutoDetect()
{
	m_dataViewListCtrl->DeleteAllItems();
	wxDir dir(m_dirPicker->GetPath());
	if (!dir.IsOpened()) return;

	wxString dirname, fn;
	bool cont = dir.GetFirst(&dirname, wxEmptyString, wxDIR_DIRS);

	wxVector<wxVariant> data;
	while (cont) {
		data.push_back(wxVariant(dirname));

		wxDir subdir(m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirname);
		if (!subdir.IsOpened()) return;

		subdir.GetFirst(&fn, wxT("*.tif"), wxDIR_FILES);
		fn = m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirname + wxFILE_SEP_PATH + fn;
		wxString hno = AnalizeHhsno(fn, m_spinCtrlLR->GetValue() * 5, m_spinCtrlUD->GetValue() * 5);

		data.push_back(wxVariant(hno));
		data.push_back(wxVariant(m_hhash[hno]));
		//data.push_back(wxVariant(false));

		m_dataViewListCtrl->AppendItem(data);

		data.clear();
		
		cont = dir.GetNext(&dirname);
	}
	wxMessageBox(wxT("自動認識終了"));
}

void MoveFrame::SelectItem(int r)
{
	m_dataViewListCtrl->SelectRow(r);

	m_offx = 0;
	m_offy = 0;
	m_listViewThumb->DeleteAllItems();

	wxString dirno = m_dataViewListCtrl->GetTextValue(r, 0);
	wxString hno   = m_dataViewListCtrl->GetTextValue(r, 1);
	wxString hname = m_dataViewListCtrl->GetTextValue(r, 2);

	wxString img_path = m_dirPicker->GetPath() + wxFILE_SEP_PATH + dirno;
	wxDir dir(img_path);
	if (!dir.IsOpened()) return;

	wxString fn;
	bool cont = dir.GetFirst(&fn, wxT("*.tif"), wxDIR_FILES);

	m_curms = img_path + wxFILE_SEP_PATH + fn;
	wxImage image(m_curms, wxBITMAP_TYPE_TIFF);
	wxImage img_buf;
	wxBitmap bmp_buf;

	img_buf = image.GetSubImage(wxRect(HNAME_X, HNAME_Y, HNAME_W, HNAME_H)); 
	bmp_buf = img_buf.Scale(HNAME_WW, HNAME_WH, wxIMAGE_QUALITY_HIGH);
	m_bitmapName->SetBitmap(bmp_buf);

	img_buf = image.GetSubImage(wxRect(HNO_X, HNO_Y, HNO_W, HNO_H)); 
	bmp_buf = img_buf.Scale(HNO_WW, HNO_WH, wxIMAGE_QUALITY_HIGH);
	m_bitmapHno->SetBitmap(bmp_buf);

	m_textCtrlName->SetValue(hname);
	m_textCtrlHno->SetValue(hno);
	m_staticTextHnoMsg->SetLabel(wxEmptyString);
	if (hno.Cmp(m_maxhno) > 0) m_staticTextHnoMsg->SetLabel(wxString::Format(wxT("> %s !"), m_maxhno));

	wxImageList* imglist = new wxImageList(THUMB_W, THUMB_H);
	m_listViewThumb->SetImageList(imglist, wxIMAGE_LIST_NORMAL);
	for (int i = 0; cont; i++) {
		wxString buf = img_path + wxFILE_SEP_PATH + fn;
		wxImage img(buf, wxBITMAP_TYPE_TIFF);
		bmp_buf = img.Scale(THUMB_W, THUMB_H, wxIMAGE_QUALITY_HIGH);
		imglist->Add(bmp_buf);
		m_listViewThumb->InsertItem(i, fn, i);

		if (i == 2) {
			wxImage im = img.GetSubImage(wxRect(0, 0, img.GetWidth() - 1, 300));	// 2480x300
			bmp_buf = im.Scale(RIGHT_W, RIGHT_H1, wxIMAGE_QUALITY_HIGH);
			m_bitmapTk->SetBitmap(bmp_buf);
		}
		if (i == 3) {
			wxImage im = img.GetSubImage(wxRect(0, 20, img.GetWidth() - 1, 700));	// 2480x500
			bmp_buf = im.Scale(RIGHT_W, RIGHT_H2, wxIMAGE_QUALITY_HIGH);
			m_bitmapIk->SetBitmap(bmp_buf);
		}
		cont = dir.GetNext(&fn);
	}
}

void MoveFrame::ThumbnailPaper()
{
	wxString path = m_dirPicker->GetPath();
	wxDir dir(path);
	if (!dir.IsOpened()) return;

	wxString file;
	bool cont = dir.GetFirst(&file, wxT("*.tif"), wxDIR_FILES);

	wxImageList* imglist = new wxImageList(THUMB_W / 2, THUMB_H / 2);
	m_listViewThumb->SetImageList(imglist, wxIMAGE_LIST_NORMAL);
	wxBitmap bmp;
	int n = 0;
	for (int i = 0; cont; i++) {
		wxImage img(path + wxFILE_SEP_PATH + file, wxBITMAP_TYPE_TIFF);
		bmp = img.Scale(THUMB_W / 2, THUMB_H / 2, wxIMAGE_QUALITY_HIGH);
		imglist->Add(bmp);
		m_listViewThumb->InsertItem(i, file, i);
		n++;
		cont = dir.GetNext(&file);
	}

	int m = m_listViewThumb->GetSelectedItemCount();
	m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), m, n));
	wxMessageBox(wxString::Format(wxT("%d files found."), n));
}

wxString MoveFrame::AnalizeHhsno(wxString file, int offx, int offy)
{
	wxImage image(file, wxBITMAP_TYPE_TIFF);
	int sx = MS_X + offx;	// start x
	int sy = MS_Y + offy;
	int bw = MS_W / 10;	// block width
	int bh = MS_H / 10;
	int area = bw * bh;
	int black = 0;
	int th = 38;
	int x, y;
	unsigned char r, g, b;

	int max_n;
	float max, bk;

	wxString hno;
	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 = image.GetRed(x, y);
					g = image.GetGreen(x, y);
					b = image.GetBlue(x, y);
					if ((int)r < th && (int)g < th && (int)b < th) black++;
				}
			}

			bk = (float)black / area;
			if (max < bk) {
				max = bk;
				max_n = n;
			}
			black = 0;
		}
		hno.Append(wxString::Format(wxT("%d"), max_n));
	}

	return hno;
}

void MoveFrame::MoveLookWin(int x, int y)
{
	m_offx += x * 5;
	m_offy += y * 5;

	wxImage image(m_curms, wxBITMAP_TYPE_TIFF);
	wxImage img_buf;
	wxBitmap bmp_buf;

	img_buf = image.GetSubImage(wxRect(HNAME_X + m_offx, HNAME_Y + m_offy, HNAME_W, HNAME_H)); 
	bmp_buf = img_buf.Scale(HNAME_WW, HNAME_WH, wxIMAGE_QUALITY_HIGH);
	m_bitmapName->SetBitmap(bmp_buf);

	img_buf = image.GetSubImage(wxRect(HNO_X + m_offx, HNO_Y + m_offy, HNO_W, HNO_H)); 
	bmp_buf = img_buf.Scale(HNO_WW, HNO_WH, wxIMAGE_QUALITY_HIGH);
	m_bitmapHno->SetBitmap(bmp_buf);

	wxString hno = AnalizeHhsno(m_curms, m_offx, m_offy);
	m_textCtrlName->SetValue(m_hhash[hno]);
	m_textCtrlHno->SetValue(hno);

	m_staticTextHnoMsg->SetLabel(wxEmptyString);
	if (hno.Cmp(m_maxhno) > 0) m_staticTextHnoMsg->SetLabel(wxString::Format(wxT("> %s !"), m_maxhno));
}

/* Event Handlers */
void MoveFrame::OnKey(wxKeyEvent& event)
{
	int mod = event.GetModifiers();
	int key = event.GetKeyCode();

	switch (key) {
		case WXK_F5: {
			wxMessageBox("aaa");
			break;
		}
	}
}

void MoveFrame::OnAuto(wxCommandEvent& WXUNUSED(event))
{
	if (m_checkBox->IsChecked()) {
		ThumbnailPaper();
		return;
	}

	m_offx = 0;
	m_offy = 0;
	AutoDetect();
	SelectItem(0);
	m_dataViewListCtrl->SetFocus();
}

void MoveFrame::OnSelect(wxDataViewEvent& WXUNUSED(event))
{
	int r = m_dataViewListCtrl->GetSelectedRow();
	SelectItem(r);
}
 
void MoveFrame::OnListChar(wxKeyEvent& event)
{
	int mod = event.GetModifiers();
	int key = event.GetKeyCode();

	switch (key) {
		case WXK_UP: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(0, 1);
				return;
			}
			break;
		}
		case WXK_DOWN: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(0, -1);
				return;
			}
			break;
		}
		case WXK_RIGHT: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(-1, 0);
				return;
			}
			break;
		}
		case WXK_LEFT: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(1, 0);
				return;
			}
			break;
		}
		case WXK_RETURN: {
			int r = m_dataViewListCtrl->GetSelectedRow();
			m_dataViewListCtrl->SetTextValue(m_textCtrlHno->GetValue(), r, 1);
			m_dataViewListCtrl->SetTextValue(m_textCtrlName->GetValue(), r, 2);
			//if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
			return;
		}
	}
	event.Skip();
}

void MoveFrame::OnName(wxCommandEvent& WXUNUSED(event))
{
	int r = m_dataViewListCtrl->GetSelectedRow();
	m_dataViewListCtrl->SetTextValue(m_textCtrlHno->GetValue(), r, 1);
	m_dataViewListCtrl->SetTextValue(m_textCtrlName->GetValue(), r, 2);
	//if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
	m_dataViewListCtrl->SetFocus();
}

void MoveFrame::OnHnoChar(wxKeyEvent& event)
{
	int mod = event.GetModifiers();
	int key = event.GetKeyCode();

	if (key == 45) { // num-key '-' as BackSpace
		wxString t = m_textCtrlHno->GetStringSelection();
		if (t.IsEmpty()) {
			long p = m_textCtrlHno->GetInsertionPoint();
			if (p > 0) m_textCtrlHno->Remove(p - 1, p);
		} else {
			m_textCtrlHno->Cut();
		}
		return;
	}

	switch (key) {
		case WXK_UP: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(0, 1);
				return;
			}
			break;
		}
		case WXK_DOWN: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(0, -1);
				return;
			}
			break;
		}
		case WXK_RIGHT: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(-1, 0);
				return;
			}
			break;
		}
		case WXK_LEFT: {
			if (mod == wxMOD_CONTROL) {
				MoveLookWin(1, 0);
				return;
			}
			break;
		}
	}
	event.Skip();
}

void MoveFrame::OnHno(wxCommandEvent& WXUNUSED(event))
{
	m_textCtrlHno->SelectAll();
	if (m_textCtrlHno->GetLineLength(0) != 10) {
		wxMessageBox(wxT("Bat input"));
		return;
	}

	wxString hno = m_textCtrlHno->GetValue();
	m_textCtrlName->SetValue(m_hhash[hno]);

	int r = m_dataViewListCtrl->GetSelectedRow();
	if (r == wxNOT_FOUND) {
		return;
	}
	m_dataViewListCtrl->SetTextValue(hno, r, 1);
	m_dataViewListCtrl->SetTextValue(m_hhash[hno], r, 2);

	//if (r != m_dataViewListCtrl->GetItemCount() - 1) SelectItem(r + 1);
	m_dataViewListCtrl->SetFocus();
}

void MoveFrame::OnCheck(wxCommandEvent& WXUNUSED(event))
{
	if (m_checkBox->IsChecked()) {
		m_buttonAuto->SetLabel(wxT("表示"));
	} else {
		m_buttonAuto->SetLabel(wxT("一括判定"));
	}

	m_dataViewListCtrl->DeleteAllItems();
	m_textCtrlName->SetValue(wxEmptyString);
	m_textCtrlHno->SetValue(wxT("0123456789"));
	m_listViewThumb->DeleteAllItems();
	LoadDefaultImages();
}

void MoveFrame::OnThumbDeselected(wxListEvent& WXUNUSED(event))
{
	int m = m_listViewThumb->GetItemCount();
	int n = m_listViewThumb->GetSelectedItemCount();
	m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), n, m));
}

void MoveFrame::OnThumbSelected(wxListEvent& WXUNUSED(event))
{
	int m = m_listViewThumb->GetItemCount();
	int n = m_listViewThumb->GetSelectedItemCount();
	m_textCtrlMsg->SetValue(wxString::Format(wxT("%d / %d"), n, m));
}

void MoveFrame::OnThumbDClick(wxListEvent& WXUNUSED(event))
{
	wxString file = m_dirPicker->GetPath() + wxFILE_SEP_PATH;

	if (!m_checkBox->IsChecked()) {
		int r = m_dataViewListCtrl->GetSelectedRow();
		file += m_dataViewListCtrl->GetTextValue(r, 0) + wxFILE_SEP_PATH;
	}

	for (int i = 0; i < m_listViewThumb->GetItemCount(); i++) {
		if (m_listViewThumb->IsSelected(i))
			file += m_listViewThumb->GetItemText(i, 0);
	}

	wxImage img(file, wxBITMAP_TYPE_TIFF);
	wxBitmap bmp = img.Scale(THUMB_W * 6, THUMB_H * 6, wxIMAGE_QUALITY_HIGH);
	wxSplashScreen* splash = new wxSplashScreen(bmp, wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT, 10000, NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_RAISED|wxSTAY_ON_TOP);
	wxYield();
}

void MoveFrame::OnSave(wxCommandEvent& WXUNUSED(event))
{
	if (m_choiceCcn->GetCurrentSelection() == wxNOT_FOUND) {
		wxMessageBox(wxT("Bad choice."));
		return;
	}

	wxDateTime dt = m_datePicker->GetValue();
	wxString ymd  = dt.Format(wxT("%Y%m%d"));
	wxString year = dt.Format(wxT("%Y"));

	wxDateTime::Month month = dt.GetMonth();
	if (month == wxDateTime::Jan || month == wxDateTime::Feb || month == wxDateTime::Mar) {
		year = wxString::Format(wxT("%d"), dt.GetYear() - 1);
	}

	wxString ymddir = wxFILE_SEP_PATH + year + wxFILE_SEP_PATH + ymd;
	if (!wxDirExists(ymddir)) wxFileName::Mkdir(ymddir, wxS_DIR_DEFAULT, 0);

	int n = m_choiceCcn->GetCurrentSelection();
	wxString ccndir = ymddir + wxFILE_SEP_PATH + m_choiceCcn->GetString(n);
	if (!wxDirExists(ccndir)) wxFileName::Mkdir(ccndir, wxS_DIR_DEFAULT, 0);
	wxString sssdir = ymddir + wxFILE_SEP_PATH + m_choiceCcn->GetString(n) + wxFILE_SEP_PATH + m_sss[n];
	if (!wxDirExists(sssdir)) wxFileName::Mkdir(sssdir, wxS_DIR_DEFAULT, 0);

	if (m_checkBox->IsChecked()) {
		wxString srcdir = m_dirPicker->GetPath();
		wxString dstdir = sssdir;

		wxDir dir(srcdir);
		if (!dir.IsOpened()) return;

		if (m_listViewThumb->GetSelectedItemCount() == 0) {
			wxMessageBox(wxT("no item selected."));
			return;
		}

		for (int i = 0; i < m_listViewThumb->GetItemCount(); i++) {
			if (m_listViewThumb->IsSelected(i)) {
				wxString file = m_listViewThumb->GetItemText(i, 0);
				wxString src = srcdir + wxFILE_SEP_PATH + file;
				wxString dst = dstdir + wxFILE_SEP_PATH + file;
				wxCopyFile(src, dst, true);
			}
		}

	} else {
		for (int r = 0; r < m_dataViewListCtrl->GetItemCount(); r++) {
			wxString srcdir = m_dirPicker->GetPath() + wxFILE_SEP_PATH + m_dataViewListCtrl->GetTextValue(r, 0);
			wxString dstdir = ccndir + wxFILE_SEP_PATH + m_dataViewListCtrl->GetTextValue(r, 1);

			wxDir dir(srcdir);
			if (!dir.IsOpened()) return;
			if (!wxDirExists(dstdir)) wxFileName::Mkdir(dstdir, wxS_DIR_DEFAULT, 0);

			wxString file;
			bool cont = dir.GetFirst(&file, wxT("*.tif"), wxDIR_FILES);
			while (cont) {
				wxString src = srcdir + wxFILE_SEP_PATH + file;
				wxString dst = dstdir + wxFILE_SEP_PATH + file;
				wxCopyFile(src, dst, true);
				cont = dir.GetNext(&file);
			}
		}

		wxString listfn = ymd + wxT("_") + m_choiceCcn->GetString(n) + wxT(".csv");
		if (wxFileExists(listfn)) wxRemoveFile(listfn);

		wxTextFile listfile;
		listfile.Create(listfn);
		for(int r = 0; r < m_dataViewListCtrl->GetItemCount(); r++) {
			wxString s = m_dataViewListCtrl->GetTextValue(r, 0);
			s += wxT(",") + m_dataViewListCtrl->GetTextValue(r, 1);
			s += wxT(",") + m_dataViewListCtrl->GetTextValue(r, 2);
			listfile.AddLine(s);
		}
		listfile.Write();
		listfile.Close();
	}
	wxMessageBox(wxT("コピー終了"));
}