diff horori/mover/src/mover.cpp @ 0:aaaa401818a1 draft

first commit.
author pyon <pyon@macmini>
date Mon, 24 May 2021 21:32:58 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/horori/mover/src/mover.cpp	Mon May 24 21:32:58 2021 +0900
@@ -0,0 +1,695 @@
+// 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("コピー終了"));
+}
+