Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CFileMode.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations) (download) (as text)
Tue Nov 23 14:34:03 2010 UTC (13 years, 5 months ago) by okadu
File MIME type: text/x-c++src
File size: 27451 byte(s)
[okadu] Version 2.13
1 #include "stdafx.h"
2 #include "md5.h"
3 #include "Script.h"
4 #include "Network.h"
5 #include "CSimpleDialog.h"
6 #include "CSaveFile.h"
7 #include "CSkinPlugin.h"
8 #include "CSimulationMode.h"
9 #include "CFileMode.h"
10 #include "CConfigMode.h"
11
12 // 外部定数
13 extern const int RSN_SCRNAME_MAX;
14 extern const int RSN_SYNC_INTERVAL_MIN;
15 extern const int RSN_SYNC_INTERVAL_MAX;
16
17 // 内部定数
18 const int WW = 512, WH = 384; // 窓サイズ
19 const int NWW = 384, NWH = 256; // ネットワーク窓サイズ
20 const int UNDO_MAX = 32; // アンドゥ回数
21 extern const char *LAYOUT_DIRNAME = "Layout";
22 extern const char *UNDO_DIRNAME = "Undo";
23
24 // 外部グローバル
25 extern float g_SkinFileIconRect[4];
26
27 extern int g_LastJoinedHostIP[];
28 extern int g_LastJoinedHostPort;
29 extern int g_LastJoinedLocalPort;
30 extern int g_LastCreatedHostPort;
31 extern string g_LastScreenName;
32
33 // 内部グローバル
34 list<CLayoutInfo> g_LayoutInfoList; // セーブファイルリスト
35 CInputDialog *g_NetworkConnectionInputDialog = NULL; // 入力ダイアログ
36
37 /*
38 * ヘッダ読込
39 */
40 bool CLayoutInfo::PreLoadSF(
41 FILE *file // ファイル
42 ){
43 char *buf = LoadBinaryText(file, 1024), *str = buf, *eee;
44 try{
45 if(!(str = Space(eee = str))) return false;
46 if(!(str = BeginBlock(eee = str, "DatafileHeader"))) return false;
47 if(!(str = AsgnFloat(eee = str, "RailSimVersion", &m_Version))) throw CSynErr(eee);
48 if(m_Version<2.00f) throw CSynErr(eee, "%s: %.2f", lang(InvalidVersion), m_Version);
49 if(RAILSIM_VERSION<m_Version) throw CSynErr(eee, "%s: %.2f", lang(UnsupportedVersion), m_Version);
50 string datafiletype;
51 if(!(str = AsgnIdentifier(eee = str, "DatafileType", &datafiletype))) throw CSynErr(eee);
52 if(datafiletype!=LAYOUT_DIRNAME) throw CSynErr(eee, lang(InvalidDatafileType));
53 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
54
55 if(!(str = BeginBlock(eee = str, "LayoutInfo"))) throw CSynErr(eee);
56 if(!(str = AsgnString(eee = str, "Date", &m_FileDate))) throw CSynErr(eee);
57 if(!(str = AsgnString(eee = str, "Note", &m_FileNote))) throw CSynErr(eee);
58 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
59 }
60 catch(CSynErr err){
61 err.Handle(FlashIn("%s <%s>", m_FileName.c_str(), "Layout"), buf);
62 return false;
63 }
64 DELETE_A(buf);
65 return true;
66 }
67
68 ////////////////////////////////////////////////////////////////////////////////
69 ////////////////////////////////////////////////////////////////////////////////
70
71 /*
72 * リネーム確認
73 */
74 bool CFileListView::ConfirmRename(
75 CListElement *item, // アイテム
76 string &newname // 新規名
77 ){
78 char *oldname = item->GetString(0);
79 newname = FixFileExt((char *)newname.c_str(), "rs2");
80 if(!_mbsicmp((PUCHAR)oldname, (PUCHAR)newname.c_str())) return false;
81 if(CheckSlash(newname.c_str()) || chdir(g_BaseDir) || chdir(LAYOUT_DIRNAME) ||
82 rename(oldname, newname.c_str())){
83 FILE *file = fopen(newname.c_str(), "rb");
84 if(file){
85 EnqueueCommonDialog(new CSimpleDialog(
86 lang(FileAlreadyExists), (char *)newname.c_str()));
87 fclose(file);
88 }else{
89 EnqueueCommonDialog(new CSimpleDialog(
90 lang(ErrorDuringRename), oldname));
91 }
92 g_Skin->Error();
93 return false;
94 }
95 g_SaveFile->SetFileName((char *)newname.c_str());
96 return true;
97 }
98
99 /*
100 * リネーム終了処理
101 */
102 void CFileListView::EndRename(
103 CListElement *item // アイテム
104 ){
105 g_FileMode->ListFile();
106 }
107
108 /*
109 * ダブルクリック
110 */
111 void CFileListView::DoubleClick(){
112 if(g_NetworkInitialized){
113 g_Skin->Error();
114 return;
115 }
116 CListElement *le = GetFocusItem();
117 if(le && le->IsSelected()) g_FileMode->OpenFile(le->GetString(0));
118 }
119
120 ////////////////////////////////////////////////////////////////////////////////
121 ////////////////////////////////////////////////////////////////////////////////
122
123 /*
124 * コンストラクタ
125 */
126 CFileMode::CFileMode(){
127 int wide = WW-TILE_UNIT*2, win = wide-TILE_UNIT*2;
128 m_FileWindow.Init((g_DispWidth-WW)/2-TILE_UNIT, (g_DispHeight-WH)/2,
129 WW, WH, lang(File), &m_Interface, true);
130 m_FileWindow.SetResize(TILE_UNIT*27+TILE_HALF*4, TILE_UNIT*14,
131 g_DispWidth, g_DispHeight, this);
132 m_FileLabel.Init(TILE_UNIT, TILE_UNIT*2, 1, 1, "", &m_FileWindow, 0, 1);
133 m_NoteLabel.Init(TILE_UNIT, TILE_UNIT*3+TILE_HALF,
134 TILE_UNIT*2, TILE_UNIT, lang(Description), &m_FileWindow, 0, 1);
135 m_NoteEdit.Init(TILE_UNIT*3, TILE_UNIT*3+TILE_HALF, 1, 1, "", &m_FileWindow, 64);
136 m_NewButton.Init(TILE_UNIT, TILE_UNIT*5,
137 TILE_UNIT*5, TILE_UNIT, lang(NewFile), &m_FileWindow);
138 m_OpenButton.Init(TILE_UNIT*6+TILE_HALF, TILE_UNIT*5,
139 TILE_UNIT*5, TILE_UNIT, lang(Open), &m_FileWindow);
140 m_SaveButton.Init(TILE_UNIT*11+TILE_HALF*2, TILE_UNIT*5,
141 TILE_UNIT*5, TILE_UNIT, lang(Overwrite), &m_FileWindow);
142 m_SaveAsButton.Init(TILE_UNIT*16+TILE_HALF*3, TILE_UNIT*5,
143 TILE_UNIT*5, TILE_UNIT, lang(SaveAs), &m_FileWindow);
144 m_NetworkButton.Init(TILE_UNIT*21+TILE_HALF*4, TILE_UNIT*5,
145 TILE_UNIT*5, TILE_UNIT, lang(Download), &m_FileWindow);
146 char *fcol[3] = {lang(FileName), lang(Date), lang(Description)};
147 m_FileListView.Init(TILE_UNIT, TILE_UNIT*6+TILE_HALF, WW-TILE_UNIT*2, 1,
148 &m_FileWindow, 3, fcol, DRAG_NONE, LISTVIEW_RENAMABLE, this, CMD_FILE);
149 m_AutoLoadCheck.Init(0, 0, 1, 1, lang(AutoReload), &m_FileWindow);
150 m_AutoLoadCheck.SetCheck(1);
151 WindowResized(WW, WH, &m_FileWindow);
152 m_NetworkWindow.Init((g_DispWidth-WW)/2-TILE_UNIT*2, (g_DispHeight-WH)/2+TILE_UNIT,
153 NWW, NWH, lang(Network), &m_Interface, true);
154 m_NetworkWindow.SetResize(TILE_UNIT*17+TILE_HALF*2, TILE_UNIT*10,
155 g_DispWidth, g_DispHeight, this);
156 m_NetworkLabel.Init(TILE_UNIT, TILE_UNIT*2, 1, 1, "", &m_NetworkWindow, 0, 1);
157 m_CloseEntryButton.Init(TILE_UNIT, TILE_UNIT*3+TILE_HALF,
158 TILE_UNIT*5, TILE_UNIT, lang(CloseEntry), &m_NetworkWindow);
159 m_DeleteMemberButton.Init(TILE_UNIT*6+TILE_HALF, TILE_UNIT*3+TILE_HALF,
160 TILE_UNIT*5, TILE_UNIT, lang(DeleteMember), &m_NetworkWindow);
161 m_DisconnectButton.Init(TILE_UNIT*11+TILE_HALF*2, TILE_UNIT*3+TILE_HALF,
162 TILE_UNIT*5, TILE_UNIT, lang(Disconnect), &m_NetworkWindow);
163 char *ncol[2] = {lang(ScreenName), lang(State)};
164 m_NetworkListView.Init(TILE_UNIT, TILE_UNIT*5, NWW-TILE_UNIT*2, 1,
165 &m_NetworkWindow, 2, ncol, DRAG_NONE, 0, this, CMD_NETWORK);
166 WindowResized(NWW, NWH, &m_NetworkWindow);
167 m_NetworkWindow.Show(false);
168 m_YesNoDialog = NULL;
169 m_InputDialog = NULL;
170 m_MultiInputDialog = NULL;
171 m_FileMenu = new CPopMenu("", NULL);
172 new CPopMenu(lang(Open), m_FileMenu);
173 new CPopMenu(lang(Overwrite), m_FileMenu);
174 new CPopMenu(lang(Delete), m_FileMenu);
175 new CPopMenu(lang(ChangeName), m_FileMenu);
176 new CPopMenu("-", m_FileMenu);
177 new CPopMenu(lang(CreateSession), m_FileMenu);
178 new CPopMenu(lang(JoinSession), m_FileMenu);
179 chdir(g_BaseDir);
180 if(chdir(LAYOUT_DIRNAME)) mkdir(LAYOUT_DIRNAME);
181 chdir(g_BaseDir);
182 if(chdir(UNDO_DIRNAME)) mkdir(UNDO_DIRNAME);
183 chdir(g_BaseDir);
184 ResetUndo();
185 m_NetworkMode = false;
186 }
187
188 /*
189 * コンストラクタ
190 */
191 CFileMode::~CFileMode(){
192 DELETE_V(m_FileMenu);
193 }
194
195 /*
196 * ウィンドウリサイズ
197 */
198 void CFileMode::WindowResized(
199 int w, int h, // 新規サイズ
200 CWindowCtrl *wnd // ウィドウコントロール
201 ){
202 if(wnd==&m_FileWindow){
203 m_FileLabel.SetSize(w-TILE_UNIT*2, TILE_UNIT);
204 m_NoteEdit.SetSize(w-TILE_UNIT*4, TILE_UNIT);
205 m_FileListView.SetSize(w-TILE_UNIT*2, h-TILE_UNIT*9);
206 m_AutoLoadCheck.SetPos(TILE_UNIT, h-TILE_UNIT*2);
207 m_AutoLoadCheck.SetSize(w-TILE_UNIT*2, TILE_UNIT);
208 }else if(wnd==&m_NetworkWindow){
209 m_NetworkLabel.SetSize(w-TILE_UNIT*2, TILE_UNIT);
210 m_NetworkListView.SetSize(w-TILE_UNIT*2, h-TILE_UNIT*6);
211 }
212 }
213
214 /*
215 * メニュー発行
216 */
217 CPopMenu *CFileMode::Dispatch(
218 CMDTYPE type, // コマンドタイプ
219 DWORD data // データ
220 ){
221 if(type==CMD_FILE){
222 class CFileOpener: public CMenuCommand{
223 private:
224 string m_FileName; // ファイル名
225 public:
226 CFileOpener(char *fname){ m_FileName = fname; }
227 void Exec(){
228 g_FileMode->OpenFile((char *)m_FileName.c_str());
229 }
230 };
231 class CFileSaver: public CMenuCommand{
232 private:
233 string m_FileName; // ファイル名
234 public:
235 CFileSaver(char *fname){ m_FileName = fname; }
236 void Exec(){
237 g_FileMode->SaveFile((char *)m_FileName.c_str());
238 }
239 };
240 class CFileDeleter: public CMenuCommand{
241 private:
242 bool m_Confirm; // 確認
243 string m_FileName; // ファイル名
244 public:
245 CFileDeleter(bool c, char *fname){ m_Confirm = c; m_FileName = fname; }
246 void Exec(){
247 if(m_Confirm){
248 if(chdir(g_BaseDir) || chdir(LAYOUT_DIRNAME)
249 || remove(m_FileName.c_str())){
250 EnqueueCommonDialog(new CSimpleDialog(
251 lang(ErrorDuringDelete), (char *)m_FileName.c_str()));
252 g_Skin->Error();
253 }else{
254 g_FileMode->ListFile();
255 }
256 }else{
257 CYesNoDialog *dlg = new CYesNoDialog(
258 lang(DeleteCfmMessage), (char *)m_FileName.c_str(), false);
259 dlg->SetYesCommand(new CFileDeleter(true, (char *)m_FileName.c_str()));
260 EnqueueCommonDialog(dlg);
261 }
262 }
263 };
264 class CFileRenamer: public CMenuCommand{
265 private:
266 CListElement *m_ListElement; // リスト要素
267 public:
268 CFileRenamer(CListElement *le){ m_ListElement = le; }
269 void Exec(){ m_ListElement->BeginRename(); }
270 };
271 class CNetworkStarter: public CMenuCommand{
272 private:
273 string m_FileName; // ファイル名
274 public:
275 CNetworkStarter(char *fname){ m_FileName = fname; }
276 void Exec(){
277 if(g_NetworkInitialized){
278 g_Skin->Error();
279 return;
280 }
281 g_FileMode->BeginNetworkHost((char *)m_FileName.c_str());
282 }
283 };
284 class CNetworkConnector: public CMenuCommand{
285 private:
286 string m_FileName; // ファイル名
287 public:
288 CNetworkConnector(char *fname){ m_FileName = fname; }
289 void Exec(){
290 if(g_NetworkInitialized){
291 g_Skin->Error();
292 return;
293 }
294 g_FileMode->BeginNetworkJoin((char *)m_FileName.c_str());
295 }
296 };
297 CListElement *le = (CListElement *)data;
298 if(!le) return NULL;
299 m_FileMenu->GetMenu(0)->Enable(!g_NetworkInitialized);
300 m_FileMenu->GetMenu(0)->SetCommand(new CFileOpener(le->GetString(0)));
301 m_FileMenu->GetMenu(1)->SetCommand(new CFileSaver(le->GetString(0)));
302 m_FileMenu->GetMenu(2)->SetCommand(new CFileDeleter(false, le->GetString(0)));
303 m_FileMenu->GetMenu(3)->SetCommand(new CFileRenamer(le));
304 m_FileMenu->GetMenu(5)->Enable(!g_NetworkInitialized);
305 m_FileMenu->GetMenu(5)->SetCommand(new CNetworkStarter(le->GetString(0)));
306 m_FileMenu->GetMenu(6)->Enable(!g_NetworkInitialized);
307 m_FileMenu->GetMenu(6)->SetCommand(new CNetworkConnector(le->GetString(0)));
308 return m_FileMenu;
309 }
310 return NULL;
311 }
312
313 /*
314 * 設定読込
315 */
316 char *CFileMode::LoadInterfaceSetting(
317 char *str // 対象文字列
318 ){
319 char *eee;
320 bool autoload = true;
321 string lastfile;
322 if(str){
323 if(!(str = BeginBlock(eee = str, "FileMode"))) throw CSynErr(eee);
324 if(!(str = AsgnYesNo(eee = str, "AutoLoad", &autoload))) throw CSynErr(eee);
325 if(!(str = AsgnString(eee = str, "LastFile", &lastfile))) throw CSynErr(eee);
326 if(g_ConfigVersion>=2.10f){
327 if(!(str = AsgnInteger(eee = str, "LastJoinedHostIP",
328 g_LastJoinedHostIP, 4, false))) throw CSynErr(eee);
329 if(!(str = AsgnInteger(eee = str, "LastJoinedHostPort",
330 &g_LastJoinedHostPort))) throw CSynErr(eee);
331 if(!(str = AsgnInteger(eee = str, "LastJoinedLocalPort",
332 &g_LastJoinedLocalPort))) throw CSynErr(eee);
333 if(!(str = AsgnInteger(eee = str, "LastCreatedHostPort",
334 &g_LastCreatedHostPort))) throw CSynErr(eee);
335 if(!(str = AsgnString(eee = str, "LastScreenName",
336 &g_LastScreenName))) throw CSynErr(eee);
337 }
338 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
339 }else{
340 lastfile = "Sample.rs2";
341 }
342 m_AutoLoadCheck.SetCheck(autoload);
343 if(!g_RSPV){
344 if(autoload && lastfile.size()){
345 g_SaveFile = new CSaveFile(false);
346 if(!g_SaveFile->Load(lastfile.c_str(),
347 LAYOUT_DIRNAME, false, true, NULL, NULL, false, NULL)){
348 DELETE_V(g_SaveFile);
349 g_SaveFile = new CSaveFile(true);
350 }
351 }else{
352 g_SaveFile = new CSaveFile(true);
353 }
354 }
355 return str;
356 }
357
358 /*
359 * 設定保存
360 */
361 void CFileMode::SaveInterfaceSetting(
362 FILE *file // ファイル
363 ){
364 fprintf(file, "FileMode{\n");
365 fprintf(file, "\tAutoLoad = %s;\n", YESNO[m_AutoLoadCheck.GetCheck()]);
366 fprintf(file, "\tLastFile = \"%s\";\n", g_SaveFile->GetFileName());
367 fprintf(file, "\tLastJoinedHostIP = %d, %d, %d, %d;\n",
368 g_LastJoinedHostIP[0], g_LastJoinedHostIP[1],
369 g_LastJoinedHostIP[2], g_LastJoinedHostIP[3]);
370 fprintf(file, "\tLastJoinedHostPort = %d;\n", g_LastJoinedHostPort);
371 fprintf(file, "\tLastJoinedLocalPort = %d;\n", g_LastJoinedLocalPort);
372 fprintf(file, "\tLastCreatedHostPort = %d;\n", g_LastCreatedHostPort);
373 fprintf(file, "\tLastScreenName = \"%s\";\n", g_LastScreenName.c_str());
374 fprintf(file, "}\n\n");
375 }
376
377 /*
378 * モードを有効化
379 */
380 void CFileMode::EnterInterface(){
381 ms_ModeLabel = lang(File);
382 UpdateFileName();
383 UpdateFileNote();
384 ListFile();
385 if(g_NetworkInitialized) m_NetworkListView.GiveFocus(false);
386 else m_FileListView.GiveFocus(false);
387 }
388
389 /*
390 * モーダル処理
391 */
392 void CFileMode::ModalFuncInterface(){
393 int i;
394 if(m_YesNoDialog){
395 if(m_YesNoDialog->CheckYes()){
396 DELETE_V(g_ModalDialog);
397 m_YesNoDialog = NULL;
398 switch(m_ModalState){
399 case 10:
400 if(g_NetworkInitialized){
401 g_Skin->Error();
402 break;;
403 }
404 ResetUndo();
405 DELETE_V(g_SaveFile);
406 g_SaveFile = new CSaveFile(true);
407 g_SimulationMode->InitTimeOption();
408 SetNeutral();
409 break;
410 case 20:
411 if(g_NetworkInitialized){
412 g_Skin->Error();
413 break;;
414 }
415 ResetUndo();
416 DELETE_V(g_SaveFile);
417 DELETE_A(g_NetworkFileCopy);
418 g_SaveFile = new CSaveFile(false);
419 g_SaveFile->Load(m_NewFileName.c_str(),
420 LAYOUT_DIRNAME, true, true, NULL, NULL, false, NULL);
421 SetNeutral();
422 break;
423 case 30:
424 if(!g_SaveFile->Save(
425 m_NewFileName.c_str(), LAYOUT_DIRNAME, true, true)) ListFile();
426 break;
427 case 80:
428 g_NetworkCloseRequest = true;
429 break;
430 case 90:
431 RSNDeleteMember(m_DeletingMemberID);
432 break;
433 case 100: {
434 m_CloseEntryButton.Enable(false);
435 void StartNetworkSimulation();
436 StartNetworkSimulation();
437 SetNeutral();
438 break; }
439 }
440 }else if(m_YesNoDialog->CheckNo()){
441 DELETE_V(g_ModalDialog);
442 m_YesNoDialog = NULL;
443 }
444 }else if(m_InputDialog){
445 if(m_InputDialog->CheckCancel()){
446 DELETE_V(g_ModalDialog);
447 m_InputDialog = NULL;
448 }else if(m_InputDialog->CheckOK()){
449 string input = m_InputDialog->GetInputText();
450 DELETE_V(g_ModalDialog);
451 m_InputDialog = NULL;
452 bool join_with_file = false;
453 switch(m_ModalState){
454 case 40:
455 input = FixFileExt((char *)input.c_str(), "rs2");
456 SaveFile((char *)input.c_str());
457 break;
458 }
459 }
460 }else if(m_MultiInputDialog){
461 if(m_MultiInputDialog->CheckCancel()){
462 DELETE_V(g_ModalDialog);
463 m_MultiInputDialog = NULL;
464 }else if(m_MultiInputDialog->CheckOK()){
465 vector<string> input;
466 for(i = 0; i<m_MultiInputDialog->GetItemNumber(); i++)
467 input.push_back(m_MultiInputDialog->GetInputText(i));
468 DELETE_V(g_ModalDialog);
469 m_MultiInputDialog = NULL;
470 bool join_with_file = false;
471 switch(m_ModalState){
472 case 70:
473 join_with_file = true;
474 case 50: {
475 if(sscanf(input[1].c_str(), "%d", &g_NetworkLocalPort)!=1
476 || !CheckPortArea(g_NetworkLocalPort)){
477 EnqueueCommonDialog(new CSimpleDialog(
478 lang(InvalidLocalPort), lang(NetworkError)));
479 break;
480 }
481 switch(RSNJoinSession(input[0].c_str(), g_NetworkLocalPort,
482 join_with_file, input[2].c_str())){
483 case 0: {
484 SwitchNetwork(true, false);
485 m_NetworkLabel.SetText(lang(JoinedSession));
486 if(join_with_file){
487 m_NewFileName = m_NetworkFileName;
488 ResetUndo();
489 DELETE_V(g_SaveFile);
490 DELETE_A(g_NetworkFileCopy);
491 g_SaveFile = new CSaveFile(false);
492 g_SaveFile->Load(m_NewFileName.c_str(),
493 LAYOUT_DIRNAME, true, true, NULL, NULL, true, NULL);
494 //SetNeutral();
495 }
496 break; }
497 case 2:
498 EnqueueCommonDialog(new CSimpleDialog(
499 lang(ScreenNameEmpty), lang(NetworkError)));
500 break;
501 case 4:
502 EnqueueCommonDialog(new CSimpleDialog(
503 lang(InvalidAddressFormat), lang(NetworkError)));
504 break;
505 default:
506 EnqueueCommonDialog(new CSimpleDialog(
507 lang(FailedJoinSession), lang(NetworkError)));
508 break;
509 }
510 break; }
511 case 60: {
512 if(sscanf(input[0].c_str(), "%d", &g_NetworkHostPort)!=1
513 || !CheckPortArea(g_NetworkHostPort)){
514 EnqueueCommonDialog(new CSimpleDialog(
515 lang(InvalidHostPort), lang(NetworkError)));
516 break;
517 }
518 if(sscanf(input[1].c_str(), "%d", &g_NetworkSyncInterval)!=1
519 || g_NetworkSyncInterval<RSN_SYNC_INTERVAL_MIN
520 || g_NetworkSyncInterval>RSN_SYNC_INTERVAL_MAX){
521 EnqueueCommonDialog(new CSimpleDialog(
522 lang(InvalidSyncInterval), lang(NetworkError)));
523 break;
524 }
525 m_NewFileName = m_NetworkFileName;
526 ResetUndo();
527 DELETE_V(g_SaveFile);
528 DELETE_A(g_NetworkFileCopy);
529 g_SaveFile = new CSaveFile(false);
530 if(!g_SaveFile->Load(m_NewFileName.c_str(), LAYOUT_DIRNAME, true, true,
531 &g_NetworkFileCopy, &g_NetworkFileCopySize, false, NULL)){
532 DELETE_A(g_NetworkFileCopy);
533 }
534 switch(RSNCreateSession(g_NetworkHostPort,
535 g_NetworkSyncInterval, input[2].c_str())){
536 case 0:
537 SwitchNetwork(true, true);
538 m_NetworkLabel.SetText(lang(CreatedSession));
539 break;
540 case 2:
541 EnqueueCommonDialog(new CSimpleDialog(
542 lang(ScreenNameEmpty), lang(NetworkError)));
543 break;
544 default:
545 EnqueueCommonDialog(new CSimpleDialog(
546 lang(FailedCreateSession), lang(NetworkError)));
547 break;
548 }
549 //SetNeutral();
550 break; }
551 }
552 }
553 }else if(m_InputDialog){
554 if(m_InputDialog->CheckCancel()){
555 DELETE_V(g_ModalDialog);
556 m_InputDialog = NULL;
557 }else if(m_InputDialog->CheckOK()){
558 string input = m_InputDialog->GetInputText();
559 DELETE_V(g_ModalDialog);
560 m_InputDialog = NULL;
561 }
562 }
563 }
564
565 /*
566 * 入力チェック
567 */
568 void CFileMode::ScanInputInterface(){
569 m_Interface.ScanInput();
570 if(m_FileWindow.CheckClose() || m_NetworkWindow.CheckClose()){
571 SetNeutral();
572 return;
573 }
574 g_SaveFile->m_FileNote = m_NoteEdit.GetRealtimeText();
575 if(m_NewButton.IsPushed()){
576 m_ModalState = 10;
577 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
578 lang(NewFileCfmMessage), lang(NewFile), false);
579 }else if(m_OpenButton.IsPushed()){
580 CListElement *le = m_FileListView.GetFocusItem();
581 if(le && le->IsSelected()) OpenFile(le->GetString(0));
582 }else if(m_SaveButton.IsPushed()){
583 CListElement *le = m_FileListView.GetFocusItem();
584 m_NewFileName = le && le->IsSelected() ? le->GetString(0) : g_SaveFile->m_FileName;
585 if(m_NewFileName.size()){
586 if(_mbsicmp((PUCHAR)m_NewFileName.c_str(), (PUCHAR)g_SaveFile->GetFileName()))
587 SaveFile((char *)m_NewFileName.c_str());
588 else if(!g_SaveFile->Save(
589 m_NewFileName.c_str(), LAYOUT_DIRNAME, true, true)) ListFile();
590 }else{
591 goto SAVEAS;
592 }
593 }else if(m_SaveAsButton.IsPushed()){
594 SAVEAS:
595 m_ModalState = 40;
596 g_ModalDialog = m_InputDialog = new CInputDialog(
597 lang(FileNameInquireMessage_NoExt),
598 g_SaveFile->m_FileName.size() ? lang(SaveAs) : lang(SaveNew),
599 (char *)g_SaveFile->GetFileName(), 64);
600 }else if(m_NetworkButton.IsPushed()){
601 if(g_NetworkInitialized){
602 g_Skin->Error();
603 }else{
604 BeginNetworkJoin(NULL);
605 }
606 }else if(m_CloseEntryButton.IsPushed()){
607 m_CloseEntryButton.SetPush(false);
608 m_ModalState = 100;
609 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
610 lang(CloseEntryCfmMessage), lang(Confirmation), false);
611 }else if(m_DeleteMemberButton.IsPushed()){
612 int sel = m_NetworkListView.GetSelectionMark();
613 if(sel<=0){
614 g_Skin->Error();
615 }else{
616 m_DeletingMemberID = m_NetworkListView.GetElement(sel)->GetData();
617 m_DeleteMemberButton.SetPush(false);
618 m_ModalState = 90;
619 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
620 lang(DeleteMemberCfmMessage), lang(Confirmation), false);
621 }
622 }else if(m_DisconnectButton.IsPushed()){
623 m_DisconnectButton.SetPush(false);
624 m_ModalState = 80;
625 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
626 lang(DisconnectCfmMessage), lang(Confirmation), false);
627 }
628 if(g_NetworkInitialized){
629 ListNetworkMember(&m_NetworkListView);
630 if(GetNetworkTransferState()==RSN_TRANS_LAYOUT){
631 char *dlstate = FlashIn("%s %d%%", lang(ReceivingLayoutData),
632 (g_NetworkTransferSize-g_NetworkTransferRestSize)*100/g_NetworkTransferSize);
633 if(IsNetworkTransferComplete() && !strcmp(m_NetworkLabel.GetText(), dlstate)){
634 m_NewFileName = "";
635 ResetUndo();
636 DELETE_V(g_SaveFile);
637 g_SaveFile = new CSaveFile(false);
638 MD5 hash;
639 hash.update((unsigned char *)g_NetworkTransferData, g_NetworkTransferSize-1);
640 hash.finalize();
641 CheckLayoutDigest(hash.raw_digest());
642 g_SaveFile->Load(m_NewFileName.c_str(),
643 LAYOUT_DIRNAME, true, true, NULL, NULL, false, g_NetworkTransferData);
644 //SetNeutral();
645 RSNEndTransferData();
646 m_NetworkLabel.SetText(lang(JoinedSession));
647 }else{
648 m_NetworkLabel.SetText(dlstate);
649 }
650 }
651 }else{
652 if(m_NetworkMode) SwitchNetwork(false, false);
653 }
654 }
655
656 /*
657 * ファイルリスト作成
658 */
659 void CFileMode::ListFile(){
660 long filelist;
661 _finddata_t data;
662 m_FileListView.DeleteAllItems();
663 m_LayoutInfoList.clear();
664 if(chdir(g_BaseDir) || chdir(LAYOUT_DIRNAME)) return;
665 if((filelist = _findfirst("*.rs2", &data))>=0){
666 do{
667 FILE *file;
668 if(data.attrib&_A_SUBDIR) continue;
669 m_LayoutInfoList.push_back(CLayoutInfo(data.name));
670 CLayoutInfo *nfo = &*m_LayoutInfoList.rbegin();
671 if(file = fopen(data.name, "rb")){
672 if(!nfo->PreLoadSF(file)){
673 m_LayoutInfoList.pop_back();
674 continue;
675 }
676 }else{
677 m_LayoutInfoList.pop_back();
678 continue;
679 }
680 } while(!_findnext(filelist, &data));
681 _findclose(filelist);
682 }
683 m_LayoutInfoList.sort();
684 ILayoutInfo ili = m_LayoutInfoList.begin();
685 int current = -1;
686 for(; ili!=m_LayoutInfoList.end(); ili++){
687 if(!_mbsicmp((PUCHAR)ili->m_FileName.c_str(),
688 (PUCHAR)g_SaveFile->GetFileName())){
689 current = m_FileListView.GetItemNum();
690 g_SaveFile->SetFileName((char *)ili->m_FileName.c_str());
691 }
692 CListElement *le = m_FileListView.InsertItem(
693 -1, (char *)ili->m_FileName.c_str(), NULL, g_SkinFileIconRect);
694 le->SetString(1, (char *)ili->m_FileDate.c_str());
695 le->SetString(2, (char *)ili->m_FileNote.c_str());
696 }
697 if(current>=0){
698 m_FileListView.SetSelectionMark(current, 0);
699 m_FileListView.EnsureVisible(current);
700 }
701 m_FileListView.GiveFocus(false);
702 UpdateFileName();
703 }
704
705 /*
706 * ホストになる
707 */
708 void CFileMode::BeginNetworkHost(char *fname){
709 char *labels[] = {lang(HostPort),
710 FlashIn("%s (%d-%d)", lang(SyncInterval), RSN_SYNC_INTERVAL_MIN, RSN_SYNC_INTERVAL_MAX),
711 lang(ScreenName)};
712 char *defaults[] = {FlashIn("%d", g_LastCreatedHostPort),
713 "10", (char *)g_LastScreenName.c_str()};
714 int maxlens[] = {5, 4, RSN_SCRNAME_MAX};
715 m_ModalState = 60;
716 g_ModalDialog = m_MultiInputDialog = new CMultiInputDialog(
717 lang(CreateSession), 3, labels, defaults, maxlens);
718 m_NetworkFileName = fname;
719 }
720
721 /*
722 * 参加する
723 */
724 void CFileMode::BeginNetworkJoin(char *fname){
725 char *labels[] = {
726 FlashIn("[%s %s]:[%s]", lang(Host), lang(IPAddress), lang(HostPort)),
727 lang(LocalPort), lang(ScreenName)};
728 char *defaults[] = {
729 FlashIn("%d.%d.%d.%d:%d", g_LastJoinedHostIP[0], g_LastJoinedHostIP[1],
730 g_LastJoinedHostIP[2], g_LastJoinedHostIP[3], g_LastJoinedHostPort),
731 FlashIn("%d", g_LastJoinedLocalPort), (char *)g_LastScreenName.c_str()};
732 int maxlens[] = {21, 5, RSN_SCRNAME_MAX};
733 g_ModalDialog = m_MultiInputDialog = new CMultiInputDialog(
734 lang(JoinSession), 3, labels, defaults, maxlens);
735 if(fname){
736 m_ModalState = 70;
737 m_NetworkFileName = fname;
738 }else{
739 m_ModalState = 50;
740 }
741 }
742
743 /*
744 * ネットワーク有効化・無効化
745 */
746 void CFileMode::SwitchNetwork(bool enabled, bool host)
747 {
748 m_NetworkMode = enabled;
749 m_NetworkWindow.Show(enabled);
750 m_CloseEntryButton.Enable(host);
751 m_DeleteMemberButton.Enable(host);
752 m_NetworkListView.GiveFocus(false);
753 m_NewButton.Enable(!enabled);
754 m_OpenButton.Enable(!enabled);
755 m_NetworkButton.Enable(!enabled);
756 }
757
758 /*
759 * ファイルを開く
760 */
761 void CFileMode::OpenFile(
762 char *fname // ファイル名
763 ){
764 m_NewFileName = fname;
765 m_ModalState = 20;
766 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
767 lang(FileOpenCfmMessage), fname, false);
768 }
769
770 /*
771 * ファイルに保存
772 */
773 void CFileMode::SaveFile(
774 char *fname // ファイル名
775 ){
776 switch(g_SaveFile->Save(fname, LAYOUT_DIRNAME, false, true)){
777 case 0:
778 ListFile();
779 break;
780 case 2:
781 m_ModalState = 30;
782 m_NewFileName = fname;
783 g_ModalDialog = m_YesNoDialog = new CYesNoDialog(
784 lang(OverwriteCfmMessage), fname, false);
785 break;
786 }
787 }
788
789 /*
790 * ファイル名更新
791 */
792 void CFileMode::UpdateFileName(){
793 m_FileLabel.SetText(g_SaveFile->m_FileName.size()
794 ? FlashIn("%s: \"%s\"", lang(FileName), g_SaveFile->GetFileName())
795 : FlashIn("%s: %s", lang(FileName), lang(NotSaved)));
796 }
797
798 /*
799 * 備考更新
800 */
801 void CFileMode::UpdateFileNote(){
802 m_NoteEdit.SetText((char *)g_SaveFile->m_FileNote.c_str());
803 }
804
805 /*
806 * アンドゥ履歴を消去
807 */
808 void CFileMode::ResetUndo(){
809 m_RedoNum = m_UndoNum = m_UndoPos = 0;
810 }
811
812 /*
813 * アンドゥ履歴を退避
814 */
815 void CFileMode::PushUndo(){
816 if(g_NetworkInitialized) return;
817 if(!g_ConfigMode->GetUseUndo()) return;
818 g_SaveFile->Save(FlashIn("Undo%02d.rs2", m_UndoPos), UNDO_DIRNAME, true, false);
819 m_RedoNum = 0;
820 m_UndoPos++;
821 if(m_UndoPos>=UNDO_MAX) m_UndoPos = 0;
822 if(m_UndoNum<UNDO_MAX-1) m_UndoNum++;
823 }
824
825 /*
826 * アンドゥ履歴を読込
827 */
828 void CFileMode::LoadUndo(){
829 if(g_NetworkInitialized) return;
830 if(!g_ConfigMode->GetUseUndo()) return;
831 if(m_UndoNum){
832 if(!m_RedoNum) g_SaveFile->Save(
833 FlashIn("Undo%02d.rs2", m_UndoPos), UNDO_DIRNAME, true, false);
834 m_UndoNum--;
835 m_RedoNum++;
836 m_UndoPos--;
837 if(m_UndoPos<0) m_UndoPos = UNDO_MAX-1;
838 string oldfile = g_SaveFile->GetFileName();
839 DELETE_V(g_SaveFile);
840 g_SaveFile = new CSaveFile(false);
841 g_SaveFile->Load(FlashIn("Undo%02d.rs2", m_UndoPos),
842 UNDO_DIRNAME, true, false, NULL, NULL, false, NULL);
843 g_SaveFile->SetFileName((char *)oldfile.c_str());
844 ms_ActiveMode->Enter();
845 }else{
846 g_Skin->Error();
847 }
848 }
849
850 /*
851 * リドゥ履歴を読込
852 */
853 void CFileMode::LoadRedo(){
854 if(g_NetworkInitialized) return;
855 if(!g_ConfigMode->GetUseUndo()) return;
856 if(m_RedoNum){
857 m_UndoNum++;
858 m_RedoNum--;
859 m_UndoPos++;
860 if(m_UndoPos>=UNDO_MAX) m_UndoPos = 0;
861 string oldfile = g_SaveFile->GetFileName();
862 DELETE_V(g_SaveFile);
863 g_SaveFile = new CSaveFile(false);
864 g_SaveFile->Load(FlashIn("Undo%02d.rs2", m_UndoPos),
865 UNDO_DIRNAME, true, false, NULL, NULL, false, NULL);
866 g_SaveFile->SetFileName((char *)oldfile.c_str());
867 ms_ActiveMode->Enter();
868 }else{
869 g_Skin->Error();
870 }
871 }
872
873 ////////////////////////////////////////////////////////////////////////////////
874 ////////////////////////////////////////////////////////////////////////////////
875
876 /*
877 * アンドゥを積む
878 */
879 void PushUndoStack(){
880 if(g_NetworkInitialized) return;
881 g_FileMode->PushUndo();
882 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26