From 3f9abddf33132d2e4c340b21cd5e8579f13113cc Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Fri, 29 Aug 2008 19:31:13 +0000 Subject: [PATCH] * Reuse calendar from shared to have a bitmore advanced panel while holding down the mouse over the date area in Deskbar. One probably needs to clean and rebuild Deskbar to get it... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27236 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/deskbar/CalendarMenuWindow.cpp | 262 ++++++++++++++++++++++++ src/apps/deskbar/CalendarMenuWindow.h | 45 ++++ src/apps/deskbar/Jamfile | 17 +- src/apps/deskbar/TimeView.cpp | 56 +++-- 4 files changed, 364 insertions(+), 16 deletions(-) create mode 100644 src/apps/deskbar/CalendarMenuWindow.cpp create mode 100644 src/apps/deskbar/CalendarMenuWindow.h diff --git a/src/apps/deskbar/CalendarMenuWindow.cpp b/src/apps/deskbar/CalendarMenuWindow.cpp new file mode 100644 index 0000000000..024d6b6209 --- /dev/null +++ b/src/apps/deskbar/CalendarMenuWindow.cpp @@ -0,0 +1,262 @@ +/* + * Copyright Karsten Heimrich, host.haiku@gmx.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#include "CalendarMenuWindow.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using BPrivate::BCalendarView; +using BPrivate::B_LOCAL_TIME; +using BPrivate::B_WEEK_START_SUNDAY; +using BPrivate::B_WEEK_START_MONDAY; + + +// #pragma mark -- FlatButton + + +class FlatButton : public BButton { +public: + FlatButton(const BString& label, uint32 what) + : BButton(label.String(), new BMessage(what)) {} + virtual ~FlatButton() {} + + virtual void Draw(BRect updateRect); +}; + + +void +FlatButton::Draw(BRect updateRect) +{ + updateRect = Bounds(); + rgb_color highColor = HighColor(); + + SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + FillRect(updateRect); + + font_height fh; + GetFontHeight(&fh); + + const char* label = Label(); + const float stringWidth = StringWidth(label); + const float x = (updateRect.right - stringWidth) / 2.0f; + const float labelY = updateRect.top + + ((updateRect.Height() - fh.ascent - fh.descent) / 2.0f) + + fh.ascent + 1.0f; + + SetHighColor(highColor); + DrawString(label, BPoint(x, labelY)); + + if (IsFocus()) { + SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR)); + StrokeRect(updateRect); + } +} + + +// #pragma mark -- CalendarMenuWindow + + +enum { + kInvokationMessage, + kMonthDownMessage, + kMonthUpMessage, + kYearDownMessage, + kYearUpMessage +}; + + +CalendarMenuWindow::CalendarMenuWindow(BPoint where, bool euroDate) + : BWindow(BRect(0.0, 0.0, 100.0, 130.0), "", B_BORDERED_WINDOW, + B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS | B_CLOSE_ON_ESCAPE), + fYearLabel(NULL), + fMonthLabel(NULL), + fCalendarView(NULL), + fSuppressFirstClose(true) +{ + AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); + + fYearLabel = new BStringView("year", ""); + fYearLabel->SetFontSize(10.0); + + fMonthLabel = new BStringView("month", ""); + fMonthLabel->SetFontSize(10.0); + + fCalendarView = new BCalendarView(Bounds(), "calendar", + euroDate ? B_WEEK_START_MONDAY : B_WEEK_START_SUNDAY, B_FOLLOW_ALL); + fCalendarView->SetInvocationMessage(new BMessage(kInvokationMessage)); + fCalendarView->SetFontSize(10.0); + + BGroupLayout *layout = new BGroupLayout(B_HORIZONTAL); + SetLayout(layout); + + float width, height; + fMonthLabel->GetPreferredSize(&width, &height); + + BGridLayout* gridLayout = BGridLayoutBuilder(5.0) + .Add(_SetupButton("-", kMonthDownMessage, height), 0, 0) + .Add(fMonthLabel, 1, 0) + .Add(_SetupButton("+", kMonthUpMessage, height), 2, 0) + .Add(BSpaceLayoutItem::CreateGlue(), 3, 0) + .Add(_SetupButton("-", kYearDownMessage, height), 4, 0) + .Add(fYearLabel, 5, 0) + .Add(_SetupButton("+", kYearUpMessage, height), 6, 0) + .SetInsets(5.0, 0.0, 5.0, 0.0); + gridLayout->SetMinColumnWidth(1, be_plain_font->StringWidth("September")); + + BGroupView* groupView = new BGroupView(B_VERTICAL, 10.0); + BView* view = BGroupLayoutBuilder(B_VERTICAL, 5.0) + .Add(gridLayout->View()) + .Add(fCalendarView) + .SetInsets(5.0, 5.0, 5.0, 5.0); + groupView->AddChild(view); + AddChild(groupView); + + MoveTo(where); + _UpdateUi(BDate::CurrentDate(B_LOCAL_TIME)); +} + + +CalendarMenuWindow::~CalendarMenuWindow() +{ +} + + +void +CalendarMenuWindow::Show() +{ + BRect screen(BScreen().Frame()); + + float right = screen.right; + float bottom = screen.bottom; + + BRect rightTop(right / 2.0, screen.top, right, bottom / 2.0); + BRect rightBottom(right / 2.0, bottom / 2.0, right + 1.0, bottom + 1.0); + BRect leftBottom(screen.left, bottom / 2.0, right / 2.0, bottom + 1.0); + + BPoint where = Frame().LeftTop(); + BSize size = GetLayout()->PreferredSize(); + + if (rightTop.Contains(where)) { + where.x -= size.width; + } else if (leftBottom.Contains(where)) { + where.y -= (size.height + 4.0); + } else if (rightBottom.Contains(where)) { + where.x -= size.width; + where.y -= (size.height + 4.0); + } + + MoveTo(where); + fCalendarView->MakeFocus(true); + + BWindow::Show(); +} + + +void +CalendarMenuWindow::WindowActivated(bool active) +{ + if (active) + return; + + if (mouse_mode() == 0) { + if (!active) + PostMessage(B_QUIT_REQUESTED); + } else { + if (fSuppressFirstClose && !active) { + fSuppressFirstClose = false; return; + } + + if (!fSuppressFirstClose && !active) + PostMessage(B_QUIT_REQUESTED); + } +} + + +void +CalendarMenuWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kInvokationMessage: { + int32 day, month, year; + message->FindInt32("day", &day); + message->FindInt32("month", &month); + message->FindInt32("year", &year); + + _UpdateUi(BDate(year, month, day)); + } break; + + case kMonthDownMessage: { + case kMonthUpMessage: + BDate date = fCalendarView->Date(); + + int32 day = date.Day(); + int32 year = date.Year(); + int32 month = date.Month(); + + month += (kMonthDownMessage == message->what) ? -1 : 1; + if (month < 1) { + year--; + month = 12; + } else if (month > 12) { + year++; + month = 1; + } + date.SetDate(year, month, day); + + if (day > date.DaysInMonth()) + day = date.DaysInMonth(); + + _UpdateUi(BDate(year, month, day)); + } break; + + case kYearDownMessage: { + case kYearUpMessage: + BDate date = fCalendarView->Date(); + int32 i = kYearDownMessage == message->what ? -1 : 1; + _UpdateUi(BDate(date.Year() + i, date.Month(), date.Day())); + } break; + + default: { + BWindow::MessageReceived(message); + } break; + } +} + + +void +CalendarMenuWindow::_UpdateUi(const BDate& date) +{ + if (!date.IsValid()) + return; + + fCalendarView->SetDate(date); + + BString text; + text << date.Year(); + fYearLabel->SetText(text.String()); + + fMonthLabel->SetText(date.LongMonthName(date.Month()).String()); +} + + +BButton* +CalendarMenuWindow::_SetupButton(const char* label, uint32 what, float height) +{ + FlatButton* button = new FlatButton(label, what); + button->SetExplicitMinSize(BSize(height, height)); + button->SetFontSize(10.0); + + return button; +} diff --git a/src/apps/deskbar/CalendarMenuWindow.h b/src/apps/deskbar/CalendarMenuWindow.h new file mode 100644 index 0000000000..2279c36c8c --- /dev/null +++ b/src/apps/deskbar/CalendarMenuWindow.h @@ -0,0 +1,45 @@ +/* + * Copyright Karsten Heimrich, host.haiku@gmx.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _CALENDAR_MENU_WINDOW_H_ +#define _CALENDAR_MENU_WINDOW_H_ + + +#include +#include + + +class BMessage; +class BStringView; + + +namespace BPrivate { + class BCalendarView; +} +using BPrivate::BCalendarView; +using BPrivate::BDate; + + +class CalendarMenuWindow : public BWindow { +public: + CalendarMenuWindow(BPoint where, bool euroDate); + virtual ~CalendarMenuWindow(); + + virtual void Show(); + virtual void WindowActivated(bool active); + virtual void MessageReceived(BMessage* message); + +private: + void _UpdateUi(const BDate& date); + BButton* _SetupButton(const char* label, uint32 what, float height); + +private: + BStringView* fYearLabel; + BStringView* fMonthLabel; + BCalendarView* fCalendarView; + bool fSuppressFirstClose; +}; + + +#endif // _CALENDAR_MENU_WINDOW_H_ diff --git a/src/apps/deskbar/Jamfile b/src/apps/deskbar/Jamfile index 943534205b..22ab22092a 100644 --- a/src/apps/deskbar/Jamfile +++ b/src/apps/deskbar/Jamfile @@ -11,8 +11,18 @@ AddResources Deskbar : Deskbar.rdef icon-freelogo.rdef icons.rdef ; SubDirC++Flags -DDB_ADDONS -DOPEN_TRACKER=1 -D_INCLUDES_CLASS_DEVICE_MAP=1 -D_SUPPORTS_RESOURCES=1 - -D_SUPPORTS_FEATURE_SCRIPTING=1 - -D_SHOW_CALENDAR_MENU_ITEM=1 ; + -D_SUPPORTS_FEATURE_SCRIPTING=1 ; + +local targetLib ; +local targetSource ; + +if $(TARGET_PLATFORM) = haiku { +targetLib = libshared.a ; +targetSource = CalendarMenuWindow.cpp ; +SubDirC++Flags -D_SHOW_CALENDAR_MENU_WINDOW=1 ; +} else { +SubDirC++Flags -D_SHOW_CALENDAR_MENU_ITEM=1 ; +} Application Deskbar : BarApp.cpp @@ -34,7 +44,8 @@ Application Deskbar : WindowMenuItem.cpp ResourceSet.cpp Switcher.cpp - : be tracker + $(targetSource) + : be tracker $(targetLib) ; if $(TARGET_PLATFORM) = libbe_test { diff --git a/src/apps/deskbar/TimeView.cpp b/src/apps/deskbar/TimeView.cpp index 48220826b3..0c1ac3613f 100644 --- a/src/apps/deskbar/TimeView.cpp +++ b/src/apps/deskbar/TimeView.cpp @@ -39,6 +39,10 @@ All rights reserved. # include "CalendarMenuItem.h" #endif +#ifdef _SHOW_CALENDAR_MENU_WINDOW +# include "CalendarMenuWindow.h" +#endif + #include #include #include @@ -157,7 +161,7 @@ void TTimeView::GetPreferredSize(float *width, float *height) { *height = fHeight; - + GetCurrentTime(); GetCurrentDate(); @@ -166,13 +170,13 @@ TTimeView::GetPreferredSize(float *width, float *height) // overlap the bevels in the parent view. if (ShowingDate()) *width = fOrientation ? - min_c(fMaxWidth - kHMargin, kHMargin + StringWidth(fDateStr)) - : kHMargin + StringWidth(fDateStr); - else { + min_c(fMaxWidth - kHMargin, kHMargin + StringWidth(fDateStr)) + : kHMargin + StringWidth(fDateStr); + else { *width = fOrientation ? min_c(fMaxWidth - kHMargin, kHMargin + StringWidth(fTimeStr)) - : kHMargin + StringWidth(fTimeStr); - } + : kHMargin + StringWidth(fTimeStr); + } } @@ -358,6 +362,32 @@ TTimeView::MouseDown(BPoint point) return; } + snooze(15000); + } +#elif _SHOW_CALENDAR_MENU_WINDOW + bigtime_t startTime = system_time(); + + // use the doubleClickSpeed as a treshold + bigtime_t doubleClickSpeed; + get_click_speed(&doubleClickSpeed); + + while (buttons) { + BPoint where; + GetMouse(&where, &buttons, false); + + if ((system_time() - startTime) > doubleClickSpeed) { + where.y = Bounds().bottom + 4.0; + ConvertToScreen(&where); + + if (where.y >= BScreen().Frame().bottom) + where.y -= (Bounds().Height() + 4.0); + + CalendarMenuWindow* window = new CalendarMenuWindow(where, fEuroDate); + window->Show(); + + return; + } + snooze(15000); } #endif @@ -402,7 +432,7 @@ TTimeView::Pulse() Draw(Bounds()); fNeedToUpdate = false; - } + } } @@ -489,22 +519,22 @@ TTimeView::CalculateTextPlacement() BRect bounds(Bounds()); fDateLocation.x = 0.0; - fTimeLocation.x = 0.0; - + fTimeLocation.x = 0.0; + BFont font; - GetFont(&font); + GetFont(&font); const char* stringArray[1]; stringArray[0] = fTimeStr; BRect rectArray[1]; escapement_delta delta = { 0.0, 0.0 }; font.GetBoundingBoxesForStrings(stringArray, 1, B_SCREEN_METRIC, &delta, rectArray); - + fTimeLocation.y = fDateLocation.y = ceilf((bounds.Height() - - rectArray[0].Height() + 1.0) / 2.0 - rectArray[0].top); + rectArray[0].Height() + 1.0) / 2.0 - rectArray[0].top); } - + void TTimeView::ShowClockOptions(BPoint point) {