Added code to enable / disable the Edit->Paste menu item when the contents of the clipboard change

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5413 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Matthew Wilber
2003-11-19 01:46:00 +00:00
parent 2a7b708cdd
commit 402c09e582
4 changed files with 77 additions and 0 deletions
+58
View File
@@ -29,6 +29,8 @@
#include <stdio.h> #include <stdio.h>
#include <Alert.h> #include <Alert.h>
#include <FilePanel.h> #include <FilePanel.h>
#include <String.h>
#include <Clipboard.h>
#include "ShowImageConstants.h" #include "ShowImageConstants.h"
#include "ShowImageApp.h" #include "ShowImageApp.h"
@@ -68,6 +70,9 @@ ShowImageApp::ReadyToRun()
// (paths supplied on the command line) // (paths supplied on the command line)
// start checking the number of open windows // start checking the number of open windows
StartPulse(); StartPulse();
be_clipboard->StartWatching(be_app_messenger);
// tell the clipboard to notify this app when its contents change
} }
void void
@@ -132,6 +137,10 @@ ShowImageApp::MessageReceived(BMessage *pmsg)
BroadcastToWindows(MSG_UPDATE_RECENT_DOCUMENTS); BroadcastToWindows(MSG_UPDATE_RECENT_DOCUMENTS);
break; break;
case B_CLIPBOARD_CHANGED:
CheckClipboard();
break;
default: default:
BApplication::MessageReceived(pmsg); BApplication::MessageReceived(pmsg);
break; break;
@@ -170,3 +179,52 @@ ShowImageApp::BroadcastToWindows(uint32 what)
msgr.SendMessage(what); msgr.SendMessage(what);
} }
} }
void
ShowImageApp::BroadcastToWindows(BMessage *pmsg)
{
const int32 n = CountWindows();
for (int32 i = 0; i < n ; i ++) {
// BMessenger checks for us if BWindow is still a valid object
BMessenger msgr(WindowAt(i));
msgr.SendMessage(pmsg);
}
}
void
ShowImageApp::CheckClipboard()
{
// Determines if the contents of the clipboard contain
// data that is useful to this application.
// After checking the clipboard, a message is sent to
// all windows indicating that the clipboard has changed
// and whether or not the clipboard contains useful data.
bool bdata = false;
if (be_clipboard->Lock()) {
BMessage *pclip;
if ((pclip = be_clipboard->Data()) != NULL) {
BString strClass;
if (pclip->FindString("class", &strClass) == B_OK) {
if (strClass == "BBitmap")
bdata = true;
}
}
be_clipboard->Unlock();
}
BMessage msg(MSG_CLIPBOARD_CHANGED);
msg.AddBool("data_available", bdata);
BroadcastToWindows(&msg);
}
void
ShowImageApp::Quit()
{
be_clipboard->StopWatching(be_app_messenger);
// tell clipboard we don't want anymore notification
BApplication::Quit();
}
+3
View File
@@ -42,11 +42,14 @@ public:
virtual void ReadyToRun(); virtual void ReadyToRun();
virtual void Pulse(); virtual void Pulse();
virtual void RefsReceived(BMessage *pmsg); virtual void RefsReceived(BMessage *pmsg);
virtual void Quit();
private: private:
void StartPulse(); void StartPulse();
void Open(const entry_ref *pref); void Open(const entry_ref *pref);
void BroadcastToWindows(uint32 what); void BroadcastToWindows(uint32 what);
void BroadcastToWindows(BMessage *pmsg);
void CheckClipboard();
BFilePanel *fpOpenPanel; BFilePanel *fpOpenPanel;
bool fbPulseStarted; bool fbPulseStarted;
+1
View File
@@ -40,6 +40,7 @@ const uint32 MSG_OUTPUT_TYPE = 'BTMN';
const uint32 MSG_SAVE_PANEL = 'mFSP'; const uint32 MSG_SAVE_PANEL = 'mFSP';
const uint32 MSG_CLEAR_SELECT = 'mCSL'; 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_DITHER_IMAGE = 'mDIM'; const uint32 MSG_DITHER_IMAGE = 'mDIM';
const uint32 MSG_UPDATE_STATUS = 'mUPS'; const uint32 MSG_UPDATE_STATUS = 'mUPS';
const uint32 MSG_SELECTION = 'mSEL'; const uint32 MSG_SELECTION = 'mSEL';
+15
View File
@@ -128,6 +128,10 @@ ShowImageWindow::ShowImageWindow(const entry_ref *pref)
// exit if file could not be opened // exit if file could not be opened
Quit(); Quit();
} }
// Tell application object to query the clipboard
// and tell this window if it contains interesting data or not
be_app_messenger.SendMessage(B_CLIPBOARD_CHANGED);
} }
ShowImageWindow::~ShowImageWindow() ShowImageWindow::~ShowImageWindow()
@@ -536,6 +540,17 @@ ShowImageWindow::MessageReceived(BMessage *pmsg)
break; break;
} }
case MSG_CLIPBOARD_CHANGED:
{
// The app sends this message after it examines
// the clipboard in response to a B_CLIPBOARD_CHANGED
// message
bool bdata;
if (pmsg->FindBool("data_available", &bdata) == B_OK)
EnableMenuItem(fpBar, B_PASTE, bdata);
break;
}
case B_UNDO: case B_UNDO:
break; break;
case B_CUT: case B_CUT: