//--------------------------------------------------------------------------- // // Copyright (C) Geoworks 1997. All rights reserved. // GEOWORKS CONFIDENTIAL // // ファイル: notepad2.cpp // // 解説: // // 「プログラマーズ ガイド」の「Flex UI」の最後のプログラム例 // // //--------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "resource.h" #include "notepad2.h" // // アプリケーションのメニュー用テキスト定数を作成します // static const TCHAR *MENU_ITEMS[3] = {_TEXT("New"), _TEXT("Save"), _TEXT("Open")}; // // テキストを保持するバッファを作成します // TCHAR *_notepad2TextString; // ResidentApplication のサブクラス。アプリケーションをシステムに登録し、 // アプリケーションに AppBase を作成する方法を提供します。 class Notepad2ResidentApplication : public ResidentApplication { public: Notepad2ResidentApplication() : ResidentApplication(_TEXT("notepad2")) {}; virtual AppBase *CreateAppBase(void) {return new Notepad2App;} }; static Notepad2ResidentApplication notepadApp2; // アプリケーションの指定属性。ここでは名前を指定していますが、 // 標準以外のスタック サイズやスレッド優先順位なども指定できます。 // static AppNameAttribute notepadApp2Name(¬epadApp2, NOTEPAD2_APP_TEXT); //------------------------------------------------------------------------ // Notepad2App::SetAppContext(const TCHAR *) //------------------------------------------------------------------------ // // 概要: アプリケーションの作成 // スコープ: Private // 戻り値: なし // //------------------------------------------------------------------------ void Notepad2App::SetAppContext(const TCHAR *) { // // 開いているダイアログはありません // _dialogOpen = 0; // // UI をビルドするヘルパー関数を呼び出します // if (AttachNotepad2AppUI() == FAILURE) { EC_WARN("Unable to build Notepad2 application."); } // // テキスト バッファの領域を割り当てます // _notepad2TextString = new TCHAR[600]; } /* End of Notepad2App::SetAppContext() */ //------------------------------------------------------------------------ // Notepad2App::SetAppContext(const TCHAR *) //------------------------------------------------------------------------ // // 概要: アプリケーションの作成 // スコープ: Private // 戻り値: なし // //------------------------------------------------------------------------ Result Notepad2App::AttachNotepad2AppUI(void) { // // ローカルで使用する FlexComponents の宣言 // FlexFrame *frame; FlexMenu *menu; FlexMenuButton *menuButton; // // アプリケーションのメインのフレームを作成します // frame = theUIFactory->CreateFlexFrame(HINT_FRAME_WITH_NO_CLOSE_BUTTON, NOTEPAD2_APP_TEXT); if (frame == NULL) { return FAILURE; } // // フレームのレイアウトを作成します // VerticalFlowLayout *mainFrameLayout = new VerticalFlowLayout( 10, VerticalFlowLayout::Y_JUSTIFY_CENTER, LayoutManagerInterface::X_ALIGN_LEFT); if (mainFrameLayout == NULL) { return FAILURE; } // // レイアウトをフレームに追加した後でフレームを追加します // frame->SetLayout(mainFrameLayout); this->Add(frame); // // アプリケーションのメニューを作成します // menu = theUIFactory->CreateFlexMenu(HINT_PULL_DOWN_MENU, NOTEPAD2_FILE_MENU_TEXT); if (menu == NULL) { return FAILURE; } // // メニューのメニュー ボタンを作成します // for ( int i = 0; i < 3; i++) { menuButton = theUIFactory->CreateFlexMenuButton(0, MENU_ITEMS[i], (MenuItemID) i); if (menuButton == NULL) { return FAILURE; } else { menu->Add(menuButton); } } // // メニューをフレームに追加します // frame->Add(menu); // // アプリケーションのダイアログを作成します // if ( CreateDialogUI(NOTEPAD2_SAVE_DIALOG_TEXT, &(_saveDialog)) == FAILURE) { return FAILURE; } if ( CreateDialogUI(NOTEPAD2_OPEN_DIALOG_TEXT, &(_openDialog)) == FAILURE) { return FAILURE; } // // アプリケーションのテキスト表示を作成します // _textDisplay = theUIFactory->CreateFlexTextArea(0); if (_textDisplay == NULL) { return FAILURE; } // // テキスト表示の属性を設定します // _textDisplay->SetColumns(75); _textDisplay->SetRows(7); _textDisplay->SetMaxChars(600); // // テキスト表示をフレームに追加します // frame->Add(_textDisplay); // // リスナーをシステムに追加します // menu->AddMenuListener(*this); // // フレームを表示し、SUCCESS を返します // frame->SetVisible(TRUE); return SUCCESS; } /* End of Notepad2App::AttachNotepad2AppUI() */ //------------------------------------------------------------------------------- // Notepad2App::CreateDialogUI(static const TCHAR *title, FlexDialog **dialog) //------------------------------------------------------------------------------- // // 概要: アプリケーションのダイアログの作成 // スコープ: Private // 戻り値: SUCCESS または FAILURE // //------------------------------------------------------------------------------- Result Notepad2App::CreateDialogUI(const TCHAR *title, FlexDialog **dialog) { // // アプリケーションのダイアログを作成します // *dialog = theUIFactory->CreateFlexDialog(1, title); if (*dialog == NULL) { return FAILURE; } // // ダイアログのレイアウトを作成します // DialogLayout *offsetDialogLM = new DialogLayout(); (*dialog)->SetLayout(offsetDialogLM); // // ダイアログのラベルを作成します // FlexLabel *label = theUIFactory->CreateFlexLabel(0, title); // // ファイル名を保持するリストを作成します // FlexList *list = theUIFactory->CreateFlexList(0, 4); if (list == NULL) { return FAILURE; } // // リストに文字列を追加します // if (list->Add(NOTEPAD2_FILE1) == FAILURE) { return FAILURE; } if (list->Add(NOTEPAD2_FILE2) == FAILURE) { return FAILURE; } if (list->Add(NOTEPAD2_FILE3) == FAILURE) { return FAILURE; } if (list->Add(NOTEPAD2_FILE4) == FAILURE) { return FAILURE; } // // リスナーをシステムに追加します // list->AddItemListener(*this); // // ダイアログにラベルとリストを追加します // (*dialog)->Add(label); (*dialog)->Add(list); // // アプリケーションにダイアログを追加し、SUCCESS を返します // Add(*dialog); return SUCCESS; } /* End of Notepad2App::CreateDialogUI() */ //------------------------------------------------------------------------------- // Notepad2App::MenuItemChosen(MenuEvent& event ) //------------------------------------------------------------------------------- // // 概要: MenuEvent の処理 // スコープ: Private // 戻り値: なし // //------------------------------------------------------------------------------- void Notepad2App::MenuItemChosen(MenuEvent& event ) { // // 選択したメニュー項目の ID を取得します // uint32 id = (uint32)event._menuItemID; // // 開いているダイアログがない限り、 // ファイルを新規作成したり、保存したり、開きます // if (_dialogOpen < 1) { switch (id) { case NEW_MENU_ITEM: _textDisplay->SetText(_TEXT("")); break; case SAVE_MENU_ITEM: _dialogOpen = id; _saveDialog->SetVisible(TRUE); break; case OPEN_MENU_ITEM: _dialogOpen = id; _openDialog->SetVisible(TRUE); break; } } } /* End of Notepad2App::MenuItemChosen() */ //------------------------------------------------------------------------------- // Notepad2App::ItemStateChanged(ItemEvent& event ) //------------------------------------------------------------------------------- // // 概要: ItemEvents の処理 // スコープ: Private // 戻り値: なし // //------------------------------------------------------------------------------- void Notepad2App::ItemStateChanged(ItemEvent& event ) { // // SAVE と OPEN のためのファイル ポインタと、 // ファイル名を格納する文字列を作成します // File *myFile; const TCHAR *filename; // // リストとインデックスを取得します // FlexList *list = (FlexList *)event.GetSource(); uint32 index = event.GetIndex(); // // インデックスに依存するファイル名を設定します // switch (index) { case 0: filename = NOTEPAD2_FILE1; break; case 1: filename = NOTEPAD2_FILE2; break; case 2: filename = NOTEPAD2_FILE3; break; case 3: filename = NOTEPAD2_FILE4; break; } // // SAVE がクリックされたかどうかチェックします // if (_dialogOpen == SAVE_MENU_ITEM) { // // バッファの内容を取得します // _textDisplay->GetText(_notepad2TextString, 600); // // ファイルを CREATE と READ_WRITE 属性で開きます // myFile = theFileStoreManager.Open(filename, O_CREAT | O_RDWR ); // // バッファの内容をファイルへ書き込み、 // ファイルを閉じます // myFile->Write((uint8 *)_notepad2TextString, 600); myFile->Close(); // // ダイアログを閉じます // _saveDialog->SetVisible(FALSE); } // // OPEN がクリックされたかどうかチェックします // else if (_dialogOpen == OPEN_MENU_ITEM) { // // ファイルがすでに存在するかどうかチェックします // if (theFileStoreManager.FileExists(filename)) { // // ファイルを READ_ONLY で開き、内容をバッファに読み込み、 // 操作終了後にファイルを閉じます // myFile = theFileStoreManager.Open(filename, O_RDONLY ); myFile->Read((uint8 *)_notepad2TextString, 600); myFile->Close(); // // バッファの内容を表示します // _textDisplay->SetText(_notepad2TextString); } // // ダイアログを閉じます // _openDialog->SetVisible(FALSE); } // // リスト項目の選択を解除します // list->Deselect(index); // // ダイアログ ボックスが閉じているように設定します // _dialogOpen = 0; } /* End of Notepad2App::ItemStateChanged() */ void Notepad2App::Exit(void) { AppBase::Exit(); // // バッファ用の領域を削除します // delete(_notepad2TextString); } /* End of Notepad2App::Exit() */