From 31c0024d1b271b0b671c77432cce0be483b366f0 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 8 Nov 2012 00:43:14 -0500 Subject: [PATCH] Add Deskbar clock settings to Time Preferences * Added a new Clock tab to the Time preflet. Added Clock related controls there. They all function by communicating with Deskbar. * Put controls in a BBox controlled by the Show clock checkbox. This more clearly shows that all the clock settings are dependent on the show clock setting since it doesn't matter what your clock settings are if you don't show the clock. * Make revert work. * Split clock settings into it's own file and struct. * Re-add the time zone setting. * Remove the clock settings from the Deskbar preference window, they are in Time now. * Make Locale preferences accepts B_LOCALE_CHANGED message, although not used. --- src/apps/deskbar/BarApp.cpp | 78 ++++-- src/apps/deskbar/BarApp.h | 11 +- src/apps/deskbar/BarView.cpp | 5 + src/apps/deskbar/DeskbarMenu.cpp | 7 +- src/apps/deskbar/DeskbarMenu.h | 2 + src/apps/deskbar/PreferencesWindow.cpp | 44 +--- src/apps/deskbar/PreferencesWindow.h | 9 - src/apps/deskbar/StatusView.cpp | 62 +++-- src/apps/deskbar/TimeView.cpp | 80 +++--- src/apps/deskbar/TimeView.h | 36 ++- src/preferences/locale/FormatSettingsView.cpp | 17 +- src/preferences/locale/LocalePreflet.cpp | 5 + src/preferences/locale/LocaleWindow.cpp | 7 +- src/preferences/time/ClockView.cpp | 227 ++++++++++++++++++ src/preferences/time/ClockView.h | 44 ++++ src/preferences/time/Jamfile | 1 + src/preferences/time/Time.cpp | 17 ++ src/preferences/time/Time.h | 3 + src/preferences/time/TimeMessages.h | 18 ++ src/preferences/time/TimeWindow.cpp | 26 +- src/preferences/time/TimeWindow.h | 10 +- 21 files changed, 570 insertions(+), 139 deletions(-) create mode 100644 src/preferences/time/ClockView.cpp create mode 100644 src/preferences/time/ClockView.h diff --git a/src/apps/deskbar/BarApp.cpp b/src/apps/deskbar/BarApp.cpp index 42160e01eb9..563de4e4751 100644 --- a/src/apps/deskbar/BarApp.cpp +++ b/src/apps/deskbar/BarApp.cpp @@ -51,6 +51,8 @@ All rights reserved. #include #include #include +#include +#include #include #include #include @@ -74,9 +76,8 @@ BList TBarApp::sBarTeamInfoList; BList TBarApp::sSubscribers; -const uint32 kShowDeskbarMenu = 'BeMn'; -const uint32 kShowTeamMenu = 'TmMn'; - +const uint32 kShowDeskbarMenu = 'BeMn'; +const uint32 kShowTeamMenu = 'TmMn'; static const color_space kIconColorSpace = B_RGBA32; @@ -95,6 +96,7 @@ main() TBarApp::TBarApp() : BApplication(kDeskbarSignature), fSettingsFile(NULL), + fClockSettingsFile(NULL), fPreferencesWindow(NULL) { InitSettings(); @@ -159,8 +161,11 @@ TBarApp::~TBarApp() = static_cast(sSubscribers.ItemAt(i)); delete messenger; } + SaveSettings(); + delete fSettingsFile; + delete fClockSettingsFile; } @@ -204,9 +209,6 @@ TBarApp::SaveSettings() storedSettings.AddInt32("state", fSettings.state); storedSettings.AddFloat("width", fSettings.width); - storedSettings.AddBool("showSeconds", fSettings.showSeconds); - storedSettings.AddBool("showDayOfWeek", fSettings.showDayOfWeek); - storedSettings.AddPoint("switcherLoc", fSettings.switcherLoc); storedSettings.AddInt32("recentAppsCount", fSettings.recentAppsCount); storedSettings.AddInt32("recentDocsCount", fSettings.recentDocsCount); @@ -233,6 +235,20 @@ TBarApp::SaveSettings() storedSettings.Flatten(fSettingsFile); } + + if (fClockSettingsFile->InitCheck() == B_OK) { + fClockSettingsFile->Seek(0, SEEK_SET); + BMessage storedSettings; + + storedSettings.AddBool("showSeconds", + fClockSettings.showSeconds); + storedSettings.AddBool("showDayOfWeek", + fClockSettings.showDayOfWeek); + storedSettings.AddBool("showTimeZone", + fClockSettings.showTimeZone); + + storedSettings.Flatten(fClockSettingsFile); + } } @@ -243,8 +259,6 @@ TBarApp::InitSettings() settings.vertical = true; settings.left = false; settings.top = true; - settings.showSeconds = false; - settings.showDayOfWeek = false; settings.state = kExpandoState; settings.width = 0; settings.switcherLoc = BPoint(5000, 5000); @@ -266,13 +280,19 @@ TBarApp::InitSettings() settings.recentDocsEnabled = true; settings.recentFoldersEnabled = true; + clock_settings clock; + clock.showSeconds = false; + clock.showDayOfWeek = false; + clock.showTimeZone = false; + BPath dirPath; const char* settingsFileName = "Deskbar_settings"; + const char* clockSettingsFileName = "Deskbar_clock_settings"; find_directory(B_USER_DESKBAR_DIRECTORY, &dirPath, true); // just make it - if (find_directory (B_USER_SETTINGS_DIRECTORY, &dirPath, true) == B_OK) { + if (find_directory(B_USER_SETTINGS_DIRECTORY, &dirPath, true) == B_OK) { BPath filePath = dirPath; filePath.Append(settingsFileName); fSettingsFile = new BFile(filePath.Path(), O_RDWR); @@ -282,6 +302,13 @@ TBarApp::InitSettings() theDir.CreateFile(settingsFileName, fSettingsFile); } + fClockSettingsFile = new BFile(filePath.Path(), O_RDWR); + if (fClockSettingsFile->InitCheck() != B_OK) { + BDirectory theDir(dirPath.Path()); + if (theDir.InitCheck() == B_OK) + theDir.CreateFile(clockSettingsFileName, fClockSettingsFile); + } + BMessage storedSettings; if (fSettingsFile->InitCheck() == B_OK && storedSettings.Unflatten(fSettingsFile) == B_OK) { @@ -299,14 +326,6 @@ TBarApp::InitSettings() } if (storedSettings.FindFloat("width", &settings.width) != B_OK) settings.width = 0; - if (storedSettings.FindBool("showSeconds", &settings.showSeconds) - != B_OK) { - settings.showSeconds = false; - } - if (storedSettings.FindBool("showDayOfWeek", &settings.showDayOfWeek) - != B_OK) { - settings.showDayOfWeek = false; - } if (storedSettings.FindPoint("switcherLoc", &settings.switcherLoc) != B_OK) { settings.switcherLoc = BPoint(5000, 5000); @@ -378,9 +397,26 @@ TBarApp::InitSettings() settings.recentFoldersEnabled = true; } } + + if (fClockSettingsFile->InitCheck() == B_OK + && storedSettings.Unflatten(fClockSettingsFile) == B_OK) { + if (storedSettings.FindBool("showSeconds", &clock.showSeconds) + != B_OK) { + clock.showSeconds = false; + } + if (storedSettings.FindBool("showDayOfWeek", + &clock.showDayOfWeek) != B_OK) { + clock.showDayOfWeek = false; + } + if (storedSettings.FindBool("showTimeZone", + &clock.showTimeZone) != B_OK) { + clock.showDayOfWeek = false; + } + } } fSettings = settings; + fClockSettings = clock; } @@ -626,13 +662,19 @@ TBarApp::MessageReceived(BMessage* message) bool localize; if (message->FindBool("filesys", &localize) == B_OK) gLocalizedNamePreferred = localize; + } + // fall-through + case kShowHideTime: + case kShowSeconds: + case kShowDayOfWeek: + case kShowTimeZone: + case kGetClockSettings: fStatusViewMessenger.SendMessage(message); // Notify the replicant tray (through BarView) that the time // interval has changed and it should update the time view // and reflow the tray icons. break; - } default: BApplication::MessageReceived(message); diff --git a/src/apps/deskbar/BarApp.h b/src/apps/deskbar/BarApp.h index 2c817572c00..04271505832 100644 --- a/src/apps/deskbar/BarApp.h +++ b/src/apps/deskbar/BarApp.h @@ -75,8 +75,6 @@ struct desk_settings { bool vertical; bool left; bool top; - bool showSeconds; - bool showDayOfWeek; uint32 state; float width; BPoint switcherLoc; @@ -99,6 +97,12 @@ struct desk_settings { bool recentFoldersEnabled; }; +struct clock_settings { + bool showSeconds; + bool showDayOfWeek; + bool showTimeZone; +}; + class BFile; class BList; class BBitmap; @@ -132,6 +136,7 @@ class TBarApp : public BApplication { virtual void RefsReceived(BMessage* refs); desk_settings* Settings() { return &fSettings; } + clock_settings* ClockSettings() { return &fClockSettings; } TBarView* BarView() const { return fBarView; } TBarWindow* BarWindow() const { return fBarWindow; } @@ -156,7 +161,9 @@ class TBarApp : public BApplication { BMessenger fSwitcherMessenger; BMessenger fStatusViewMessenger; BFile* fSettingsFile; + BFile* fClockSettingsFile; desk_settings fSettings; + clock_settings fClockSettings; PreferencesWindow* fPreferencesWindow; diff --git a/src/apps/deskbar/BarView.cpp b/src/apps/deskbar/BarView.cpp index 6f89271aa17..2c0fb4f97e5 100644 --- a/src/apps/deskbar/BarView.cpp +++ b/src/apps/deskbar/BarView.cpp @@ -223,6 +223,11 @@ TBarView::MessageReceived(BMessage* message) { switch (message->what) { case B_LOCALE_CHANGED: + case kShowHideTime: + case kShowSeconds: + case kShowDayOfWeek: + case kShowTimeZone: + case kGetClockSettings: fReplicantTray->MessageReceived(message); break; diff --git a/src/apps/deskbar/DeskbarMenu.cpp b/src/apps/deskbar/DeskbarMenu.cpp index 04d51fbb6fa..b85c082a0e1 100644 --- a/src/apps/deskbar/DeskbarMenu.cpp +++ b/src/apps/deskbar/DeskbarMenu.cpp @@ -388,13 +388,12 @@ TDeskbarMenu::ResetTargets() case kRebootSystem: case kSuspendSystem: case kShutdownSystem: - item->SetTarget(be_app); - break; - case kShowHideTime: case kShowSeconds: case kShowDayOfWeek: - item->SetTarget(fBarView->fReplicantTray); + case kShowTimeZone: + case kGetClockSettings: + item->SetTarget(be_app); break; } } diff --git a/src/apps/deskbar/DeskbarMenu.h b/src/apps/deskbar/DeskbarMenu.h index ce9b7a6013d..3737a32fb9e 100644 --- a/src/apps/deskbar/DeskbarMenu.h +++ b/src/apps/deskbar/DeskbarMenu.h @@ -37,6 +37,8 @@ All rights reserved. #include "NavMenu.h" +#include "PreferencesWindow.h" + // for message constants class TBarView; diff --git a/src/apps/deskbar/PreferencesWindow.cpp b/src/apps/deskbar/PreferencesWindow.cpp index 5a0da893a2f..98269703f1f 100644 --- a/src/apps/deskbar/PreferencesWindow.cpp +++ b/src/apps/deskbar/PreferencesWindow.cpp @@ -91,12 +91,6 @@ PreferencesWindow::PreferencesWindow(BRect frame) fWindowAutoHide = new BCheckBox(B_TRANSLATE("Auto-hide"), new BMessage(kAutoHide)); - // Clock controls - fShowSeconds = new BCheckBox(B_TRANSLATE("Show seconds"), - new BMessage(kShowSeconds)); - fShowDayOfWeek = new BCheckBox(B_TRANSLATE("Show day of week"), - new BMessage(kShowDayOfWeek)); - // Get settings from BarApp TBarApp* barApp = static_cast(be_app); desk_settings* settings = barApp->Settings(); @@ -156,16 +150,6 @@ PreferencesWindow::PreferencesWindow(BRect frame) fWindowAutoRaise->SetValue(settings->autoRaise); fWindowAutoHide->SetValue(settings->autoHide); - // Clock settings - TReplicantTray* replicantTray = barApp->BarView()->ReplicantTray(); - if (replicantTray->Time() != NULL) { - fShowSeconds->SetValue(replicantTray->Time()->ShowSeconds()); - fShowDayOfWeek->SetValue(replicantTray->Time()->ShowDayOfWeek()); - } else { - fShowSeconds->SetValue(settings->showSeconds); - fShowDayOfWeek->SetValue(settings->showDayOfWeek); - } - EnableDisableDependentItems(); // Targets @@ -179,19 +163,14 @@ PreferencesWindow::PreferencesWindow(BRect frame) fWindowAutoRaise->SetTarget(be_app); fWindowAutoHide->SetTarget(be_app); - fShowSeconds->SetTarget(replicantTray); - fShowDayOfWeek->SetTarget(replicantTray); - // Layout fMenuBox = new BBox("fMenuBox"); fAppsBox = new BBox("fAppsBox"); fWindowBox = new BBox("fWindowBox"); - fClockBox = new BBox("fClockBox"); fMenuBox->SetLabel(B_TRANSLATE("Menu")); fAppsBox->SetLabel(B_TRANSLATE("Applications")); fWindowBox->SetLabel(B_TRANSLATE("Window")); - fClockBox->SetLabel(B_TRANSLATE("Clock")); BView* view; view = BLayoutBuilder::Group<>() @@ -252,25 +231,12 @@ PreferencesWindow::PreferencesWindow(BRect frame) .View(); fWindowBox->AddChild(view); - view = BLayoutBuilder::Group<>() - .AddGroup(B_VERTICAL, 0) - .Add(fShowSeconds) - .Add(fShowDayOfWeek) - .AddGlue() - .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, - B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING) - .End() - .View(); - fClockBox->AddChild(view); - BLayoutBuilder::Group<>(this) - .AddGrid(5, 5) - .Add(fMenuBox, 0, 0) - .Add(fWindowBox, 1, 0) - .Add(fAppsBox, 0, 1) - .Add(fClockBox, 1, 1) - .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, - B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING) + .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) + .Add(fMenuBox) + .Add(fAppsBox) + .Add(fWindowBox) + .SetInsets(B_USE_DEFAULT_SPACING) .End() .End(); diff --git a/src/apps/deskbar/PreferencesWindow.h b/src/apps/deskbar/PreferencesWindow.h index 86fd9c2a5b2..d942165af34 100644 --- a/src/apps/deskbar/PreferencesWindow.h +++ b/src/apps/deskbar/PreferencesWindow.h @@ -23,11 +23,6 @@ const uint32 kResizeTeamIcons = 'RTIs'; const uint32 kAutoRaise = 'AtRs'; const uint32 kAutoHide = 'AtHd'; -const uint32 kShowHideTime = 'ShTm'; -const uint32 kShowSeconds = 'SwSc'; -const uint32 kShowDayOfWeek = 'SwDw'; - - class BBox; class BButton; class BCheckBox; @@ -51,7 +46,6 @@ class PreferencesWindow : public BWindow private: BBox* fMenuBox; BBox* fAppsBox; - BBox* fClockBox; BBox* fWindowBox; BCheckBox* fMenuRecentDocuments; @@ -72,9 +66,6 @@ class PreferencesWindow : public BWindow BCheckBox* fWindowAlwaysOnTop; BCheckBox* fWindowAutoRaise; BCheckBox* fWindowAutoHide; - - BCheckBox* fShowSeconds; - BCheckBox* fShowDayOfWeek; }; diff --git a/src/apps/deskbar/StatusView.cpp b/src/apps/deskbar/StatusView.cpp index fcea9559579..b9e6976be69 100644 --- a/src/apps/deskbar/StatusView.cpp +++ b/src/apps/deskbar/StatusView.cpp @@ -147,14 +147,8 @@ TReplicantTray::TReplicantTray(TBarView* parent, bool vertical) fMinimumTrayWidth = sMinimumWindowWidth - kGutter - kDragRegionWidth; } - BFormattingConventions conventions; - BLocale::Default()->GetFormattingConventions(&conventions); - bool use24HourClock = conventions.Use24HourClock(); - desk_settings* settings = ((TBarApp*)be_app)->Settings(); - // Create the time view - fTime = new TTimeView(fMinimumTrayWidth, kMaxReplicantHeight - 1.0, - use24HourClock, settings->showSeconds, settings->showDayOfWeek); + fTime = new TTimeView(fMinimumTrayWidth, kMaxReplicantHeight - 1.0); } @@ -180,6 +174,12 @@ TReplicantTray::AttachedToWindow() Window()->SetPulseRate(1000000); + // Set clock settings + clock_settings* settings = ((TBarApp*)be_app)->ClockSettings(); + fTime->SetShowSeconds(settings->showSeconds); + fTime->SetShowDayOfWeek(settings->showDayOfWeek); + fTime->SetShowTimeZone(settings->showTimeZone); + AddChild(fTime); fTime->MoveTo(Bounds().right - fTime->Bounds().Width() - 1, 2); @@ -279,10 +279,7 @@ TReplicantTray::MessageReceived(BMessage* message) if (fTime == NULL) return; - // Locale may have updated 12/24 hour clock - BFormattingConventions conventions; - BLocale::Default()->GetFormattingConventions(&conventions); - fTime->SetUse24HourClock(conventions.Use24HourClock()); + fTime->Update(); // time string reformat -> realign RealignReplicants(); @@ -317,6 +314,36 @@ TReplicantTray::MessageReceived(BMessage* message) AdjustPlacement(); break; + case kShowTimeZone: + if (fTime == NULL) + return; + + fTime->SetShowTimeZone(!fTime->ShowTimeZone()); + + // time string reformat -> realign + RealignReplicants(); + AdjustPlacement(); + break; + + case kGetClockSettings: + { + if (fTime == NULL) + return; + + bool showClock = !fTime->IsHidden(); + bool showSeconds = fTime->ShowSeconds(); + bool showDayOfWeek = fTime->ShowDayOfWeek(); + bool showTimeZone = fTime->ShowTimeZone(); + + BMessage* reply = new BMessage(kGetClockSettings); + reply->AddBool("showClock", showClock); + reply->AddBool("showSeconds", showSeconds); + reply->AddBool("showDayOfWeek", showDayOfWeek); + reply->AddBool("showTimeZone", showTimeZone); + message->SendReply(reply); + break; + } + #ifdef DB_ADDONS case B_NODE_MONITOR: HandleEntryUpdate(message); @@ -375,12 +402,12 @@ TReplicantTray::ShowReplicantMenu(BPoint point) BPopUpMenu* menu = new BPopUpMenu("", false, false); menu->SetFont(be_plain_font); - // If clock is visible show the extended menu, otherwise show "Show time" + // If clock is visible show the extended menu, otherwise show "Show clock" if (!fTime->IsHidden()) fTime->ShowTimeOptions(ConvertToScreen(point)); else { - BMenuItem* item = new BMenuItem(B_TRANSLATE("Show time"), + BMenuItem* item = new BMenuItem(B_TRANSLATE("Show clock"), new BMessage(kShowHideTime)); menu->AddItem(item); menu->SetTargetForItems(this); @@ -411,6 +438,12 @@ TReplicantTray::ShowHideTime() RealignReplicants(); AdjustPlacement(); + + // message Time preferences to update it's show time setting + BMessenger messenger("application/x-vnd.Haiku-Time"); + BMessage* message = new BMessage(kShowHideTime); + message->AddBool("showClock", !fTime->IsHidden()); + messenger.SendMessage(message); } @@ -1235,9 +1268,10 @@ TReplicantTray::SaveTimeSettings() if (fTime == NULL) return; - desk_settings* settings = ((TBarApp*)be_app)->Settings(); + clock_settings* settings = ((TBarApp*)be_app)->ClockSettings(); settings->showSeconds = fTime->ShowSeconds(); settings->showDayOfWeek = fTime->ShowDayOfWeek(); + settings->showTimeZone = fTime->ShowTimeZone(); } diff --git a/src/apps/deskbar/TimeView.cpp b/src/apps/deskbar/TimeView.cpp index b0f86be74b6..0c6d0c8c105 100644 --- a/src/apps/deskbar/TimeView.cpp +++ b/src/apps/deskbar/TimeView.cpp @@ -38,6 +38,7 @@ All rights reserved. #include +#include #include #include #include @@ -55,20 +56,11 @@ static const char* const kMinString = "99:99 AM"; static const float kHMargin = 2.0; -enum { - kShowTime, - kChangeTime, - kHide, - kShowCalendar -}; - - #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "TimeView" -TTimeView::TTimeView(float maxWidth, float height, bool use24HourClock, - bool showSeconds, bool showDayOfWeek) +TTimeView::TTimeView(float maxWidth, float height) : BView(BRect(-100, -100, -90, -90), "_deskbar_tv_", B_FOLLOW_RIGHT | B_FOLLOW_TOP, @@ -77,9 +69,9 @@ TTimeView::TTimeView(float maxWidth, float height, bool use24HourClock, fMaxWidth(maxWidth), fHeight(height), fOrientation(true), - fUse24HourClock(use24HourClock), - fShowSeconds(showSeconds), - fShowDayOfWeek(showDayOfWeek) + fShowSeconds(false), + fShowDayOfWeek(false), + fShowTimeZone(false) { fCurrentTime = fLastTime = time(NULL); fSeconds = fMinute = fHour = 0; @@ -88,7 +80,6 @@ TTimeView::TTimeView(float maxWidth, float height, bool use24HourClock, fLastTimeStr[0] = 0; fLastDateStr[0] = 0; fNeedToUpdate = true; - fLocale = *BLocale::Default(); } @@ -125,7 +116,10 @@ status_t TTimeView::Archive(BMessage* data, bool deep) const { BView::Archive(data, deep); - data->AddBool("seconds", fShowSeconds); + data->AddBool("showSeconds", fShowSeconds); + data->AddBool("showDayOfWeek", fShowDayOfWeek); + data->AddBool("showTimeZone", fShowTimeZone); + data->AddBool("orientation", fOrientation); data->AddInt32("deskbar:private_align", B_ALIGN_RIGHT); return B_OK; @@ -194,13 +188,21 @@ TTimeView::MessageReceived(BMessage* message) { switch (message->what) { case kChangeTime: + { // launch the time prefs app be_roster->Launch("application/x-vnd.Haiku-Time"); + // tell Time preflet to switch to the clock tab + BMessenger messenger("application/x-vnd.Haiku-Time"); + BMessage* switchToClock = new BMessage('SlCk'); + messenger.SendMessage(switchToClock); break; + } case kShowHideTime: - Window()->PostMessage(message, Parent()); + { + be_app->MessageReceived(message); break; + } case kShowCalendar: { @@ -303,46 +305,46 @@ TTimeView::SetOrientation(bool orientation) bool -TTimeView::Use24HourClock() const +TTimeView::ShowSeconds() const { - return fUse24HourClock; + return fShowSeconds; } void -TTimeView::SetUse24HourClock(bool use24HourClock) +TTimeView::SetShowSeconds(bool show) { - fUse24HourClock = use24HourClock; + fShowSeconds = show; Update(); } bool -TTimeView::ShowSeconds() const +TTimeView::ShowDayOfWeek() const { - return fShowSeconds; + return fShowDayOfWeek; } void -TTimeView::SetShowSeconds(bool show) +TTimeView::SetShowDayOfWeek(bool show) { - fShowSeconds = show; + fShowDayOfWeek = show; Update(); } bool -TTimeView::ShowDayOfWeek() const +TTimeView::ShowTimeZone() const { - return fShowDayOfWeek; + return fShowTimeZone; } void -TTimeView::SetShowDayOfWeek(bool show) +TTimeView::SetShowTimeZone(bool show) { - fShowDayOfWeek = show; + fShowTimeZone = show; Update(); } @@ -379,16 +381,17 @@ TTimeView::ShowCalendar(BPoint where) void TTimeView::GetCurrentTime() { - ssize_t offset = 0; + ssize_t offset_dow = 0; + ssize_t offset_time = 0; // ToDo: Check to see if we should write day of week after time for locale if (fShowDayOfWeek) { BString timeFormat("eee "); - offset = fLocale.FormatTime(fCurrentTimeStr, sizeof(fCurrentTimeStr), - fCurrentTime, timeFormat); + offset_dow = fLocale.FormatTime(fCurrentTimeStr, + sizeof(fCurrentTimeStr), fCurrentTime, timeFormat); - if (offset < 0) { + if (offset_dow < 0) { // error occured, attempt to overwrite with current time // (this should not ever happen) fLocale.FormatTime(fCurrentTimeStr, sizeof(fCurrentTimeStr), @@ -398,9 +401,16 @@ TTimeView::GetCurrentTime() } } - fLocale.FormatTime(fCurrentTimeStr + offset, - sizeof(fCurrentTimeStr) - offset, fCurrentTime, + offset_time = fLocale.FormatTime(fCurrentTimeStr + offset_dow, + sizeof(fCurrentTimeStr) - offset_dow, fCurrentTime, fShowSeconds ? B_MEDIUM_TIME_FORMAT : B_SHORT_TIME_FORMAT); + + if (fShowTimeZone) { + BString timeFormat(" V"); + ssize_t offset = offset_dow + offset_time; + fLocale.FormatTime(fCurrentTimeStr + offset, + sizeof(fCurrentTimeStr) - offset, fCurrentTime, timeFormat); + } } @@ -456,7 +466,7 @@ TTimeView::ShowTimeOptions(BPoint point) new BMessage(kChangeTime)); menu->AddItem(item); - item = new BMenuItem(B_TRANSLATE("Hide time"), + item = new BMenuItem(B_TRANSLATE("Hide clock"), new BMessage(kShowHideTime)); menu->AddItem(item); diff --git a/src/apps/deskbar/TimeView.h b/src/apps/deskbar/TimeView.h index f273a108692..129b2021fb0 100644 --- a/src/apps/deskbar/TimeView.h +++ b/src/apps/deskbar/TimeView.h @@ -41,7 +41,28 @@ All rights reserved. #include #include -#include "PreferencesWindow.h" // For message constants + +// open Time preferences +const uint32 kChangeTime = 'ChTm'; + +// pop the calendar +const uint32 kShowCalendar = 'ShCa'; + +// show or hide clock +const uint32 kShowHideTime = 'ShTm'; + +// show seconds +const uint32 kShowSeconds = 'SwSc'; + +// show day of week +const uint32 kShowDayOfWeek = 'SwDw'; + +// show time zone +const uint32 kShowTimeZone = 'SwTz'; + +// get clock settings to send to Time prefs +const uint32 kGetClockSettings = 'GCkS'; + class BCountry; @@ -53,9 +74,7 @@ class _EXPORT TTimeView; class TTimeView : public BView { public: - TTimeView(float maxWidth, float height, - bool use24HourClock, bool showSeconds, - bool showDayOfWeek); + TTimeView(float maxWidth, float height); TTimeView(BMessage* data); ~TTimeView(); @@ -77,15 +96,15 @@ class TTimeView : public BView { bool Orientation() const; void SetOrientation(bool o); - bool Use24HourClock() const; - void SetUse24HourClock(bool use24HourClock); - bool ShowSeconds() const; void SetShowSeconds(bool show); bool ShowDayOfWeek() const; void SetShowDayOfWeek(bool show); + bool ShowTimeZone() const; + void SetShowTimeZone(bool show); + void ShowCalendar(BPoint where); private: @@ -116,9 +135,12 @@ class TTimeView : public BView { float fHeight; bool fOrientation; // vertical = true + bool fOverrideLocale; bool fUse24HourClock; bool fShowSeconds; bool fShowDayOfWeek; + bool fShowTimeZone; + BString fTimeFormat; BPoint fTimeLocation; diff --git a/src/preferences/locale/FormatSettingsView.cpp b/src/preferences/locale/FormatSettingsView.cpp index 2ea8cd4d59c..0dc5f6bd5b6 100644 --- a/src/preferences/locale/FormatSettingsView.cpp +++ b/src/preferences/locale/FormatSettingsView.cpp @@ -258,12 +258,27 @@ void FormatSettingsView::MessageReceived(BMessage* message) { switch (message->what) { + case B_LOCALE_CHANGED: + { + // Time updated 12/24 hour clock + BFormattingConventions conventions; + BLocale::Default()->GetFormattingConventions(&conventions); + if (conventions.Use24HourClock()) + f24HourRadioButton->SetValue(B_CONTROL_ON); + else + f12HourRadioButton->SetValue(B_CONTROL_ON); + + _UpdateExamples(); + Window()->PostMessage(kMsgSettingsChanged); + break; + } + case kClockFormatChange: { BFormattingConventions conventions; BLocale::Default()->GetFormattingConventions(&conventions); conventions.SetExplicitUse24HourClock( - f24HourRadioButton->Value() ? true : false); + f24HourRadioButton->Value() == B_CONTROL_ON); MutableLocaleRoster::Default()->SetDefaultFormattingConventions( conventions); diff --git a/src/preferences/locale/LocalePreflet.cpp b/src/preferences/locale/LocalePreflet.cpp index d71b26be725..65eb3003f17 100644 --- a/src/preferences/locale/LocalePreflet.cpp +++ b/src/preferences/locale/LocalePreflet.cpp @@ -65,6 +65,11 @@ void LocalePreflet::MessageReceived(BMessage* message) { switch (message->what) { + case B_LOCALE_CHANGED: + BLocaleRoster::Default()->Refresh(); + fLocaleWindow->PostMessage(message); + break; + case kMsgRestartTrackerAndDeskbar: if (message->FindInt32("which") == 1) { _RestartApp("application/x-vnd.Be-TRAK"); diff --git a/src/preferences/locale/LocaleWindow.cpp b/src/preferences/locale/LocaleWindow.cpp index 97933bd6e31..2a6b4efce2a 100644 --- a/src/preferences/locale/LocaleWindow.cpp +++ b/src/preferences/locale/LocaleWindow.cpp @@ -295,6 +295,10 @@ void LocaleWindow::MessageReceived(BMessage* message) { switch (message->what) { + case B_LOCALE_CHANGED: + fFormatView->MessageReceived(message); + break; + case kMsgDefaults: _Defaults(); break; @@ -478,8 +482,7 @@ LocaleWindow::Show() void LocaleWindow::_SettingsChanged() { - bool haveAnythingToRevert = fFormatView->IsReversible() || _IsReversible(); - fRevertButton->SetEnabled(haveAnythingToRevert); + fRevertButton->SetEnabled(fFormatView->IsReversible() || _IsReversible()); } diff --git a/src/preferences/time/ClockView.cpp b/src/preferences/time/ClockView.cpp new file mode 100644 index 00000000000..8c51c675a1f --- /dev/null +++ b/src/preferences/time/ClockView.cpp @@ -0,0 +1,227 @@ +/* + * Copyright 2004-2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * John Scipione + */ + +#include "ClockView.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TimeMessages.h" + + +static const char* kDeskbarSignature = "application/x-vnd.Be-TSKB"; + +static const float kIndentSpacing + = be_control_look->DefaultItemSpacing() * 2.3; + + +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "Time" + + +ClockView::ClockView(const char* name) + : + BView(name, 0), + fCachedShowClock(B_CONTROL_ON), + fCachedShowSeconds(B_CONTROL_OFF), + fCachedShowDayOfWeek(B_CONTROL_OFF), + fCachedShowTimeZone(B_CONTROL_OFF) +{ + fShowClock = new BCheckBox(B_TRANSLATE("Show clock in Deskbar"), + new BMessage(kShowHideTime)); + fShowSeconds = new BCheckBox(B_TRANSLATE("Display time with seconds"), + new BMessage(kShowSeconds)); + fShowDayOfWeek = new BCheckBox(B_TRANSLATE("Show day of week"), + new BMessage(kShowDayOfWeek)); + fShowTimeZone = new BCheckBox(B_TRANSLATE("Show time zone"), + new BMessage(kShowTimeZone)); + + BView* view = BLayoutBuilder::Group<>(B_VERTICAL, 0) + .Add(fShowSeconds) + .Add(fShowDayOfWeek) + .Add(fShowTimeZone) + .AddGlue() + .SetInsets(B_USE_DEFAULT_SPACING) + .View(); + + BBox* showClockBox = new BBox("show clock box"); + showClockBox->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, B_ALIGN_TOP)); + showClockBox->SetLabel(fShowClock); + showClockBox->AddChild(view); + + BLayoutBuilder::Group<>(this) + .AddGroup(B_VERTICAL, 0) + .Add(showClockBox) + .End() + .SetInsets(B_USE_DEFAULT_SPACING); +} + + +ClockView::~ClockView() +{ +} + + +void +ClockView::AttachedToWindow() +{ + if (Parent()) + SetViewColor(Parent()->ViewColor()); + + fShowClock->SetTarget(this); + fShowSeconds->SetTarget(this); + fShowDayOfWeek->SetTarget(this); + fShowTimeZone->SetTarget(this); + + // Disable these controls initially, they'll be enabled + // when we get a response from Deskbar. + fShowClock->SetEnabled(false); + fShowSeconds->SetEnabled(false); + fShowDayOfWeek->SetEnabled(false); + fShowTimeZone->SetEnabled(false); + + // Ask Deskbar for current clock settings, it will reply + // asynchronously in MesssageReceived() below. + BMessenger* messenger = new BMessenger(kDeskbarSignature); + BMessenger replyMessenger(this); + BMessage* message = new BMessage(kGetClockSettings); + messenger->SendMessage(message, replyMessenger); +} + + +void +ClockView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kGetClockSettings: + { + // Get current clock settings from Deskbar + bool showClock; + bool showSeconds; + bool showDayOfWeek; + bool showTimeZone; + + if (message->FindBool("showSeconds", &showSeconds) == B_OK) { + fCachedShowSeconds = showSeconds + ? B_CONTROL_ON : B_CONTROL_OFF; + fShowSeconds->SetValue(fCachedShowSeconds); + fShowSeconds->SetEnabled(true); + } + + if (message->FindBool("showDayOfWeek", &showDayOfWeek) == B_OK) { + fCachedShowDayOfWeek = showDayOfWeek + ? B_CONTROL_ON : B_CONTROL_OFF; + fShowDayOfWeek->SetValue(fCachedShowDayOfWeek); + fShowDayOfWeek->SetEnabled(true); + } + + if (message->FindBool("showTimeZone", &showTimeZone) == B_OK) { + fCachedShowTimeZone = showTimeZone + ? B_CONTROL_ON : B_CONTROL_OFF; + fShowTimeZone->SetValue(fCachedShowTimeZone); + fShowTimeZone->SetEnabled(true); + } + + // do this one last because it might disable the others + if (message->FindBool("showClock", &showClock) == B_OK) { + fCachedShowClock = showClock ? B_CONTROL_ON : B_CONTROL_OFF; + fShowClock->SetValue(fCachedShowClock); + fShowClock->SetEnabled(true); + fShowSeconds->SetEnabled(showClock); + fShowDayOfWeek->SetEnabled(showClock); + fShowTimeZone->SetEnabled(showClock); + } + break; + } + + case kShowHideTime: + { + bool showClock; + if (message->FindBool("showClock", &showClock) == B_OK) { + // message originated from Deskbar, handle special + fShowClock->SetValue(showClock ? B_CONTROL_ON : B_CONTROL_OFF); + fShowSeconds->SetEnabled(showClock); + fShowDayOfWeek->SetEnabled(showClock); + fShowTimeZone->SetEnabled(showClock); + + Window()->PostMessage(kMsgChange); + break; + // don't fall through + } + showClock = fShowClock->Value() == B_CONTROL_ON; + fShowSeconds->SetEnabled(showClock); + fShowDayOfWeek->SetEnabled(showClock); + fShowTimeZone->SetEnabled(showClock); + } + // fall-through + case kShowSeconds: + case kShowDayOfWeek: + case kShowTimeZone: + { + BMessenger* messenger = new BMessenger(kDeskbarSignature); + messenger->SendMessage(message); + + Window()->PostMessage(kMsgChange); + + break; + } + + case kMsgRevert: + _Revert(); + break; + + default: + BView::MessageReceived(message); + break; + } +} + + +bool +ClockView::CheckCanRevert() +{ + return fShowClock->Value() != fCachedShowClock + || fShowSeconds->Value() != fCachedShowSeconds + || fShowDayOfWeek->Value() != fCachedShowDayOfWeek + || fShowTimeZone->Value() != fCachedShowTimeZone; +} + + +void +ClockView::_Revert() +{ + if (fShowClock->Value() != fCachedShowClock) { + fShowClock->SetValue(fCachedShowClock); + fShowClock->Invoke(); + } + + if (fShowSeconds->Value() != fCachedShowSeconds) { + fShowSeconds->SetValue(fCachedShowSeconds); + fShowSeconds->Invoke(); + } + + if (fShowDayOfWeek->Value() != fCachedShowDayOfWeek) { + fShowDayOfWeek->SetValue(fCachedShowDayOfWeek); + fShowDayOfWeek->Invoke(); + } + + if (fShowTimeZone->Value() != fCachedShowTimeZone) { + fShowTimeZone->SetValue(fCachedShowTimeZone); + fShowTimeZone->Invoke(); + } +} diff --git a/src/preferences/time/ClockView.h b/src/preferences/time/ClockView.h new file mode 100644 index 00000000000..d5a6e6502de --- /dev/null +++ b/src/preferences/time/ClockView.h @@ -0,0 +1,44 @@ +/* + * Copyright 2004-2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * John Scipione + */ +#ifndef _CLOCK_VIEW_H +#define _CLOCK_VIEW_H + + +#include + + +class BCheckBox; +class BRadioButton; + + +class ClockView : public BView { +public: + ClockView(const char* name); + virtual ~ClockView(); + + virtual void AttachedToWindow(); + virtual void MessageReceived(BMessage* message); + + bool CheckCanRevert(); + +private: + void _Revert(); + + BCheckBox* fShowClock; + BCheckBox* fShowSeconds; + BCheckBox* fShowDayOfWeek; + BCheckBox* fShowTimeZone; + + int32 fCachedShowClock; + int32 fCachedShowSeconds; + int32 fCachedShowDayOfWeek; + int32 fCachedShowTimeZone; +}; + + +#endif // _CLOCK_VIEW_H diff --git a/src/preferences/time/Jamfile b/src/preferences/time/Jamfile index 43e27b08286..aa7154fca1c 100644 --- a/src/preferences/time/Jamfile +++ b/src/preferences/time/Jamfile @@ -9,6 +9,7 @@ local sources = AnalogClock.cpp BaseView.cpp Bitmaps.cpp + ClockView.cpp DateTimeEdit.cpp SectionEdit.cpp DateTimeView.cpp diff --git a/src/preferences/time/Time.cpp b/src/preferences/time/Time.cpp index 10c462df037..21a65eabd5b 100644 --- a/src/preferences/time/Time.cpp +++ b/src/preferences/time/Time.cpp @@ -20,6 +20,7 @@ #include #include "NetworkTimeView.h" +#include "TimeMessages.h" #include "TimeWindow.h" @@ -64,6 +65,22 @@ TimeApplication::AboutRequested() } +void +TimeApplication::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kSelectClockTab: + case kShowHideTime: + fWindow->PostMessage(message); + break; + + default: + BApplication::MessageReceived(message); + break; + } +} + + int main(int argc, char** argv) { diff --git a/src/preferences/time/Time.h b/src/preferences/time/Time.h index a0af8e0bed0..99ab955a81e 100644 --- a/src/preferences/time/Time.h +++ b/src/preferences/time/Time.h @@ -14,6 +14,7 @@ #include +class BMessage; class TTimeWindow; @@ -25,6 +26,8 @@ class TimeApplication : public BApplication { virtual void ReadyToRun(); virtual void AboutRequested(); + virtual void MessageReceived(BMessage* message); + private: TTimeWindow* fWindow; }; diff --git a/src/preferences/time/TimeMessages.h b/src/preferences/time/TimeMessages.h index 51a54401899..73206cf4409 100644 --- a/src/preferences/time/TimeMessages.h +++ b/src/preferences/time/TimeMessages.h @@ -49,5 +49,23 @@ const uint32 kMsgChange = 'chng'; // change time finished const uint32 kChangeTimeFinished = 'tcfi'; +// show or hide Deskbar clock +const uint32 kShowHideTime = 'ShTm'; + +// show seconds +const uint32 kShowSeconds = 'SwSc'; + +// show day of week +const uint32 kShowDayOfWeek = 'SwDw'; + +// show time zone +const uint32 kShowTimeZone = 'SwTz'; + +// get clock settings from Deskbar +const uint32 kGetClockSettings = 'GCkS'; + +// bring the clock tab to front +const uint32 kSelectClockTab = 'SlCk'; + #endif // _TIME_MESSAGES_H diff --git a/src/preferences/time/TimeWindow.cpp b/src/preferences/time/TimeWindow.cpp index 2c7c6e48d2d..8d2e6415ba4 100644 --- a/src/preferences/time/TimeWindow.cpp +++ b/src/preferences/time/TimeWindow.cpp @@ -19,6 +19,7 @@ #include #include "BaseView.h" +#include "ClockView.h" #include "DateTimeView.h" #include "NetworkTimeView.h" #include "TimeMessages.h" @@ -79,6 +80,7 @@ TTimeWindow::MessageReceived(BMessage* message) fDateTimeView->MessageReceived(message); fTimeZoneView->MessageReceived(message); fNetworkTimeView->MessageReceived(message); + fClockView->MessageReceived(message); fRevertButton->SetEnabled(false); break; @@ -92,6 +94,15 @@ TTimeWindow::MessageReceived(BMessage* message) _SetRevertStatus(); break; + case kSelectClockTab: + // focus the clock tab (last one) + fTabView->Select(fTabView->CountTabs() - 1); + break; + + case kShowHideTime: + fClockView->MessageReceived(message); + break; + default: BWindow::MessageReceived(message); break; @@ -107,17 +118,19 @@ TTimeWindow::_InitWindow() fDateTimeView = new DateTimeView(B_TRANSLATE("Date and time")); fTimeZoneView = new TimeZoneView(B_TRANSLATE("Time zone")); fNetworkTimeView = new NetworkTimeView(B_TRANSLATE("Network time")); + fClockView = new ClockView(B_TRANSLATE("Clock")); fBaseView = new TTimeBaseView("baseView"); fBaseView->StartWatchingAll(fDateTimeView); fBaseView->StartWatchingAll(fTimeZoneView); - BTabView* tabView = new BTabView("tabView"); - tabView->AddTab(fDateTimeView); - tabView->AddTab(fTimeZoneView); - tabView->AddTab(fNetworkTimeView); + fTabView = new BTabView("tabView"); + fTabView->AddTab(fDateTimeView); + fTabView->AddTab(fTimeZoneView); + fTabView->AddTab(fNetworkTimeView); + fTabView->AddTab(fClockView); - fBaseView->AddChild(tabView); + fBaseView->AddChild(fTabView); fRevertButton = new BButton("revert", B_TRANSLATE("Revert"), new BMessage(kMsgRevert)); @@ -166,5 +179,6 @@ TTimeWindow::_SetRevertStatus() { fRevertButton->SetEnabled(fDateTimeView->CheckCanRevert() || fTimeZoneView->CheckCanRevert() - || fNetworkTimeView->CheckCanRevert()); + || fNetworkTimeView->CheckCanRevert() + || fClockView->CheckCanRevert()); } diff --git a/src/preferences/time/TimeWindow.h b/src/preferences/time/TimeWindow.h index 55ef884ffbe..46af79ec638 100644 --- a/src/preferences/time/TimeWindow.h +++ b/src/preferences/time/TimeWindow.h @@ -14,10 +14,12 @@ class BMessage; +class BTabView; +class ClockView; class DateTimeView; -class TTimeBaseView; -class TimeZoneView; class NetworkTimeView; +class TimeZoneView; +class TTimeBaseView; class TTimeWindow : public BWindow { @@ -35,9 +37,13 @@ class TTimeWindow : public BWindow { void _SetRevertStatus(); TTimeBaseView* fBaseView; + + BTabView* fTabView; DateTimeView* fDateTimeView; TimeZoneView* fTimeZoneView; NetworkTimeView* fNetworkTimeView; + ClockView* fClockView; + BButton* fRevertButton; };