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_SELECT_ALL = 'mSAL';
|
||||||
const uint32 MSG_CLIPBOARD_CHANGED = 'mCLP';
|
const uint32 MSG_CLIPBOARD_CHANGED = 'mCLP';
|
||||||
const uint32 MSG_DITHER_IMAGE = 'mDIM';
|
const uint32 MSG_DITHER_IMAGE = 'mDIM';
|
||||||
|
const uint32 MSG_MODIFIED = 'mMOD';
|
||||||
const uint32 MSG_UPDATE_STATUS = 'mUPS';
|
const uint32 MSG_UPDATE_STATUS = 'mUPS';
|
||||||
const uint32 MSG_SELECTION = 'mSEL';
|
const uint32 MSG_SELECTION = 'mSEL';
|
||||||
const uint32 MSG_PAGE_FIRST = 'mPGF';
|
const uint32 MSG_PAGE_FIRST = 'mPGF';
|
||||||
|
|||||||
@@ -1093,6 +1093,9 @@ ShowImageView::MergeSelection()
|
|||||||
|
|
||||||
DeleteBitmap();
|
DeleteBitmap();
|
||||||
fBitmap = bitmap;
|
fBitmap = bitmap;
|
||||||
|
|
||||||
|
BMessenger msgr(Window());
|
||||||
|
msgr.SendMessage(MSG_MODIFIED);
|
||||||
} else
|
} else
|
||||||
delete bitmap;
|
delete bitmap;
|
||||||
}
|
}
|
||||||
@@ -1469,6 +1472,9 @@ ShowImageView::AddWhiteRect(BRect &rect)
|
|||||||
|
|
||||||
DeleteBitmap();
|
DeleteBitmap();
|
||||||
fBitmap = bitmap;
|
fBitmap = bitmap;
|
||||||
|
|
||||||
|
BMessenger msgr(Window());
|
||||||
|
msgr.SendMessage(MSG_MODIFIED);
|
||||||
} else
|
} else
|
||||||
delete bitmap;
|
delete bitmap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ ShowImageWindow::ShowImageWindow(const entry_ref *pref)
|
|||||||
: BWindow(BRect(50, 50, 350, 250), "", B_DOCUMENT_WINDOW, 0)
|
: BWindow(BRect(50, 50, 350, 250), "", B_DOCUMENT_WINDOW, 0)
|
||||||
{
|
{
|
||||||
fSavePanel = NULL;
|
fSavePanel = NULL;
|
||||||
|
fModified = false;
|
||||||
fFullScreen = false;
|
fFullScreen = false;
|
||||||
fShowCaption = true;
|
fShowCaption = true;
|
||||||
fPrintSettings = NULL;
|
fPrintSettings = NULL;
|
||||||
@@ -470,6 +471,11 @@ ShowImageWindow::MessageReceived(BMessage *pmsg)
|
|||||||
{
|
{
|
||||||
ShowImageSettings* settings;
|
ShowImageSettings* settings;
|
||||||
switch (pmsg->what) {
|
switch (pmsg->what) {
|
||||||
|
case MSG_MODIFIED:
|
||||||
|
// If image has been modified due to a Cut or Paste
|
||||||
|
fModified = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case MSG_OUTPUT_TYPE:
|
case MSG_OUTPUT_TYPE:
|
||||||
// User clicked Save As then choose an output format
|
// User clicked Save As then choose an output format
|
||||||
if (!fSavePanel)
|
if (!fSavePanel)
|
||||||
@@ -592,23 +598,30 @@ ShowImageWindow::MessageReceived(BMessage *pmsg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PAGE_FIRST:
|
case MSG_PAGE_FIRST:
|
||||||
fImageView->FirstPage();
|
if (ClosePrompt())
|
||||||
|
fImageView->FirstPage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PAGE_LAST:
|
case MSG_PAGE_LAST:
|
||||||
fImageView->LastPage();
|
if (ClosePrompt())
|
||||||
|
fImageView->LastPage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PAGE_NEXT:
|
case MSG_PAGE_NEXT:
|
||||||
fImageView->NextPage();
|
if (ClosePrompt())
|
||||||
|
fImageView->NextPage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PAGE_PREV:
|
case MSG_PAGE_PREV:
|
||||||
fImageView->PrevPage();
|
if (ClosePrompt())
|
||||||
|
fImageView->PrevPage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_GOTO_PAGE:
|
case MSG_GOTO_PAGE:
|
||||||
{
|
{
|
||||||
|
if (!ClosePrompt())
|
||||||
|
break;
|
||||||
|
|
||||||
int32 curPage, newPage, pages;
|
int32 curPage, newPage, pages;
|
||||||
if (pmsg->FindInt32("page", &newPage) == B_OK) {
|
if (pmsg->FindInt32("page", &newPage) == B_OK) {
|
||||||
curPage = fImageView->CurrentPage();
|
curPage = fImageView->CurrentPage();
|
||||||
@@ -640,11 +653,13 @@ ShowImageWindow::MessageReceived(BMessage *pmsg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_FILE_PREV:
|
case MSG_FILE_PREV:
|
||||||
fImageView->PrevFile();
|
if (ClosePrompt())
|
||||||
|
fImageView->PrevFile();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_FILE_NEXT:
|
case MSG_FILE_NEXT:
|
||||||
fImageView->NextFile();
|
if (ClosePrompt())
|
||||||
|
fImageView->NextFile();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_ROTATE_90:
|
case MSG_ROTATE_90:
|
||||||
@@ -663,11 +678,21 @@ ShowImageWindow::MessageReceived(BMessage *pmsg)
|
|||||||
fImageView->Invert();
|
fImageView->Invert();
|
||||||
break;
|
break;
|
||||||
case MSG_SLIDE_SHOW:
|
case MSG_SLIDE_SHOW:
|
||||||
if (ToggleMenuItem(pmsg->what)) {
|
{
|
||||||
fImageView->StartSlideShow();
|
BMenuItem *item;
|
||||||
} else {
|
item = fBar->FindItem(pmsg->what);
|
||||||
fImageView->StopSlideShow();
|
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:
|
case MSG_SLIDE_SHOW_DELAY:
|
||||||
{
|
{
|
||||||
float value;
|
float value;
|
||||||
@@ -786,7 +811,8 @@ ShowImageWindow::SaveToFile(BMessage *pmsg)
|
|||||||
&file, outType) != B_OK) {
|
&file, outType) != B_OK) {
|
||||||
BAlert *palert = new BAlert(NULL, "Error writing image file.", "Ok");
|
BAlert *palert = new BAlert(NULL, "Error writing image file.", "Ok");
|
||||||
palert->Go();
|
palert->Go();
|
||||||
}
|
} else
|
||||||
|
fModified = false;
|
||||||
|
|
||||||
BBitmap *pout = NULL;
|
BBitmap *pout = NULL;
|
||||||
stream.DetachBitmap(&pout);
|
stream.DetachBitmap(&pout);
|
||||||
@@ -794,6 +820,33 @@ ShowImageWindow::SaveToFile(BMessage *pmsg)
|
|||||||
// detach so it doesn't get deleted
|
// 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
|
bool
|
||||||
ShowImageWindow::CanQuit()
|
ShowImageWindow::CanQuit()
|
||||||
{
|
{
|
||||||
@@ -801,7 +854,7 @@ ShowImageWindow::CanQuit()
|
|||||||
// Don't allow this window to be closed if a save panel is open
|
// Don't allow this window to be closed if a save panel is open
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return true;
|
return ClosePrompt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -88,7 +88,8 @@ private:
|
|||||||
void SaveAs(BMessage *pmsg);
|
void SaveAs(BMessage *pmsg);
|
||||||
// Handle Save As submenu choice
|
// Handle Save As submenu choice
|
||||||
void SaveToFile(BMessage *pmsg);
|
void SaveToFile(BMessage *pmsg);
|
||||||
// Handle save file panel message
|
// Handle save file panel message
|
||||||
|
bool ClosePrompt();
|
||||||
bool CanQuit();
|
bool CanQuit();
|
||||||
// returns true if the window can be closed safely, false if not
|
// returns true if the window can be closed safely, false if not
|
||||||
void ToggleFullScreen();
|
void ToggleFullScreen();
|
||||||
@@ -106,6 +107,7 @@ private:
|
|||||||
BMenu *fSlideShowDelay;
|
BMenu *fSlideShowDelay;
|
||||||
ShowImageView *fImageView;
|
ShowImageView *fImageView;
|
||||||
ShowImageStatusView *fStatusView;
|
ShowImageStatusView *fStatusView;
|
||||||
|
bool fModified;
|
||||||
bool fFullScreen;
|
bool fFullScreen;
|
||||||
BRect fWindowFrame;
|
BRect fWindowFrame;
|
||||||
bool fShowCaption;
|
bool fShowCaption;
|
||||||
|
|||||||
Reference in New Issue
Block a user