diff --git a/headers/private/shared/AboutWindow.h b/headers/private/shared/AboutWindow.h index d6ac30e6ef..3741d2c3bc 100644 --- a/headers/private/shared/AboutWindow.h +++ b/headers/private/shared/AboutWindow.h @@ -24,6 +24,8 @@ class BAboutWindow : public BWindow { const char* signature); virtual ~BAboutWindow(); + virtual bool QuitRequested(); + void AddDescription(const char* description); void AddCopyright(int32 firstCopyrightYear, const char* copyrightHolder, @@ -40,6 +42,7 @@ class BAboutWindow : public BWindow { private: AboutView* fAboutView; + BHandler* fCaller; }; #endif // B_ABOUT_WINDOW_H diff --git a/src/apps/activitymonitor/ActivityMonitor.cpp b/src/apps/activitymonitor/ActivityMonitor.cpp index cf9ba52f16..0db3cd1060 100644 --- a/src/apps/activitymonitor/ActivityMonitor.cpp +++ b/src/apps/activitymonitor/ActivityMonitor.cpp @@ -8,17 +8,19 @@ #include -#include #include #include "ActivityWindow.h" + +const char* kAppName = B_TRANSLATE_SYSTEM_NAME("ActivityMonitor"); const char* kSignature = "application/x-vnd.Haiku-ActivityMonitor"; ActivityMonitor::ActivityMonitor() : BApplication(kSignature) { + fWindow = new ActivityWindow(); } @@ -30,7 +32,6 @@ ActivityMonitor::~ActivityMonitor() void ActivityMonitor::ReadyToRun() { - fWindow = new ActivityWindow(); fWindow->Show(); } @@ -52,20 +53,6 @@ ActivityMonitor::MessageReceived(BMessage* message) void ActivityMonitor::AboutRequested() { - ShowAbout(); -} - - -/*static*/ void -ActivityMonitor::ShowAbout() -{ - const char* kAuthors[] = { - "Axel Dörfler", - NULL - }; - - BAboutWindow aboutWindow(B_TRANSLATE_SYSTEM_NAME("ActivityMonitor"), 2008, kAuthors); - aboutWindow.Show(); } diff --git a/src/apps/activitymonitor/ActivityMonitor.h b/src/apps/activitymonitor/ActivityMonitor.h index 7ac0fd3bb1..036acb5559 100644 --- a/src/apps/activitymonitor/ActivityMonitor.h +++ b/src/apps/activitymonitor/ActivityMonitor.h @@ -9,8 +9,9 @@ #include #include -class BMessage; + class ActivityWindow; +class BMessage; #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "ActivityWindow" @@ -28,8 +29,6 @@ public: virtual void AboutRequested(); - static void ShowAbout(); - private: ActivityWindow* fWindow; }; diff --git a/src/apps/activitymonitor/ActivityView.cpp b/src/apps/activitymonitor/ActivityView.cpp index e3db9f8845..664ef9a564 100644 --- a/src/apps/activitymonitor/ActivityView.cpp +++ b/src/apps/activitymonitor/ActivityView.cpp @@ -12,6 +12,7 @@ #include #ifdef __HAIKU__ +# include # include # include #endif @@ -175,6 +176,7 @@ const uint32 kMsgToggleDataSource = 'tgds'; const uint32 kMsgToggleLegend = 'tglg'; const uint32 kMsgUpdateResolution = 'ures'; +extern const char* kAppName; extern const char* kSignature; @@ -598,6 +600,8 @@ ActivityView::~ActivityView() { delete fOffscreen; delete fSystemInfoHandler; + + fAboutWindow->Quit(); } @@ -614,6 +618,9 @@ ActivityView::_Init(const BMessage* settings) #endif SetViewColor(B_TRANSPARENT_COLOR); + fAboutWindow = new BAboutWindow(kAppName, kSignature); + fAboutWindow->AddCopyright(2008, "Haiku, Inc."); + fLastRefresh = 0; fDrawResolution = 1; fZooming = false; @@ -1104,7 +1111,7 @@ ActivityView::MessageReceived(BMessage* message) switch (message->what) { case B_ABOUT_REQUESTED: - ActivityMonitor::ShowAbout(); + fAboutWindow->Show(); break; case kMsgUpdateResolution: diff --git a/src/apps/activitymonitor/ActivityView.h b/src/apps/activitymonitor/ActivityView.h index 5ffa336312..0e1ccf6520 100644 --- a/src/apps/activitymonitor/ActivityView.h +++ b/src/apps/activitymonitor/ActivityView.h @@ -16,6 +16,8 @@ #include "CircularBuffer.h" #include "DataSource.h" + +class BAboutWindow; class BBitmap; class BMessageRunner; class Scale; @@ -23,7 +25,6 @@ class SystemInfoHandler; class ViewHistory; struct data_item; - class DataHistory { public: DataHistory(bigtime_t memorize, bigtime_t interval); @@ -145,6 +146,8 @@ private: int32 fOriginalResolution; SystemInfoHandler* fSystemInfoHandler; std::map fScales; + + BAboutWindow* fAboutWindow; }; #endif // ACTIVITY_VIEW_H diff --git a/src/apps/deskcalc/CalcApplication.cpp b/src/apps/deskcalc/CalcApplication.cpp index d91002ce90..9c6d4c0052 100644 --- a/src/apps/deskcalc/CalcApplication.cpp +++ b/src/apps/deskcalc/CalcApplication.cpp @@ -22,6 +22,7 @@ #include #include +#include "CalcView.h" #include "CalcWindow.h" @@ -29,9 +30,9 @@ #define B_TRANSLATION_CONTEXT "CalcApplication" -static const char* kSettingsFileName = "DeskCalc_settings"; -const char* kAppName = B_TRANSLATE_SYSTEM_NAME("DeskCalc"); -const char* kAppSig = "application/x-vnd.Haiku-DeskCalc"; +static const char* kSettingsFileName = "DeskCalc_settings"; +const char* kAppName = B_TRANSLATE_SYSTEM_NAME("DeskCalc"); +const char* kSignature = "application/x-vnd.Haiku-DeskCalc"; static const float kDefaultWindowWidth = 220.0; static const float kDefaultWindowHeight = 140.0; @@ -39,7 +40,7 @@ static const float kDefaultWindowHeight = 140.0; CalcApplication::CalcApplication() : - BApplication(kAppSig), + BApplication(kSignature), fCalcWindow(NULL) { } @@ -67,8 +68,7 @@ CalcApplication::ReadyToRun() void CalcApplication::AboutRequested() { - // TODO: implement me! - return BApplication::AboutRequested(); + fCalcWindow->View()->MessageReceived(new BMessage(B_ABOUT_REQUESTED)); } diff --git a/src/apps/deskcalc/CalcApplication.h b/src/apps/deskcalc/CalcApplication.h index 9707daf4be..d66f4be406 100644 --- a/src/apps/deskcalc/CalcApplication.h +++ b/src/apps/deskcalc/CalcApplication.h @@ -16,7 +16,7 @@ extern const char* kAppName; -extern const char* kAppSig; +extern const char* kSignature; class BFile; class CalcWindow; diff --git a/src/apps/deskcalc/CalcView.cpp b/src/apps/deskcalc/CalcView.cpp index d0b53d6c4e..285671cf5d 100644 --- a/src/apps/deskcalc/CalcView.cpp +++ b/src/apps/deskcalc/CalcView.cpp @@ -138,24 +138,10 @@ CalcView::CalcView(BRect frame, rgb_color rgbBaseColor, BMessage* settings) fAudioFeedbackItem(NULL), fOptions(new CalcOptions()) { - // create expression text view - fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); - AddChild(fExpressionTextView); - - // read data from archive - _LoadSettings(settings); - // tell the app server not to erase our b/g SetViewColor(B_TRANSPARENT_32_BIT); - // parse calculator description - _ParseCalcDesc(fKeypadDescription); - - // colorize based on base color. - _Colorize(); - - // Fetch the calc icon for compact view - _FetchAppIcon(fCalcIcon); + _Init(settings); } @@ -188,15 +174,7 @@ CalcView::CalcView(BMessage* archive) // Do not restore the follow mode, in shelfs, we never follow. SetResizingMode(B_FOLLOW_NONE); - // create expression text view - fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); - AddChild(fExpressionTextView); - - // read data from archive - _LoadSettings(archive); - - // Fetch the calc icon for compact view - _FetchAppIcon(fCalcIcon); + _Init(archive); } @@ -205,6 +183,8 @@ CalcView::~CalcView() delete fKeypad; delete fOptions; free(fKeypadDescription); + + fAboutWindow->Quit(); } @@ -288,7 +268,7 @@ CalcView::MessageReceived(BMessage* message) // (replicant) about box requested case B_ABOUT_REQUESTED: - AboutRequested(); + fAboutWindow->Show(); break; case MSG_UNFLASH_KEY: @@ -296,6 +276,7 @@ CalcView::MessageReceived(BMessage* message) int32 key; if (message->FindInt32("key", &key) == B_OK) _FlashKey(key, 0); + break; } @@ -709,20 +690,6 @@ CalcView::FrameResized(float width, float height) } -void -CalcView::AboutRequested() -{ - const char* extraCopyrights[] = { - "1997, 1998 R3 Software Ltd.", - NULL - }; - - BAboutWindow* about = new BAboutWindow(kAppName, kAppSig); - about->AddCopyright(2006, "Haiku, Inc.", extraCopyrights); - about->Show(); -} - - status_t CalcView::Archive(BMessage* archive, bool deep) const { @@ -735,7 +702,7 @@ CalcView::Archive(BMessage* archive, bool deep) const // save app signature for replicant add-on loading if (ret == B_OK) - ret = archive->AddString("add_on", kAppSig); + ret = archive->AddString("add_on", kSignature); // save all the options if (ret == B_OK) @@ -816,73 +783,6 @@ CalcView::Paste(BMessage* message) } -status_t -CalcView::_LoadSettings(BMessage* archive) -{ - if (!archive) - return B_BAD_VALUE; - - // record calculator description - const char* calcDesc; - if (archive->FindString("calcDesc", &calcDesc) < B_OK) - calcDesc = kKeypadDescriptionBasic; - - // save calculator description for reference - free(fKeypadDescription); - fKeypadDescription = strdup(calcDesc); - - // read grid dimensions - if (archive->FindInt16("cols", &fColumns) < B_OK) - fColumns = 5; - if (archive->FindInt16("rows", &fRows) < B_OK) - fRows = 4; - - // read color scheme - const rgb_color* color; - ssize_t size; - if (archive->FindData("rgbBaseColor", B_RGB_COLOR_TYPE, - (const void**)&color, &size) < B_OK - || size != sizeof(rgb_color)) { - fBaseColor = ui_color(B_PANEL_BACKGROUND_COLOR); - puts("Missing rgbBaseColor from CalcView archive!\n"); - } else { - fBaseColor = *color; - } - - if (archive->FindData("rgbDisplay", B_RGB_COLOR_TYPE, - (const void**)&color, &size) < B_OK - || size != sizeof(rgb_color)) { - fExpressionBGColor = (rgb_color){ 0, 0, 0, 255 }; - puts("Missing rgbBaseColor from CalcView archive!\n"); - } else { - fExpressionBGColor = *color; - } - - // load options - fOptions->LoadSettings(archive); - - // load display text - const char* display; - if (archive->FindString("displayText", &display) < B_OK) { - puts("Missing expression text from CalcView archive.\n"); - } else { - // init expression text - fExpressionTextView->SetText(display); - } - - // load expression history - fExpressionTextView->LoadSettings(archive); - - // parse calculator description - _ParseCalcDesc(fKeypadDescription); - - // colorize based on base color. - _Colorize(); - - return B_OK; -} - - status_t CalcView::SaveSettings(BMessage* archive) const { @@ -1068,6 +968,99 @@ CalcView::SetKeypadMode(uint8 mode) // #pragma mark - +void +CalcView::_Init(BMessage* settings) +{ + // create the about window + const char* extraCopyrights[] = { + "1997, 1998 R3 Software Ltd.", + NULL + }; + + fAboutWindow = new BAboutWindow(kAppName, kSignature); + fAboutWindow->AddCopyright(2006, "Haiku, Inc.", + extraCopyrights); + + // create expression text view + fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); + AddChild(fExpressionTextView); + + // read data from archive + _LoadSettings(settings); + + // fetch the calc icon for compact view + _FetchAppIcon(fCalcIcon); + +} + + +status_t +CalcView::_LoadSettings(BMessage* archive) +{ + if (!archive) + return B_BAD_VALUE; + + // record calculator description + const char* calcDesc; + if (archive->FindString("calcDesc", &calcDesc) < B_OK) + calcDesc = kKeypadDescriptionBasic; + + // save calculator description for reference + free(fKeypadDescription); + fKeypadDescription = strdup(calcDesc); + + // read grid dimensions + if (archive->FindInt16("cols", &fColumns) < B_OK) + fColumns = 5; + if (archive->FindInt16("rows", &fRows) < B_OK) + fRows = 4; + + // read color scheme + const rgb_color* color; + ssize_t size; + if (archive->FindData("rgbBaseColor", B_RGB_COLOR_TYPE, + (const void**)&color, &size) < B_OK + || size != sizeof(rgb_color)) { + fBaseColor = ui_color(B_PANEL_BACKGROUND_COLOR); + puts("Missing rgbBaseColor from CalcView archive!\n"); + } else { + fBaseColor = *color; + } + + if (archive->FindData("rgbDisplay", B_RGB_COLOR_TYPE, + (const void**)&color, &size) < B_OK + || size != sizeof(rgb_color)) { + fExpressionBGColor = (rgb_color){ 0, 0, 0, 255 }; + puts("Missing rgbBaseColor from CalcView archive!\n"); + } else { + fExpressionBGColor = *color; + } + + // load options + fOptions->LoadSettings(archive); + + // load display text + const char* display; + if (archive->FindString("displayText", &display) < B_OK) { + puts("Missing expression text from CalcView archive.\n"); + } else { + // init expression text + fExpressionTextView->SetText(display); + } + + // load expression history + fExpressionTextView->LoadSettings(archive); + + // parse calculator description + _ParseCalcDesc(fKeypadDescription); + + // colorize based on base color. + _Colorize(); + + return B_OK; +} + + void CalcView::_ParseCalcDesc(const char* keypadDescription) { @@ -1372,7 +1365,7 @@ void CalcView::_FetchAppIcon(BBitmap* into) { entry_ref appRef; - status_t status = be_roster->FindApp(kAppSig, &appRef); + status_t status = be_roster->FindApp(kSignature, &appRef); if (status == B_OK) { BFile file(&appRef, B_READ_ONLY); BAppFileInfo appInfo(&file); diff --git a/src/apps/deskcalc/CalcView.h b/src/apps/deskcalc/CalcView.h index 93bc594f2a..50a121df7d 100644 --- a/src/apps/deskcalc/CalcView.h +++ b/src/apps/deskcalc/CalcView.h @@ -34,6 +34,7 @@ static const float kMaximumHeightBasic = 400.0f; class BAboutWindow; class BString; class BMenuItem; +class BMessage; class BPopUpMenu; class CalcOptions; class CalcOptionsWindow; @@ -64,9 +65,6 @@ class CalcView : public BView { virtual void ResizeTo(float width, float height); virtual void FrameResized(float width, float height); - // Present about box for view (replicant). - virtual void AboutRequested(); - // Archive this view. virtual status_t Archive(BMessage* archive, bool deep) const; @@ -102,6 +100,8 @@ class CalcView : public BView { void SetKeypadMode(uint8 mode); private: + void _Init(BMessage* settings); + status_t _LoadSettings(BMessage* archive); void _ParseCalcDesc(const char* keypadDescription); void _PressKey(int key); @@ -121,8 +121,6 @@ class CalcView : public BView { void _FetchAppIcon(BBitmap* into); - status_t _LoadSettings(BMessage* archive); - // grid dimensions int16 fColumns; int16 fRows; @@ -165,6 +163,9 @@ class CalcView : public BView { // calculator options. CalcOptions* fOptions; + + // about window for replicant + BAboutWindow* fAboutWindow; }; #endif // _CALC_VIEW_H diff --git a/src/apps/deskcalc/CalcWindow.h b/src/apps/deskcalc/CalcWindow.h index 421f4605a9..5e6b16c769 100644 --- a/src/apps/deskcalc/CalcWindow.h +++ b/src/apps/deskcalc/CalcWindow.h @@ -31,6 +31,8 @@ class CalcWindow : public BWindow { void SetFrame(BRect frame, bool forceCenter = false); + CalcView* View() const { return fCalcView; }; + private: CalcView* fCalcView; }; diff --git a/src/kits/shared/AboutWindow.cpp b/src/kits/shared/AboutWindow.cpp index e7d968277e..74dbef066c 100644 --- a/src/kits/shared/AboutWindow.cpp +++ b/src/kits/shared/AboutWindow.cpp @@ -31,6 +31,7 @@ #include #include #include +#include static const float kStripeWidth = 30.0; @@ -80,8 +81,12 @@ StripeView::StripeView(BBitmap* icon) BView("StripeView", B_WILL_DRAW), fIcon(icon) { - SetExplicitMinSize(BSize(160.0, B_SIZE_UNSET)); - SetExplicitPreferredSize(BSize(160.0, B_SIZE_UNLIMITED)); + float width = 48.0f; + if (icon != NULL) + width += icon->Bounds().Width() - 16.0f; + + SetExplicitMinSize(BSize(width, B_SIZE_UNSET)); + SetExplicitPreferredSize(BSize(width, B_SIZE_UNLIMITED)); SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); } @@ -233,7 +238,7 @@ AboutView::AppIcon(const char* signature) BAboutWindow::BAboutWindow(const char* appName, int32 firstCopyrightYear, const char** authors, const char* extraInfo) - : BWindow(BRect(0.0, 0.0, 300.0, 140.0), appName, B_TITLED_WINDOW, + : BWindow(BRect(0.0, 0.0, 200.0, 140.0), appName, B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS) { @@ -261,6 +266,19 @@ BAboutWindow::~BAboutWindow() } +bool +BAboutWindow::QuitRequested() +{ + while (!IsHidden()) + Hide(); + + return false; +} + + +// #pragma mark - + + void BAboutWindow::AddDescription(const char* description) { @@ -270,8 +288,11 @@ BAboutWindow::AddDescription(const char* description) const char* appDesc = B_TRANSLATE_MARK(description); appDesc = gSystemCatalog.GetString(appDesc, "AboutWindow"); - BString desc(appDesc); - desc << "\n\n"; + BString desc(""); + if (fAboutView->InfoView()->TextLength() > 0) + desc << "\n\n"; + + desc << appDesc; fAboutView->InfoView()->Insert(desc.String()); } @@ -281,10 +302,7 @@ void BAboutWindow::AddCopyright(int32 firstCopyrightYear, const char* copyrightHolder, const char** extraCopyrights) { - BString copyright(B_UTF8_COPYRIGHT " %years%"); - if (copyrightHolder != NULL) - copyright << " " << copyrightHolder; - + BString copyright(B_UTF8_COPYRIGHT " %years% %holder%"); const char* firstCopyright = B_TRANSLATE_MARK(copyright.String()); firstCopyright = gSystemCatalog.GetString(copyright, "AboutWindow"); @@ -298,23 +316,29 @@ BAboutWindow::AddCopyright(int32 firstCopyrightYear, if (copyrightYears != currentYear) copyrightYears << "-" << currentYear; - BString text(firstCopyright); + BString text(""); + if (fAboutView->InfoView()->TextLength() > 0) + text << "\n\n"; - // Replace the copyright year with the current year + text << firstCopyright; + + // Fill out the copyright year placeholder text.ReplaceAll("%years%", copyrightYears.String()); + // Fill in the copyright holder placeholder + text.ReplaceAll("%holder%", copyrightHolder); + // Add extra copyright strings if (extraCopyrights != NULL) { // Add optional extra copyright information for (int32 i = 0; extraCopyrights[i]; i++) text << "\n" << B_UTF8_COPYRIGHT << " " << extraCopyrights[i]; } - text << "\n"; const char* allRightsReserved = B_TRANSLATE_MARK("All Rights Reserved."); allRightsReserved = gSystemCatalog.GetString(allRightsReserved, "AboutWindow"); - text << " " << allRightsReserved << "\n\n"; + text << "\n " << allRightsReserved; fAboutView->InfoView()->Insert(text.String()); } @@ -329,11 +353,14 @@ BAboutWindow::AddAuthors(const char** authors) const char* writtenBy = B_TRANSLATE_MARK("Written by:"); writtenBy = gSystemCatalog.GetString(writtenBy, "AboutWindow"); - BString text(writtenBy); + BString text(""); + if (fAboutView->InfoView()->TextLength() > 0) + text << "\n\n"; + + text << writtenBy; text << "\n"; for (int32 i = 0; authors[i]; i++) text << " " << authors[i] << "\n"; - text << "\n"; fAboutView->InfoView()->Insert(text.String()); } @@ -348,11 +375,13 @@ BAboutWindow::AddSpecialThanks(const char** thanks) const char* specialThanks = B_TRANSLATE_MARK("Special Thanks:"); specialThanks = gSystemCatalog.GetString(specialThanks, "AboutWindow"); - BString text(specialThanks); - text << "\n"; + BString text(""); + if (fAboutView->InfoView()->TextLength() > 0) + text << "\n\n"; + + text << specialThanks << "\n"; for (int32 i = 0; thanks[i]; i++) text << " " << thanks[i] << "\n"; - text << "\n"; fAboutView->InfoView()->Insert(text.String()); } @@ -366,11 +395,14 @@ BAboutWindow::AddVersionHistory(const char** history) const char* versionHistory = B_TRANSLATE_MARK("Version history:"); versionHistory = gSystemCatalog.GetString(versionHistory, "AboutWindow"); - BString text(versionHistory); - text << "\n"; + + BString text(""); + if (fAboutView->InfoView()->TextLength() > 0) + text << "\n\n"; + + text << versionHistory << "\n"; for (int32 i = 0; history[i]; i++) text << " " << history[i] << "\n"; - text << "\n"; fAboutView->InfoView()->Insert(text.String()); } @@ -385,8 +417,11 @@ BAboutWindow::AddExtraInfo(const char* extraInfo) const char* appExtraInfo = B_TRANSLATE_MARK(extraInfo); appExtraInfo = gSystemCatalog.GetString(extraInfo, "AboutWindow"); - BString extra(appExtraInfo); - extra << "\n"; + BString extra(""); + if (fAboutView->InfoView()->TextLength() > 0) + extra << "\n\n"; + + extra << appExtraInfo; fAboutView->InfoView()->Insert(extra.String()); } @@ -409,7 +444,8 @@ BAboutWindow::AboutPosition(float width, float height) result.x = screenFrame.left + (screenFrame.Width() / 2.0) - (width / 2.0); // This is probably sooo wrong, but it looks right on 1024 x 768 - result.y = screenFrame.top + (screenFrame.Height() / 4.0) - ceil(height / 3.0); + result.y = screenFrame.top + (screenFrame.Height() / 4.0) + - ceil(height / 3.0); return result; }