/**** ファイル名 : BTinyEditor.h ****/
#ifndef BTINYEDITORAPP #define BTINYEDITORAPP //--------------------------------------------------------------------- #include <Be.h> #include "MainWindow.h" //--------------------------------------------------------------------- #define APPLICATION_SIGNATURE "application/x-vnd.vow-betinyeditor" //--------------------------------------------------------------------- class BTinyEditorApp : public BApplication { private: BFilePanel *open_filepanel; public: BTinyEditorApp() :BApplication(APPLICATION_SIGNATURE) { BEditorWindow *mainwnd=new BEditorWindow( BRect(MAINWINDOW_POSITION_LEFT,MAINWINDOW_POSITION_TOP, MAINWINDOW_POSITION_WIDTH+MAINWINDOW_POSITION_LEFT-1, MAINWINDOW_POSITION_HEIGHT+MAINWINDOW_POSITION_TOP-1), MAINWINDOW_TITLE); open_filepanel= new BFilePanel(); mainwnd->Show(); }; //----------------------------------------------------------------- ~BTinyEditorApp() { delete open_filepanel; }; //----------------------------------------------------------------- void MessageReceived(BMessage *msg) { switch(msg->what) { case MSG_OPEN: open_filepanel->Show(); break; default: BApplication::MessageReceived(msg); } }; }; //--------------------------------------------------------------------- #endif
/**** ファイル名 : MainWindow.cpp ****/
//--------------------------------------------------------------------- BEditorView::BEditorView(BRect frame) :BView(frame,"beditorview",B_FOLLOW_ALL,B_WILL_DRAW) { BRect viewrect(Bounds()); BMenuBar *mainmenu=new BMenuBar(BRect(0,0,viewrect.right, be_plain_font->Size()*2), "mainmenubar"); AddChild(mainmenu); memo=new BMemoView(BRect(0,be_plain_font->Size()*2, viewrect.right-B_V_SCROLL_BAR_WIDTH, viewrect.bottom-B_H_SCROLL_BAR_HEIGHT), "memo",B_FOLLOW_ALL); BScrollView *scr=new BScrollView("memoscroll",memo, B_FOLLOW_ALL,0,true,true); AddChild(scr); BMenu *filemenu=new BMenu("File"); filemenu->AddItem(new BMenuItem("Open...",new BMessage(MSG_OPEN))); filemenu->ItemAt(0)->SetTarget(be_app); filemenu->AddItem(new BMenuItem("Save",new BMessage(MSG_SAVE))); filemenu->AddItem(new BMenuItem("Save As...",new BMessage(MSG_SAVEAS))); filemenu->AddSeparatorItem(); filemenu->AddItem(new BMenuItem("Quit",new BMessage(B_QUIT_REQUESTED))); mainmenu->AddItem(filemenu); BMenu *editmenu=new BMenu("Edit"); editmenu->AddItem(new BMenuItem("Undo",new BMessage(B_UNDO))); editmenu->AddSeparatorItem(); editmenu->AddItem(new BMenuItem("Copy",new BMessage(B_COPY))); editmenu->AddItem(new BMenuItem("Cut",new BMessage(B_CUT))); editmenu->AddItem(new BMenuItem("Paste",new BMessage(B_PASTE))); editmenu->AddItem(new BMenuItem("Select All",new BMessage(B_SELECT_ALL))); mainmenu->AddItem(editmenu); memo->SetDoesUndo(true); } //---------------------------------------------------------------------
/**** ファイル名 : BTinyEditor.h ****/
void RefsReceived(BMessage *message) { type_code ref_type; int32 ref_count; entry_ref ref; BEntry entry; message->GetInfo("refs", &ref_type,&ref_count); for (int i=0;i<ref_count;i++) { message->FindRef("refs",i,&ref); if(entry.SetTo(&ref)==B_OK) { WindowAt(0)->Lock(); ((BEditorWindow *)WindowAt(0))->OpenFile(&entry); WindowAt(0)->Unlock(); return; } } }
message->GetInfo("refs", &ref_type,&ref_count);で"refs"の情報からファイル名の個数を取得します。
message->FindRef("refs",i,&ref);でファイル名の情報を取り出しSetTo関数でentryにセットしたら、BEditorWindowのOpenFile関数を呼び出します。ここで注意しなければならないのは、OpenFile関数を呼び出す手前で、そのウィンドウをLock関数でロックしている点です。
/**** ファイル名 : MainWindow.h ****/
//--------------------------------------------------------------------- class BEditorWindow : public BWindow { public: BEditorView *mainview; //----------------------------------------------------------------- BEditorWindow(BRect frame,const char *title); virtual void MessageReceived(BMessage *msg); void OpenFile(BEntry *entry); //----------------------------------------------------------------- bool QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; }; }; //---------------------------------------------------------------------
/**** ファイル名 : MainWindow.cpp ****/
//--------------------------------------------------------------------- void BEditorWindow::OpenFile(BEntry *entry) { if(entry->Exists()) { BFile fil; off_t size; fil.SetTo(entry,B_READ_ONLY); fil.GetSize(&size); ((BTextView *)FindView("memo"))->SetText(&fil,0,size); } } //---------------------------------------------------------------------
圧縮ファイル R5 Intel環境で確認 |
BTinyEditor20000328.zip |
ソースファイル | BTinyEditor.h |
BMemoView.cpp | |
BMemoView.h | |
main.cpp | |
MainWindow.cpp | |
MainWindow.h |