diff src/iklist.cpp @ 0:520044113ef0 draft

beta release.
author pyon <pyon@macmini>
date Sat, 21 Aug 2021 13:03:13 +0900
parents
children c0f76f8e67fa
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iklist.cpp	Sat Aug 21 13:03:13 2021 +0900
@@ -0,0 +1,314 @@
+// Filename   : iklist.cpp
+// Last Change: 2021-08-20 金 12:48:51.
+//
+#include <wx/textfile.h>
+#include <wx/utils.h>
+#include <wx/dir.h>
+#include <wx/filefn.h>
+#include <wx/wfstream.h>
+#include <wx/txtstrm.h>
+#include <wx/fs_zip.h>
+#include <wx/filesys.h>
+#include <wx/msgdlg.h>
+
+#include "iklist.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+MainFrame::MainFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) 
+	: wxFrame(parent, id, title, pos, size, style)
+{
+	CreateControls();
+	LoadConfig();
+
+	// Connect Events
+	m_searchCtrl->Connect(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, wxCommandEventHandler(MainFrame::OnCancel), NULL, this);
+	m_searchCtrl->Connect(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
+	m_searchCtrl->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
+	m_textCtrl->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnTextEnter), NULL, this);
+	m_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainFrame::OnClick), NULL, this);
+	m_choiceCity->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnCityChoice), NULL, this);
+	m_choiceKind->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnKindChoice), NULL, this);
+	m_dataViewListCtrl->Connect(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEventHandler(MainFrame::OnListItemActivated), NULL, this);
+}
+
+MainFrame::~MainFrame()
+{
+	// Clean TempFile
+	wxString tmpdir, filename;
+	wxGetEnv(wxT("TEMP"), &tmpdir);
+	wxDir dir(tmpdir);
+	dir.IsOpened();
+	bool cont = dir.GetFirst(&filename, wxT("iklist-*"), wxDIR_FILES);
+	while (cont) {
+		wxRemoveFile(tmpdir + wxFILE_SEP_PATH + filename);
+		cont = dir.GetNext(&filename);
+	}
+
+	// Disconnect Events
+	m_searchCtrl->Disconnect(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, wxCommandEventHandler(MainFrame::OnCancel), NULL, this);
+	m_searchCtrl->Disconnect(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
+	m_searchCtrl->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
+	m_textCtrl->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnTextEnter), NULL, this);
+	m_button->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainFrame::OnClick), NULL, this);
+	m_choiceCity->Disconnect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnCityChoice), NULL, this);
+	m_choiceKind->Disconnect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnKindChoice), NULL, this);
+	m_dataViewListCtrl->Disconnect(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEventHandler(MainFrame::OnListItemActivated), NULL, this);
+}
+
+// Event Handlers
+void MainFrame::OnSearch(wxCommandEvent& WXUNUSED(event))
+{
+	SetList();
+}
+
+void MainFrame::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+	m_searchCtrl->Clear();
+}
+
+void MainFrame::OnTextEnter(wxCommandEvent& WXUNUSED(event))
+{
+	CheckPassword();
+}
+
+void MainFrame::OnClick(wxCommandEvent& WXUNUSED(event))
+{
+	CheckPassword();
+}
+
+void MainFrame::OnCityChoice(wxCommandEvent& WXUNUSED(event))
+{
+	SetList();
+}
+
+void MainFrame::OnKindChoice(wxCommandEvent& WXUNUSED(event))
+{
+	SetList();
+}
+
+void MainFrame::OnListItemActivated(wxDataViewEvent& WXUNUSED(event))
+{
+	int n = m_dataViewListCtrl->GetSelectedRow();
+	wxString index = m_dataViewListCtrl->GetTextValue(n, 0);
+	wxString pdf = MakePDF(index);
+
+	wxString cmd = wxT("cmd /c start ") + pdf;
+	wxArrayString output, error;
+	wxExecute(cmd, output, error, wxEXEC_HIDE_CONSOLE);
+}
+
+// Functions
+void MainFrame::SetList()
+{
+	wxString kw = m_searchCtrl->GetValue();
+	wxString city = m_choiceCity->GetString(m_choiceCity->GetSelection());
+	wxString kind = m_choiceKind->GetString(m_choiceKind->GetSelection());
+
+	m_dataViewListCtrl->DeleteAllItems();
+	wxVector<wxVariant> data;
+    for (int i = 0; i < m_data.GetCount(); i++) {
+		wxArrayString str = wxSplit(m_data[i], ':');
+
+		data.push_back(wxVariant(wxString::Format(wxT("%04d"), i + 1)));	// ID
+		data.push_back(wxVariant(str[0]));	// Name
+		data.push_back(wxVariant(str[1]));	// City
+		data.push_back(wxVariant(str[2]));	// Kind
+
+		unsigned int flag = 0;
+		if (!kw.IsEmpty() && str[0].Find(kw) == wxNOT_FOUND) flag |= 1;
+		if (!city.IsEmpty() && str[1].IsSameAs(city)) flag |= 2;
+		if (!kind.IsEmpty() && str[2].IsSameAs(kind)) flag |= 4;
+		if (flag != 0)
+			m_dataViewListCtrl->AppendItem(data);
+
+		data.clear();
+    }
+}
+
+wxString MainFrame::MakePDF(wxString index)
+{
+	wxString file = SearchFile(wxT("data03"), index);
+	wxFileInputStream si1(file);
+	file = SearchFile(wxT("data04"), index);
+	wxFileInputStream si2(file);
+	file = SearchFile(wxT("data08"), index);
+	wxFileInputStream si3(file);
+
+	wxString tmpdir;
+	wxGetEnv(wxT("TEMP"), &tmpdir);
+	wxString pdf = tmpdir + "/iklist-" + index + ".pdf";
+	wxFileOutputStream so(pdf);
+	so << si1 << si2 << si3;	// use chunk buffer to copy if file is big.
+
+	return pdf;
+}
+
+wxString MainFrame::SearchFile(wxString directory, wxString index)
+{
+	wxDir dir(directory);
+	if (!dir.IsOpened())
+		return wxEmptyString;
+
+	wxString filename;
+	bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES);
+	while (cont) {
+		if (filename.Mid(8, 4).IsSameAs(index, false)) 
+			break;
+		cont = dir.GetNext(&filename);
+	}
+	return directory + wxT("/") + filename;
+}
+
+void MainFrame::CreateControls()
+{
+    this->SetIcon(wxIcon(wxT("sample")));
+	this->SetSizeHints(wxDefaultSize, wxDefaultSize);
+	this->SetBackgroundColour(wxColour(130, 170, 210));
+
+	wxBoxSizer* bSizerTop = new wxBoxSizer(wxVERTICAL);
+
+	//--
+	wxBoxSizer* bSizerWord = new wxBoxSizer(wxHORIZONTAL);
+
+	m_staticTextWord = new wxStaticText(this, wxID_ANY, wxT("パスワード:"), wxDefaultPosition, wxDefaultSize, 0);
+	bSizerWord->Add(m_staticTextWord, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_searchCtrl = new wxSearchCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(0, -1), 0);
+	#ifndef __WXMAC__
+	m_searchCtrl->ShowSearchButton(true);
+	#endif
+	m_searchCtrl->ShowCancelButton(true);
+
+	bSizerWord->Add(m_searchCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, -1), wxTE_PASSWORD|wxTE_PROCESS_ENTER);
+	bSizerWord->Add(m_textCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+	m_textCtrl->SetFocus();
+
+	m_button = new wxButton(this, wxID_ANY, wxT("OK"), wxDefaultPosition, wxSize(60, -1), 0);
+	bSizerWord->Add(m_button, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	bSizerTop->Add(bSizerWord, 0, wxEXPAND, 5);
+
+	//--
+	wxBoxSizer* bSizerFilter = new wxBoxSizer(wxHORIZONTAL);
+
+	m_staticTextFilter = new wxStaticText(this, wxID_ANY, wxT("フィルター:"), wxDefaultPosition, wxDefaultSize, 0);
+	bSizerFilter->Add(m_staticTextFilter, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_staticTextCity = new wxStaticText(this, wxID_ANY, wxT("市町村"), wxDefaultPosition, wxDefaultSize, 0);
+	bSizerFilter->Add(m_staticTextCity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	wxArrayString m_choiceCityChoices;
+	m_choiceCity = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCityChoices, 0);
+	m_choiceCity->SetSelection(0);
+	bSizerFilter->Add(m_choiceCity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	m_staticTextKind = new wxStaticText(this, wxID_ANY, wxT("区分"), wxDefaultPosition, wxDefaultSize, 0);
+	bSizerFilter->Add(m_staticTextKind, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	wxArrayString m_choiceKindChoices;
+	m_choiceKind = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceKindChoices, 0);
+	m_choiceKind->SetSelection(0);
+	bSizerFilter->Add(m_choiceKind, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
+
+	bSizerTop->Add(bSizerFilter, 0, wxEXPAND, 5);
+
+	//--
+	m_dataViewListCtrl = new wxDataViewListCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_SINGLE|wxDV_VERT_RULES|wxDV_ROW_LINES);
+	m_dataViewListColumnID = m_dataViewListCtrl->AppendTextColumn(wxT("ID"),       wxDATAVIEW_CELL_INERT,  40, static_cast<wxAlignment>(wxALIGN_CENTER), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
+	m_dataViewListColumnName = m_dataViewListCtrl->AppendTextColumn(wxT(" 名称"), wxDATAVIEW_CELL_INERT, 280, static_cast<wxAlignment>(wxALIGN_LEFT),   wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
+	m_dataViewListColumnCity = m_dataViewListCtrl->AppendTextColumn(wxT("市町村"), wxDATAVIEW_CELL_INERT,  -1, static_cast<wxAlignment>(wxALIGN_CENTER), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
+	m_dataViewListColumnKind = m_dataViewListCtrl->AppendTextColumn(wxT(" 区分"), wxDATAVIEW_CELL_INERT,  -1, static_cast<wxAlignment>(wxALIGN_LEFT),   wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
+	bSizerTop->Add(m_dataViewListCtrl, 1, wxALL|wxEXPAND, 5);
+
+	this->SetSizer(bSizerTop);
+	this->Layout();
+
+	this->Centre(wxBOTH);
+}
+
+void MainFrame::LoadConfig()
+{
+	wxFileSystem::AddHandler(new wxZipFSHandler);
+	wxFileSystem* fs = new wxFileSystem;
+	wxString archive = wxT("iklist.lib");
+
+	// Load Password
+	wxString pwfn = wxT("p8wypswd5c0x");
+	wxFSFile* pwfile = fs->OpenFile(archive + wxT("#zip:") + pwfn);
+	if (pwfile) {
+		wxInputStream *zstream = pwfile->GetStream();
+		wxTextInputStream tstream(*zstream);
+		m_pswd = tstream.ReadLine();
+		delete pwfile;
+	}
+
+	// Load List
+	wxString listfn = wxT("q534list8mor");
+	wxFSFile* listfile = fs->OpenFile(archive + wxT("#zip:") + listfn);
+	if (listfile) {
+		wxInputStream *zstream = listfile->GetStream();
+		wxTextInputStream tstream(*zstream);
+		for (int i = 0; i < 541; i++) {	//#########################
+		//while (!zstream->Eof()) {
+			m_data.Add(tstream.ReadLine());
+		}
+		delete listfile;
+	}
+
+	// Set Filter
+	wxArrayString filter1, filter2;
+	filter1.Add(wxEmptyString);
+	filter2.Add(wxEmptyString);
+	for (int i = 0; i < m_data.GetCount(); i++) {
+		wxArrayString str = wxSplit(m_data[i], ':');
+		bool flag1, flag2;
+		for (int j = 0; j < filter1.GetCount(); j++) {
+			if (filter1[j].IsSameAs(str[1])) {
+				flag1 = false;
+			} else {
+				flag1 = true;
+			}
+		}
+		if (flag1) filter1.Add(str[1]);
+
+		for (int j = 0; j < filter2.GetCount(); j++) {
+			if (filter2[j].IsSameAs(str[2])) {
+				flag2 = false;
+			} else {
+				flag2 = true;
+			}
+		}
+		if (flag2) filter2.Add(str[2]);
+	}
+
+	for (int i = 0; i < filter1.GetCount(); i++) {
+		m_choiceCity->Append(filter1[i]);
+	}
+	m_choiceCity->SetSelection(0);
+	for (int i = 0; i < filter2.GetCount(); i++) {
+		m_choiceKind->Append(filter2[i]);
+	}
+	m_choiceKind->SetSelection(0);
+
+	delete fs;
+}
+
+void MainFrame::CheckPassword()
+{
+	if (m_textCtrl->GetValue().IsSameAs(m_pswd, true)) {
+		m_staticTextWord->SetLabel(wxT("キーワード:"));
+		m_searchCtrl->SetSize(200, -1);	
+		m_textCtrl->SetSize(0, -1);
+		m_textCtrl->Hide();
+		m_button->SetSize(0, -1);
+		m_button->Hide();
+		SetList();
+	} else {
+		m_textCtrl->SetBackgroundColour(wxColour(255, 160, 160));
+		m_textCtrl->SelectAll();
+	}
+}
+