view 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 source

// 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."));
	}
}