diff --git a/src/apps/stylededit/StyledEditWindow.cpp b/src/apps/stylededit/StyledEditWindow.cpp index f987c5bde8..a62f440a2a 100644 --- a/src/apps/stylededit/StyledEditWindow.cpp +++ b/src/apps/stylededit/StyledEditWindow.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -120,7 +121,7 @@ StyledEditWindow::InitWindow() menu->AddItem(menuItem= new BMenuItem("New", new BMessage(MENU_NEW), 'N')); menuItem->SetTarget(be_app); - menu->AddItem(menuItem= new BMenuItem(new BMenu("Open..."), new BMessage(MENU_OPEN))); + menu->AddItem(menuItem= new BMenuItem(fRecentMenu= new BMenu("Open..."), new BMessage(MENU_OPEN))); menuItem->SetShortcut('O',0); menuItem->SetTarget(be_app); menu->AddSeparatorItem(); @@ -281,16 +282,15 @@ StyledEditWindow::MessageReceived(BMessage *message) { switch(message->what){ /************file menu:***************/ - case MENU_SAVE: - { + case MENU_SAVE: { if(!fSaveMessage) - fSavePanel->Show(); + SaveAs(); else Save(fSaveMessage); - } + } break; case MENU_SAVEAS: - fSavePanel->Show(); + SaveAs(); break; case B_SAVE_REQUESTED: Save(message); @@ -298,7 +298,7 @@ StyledEditWindow::MessageReceived(BMessage *message) case MENU_REVERT: RevertToSaved(); break; - case MENU_CLOSE:{ + case MENU_CLOSE: { if(this->QuitRequested()) { BAutolock lock(this); Quit(); @@ -531,6 +531,31 @@ StyledEditWindow::MessageReceived(BMessage *message) } }/***StyledEditWindow::MessageReceived() ***/ +void +StyledEditWindow::MenusBeginning() +{ + BMessage documents; + be_roster->GetRecentDocuments(&documents,9,NULL,APP_SIGNATURE); + // delete old items.. + // shatty: it would be preferable to keep the old + // menu around instead of continuously thrashing + // the menu, but unfortunately there does not + // seem to be a straightforward way to update it + // going backwards may simplify memory management + for (int i = fRecentMenu->CountItems()-1 ; (i >= 0) ; i--) { + delete fRecentMenu->RemoveItem(i); + } + // add new items + int count = 0; + entry_ref ref; + while (documents.FindRef("refs",count++,&ref) == B_OK) { + BMessage * openRecent = new BMessage(B_REFS_RECEIVED); + openRecent->AddRef("refs",&ref); + BMenuItem * item = new BMenuItem(ref.name,openRecent); + item->SetTarget(be_app); + fRecentMenu->AddItem(item); + } +} void StyledEditWindow::Quit() @@ -573,8 +598,6 @@ StyledEditWindow::QuitRequested() status_t StyledEditWindow::Save(BMessage *message) { - entry_ref ref; - const char *name; status_t err; if(!message){ @@ -583,37 +606,46 @@ StyledEditWindow::Save(BMessage *message) return B_ERROR; } - err= message->FindRef("directory", &ref); + entry_ref dirref; + err= message->FindRef("directory", &dirref); if(err!= B_OK) return err; + const char *name; err=message->FindString("name", &name); if (err!= B_OK) return err; - BDirectory dir(&ref); + BDirectory dir(&dirref); err= dir.InitCheck(); if(err!= B_OK) return err; + + BEntry entry(&dir, name); + err= entry.InitCheck(); + if(err!= B_OK) + return err; - BFile file(&dir, name, B_READ_WRITE | B_CREATE_FILE); - + BFile file(&entry, B_READ_WRITE | B_CREATE_FILE); err= file.InitCheck(); if(err!= B_OK) return err; err= BTranslationUtils::WriteStyledEditFile(fTextView, &file); - - if(err>= 0) + if(err != B_OK) + return err; + + SetTitle(name); + if(fSaveMessage!= message) { - SetTitle(name); - fSaveItem->SetEnabled(true); - if(fSaveMessage!= message) - { - delete fSaveMessage; - fSaveMessage= new BMessage(*message); - } + delete fSaveMessage; + fSaveMessage= new BMessage(*message); } + + entry_ref ref; + if (entry.GetRef(&ref) == B_OK) { + be_roster->AddToRecentDocuments(&ref,APP_SIGNATURE); + } // clear clean modes fSaveItem->SetEnabled(false); @@ -624,6 +656,22 @@ StyledEditWindow::Save(BMessage *message) return err; } /***Save()***/ +#include +#include + +status_t +StyledEditWindow::SaveAs() +{ + BWindow * saveWindow = fSavePanel->Window(); + BTextControl * textView = + dynamic_cast(saveWindow->FindView("text view")); + if (textView) { + BAutolock lock(saveWindow); + textView->SetText(Title()); + } + fSavePanel->Show(); +} + void StyledEditWindow::OpenFile(entry_ref *ref) { @@ -632,11 +680,12 @@ StyledEditWindow::OpenFile(entry_ref *ref) fileinit= file.SetTo(ref, B_READ_ONLY); - if(fileinit== B_OK){ + if (fileinit == B_OK){ status_t result; result = fTextView->GetStyledText(&file); //he he he :) - if(result==B_OK){ + if (result == B_OK) { + be_roster->AddToRecentDocuments(ref,APP_SIGNATURE); fSaveMessage= new BMessage(B_SAVE_REQUESTED); if(fSaveMessage){ BEntry entry(ref, true); @@ -667,12 +716,12 @@ StyledEditWindow::RevertToSaved() alertText.SetTo("Revert to the last version of \""); alertText<< Title(); alertText<<"\"? "; - revertAlert= new BAlert("revertAlert",alertText.String(), "Cancel", "Ok", 0, + revertAlert= new BAlert("revertAlert",alertText.String(), "Cancel", "OK", 0, B_WIDTH_AS_USUAL, B_EVEN_SPACING, B_WARNING_ALERT); revertAlert->SetShortcut(0, B_ESCAPE); buttonIndex= revertAlert->Go(); - if (buttonIndex!=2) { // some sort of cancel, don't revert + if (buttonIndex!=1) { // some sort of cancel, don't revert return; } diff --git a/src/apps/stylededit/StyledEditWindow.h b/src/apps/stylededit/StyledEditWindow.h index 57c4e292bf..f593aa016c 100644 --- a/src/apps/stylededit/StyledEditWindow.h +++ b/src/apps/stylededit/StyledEditWindow.h @@ -22,8 +22,10 @@ public: virtual void Quit(); virtual bool QuitRequested(); virtual void MessageReceived(BMessage *message); + virtual void MenusBeginning(); status_t Save(BMessage *message); + status_t SaveAs(); void OpenFile(entry_ref *ref); status_t PageSetup(const char *documentname); void Print(const char *documentname); @@ -43,6 +45,7 @@ private: BMenuBar *fMenuBar; BMessage *fPrintSettings; BMessage *fSaveMessage; + BMenu *fRecentMenu; BMenuItem *fSaveItem; BMenuItem *fRevertItem; BMenuItem *fUndoItem;