diff horori/merger/src/merger.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/merger/src/merger.cpp	Mon May 24 21:32:58 2021 +0900
@@ -0,0 +1,535 @@
+// Filename   : merger.cpp
+// Last Change: 2020-05-21 木 15:18:24.
+//
+#include <wx/dir.h>
+#include <wx/textfile.h>
+#include <wx/msgdlg.h>
+#include <wx/fileconf.h>
+#include <wx/html/htmprint.h>
+
+#include "utils.h"
+#include "merger.h"
+
+MergeFrame::MergeFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) 
+	: wxFrame(parent, id, title, pos, size, style)
+{
+	CreateControls();
+	SetAccelerator();
+	LoadDefaultParams();
+	InitializeControlsValue();
+
+	m_zoom = 102;
+
+	// Connect Events
+	m_filePicker->Connect(wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEventHandler(MergeFrame::OnFileChanged), NULL, this);
+	m_buttonSet->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnMaskLocSet), NULL, this);
+	m_dataViewListCtrlParam->Connect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MergeFrame::OnSelectData), NULL, this);
+	m_buttonWrite->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnWrite), NULL, this);
+	m_buttonPrint->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnPrint), NULL, this);
+	m_buttonPrintAll->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnPrintAll), NULL, this);
+	m_buttonAclS->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnAclS), NULL, this);
+}
+
+MergeFrame::~MergeFrame()
+{
+	m_filePicker->Disconnect(wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEventHandler(MergeFrame::OnFileChanged), NULL, this);
+	m_buttonSet->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnMaskLocSet), NULL, this);
+	m_dataViewListCtrlParam->Disconnect(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(MergeFrame::OnSelectData), NULL, this);
+	m_buttonWrite->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnWrite), NULL, this);
+	m_buttonPrint->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnPrint), NULL, this);
+	m_buttonPrintAll->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnPrintAll), NULL, this);
+	m_buttonAclS->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MergeFrame::OnAclS), NULL, this);
+}
+
+/* Functions */
+void MergeFrame::CreateControls()
+{
+	this->SetIcon(wxIcon(wxT("sample")));
+	this->SetSizeHints(wxDefaultSize, wxDefaultSize);
+	this->SetBackgroundColour(wxColour(240, 140, 100));
+
+	wxGridBagSizer* gbSizer = new wxGridBagSizer(0, 0);
+	gbSizer->SetFlexibleDirection(wxBOTH);
+	gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+	m_staticTextCSV = new wxStaticText(this, wxID_ANY, wxT("CSVファイル"), wxDefaultPosition, wxDefaultSize, 0);
+	gbSizer->Add(m_staticTextCSV, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5);
+
+	m_filePicker = new wxFilePickerCtrl(this, wxID_ANY, wxEmptyString, wxT("Select a file"), wxT("*.csv"), wxDefaultPosition, wxSize(400, -1), wxFLP_CHANGE_DIR|wxFLP_FILE_MUST_EXIST|wxFLP_OPEN|wxFLP_SMALL|wxFLP_USE_TEXTCTRL);
+	gbSizer->Add(m_filePicker, wxGBPosition(0, 1), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_gauge = new wxGauge(this, wxID_ANY, 40, wxDefaultPosition, wxSize(100, 20), wxGA_HORIZONTAL);
+	m_gauge->SetValue(0);
+	gbSizer->Add(m_gauge, wxGBPosition(0, 2), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5);
+
+	m_staticTextSpl = new wxStaticText(this, wxID_ANY, wxT("特記"), wxDefaultPosition, wxDefaultSize, 0);
+	gbSizer->Add(m_staticTextSpl, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL|wxALIGN_RIGHT, 5);
+
+	m_lookwinSpl = new LookWindow(this, wxID_ANY, wxDefaultPosition, wxSize(1000, 150), 0);
+	gbSizer->Add(m_lookwinSpl, wxGBPosition(1, 1), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_staticTextOpn1 = new wxStaticText(this, wxID_ANY, wxT("意見書1"), wxDefaultPosition, wxDefaultSize, 0);
+	gbSizer->Add(m_staticTextOpn1, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALL|wxALIGN_RIGHT, 5);
+
+	m_lookwinOpn1 = new LookWindow(this, wxID_ANY, wxDefaultPosition, wxSize(1000, 150), 0);
+	gbSizer->Add(m_lookwinOpn1, wxGBPosition(2, 1), wxGBSpan(1, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_staticTextOpn2 = new wxStaticText(this, wxID_ANY, wxT("意見書2"), wxDefaultPosition, wxDefaultSize, 0);
+	gbSizer->Add(m_staticTextOpn2, wxGBPosition(3, 0), wxGBSpan(2, 1), wxALL|wxALIGN_RIGHT, 5);
+
+	m_lookwinOpn2 = new LookWindow(this, wxID_ANY, wxDefaultPosition, wxSize(1000, 450), 0);
+	gbSizer->Add(m_lookwinOpn2, wxGBPosition(3, 1), wxGBSpan(3, 1), wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_buttonAclS = new wxButton(this, ID_NEXT, wxT("Acl_S"), wxDefaultPosition, wxDefaultSize, 0);
+	m_buttonAclS->Hide();
+	gbSizer->Add(m_buttonAclS, wxGBPosition(4, 2), wxGBSpan(1, 1), wxALL, 5);
+
+	m_buttonSet = new wxButton(this, wxID_ANY, wxT("マスク位置セット"), wxDefaultPosition, wxSize(100, -1), 0);
+	m_buttonSet->SetBackgroundColour(wxColour(255, 180, 150));
+	gbSizer->Add(m_buttonSet, wxGBPosition(5, 2), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);
+
+	m_staticTextMask = new wxStaticText(this, wxID_ANY, wxT("マスク位置"), wxDefaultPosition, wxDefaultSize, 0);
+	gbSizer->Add(m_staticTextMask, wxGBPosition(6, 0), wxGBSpan(3, 1), wxALL|wxALIGN_RIGHT, 5);
+
+	m_dataViewListCtrlParam = new wxDataViewListCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(1000, 300), wxDV_ROW_LINES);
+	m_dataViewListColumnNo = m_dataViewListCtrlParam->AppendTextColumn(wxT("No"), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
+	m_dataViewListColumnHno = m_dataViewListCtrlParam->AppendTextColumn(wxT("被保険者番号"), wxDATAVIEW_CELL_INERT, 100, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
+	m_dataViewListColumnName = m_dataViewListCtrlParam->AppendTextColumn(wxT("    氏名"), wxDATAVIEW_CELL_INERT, 120, static_cast<wxAlignment>(wxALIGN_LEFT), wxDATAVIEW_COL_RESIZABLE);
+	m_dataViewListColumnX1 = m_dataViewListCtrlParam->AppendTextColumn(wxT("x1  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnY1 = m_dataViewListCtrlParam->AppendTextColumn(wxT("y1  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnW1 = m_dataViewListCtrlParam->AppendTextColumn(wxT("w1  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnH1 = m_dataViewListCtrlParam->AppendTextColumn(wxT("h1  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnX2 = m_dataViewListCtrlParam->AppendTextColumn(wxT("x2  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnY2 = m_dataViewListCtrlParam->AppendTextColumn(wxT("y2  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnW2 = m_dataViewListCtrlParam->AppendTextColumn(wxT("w2  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnH2 = m_dataViewListCtrlParam->AppendTextColumn(wxT("h2  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnX3 = m_dataViewListCtrlParam->AppendTextColumn(wxT("x3  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnY3 = m_dataViewListCtrlParam->AppendTextColumn(wxT("y3  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnW3 = m_dataViewListCtrlParam->AppendTextColumn(wxT("w3  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnH3 = m_dataViewListCtrlParam->AppendTextColumn(wxT("h3  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnX4 = m_dataViewListCtrlParam->AppendTextColumn(wxT("x4  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnY4 = m_dataViewListCtrlParam->AppendTextColumn(wxT("y4  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnW4 = m_dataViewListCtrlParam->AppendTextColumn(wxT("w4  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnH4 = m_dataViewListCtrlParam->AppendTextColumn(wxT("h4  "), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_RIGHT), 0);
+	m_dataViewListColumnTime = m_dataViewListCtrlParam->AppendTextColumn(wxT("修正時刻"), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_CENTER), 0);
+	m_dataViewListCtrlParam->SetAlternateRowColour(wxColour(255, 200, 180)) ;
+	gbSizer->Add(m_dataViewListCtrlParam, wxGBPosition(6, 1), wxGBSpan(4, 1), wxALL|wxEXPAND, 5);
+
+	m_buttonWrite = new wxButton(this, wxID_ANY, wxT("設定保存"), wxDefaultPosition, wxSize(100, -1), 0);
+	m_buttonWrite->SetBackgroundColour(wxColour(255, 160, 120));
+	gbSizer->Add(m_buttonWrite, wxGBPosition(6, 2), wxGBSpan(1, 1), wxALL, 5);
+
+	gbSizer->Add(0, 210, wxGBPosition(7, 2), wxGBSpan(1, 1), wxEXPAND, 5);
+
+	m_buttonPrint = new wxButton(this, wxID_ANY, wxT("印刷"), wxDefaultPosition, wxSize(100, -1), 0);
+	m_buttonPrint->SetBackgroundColour(wxColour(255, 205, 255));
+	gbSizer->Add(m_buttonPrint, wxGBPosition(8, 2), wxGBSpan(1, 1), wxALL|wxALIGN_LEFT|wxALIGN_BOTTOM, 5);
+
+	m_buttonPrintAll = new wxButton(this, wxID_ANY, wxT("すべて印刷"), wxDefaultPosition, wxSize(100, -1), 0);
+	m_buttonPrintAll->SetBackgroundColour(wxColour(255, 175, 255));
+	gbSizer->Add(m_buttonPrintAll, wxGBPosition(9, 2), wxGBSpan(1, 1), wxALL|wxALIGN_BOTTOM, 5);
+
+	this->SetSizer(gbSizer);
+	this->Layout();
+
+	this->Centre(wxBOTH);
+}
+
+void MergeFrame::SetAccelerator()
+{
+	wxAcceleratorEntry entries[1];
+	entries[0].Set(wxACCEL_NORMAL, (int)'S', ID_NEXT);
+	/*
+	entries[1].Set(wxACCEL_NORMAL, WXK_F1,   wxID_HELP);
+	entries[2].Set(wxACCEL_CTRL,   (int)'Q', wxID_CLOSE);
+	*/
+	wxAcceleratorTable accel(1, entries);
+	SetAcceleratorTable(accel);
+}
+
+
+void MergeFrame::InitializeControlsValue()
+{
+	m_filePicker->SetPath(m_csv);
+
+	wxString file = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("testpattern.tif");
+
+    m_lookwinSpl->SetDefaultFile(file);
+    m_lookwinSpl->SetDefaultParams(m_rectSplLWin, 1);
+
+    m_lookwinOpn1->SetDefaultFile(file);
+    m_lookwinOpn1->SetDefaultParams(m_rectOpn1LWin, 1);
+
+    m_lookwinOpn2->SetDefaultFile(file);
+    m_lookwinOpn2->SetDefaultParams(m_rectOpn2LWin, 2);
+}
+
+void MergeFrame::LoadDefaultParams()
+{
+    wxString conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("merger.conf");
+    wxFileConfig* conf = new wxFileConfig(wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
+
+    conf->SetPath(wxT("/Misc"));
+    conf->Read(wxT("workdir"), &m_workdir);
+    conf->Read(wxT("csv"), &m_csv);
+
+    wxString buf;
+
+    conf->SetPath(wxT("/LookWin"));
+    conf->Read(wxT("spl"), &buf);
+	m_rectSplLWin = Geo2Rect(buf);
+
+    conf->Read(wxT("opn1"), &buf);
+	m_rectOpn1LWin = Geo2Rect(buf);
+
+    conf->Read(wxT("opn2"), &buf);
+	m_rectOpn2LWin = Geo2Rect(buf);
+
+
+    conf->SetPath(wxT("/Mask"));
+    conf->Read(wxT("spl"), &buf);
+	m_rectSplMask = Geo2Rect(buf);
+
+    conf->Read(wxT("opn1"), &buf);
+	m_rectOpn1Mask = Geo2Rect(buf);
+
+    conf->Read(wxT("opn2"), &buf);
+	m_rectOpn2Mask = Geo2Rect(buf);
+
+    conf->Read(wxT("opn3"), &buf);
+	m_rectOpn3Mask = Geo2Rect(buf);
+
+	delete conf;
+}
+
+void MergeFrame::MaskLocSet()
+{
+	wxString x, y, w, h;
+
+	int r = m_dataViewListCtrlParam->GetSelectedRow();
+
+	m_lookwinSpl->GetMaskLoc(1, &x, &y, &w, &h);
+	m_dataViewListCtrlParam->SetTextValue(x, r,  3);
+	m_dataViewListCtrlParam->SetTextValue(y, r,  4);
+	m_dataViewListCtrlParam->SetTextValue(w, r,  5);
+	m_dataViewListCtrlParam->SetTextValue(h, r,  6);
+
+	m_lookwinOpn1->GetMaskLoc(1, &x, &y, &w, &h);
+	m_dataViewListCtrlParam->SetTextValue(x, r,  7);
+	m_dataViewListCtrlParam->SetTextValue(y, r,  8);
+	m_dataViewListCtrlParam->SetTextValue(w, r,  9);
+	m_dataViewListCtrlParam->SetTextValue(h, r, 10);
+
+	m_lookwinOpn2->GetMaskLoc(1, &x, &y, &w, &h);
+	m_dataViewListCtrlParam->SetTextValue(x, r, 11);
+	m_dataViewListCtrlParam->SetTextValue(y, r, 12);
+	m_dataViewListCtrlParam->SetTextValue(w, r, 13);
+	m_dataViewListCtrlParam->SetTextValue(h, r, 14);
+
+	m_lookwinOpn2->GetMaskLoc(2, &x, &y, &w, &h);
+	m_dataViewListCtrlParam->SetTextValue(x, r, 15);
+	m_dataViewListCtrlParam->SetTextValue(y, r, 16);
+	m_dataViewListCtrlParam->SetTextValue(w, r, 17);
+	m_dataViewListCtrlParam->SetTextValue(h, r, 18);
+
+	wxDateTime now = wxDateTime::Now();
+	wxString nowstr = now.Format(wxT("%H:%M:%S"), wxDateTime::GMT9 ).c_str();
+	m_dataViewListCtrlParam->SetTextValue(nowstr, r, 19);
+}
+
+void MergeFrame::ShowImages()
+{
+	int r = m_dataViewListCtrlParam->GetSelectedRow();
+	wxString dirno = m_dataViewListCtrlParam->GetTextValue(r, 0);
+
+	wxRect mask1, mask2, mask3, mask4;
+	GetItemMaskLoc(r, &mask1, &mask2, &mask3, &mask4);
+
+	wxString dir = m_workdir + wxFILE_SEP_PATH + dirno;
+	wxArrayString files;
+	wxDir::GetAllFiles(dir, &files, wxT("*.tif"), wxDIR_FILES);
+
+	m_lookwinSpl->LoadImage(files[2]);
+	m_lookwinOpn1->LoadImage(files[4]);
+	m_lookwinOpn2->LoadImage(files[3]);
+
+	m_lookwinSpl->SetMaskLoc(mask1, ZeroRect());
+	m_lookwinOpn1->SetMaskLoc(mask2, ZeroRect());
+	m_lookwinOpn2->SetMaskLoc(mask3, mask4);
+
+	m_lookwinSpl->DoMask1();
+	m_lookwinOpn1->DoMask1();
+	m_lookwinOpn2->DoMask1();
+	m_lookwinOpn2->DoMask2();
+}
+
+void MergeFrame::SaveParams()
+{
+	if (m_dataViewListCtrlParam->GetItemCount() == 0) {
+		wxMessageBox(wxT("no item."));
+		return;
+	}
+
+	wxArrayString lines;
+	for (int r = 0; r < m_dataViewListCtrlParam->GetItemCount(); r++) {
+		wxArrayString cols;
+		for (int i = 0; i < 20; i++) {
+			cols.Add(m_dataViewListCtrlParam->GetTextValue(r,  i));
+		}
+		lines.Add(wxJoin(cols, ',', '\\'));
+	}
+
+	wxTextFile file;
+	file.Open(m_filePicker->GetPath());
+	file.Clear();
+	for (int i = 0; i < lines.GetCount(); i++) {
+		file.AddLine(lines[i]);
+	}
+	file.Write();
+	file.Close();
+}
+
+void MergeFrame::DoRealMask(wxString file, wxString maskfile, wxRect mask1, wxRect mask2)
+{
+	wxCopyFile(file, maskfile, true);
+    wxImage img_org(file, wxBITMAP_TYPE_TIFF);
+    img_org.SetRGB(mask1, 255, 255, 255);
+    img_org.SetRGB(mask2, 255, 255, 255);
+	wxImage img_out = img_org.GetSubImage(wxRect(40, 0, 2400, 3508));
+	img_out.SetOption(wxIMAGE_OPTION_TIFF_COMPRESSION, 5);
+    img_out.SaveFile(maskfile);
+}
+
+void MergeFrame::GetItemMaskLoc(int r, wxRect* mask1, wxRect* mask2, wxRect* mask3, wxRect* mask4)
+{
+	wxString x1 = m_dataViewListCtrlParam->GetTextValue(r,  3);
+	wxString y1 = m_dataViewListCtrlParam->GetTextValue(r,  4);
+	wxString w1 = m_dataViewListCtrlParam->GetTextValue(r,  5);
+	wxString h1 = m_dataViewListCtrlParam->GetTextValue(r,  6);
+	*mask1 = Geo2Rect(wxString::Format(wxT("%sx%s+%s+%s"), w1, h1, x1, y1));
+
+	wxString x2 = m_dataViewListCtrlParam->GetTextValue(r,  7);
+	wxString y2 = m_dataViewListCtrlParam->GetTextValue(r,  8);
+	wxString w2 = m_dataViewListCtrlParam->GetTextValue(r,  9);
+	wxString h2 = m_dataViewListCtrlParam->GetTextValue(r, 10);
+	*mask2 = Geo2Rect(wxString::Format(wxT("%sx%s+%s+%s"), w2, h2, x2, y2));
+
+	wxString x3 = m_dataViewListCtrlParam->GetTextValue(r, 11);
+	wxString y3 = m_dataViewListCtrlParam->GetTextValue(r, 12);
+	wxString w3 = m_dataViewListCtrlParam->GetTextValue(r, 13);
+	wxString h3 = m_dataViewListCtrlParam->GetTextValue(r, 14);
+	*mask3 = Geo2Rect(wxString::Format(wxT("%sx%s+%s+%s"), w3, h3, x3, y3));
+
+	wxString x4 = m_dataViewListCtrlParam->GetTextValue(r, 15);
+	wxString y4 = m_dataViewListCtrlParam->GetTextValue(r, 16);
+	wxString w4 = m_dataViewListCtrlParam->GetTextValue(r, 17);
+	wxString h4 = m_dataViewListCtrlParam->GetTextValue(r, 18);
+	*mask4 = Geo2Rect(wxString::Format(wxT("%sx%s+%s+%s"), w4, h4, x4, y4));
+}
+
+
+/* Event Handlers  */
+void MergeFrame::OnAclS(wxCommandEvent& WXUNUSED(event))
+{
+	int r = m_dataViewListCtrlParam->GetSelectedRow();
+	if (r == wxNOT_FOUND) return;
+
+	MaskLocSet();
+	if (r == m_dataViewListCtrlParam->GetItemCount() - 1) return;
+
+	m_dataViewListCtrlParam->SelectRow(r + 1);
+	if (r > 3) m_dataViewListCtrlParam->LineDown();
+	ShowImages();
+}
+
+void MergeFrame::OnFileChanged(wxFileDirPickerEvent& WXUNUSED(event))
+{
+	m_dataViewListCtrlParam->DeleteAllItems();
+
+	wxTextFile file;
+	file.Open(m_filePicker->GetPath());
+	wxVector<wxVariant> data;
+
+	for (int i = 0; i < file.GetLineCount(); i++) {
+		wxArrayString buf = wxSplit(file.GetLine(i), ',', '\\');
+
+		data.push_back(wxVariant(buf[0]));
+
+		data.push_back(wxVariant(buf[1]));
+		data.push_back(wxVariant(buf[2]));
+
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectSplMask.x)));       // x1
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectSplMask.y)));       // y1
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectSplMask.width)));   // w1
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectSplMask.height)));  // h2
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn1Mask.x)));      // x2
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn1Mask.y)));      // y2
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn1Mask.width)));  // w2
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn1Mask.height))); // h2
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn2Mask.x)));      // x3
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn2Mask.y)));      // y3
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn2Mask.width)));  // w3
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn2Mask.height))); // h3
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn3Mask.x)));      // x4
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn3Mask.y)));      // y4
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn3Mask.width)));  // w4
+		data.push_back(wxVariant(wxString::Format(wxT("%d"), m_rectOpn3Mask.height))); // h4
+		data.push_back(wxVariant(wxEmptyString)); // changed time
+
+		for (int j = 3; j < buf.GetCount(); j++) data[j] = buf[j];
+		m_dataViewListCtrlParam->AppendItem(data);
+
+		data.clear();
+	}
+	file.Close();
+
+	m_dataViewListCtrlParam->SelectRow(0);
+	ShowImages();
+}
+
+void MergeFrame::OnMaskLocSet(wxCommandEvent& WXUNUSED(event))
+{
+	MaskLocSet();
+}
+
+void MergeFrame::OnSelectData(wxDataViewEvent& WXUNUSED(event))
+{
+	ShowImages();
+}
+
+void MergeFrame::OnWrite(wxCommandEvent& WXUNUSED(event))
+{
+	SaveParams();
+	wxMessageBox(wxT("data saved."));
+}
+
+void MergeFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
+{
+	wxString html = wxT("<html><body>\n");
+
+	int r = m_dataViewListCtrlParam->GetSelectedRow();
+	if (r == wxNOT_FOUND) {
+		wxMessageBox(wxT("no item selected."));
+		return;
+	}
+	wxString dirno = m_dataViewListCtrlParam->GetTextValue(r, 0);
+
+	wxRect mask1, mask2, mask3, mask4;
+	GetItemMaskLoc(r, &mask1, &mask2, &mask3, &mask4);
+
+	wxString dir = m_workdir + wxFILE_SEP_PATH + dirno;
+	wxArrayString files;
+	wxDir::GetAllFiles(dir, &files, wxT("*.tif"), wxDIR_FILES);
+
+	wxString temp1 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_1.jpg"), r);
+	wxString temp2 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_2.tif"), r);
+	wxString temp3 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_3.tif"), r);
+	wxString temp4 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_4.tif"), r);
+
+	wxCopyFile(m_workdir + wxFILE_SEP_PATH + wxT("_") + dirno + wxT(".jpg"), temp1);
+	DoRealMask(files[2], temp2, mask1, ZeroRect());
+	DoRealMask(files[3], temp3, mask3, mask4);
+	DoRealMask(files[4], temp4, mask2, ZeroRect());
+	
+	wxString imgsz = wxString::Format(wxT("\" width=\"%d\" height=\"%d\""), 750 * m_zoom / 100, 1060 * m_zoom / 100);
+
+	html += wxT("<img src=\"" + temp1 + imgsz + "/>\n");
+	html += wxT("<img src=\"" + temp2 + imgsz + "/>\n");
+	html += wxT("<img src=\"" + temp3 + imgsz + "/>\n");
+	html += wxT("<img src=\"" + temp4 + imgsz + "/>\n");
+	html += wxT("</body></html>");
+
+	// start printing
+	wxPrintDialogData pd;
+	wxPrinter p(&pd);
+
+	wxHtmlPrintout hpout(wxT("Merger"));
+	hpout.SetMargins(-5, -5, -5, -5, 0);
+	hpout.SetHtmlText(html, wxEmptyString, false);
+
+	if (!p.Print(NULL, &hpout, true)) {
+		if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
+			wxMessageBox(wxT("print problem."));
+        else
+            wxMessageBox(wxT("print canceled."));
+	}
+}
+
+void MergeFrame::OnPrintAll(wxCommandEvent& WXUNUSED(event))
+{
+	int n = m_dataViewListCtrlParam->GetItemCount();
+	m_gauge->SetRange(n);
+	m_gauge->SetValue(0);
+
+	wxString html = wxT("<html><body>\n");
+	int page = 1;
+	for (int r = 0; r < n; r++) {
+		wxString dirno = m_dataViewListCtrlParam->GetTextValue(r, 0);
+
+		wxRect mask1, mask2, mask3, mask4;
+		GetItemMaskLoc(r, &mask1, &mask2, &mask3, &mask4);
+
+		wxString dir = m_workdir + wxFILE_SEP_PATH + dirno;
+		wxArrayString files;
+		wxDir::GetAllFiles(dir, &files, wxT("*.tif"), wxDIR_FILES);
+
+		wxString temp1 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_1.jpg"), r);
+		wxString temp2 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_2.tif"), r);
+		wxString temp3 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_3.tif"), r);
+		wxString temp4 = m_workdir + wxFILE_SEP_PATH + wxString::Format(wxT("temp%02d_4.tif"), r);
+
+		wxCopyFile(m_workdir + wxFILE_SEP_PATH + wxT("_") + dirno + wxT(".jpg"), temp1);
+		DoRealMask(files[2], temp2, mask1, ZeroRect());
+		DoRealMask(files[3], temp3, mask3, mask4);
+		DoRealMask(files[4], temp4, mask2, ZeroRect());
+
+		wxString imgszl = wxString::Format(wxT("\" width=\"%d\" height=\"%d\""), 750 * m_zoom / 100, 1060 * m_zoom / 100);
+		wxString imgszr = wxString::Format(wxT("\" width=\"%d\" height=\"%d\""), 750 * m_zoom / 100, 1040 * m_zoom / 100);
+
+		html += wxT("<font size=-2>");
+		html += wxT("<p align=left>");
+		html += wxT("<img src=\"" + temp1 + imgszl + "/>\n");
+		html += wxT("<img src=\"" + temp2 + imgszr + "/>\n");
+		html += wxT("</p>");
+
+		html += wxT("<p align=left>");
+		html += wxString::Format(wxT("  - %02d -"), page++);
+		html += wxT("</p>");
+
+		html += wxT("<p align=right>");
+		html += wxT("<img src=\"" + temp3 + imgszl + "/>\n");
+		html += wxT("<img src=\"" + temp4 + imgszr + "/>\n");
+		html += wxT("</p>");
+
+		html += wxT("<p align=left>");
+		html += wxString::Format(wxT("  - %02d -"), page++);
+		html += wxT("</p>");
+		html += wxT("</font>");
+
+		m_gauge->SetValue(r + 1);
+	}
+	html += wxT("</body></html>");
+	m_gauge->SetValue(0);
+
+	// start printing
+	wxPrintDialogData pd;
+	wxPrinter p(&pd);
+
+	wxHtmlPrintout hpout(wxT("Merger - batch mode"));
+	hpout.SetMargins(-5, -5, -5, -5, 0);
+	hpout.SetHtmlText(html, wxEmptyString, false);
+
+	if (!p.Print(NULL, &hpout, true)) {
+		if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
+			wxMessageBox(wxT("print problem."));
+        else
+            wxMessageBox(wxT("print canceled."));
+	}
+
+	wxMessageDialog dlg(this, wxT("設定を保存しますか?"), wxT("Question ?"), wxYES_NO);
+	if (dlg.ShowModal() == wxID_YES) {
+		SaveParams();
+		wxMessageBox(wxT("data saved."));
+	}
+}
+