0
|
1 // Filename : iklist.cpp
|
|
2 // Last Change: 2021-08-20 金 12:48:51.
|
|
3 //
|
|
4 #include <wx/textfile.h>
|
|
5 #include <wx/utils.h>
|
|
6 #include <wx/dir.h>
|
|
7 #include <wx/filefn.h>
|
|
8 #include <wx/wfstream.h>
|
|
9 #include <wx/txtstrm.h>
|
|
10 #include <wx/fs_zip.h>
|
|
11 #include <wx/filesys.h>
|
|
12 #include <wx/msgdlg.h>
|
|
13
|
|
14 #include "iklist.h"
|
|
15
|
|
16 ///////////////////////////////////////////////////////////////////////////
|
|
17
|
|
18 MainFrame::MainFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style)
|
|
19 : wxFrame(parent, id, title, pos, size, style)
|
|
20 {
|
|
21 CreateControls();
|
|
22 LoadConfig();
|
|
23
|
|
24 // Connect Events
|
|
25 m_searchCtrl->Connect(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, wxCommandEventHandler(MainFrame::OnCancel), NULL, this);
|
|
26 m_searchCtrl->Connect(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
|
|
27 m_searchCtrl->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
|
|
28 m_textCtrl->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnTextEnter), NULL, this);
|
|
29 m_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainFrame::OnClick), NULL, this);
|
|
30 m_choiceCity->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnCityChoice), NULL, this);
|
|
31 m_choiceKind->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnKindChoice), NULL, this);
|
|
32 m_dataViewListCtrl->Connect(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEventHandler(MainFrame::OnListItemActivated), NULL, this);
|
|
33 }
|
|
34
|
|
35 MainFrame::~MainFrame()
|
|
36 {
|
|
37 // Clean TempFile
|
|
38 wxString tmpdir, filename;
|
|
39 wxGetEnv(wxT("TEMP"), &tmpdir);
|
|
40 wxDir dir(tmpdir);
|
|
41 dir.IsOpened();
|
|
42 bool cont = dir.GetFirst(&filename, wxT("iklist-*"), wxDIR_FILES);
|
|
43 while (cont) {
|
|
44 wxRemoveFile(tmpdir + wxFILE_SEP_PATH + filename);
|
|
45 cont = dir.GetNext(&filename);
|
|
46 }
|
|
47
|
|
48 // Disconnect Events
|
|
49 m_searchCtrl->Disconnect(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, wxCommandEventHandler(MainFrame::OnCancel), NULL, this);
|
|
50 m_searchCtrl->Disconnect(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
|
|
51 m_searchCtrl->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnSearch), NULL, this);
|
|
52 m_textCtrl->Disconnect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(MainFrame::OnTextEnter), NULL, this);
|
|
53 m_button->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainFrame::OnClick), NULL, this);
|
|
54 m_choiceCity->Disconnect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnCityChoice), NULL, this);
|
|
55 m_choiceKind->Disconnect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(MainFrame::OnKindChoice), NULL, this);
|
|
56 m_dataViewListCtrl->Disconnect(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEventHandler(MainFrame::OnListItemActivated), NULL, this);
|
|
57 }
|
|
58
|
|
59 // Event Handlers
|
|
60 void MainFrame::OnSearch(wxCommandEvent& WXUNUSED(event))
|
|
61 {
|
|
62 SetList();
|
|
63 }
|
|
64
|
|
65 void MainFrame::OnCancel(wxCommandEvent& WXUNUSED(event))
|
|
66 {
|
|
67 m_searchCtrl->Clear();
|
|
68 }
|
|
69
|
|
70 void MainFrame::OnTextEnter(wxCommandEvent& WXUNUSED(event))
|
|
71 {
|
|
72 CheckPassword();
|
|
73 }
|
|
74
|
|
75 void MainFrame::OnClick(wxCommandEvent& WXUNUSED(event))
|
|
76 {
|
|
77 CheckPassword();
|
|
78 }
|
|
79
|
|
80 void MainFrame::OnCityChoice(wxCommandEvent& WXUNUSED(event))
|
|
81 {
|
|
82 SetList();
|
|
83 }
|
|
84
|
|
85 void MainFrame::OnKindChoice(wxCommandEvent& WXUNUSED(event))
|
|
86 {
|
|
87 SetList();
|
|
88 }
|
|
89
|
|
90 void MainFrame::OnListItemActivated(wxDataViewEvent& WXUNUSED(event))
|
|
91 {
|
|
92 int n = m_dataViewListCtrl->GetSelectedRow();
|
|
93 wxString index = m_dataViewListCtrl->GetTextValue(n, 0);
|
|
94 wxString pdf = MakePDF(index);
|
|
95
|
|
96 wxString cmd = wxT("cmd /c start ") + pdf;
|
|
97 wxArrayString output, error;
|
|
98 wxExecute(cmd, output, error, wxEXEC_HIDE_CONSOLE);
|
|
99 }
|
|
100
|
|
101 // Functions
|
|
102 void MainFrame::SetList()
|
|
103 {
|
|
104 wxString kw = m_searchCtrl->GetValue();
|
|
105 wxString city = m_choiceCity->GetString(m_choiceCity->GetSelection());
|
|
106 wxString kind = m_choiceKind->GetString(m_choiceKind->GetSelection());
|
|
107
|
|
108 m_dataViewListCtrl->DeleteAllItems();
|
|
109 wxVector<wxVariant> data;
|
|
110 for (int i = 0; i < m_data.GetCount(); i++) {
|
|
111 wxArrayString str = wxSplit(m_data[i], ':');
|
|
112
|
|
113 data.push_back(wxVariant(wxString::Format(wxT("%04d"), i + 1))); // ID
|
|
114 data.push_back(wxVariant(str[0])); // Name
|
|
115 data.push_back(wxVariant(str[1])); // City
|
|
116 data.push_back(wxVariant(str[2])); // Kind
|
|
117
|
|
118 unsigned int flag = 0;
|
|
119 if (!kw.IsEmpty() && str[0].Find(kw) == wxNOT_FOUND) flag |= 1;
|
|
120 if (!city.IsEmpty() && str[1].IsSameAs(city)) flag |= 2;
|
|
121 if (!kind.IsEmpty() && str[2].IsSameAs(kind)) flag |= 4;
|
|
122 if (flag != 0)
|
|
123 m_dataViewListCtrl->AppendItem(data);
|
|
124
|
|
125 data.clear();
|
|
126 }
|
|
127 }
|
|
128
|
|
129 wxString MainFrame::MakePDF(wxString index)
|
|
130 {
|
|
131 wxString file = SearchFile(wxT("data03"), index);
|
|
132 wxFileInputStream si1(file);
|
|
133 file = SearchFile(wxT("data04"), index);
|
|
134 wxFileInputStream si2(file);
|
|
135 file = SearchFile(wxT("data08"), index);
|
|
136 wxFileInputStream si3(file);
|
|
137
|
|
138 wxString tmpdir;
|
|
139 wxGetEnv(wxT("TEMP"), &tmpdir);
|
|
140 wxString pdf = tmpdir + "/iklist-" + index + ".pdf";
|
|
141 wxFileOutputStream so(pdf);
|
|
142 so << si1 << si2 << si3; // use chunk buffer to copy if file is big.
|
|
143
|
|
144 return pdf;
|
|
145 }
|
|
146
|
|
147 wxString MainFrame::SearchFile(wxString directory, wxString index)
|
|
148 {
|
|
149 wxDir dir(directory);
|
|
150 if (!dir.IsOpened())
|
|
151 return wxEmptyString;
|
|
152
|
|
153 wxString filename;
|
|
154 bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES);
|
|
155 while (cont) {
|
|
156 if (filename.Mid(8, 4).IsSameAs(index, false))
|
|
157 break;
|
|
158 cont = dir.GetNext(&filename);
|
|
159 }
|
|
160 return directory + wxT("/") + filename;
|
|
161 }
|
|
162
|
|
163 void MainFrame::CreateControls()
|
|
164 {
|
|
165 this->SetIcon(wxIcon(wxT("sample")));
|
|
166 this->SetSizeHints(wxDefaultSize, wxDefaultSize);
|
|
167 this->SetBackgroundColour(wxColour(130, 170, 210));
|
|
168
|
|
169 wxBoxSizer* bSizerTop = new wxBoxSizer(wxVERTICAL);
|
|
170
|
|
171 //--
|
|
172 wxBoxSizer* bSizerWord = new wxBoxSizer(wxHORIZONTAL);
|
|
173
|
|
174 m_staticTextWord = new wxStaticText(this, wxID_ANY, wxT("パスワード:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
175 bSizerWord->Add(m_staticTextWord, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
176
|
|
177 m_searchCtrl = new wxSearchCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(0, -1), 0);
|
|
178 #ifndef __WXMAC__
|
|
179 m_searchCtrl->ShowSearchButton(true);
|
|
180 #endif
|
|
181 m_searchCtrl->ShowCancelButton(true);
|
|
182
|
|
183 bSizerWord->Add(m_searchCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
184
|
|
185 m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, -1), wxTE_PASSWORD|wxTE_PROCESS_ENTER);
|
|
186 bSizerWord->Add(m_textCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
187 m_textCtrl->SetFocus();
|
|
188
|
|
189 m_button = new wxButton(this, wxID_ANY, wxT("OK"), wxDefaultPosition, wxSize(60, -1), 0);
|
|
190 bSizerWord->Add(m_button, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
191
|
|
192 bSizerTop->Add(bSizerWord, 0, wxEXPAND, 5);
|
|
193
|
|
194 //--
|
|
195 wxBoxSizer* bSizerFilter = new wxBoxSizer(wxHORIZONTAL);
|
|
196
|
|
197 m_staticTextFilter = new wxStaticText(this, wxID_ANY, wxT("フィルター:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
198 bSizerFilter->Add(m_staticTextFilter, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
199
|
|
200 m_staticTextCity = new wxStaticText(this, wxID_ANY, wxT("市町村"), wxDefaultPosition, wxDefaultSize, 0);
|
|
201 bSizerFilter->Add(m_staticTextCity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
202
|
|
203 wxArrayString m_choiceCityChoices;
|
|
204 m_choiceCity = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCityChoices, 0);
|
|
205 m_choiceCity->SetSelection(0);
|
|
206 bSizerFilter->Add(m_choiceCity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
207
|
|
208 m_staticTextKind = new wxStaticText(this, wxID_ANY, wxT("区分"), wxDefaultPosition, wxDefaultSize, 0);
|
|
209 bSizerFilter->Add(m_staticTextKind, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
210
|
|
211 wxArrayString m_choiceKindChoices;
|
|
212 m_choiceKind = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceKindChoices, 0);
|
|
213 m_choiceKind->SetSelection(0);
|
|
214 bSizerFilter->Add(m_choiceKind, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
|
|
215
|
|
216 bSizerTop->Add(bSizerFilter, 0, wxEXPAND, 5);
|
|
217
|
|
218 //--
|
|
219 m_dataViewListCtrl = new wxDataViewListCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_SINGLE|wxDV_VERT_RULES|wxDV_ROW_LINES);
|
|
220 m_dataViewListColumnID = m_dataViewListCtrl->AppendTextColumn(wxT("ID"), wxDATAVIEW_CELL_INERT, 40, static_cast<wxAlignment>(wxALIGN_CENTER), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
|
|
221 m_dataViewListColumnName = m_dataViewListCtrl->AppendTextColumn(wxT(" 名称"), wxDATAVIEW_CELL_INERT, 280, static_cast<wxAlignment>(wxALIGN_LEFT), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
|
|
222 m_dataViewListColumnCity = m_dataViewListCtrl->AppendTextColumn(wxT("市町村"), wxDATAVIEW_CELL_INERT, -1, static_cast<wxAlignment>(wxALIGN_CENTER), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
|
|
223 m_dataViewListColumnKind = m_dataViewListCtrl->AppendTextColumn(wxT(" 区分"), wxDATAVIEW_CELL_INERT, -1, static_cast<wxAlignment>(wxALIGN_LEFT), wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE);
|
|
224 bSizerTop->Add(m_dataViewListCtrl, 1, wxALL|wxEXPAND, 5);
|
|
225
|
|
226 this->SetSizer(bSizerTop);
|
|
227 this->Layout();
|
|
228
|
|
229 this->Centre(wxBOTH);
|
|
230 }
|
|
231
|
|
232 void MainFrame::LoadConfig()
|
|
233 {
|
|
234 wxFileSystem::AddHandler(new wxZipFSHandler);
|
|
235 wxFileSystem* fs = new wxFileSystem;
|
|
236 wxString archive = wxT("iklist.lib");
|
|
237
|
|
238 // Load Password
|
|
239 wxString pwfn = wxT("p8wypswd5c0x");
|
|
240 wxFSFile* pwfile = fs->OpenFile(archive + wxT("#zip:") + pwfn);
|
|
241 if (pwfile) {
|
|
242 wxInputStream *zstream = pwfile->GetStream();
|
|
243 wxTextInputStream tstream(*zstream);
|
|
244 m_pswd = tstream.ReadLine();
|
|
245 delete pwfile;
|
|
246 }
|
|
247
|
|
248 // Load List
|
|
249 wxString listfn = wxT("q534list8mor");
|
|
250 wxFSFile* listfile = fs->OpenFile(archive + wxT("#zip:") + listfn);
|
|
251 if (listfile) {
|
|
252 wxInputStream *zstream = listfile->GetStream();
|
|
253 wxTextInputStream tstream(*zstream);
|
|
254 for (int i = 0; i < 541; i++) { //#########################
|
|
255 //while (!zstream->Eof()) {
|
|
256 m_data.Add(tstream.ReadLine());
|
|
257 }
|
|
258 delete listfile;
|
|
259 }
|
|
260
|
|
261 // Set Filter
|
|
262 wxArrayString filter1, filter2;
|
|
263 filter1.Add(wxEmptyString);
|
|
264 filter2.Add(wxEmptyString);
|
|
265 for (int i = 0; i < m_data.GetCount(); i++) {
|
|
266 wxArrayString str = wxSplit(m_data[i], ':');
|
|
267 bool flag1, flag2;
|
|
268 for (int j = 0; j < filter1.GetCount(); j++) {
|
|
269 if (filter1[j].IsSameAs(str[1])) {
|
|
270 flag1 = false;
|
|
271 } else {
|
|
272 flag1 = true;
|
|
273 }
|
|
274 }
|
|
275 if (flag1) filter1.Add(str[1]);
|
|
276
|
|
277 for (int j = 0; j < filter2.GetCount(); j++) {
|
|
278 if (filter2[j].IsSameAs(str[2])) {
|
|
279 flag2 = false;
|
|
280 } else {
|
|
281 flag2 = true;
|
|
282 }
|
|
283 }
|
|
284 if (flag2) filter2.Add(str[2]);
|
|
285 }
|
|
286
|
|
287 for (int i = 0; i < filter1.GetCount(); i++) {
|
|
288 m_choiceCity->Append(filter1[i]);
|
|
289 }
|
|
290 m_choiceCity->SetSelection(0);
|
|
291 for (int i = 0; i < filter2.GetCount(); i++) {
|
|
292 m_choiceKind->Append(filter2[i]);
|
|
293 }
|
|
294 m_choiceKind->SetSelection(0);
|
|
295
|
|
296 delete fs;
|
|
297 }
|
|
298
|
|
299 void MainFrame::CheckPassword()
|
|
300 {
|
|
301 if (m_textCtrl->GetValue().IsSameAs(m_pswd, true)) {
|
|
302 m_staticTextWord->SetLabel(wxT("キーワード:"));
|
|
303 m_searchCtrl->SetSize(200, -1);
|
|
304 m_textCtrl->SetSize(0, -1);
|
|
305 m_textCtrl->Hide();
|
|
306 m_button->SetSize(0, -1);
|
|
307 m_button->Hide();
|
|
308 SetList();
|
|
309 } else {
|
|
310 m_textCtrl->SetBackgroundColour(wxColour(255, 160, 160));
|
|
311 m_textCtrl->SelectAll();
|
|
312 }
|
|
313 }
|
|
314
|