diff --git a/src/apps/showimage/ShowImageConstants.h b/src/apps/showimage/ShowImageConstants.h index d8552dd7c1..318ed7130e 100644 --- a/src/apps/showimage/ShowImageConstants.h +++ b/src/apps/showimage/ShowImageConstants.h @@ -42,6 +42,7 @@ const uint32 MSG_CLEAR_SELECT = 'mCSL'; const uint32 MSG_SELECT_ALL = 'mSAL'; const uint32 MSG_CLIPBOARD_CHANGED = 'mCLP'; const uint32 MSG_DITHER_IMAGE = 'mDIM'; +const uint32 MSG_MODIFIED = 'mMOD'; const uint32 MSG_UPDATE_STATUS = 'mUPS'; const uint32 MSG_SELECTION = 'mSEL'; const uint32 MSG_PAGE_FIRST = 'mPGF'; diff --git a/src/apps/showimage/ShowImageView.cpp b/src/apps/showimage/ShowImageView.cpp index a1073bf230..8c0497a702 100644 --- a/src/apps/showimage/ShowImageView.cpp +++ b/src/apps/showimage/ShowImageView.cpp @@ -1093,6 +1093,9 @@ ShowImageView::MergeSelection() DeleteBitmap(); fBitmap = bitmap; + + BMessenger msgr(Window()); + msgr.SendMessage(MSG_MODIFIED); } else delete bitmap; } @@ -1469,6 +1472,9 @@ ShowImageView::AddWhiteRect(BRect &rect) DeleteBitmap(); fBitmap = bitmap; + + BMessenger msgr(Window()); + msgr.SendMessage(MSG_MODIFIED); } else delete bitmap; } diff --git a/src/apps/showimage/ShowImageWindow.cpp b/src/apps/showimage/ShowImageWindow.cpp index c117f32801..261bbe423a 100644 --- a/src/apps/showimage/ShowImageWindow.cpp +++ b/src/apps/showimage/ShowImageWindow.cpp @@ -97,6 +97,7 @@ ShowImageWindow::ShowImageWindow(const entry_ref *pref) : BWindow(BRect(50, 50, 350, 250), "", B_DOCUMENT_WINDOW, 0) { fSavePanel = NULL; + fModified = false; fFullScreen = false; fShowCaption = true; fPrintSettings = NULL; @@ -470,6 +471,11 @@ ShowImageWindow::MessageReceived(BMessage *pmsg) { ShowImageSettings* settings; switch (pmsg->what) { + case MSG_MODIFIED: + // If image has been modified due to a Cut or Paste + fModified = true; + break; + case MSG_OUTPUT_TYPE: // User clicked Save As then choose an output format if (!fSavePanel) @@ -592,23 +598,30 @@ ShowImageWindow::MessageReceived(BMessage *pmsg) break; case MSG_PAGE_FIRST: - fImageView->FirstPage(); + if (ClosePrompt()) + fImageView->FirstPage(); break; case MSG_PAGE_LAST: - fImageView->LastPage(); + if (ClosePrompt()) + fImageView->LastPage(); break; case MSG_PAGE_NEXT: - fImageView->NextPage(); + if (ClosePrompt()) + fImageView->NextPage(); break; case MSG_PAGE_PREV: - fImageView->PrevPage(); + if (ClosePrompt()) + fImageView->PrevPage(); break; case MSG_GOTO_PAGE: { + if (!ClosePrompt()) + break; + int32 curPage, newPage, pages; if (pmsg->FindInt32("page", &newPage) == B_OK) { curPage = fImageView->CurrentPage(); @@ -640,11 +653,13 @@ ShowImageWindow::MessageReceived(BMessage *pmsg) break; case MSG_FILE_PREV: - fImageView->PrevFile(); + if (ClosePrompt()) + fImageView->PrevFile(); break; case MSG_FILE_NEXT: - fImageView->NextFile(); + if (ClosePrompt()) + fImageView->NextFile(); break; case MSG_ROTATE_90: @@ -663,11 +678,21 @@ ShowImageWindow::MessageReceived(BMessage *pmsg) fImageView->Invert(); break; case MSG_SLIDE_SHOW: - if (ToggleMenuItem(pmsg->what)) { - fImageView->StartSlideShow(); - } else { - fImageView->StopSlideShow(); + { + BMenuItem *item; + item = fBar->FindItem(pmsg->what); + if (!item) + break; + if (item->IsMarked()) { + item->SetMarked(false); + fImageView->StopSlideShow(); + } else if (ClosePrompt()) { + item->SetMarked(true); + fImageView->StartSlideShow(); + } } + break; + case MSG_SLIDE_SHOW_DELAY: { float value; @@ -786,7 +811,8 @@ ShowImageWindow::SaveToFile(BMessage *pmsg) &file, outType) != B_OK) { BAlert *palert = new BAlert(NULL, "Error writing image file.", "Ok"); palert->Go(); - } + } else + fModified = false; BBitmap *pout = NULL; stream.DetachBitmap(&pout); @@ -794,6 +820,33 @@ ShowImageWindow::SaveToFile(BMessage *pmsg) // detach so it doesn't get deleted } +bool +ShowImageWindow::ClosePrompt() +{ + if (!fModified) + return true; + else { + int32 page, count; + count = fImageView->PageCount(); + page = fImageView->CurrentPage(); + BString prompt, name; + fImageView->GetName(&name); + prompt << "The document '" << name << "'"; + if (count > 1) + prompt << " (page " << page << ")"; + prompt << " has been changed. " + << "Do you want to close the document?"; + BAlert *pAlert = new BAlert("Close document", prompt.String(), + "Cancel", "Close"); + if (pAlert->Go() == 0) + // Cancel + return false; + else + // Close + return true; + } +} + bool ShowImageWindow::CanQuit() { @@ -801,7 +854,7 @@ ShowImageWindow::CanQuit() // Don't allow this window to be closed if a save panel is open return false; else - return true; + return ClosePrompt(); } void diff --git a/src/apps/showimage/ShowImageWindow.h b/src/apps/showimage/ShowImageWindow.h index 61205664e0..94f41da0cd 100644 --- a/src/apps/showimage/ShowImageWindow.h +++ b/src/apps/showimage/ShowImageWindow.h @@ -88,7 +88,8 @@ private: void SaveAs(BMessage *pmsg); // Handle Save As submenu choice void SaveToFile(BMessage *pmsg); - // Handle save file panel message + // Handle save file panel message + bool ClosePrompt(); bool CanQuit(); // returns true if the window can be closed safely, false if not void ToggleFullScreen(); @@ -106,6 +107,7 @@ private: BMenu *fSlideShowDelay; ShowImageView *fImageView; ShowImageStatusView *fStatusView; + bool fModified; bool fFullScreen; BRect fWindowFrame; bool fShowCaption;