Added checking for modified document and prompt the user if they try to close a document without saving.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5492 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user