#include <iostream.h> #include <String.h> #include "SwitchBoard.h" #include "SubscriberHookup.h" // PersonnelList Class /////////////////////////////////////////// //// class PersonnelList { private: SubscriberHookup* _swsub; public: PersonnelList(); ~PersonnelList(); // PersonnelList code here // persistent store and SwitchBoard saveYourself message handler void store(); }; // -- implementation --------------------------------------------- //// PersonnelList::PersonnelList() { _swsub = newSwitchBoardSubscribtion("saveYourself", this, store); // rest of the constructor code here } PersonnelList::~PersonnelList() { delete _swsub; // rest of destructor code here } void PersonnelList::store() { // persistent store SwitchBoard::post("busy", "PersonnelList - saving..."); // save the personnel list SwitchBoard::post("notBusy"); } // ApplicationShell Class //////////////////////////////////////// //// class ApplicationShell { private: int _busy_ref_count; // tracks how busy the application is String _status; // current message as displayed in the // status bar String _idle_status; // the before busy status message that // needs to be restored public: ApplicationShell(); // busyness management center bool isBusy() { return(_busy_ref_count > 0); } void setStatus(const char* status); void busy(const char* status_msg = NULL); void notBusy(); // application state management void refresh(); void save(); }; // -- instantiation ---------------------------------------------- //// ApplicationShell::ApplicationShell() : _busy_ref_count(0) { // construct the application GUI setStatus("Ready."); // subscribe to the busy and notBusy messages newSwitchBoardSubscribtion("busy", this, busy); newSwitchBoardSubscribtion("notBusy", this, notBusy); } // -- busyness management center --------------------------------- //// void ApplicationShell::setStatus(const char* status) { _status = status; // save the status // for the example just print the status message and depth cerr << replicate(' ', _busy_ref_count) << status << endl; } void ApplicationShell::busy(const char* status /* NULL */) { // post the message telling each visible object to switch its // cursor to the busy one SwitchBoard::post("setBusyCursor"); // if this is the first call save the current status message // for later restoration if (!isBusy()) _idle_status = _status; // if going busy with a message show the user the new message if (status) setStatus(status); // increment the reference count so notBusy() will know when // to stop _busy_ref_count++; } void ApplicationShell::notBusy() { if (--_busy_ref_count < 0) _busy_ref_count = 0; if (!isBusy()) { // the application is no longer busy, so switch back to the // default cursor SwitchBoard::post("restoreDefaultCursor"); // restore the status message before work began if (!_idle_status.empty()) setStatus(_idle_status); _idle_status = NULL; } } // -- application state managment -------------------------------- //// void ApplicationShell::refresh() { SwitchBoard::post("busy", "Refreshing..."); // refresh the application state SwitchBoard::post("notBusy"); } void ApplicationShell::save() { // swith the application into a busy state SwitchBoard::post("busy", "Saving the application state..."); // code to save the application state ... // notify all the persistent objects that it's now time to save SwitchBoard::post("saveYourself"); refresh(); // return to the normal state SwitchBoard::post("notBusy"); } // Main ////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { // instantiate the application ApplicationShell app; // just for kicks, declare a personnel list outside of the // application PersonnelList personnel_list; // save the application state app.save(); return(0); } /* End of File */