[haiku-commits] haiku: hrev56119 - src/preferences/time src/kits/shared headers/private/shared

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 20 May 2022 05:19:09 +0000 (UTC)

hrev56119 adds 1 changeset to branch 'master'
old head: f43b88e836b71ac9c5ec77c42dd7bb0717578a6f
new head: cc9bc8c6fb17d7de5dab0cd5d14c2f08f6b23487
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=cc9bc8c6fb17+%5Ef43b88e836b7

----------------------------------------------------------------------------

cc9bc8c6fb17: Move DateTimeEdit into libshared
  
  BInvoker methods are now used, and input-handling is also tweaked.
  
  Change-Id: I120cca8df9f11c11aac80911108d62fb49488f8f
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/4927
  Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>
  Reviewed-by: Jérôme Duval <jerome.duval@xxxxxxxxx>

                                        [ Jaidyn Ann <jadedctrl@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev56119
Commit:      cc9bc8c6fb17d7de5dab0cd5d14c2f08f6b23487
URL:         https://git.haiku-os.org/haiku/commit/?id=cc9bc8c6fb17
Author:      Jaidyn Ann <jadedctrl@xxxxxxxxx>
Date:        Sun Feb  2 19:41:10 2003 UTC
Committer:   Jérôme Duval <jerome.duval@xxxxxxxxx>
Commit-Date: Fri May 20 05:19:05 2022 UTC

----------------------------------------------------------------------------

8 files changed, 449 insertions(+), 470 deletions(-)
.../private/shared}/DateTimeEdit.h               |  89 +++-
.../time => kits/shared}/DateTimeEdit.cpp        | 466 ++++++++++++++-----
src/kits/shared/Jamfile                          |   1 +
src/preferences/time/DateTimeView.cpp            |   8 +-
src/preferences/time/DateTimeView.h              |  10 +-
src/preferences/time/Jamfile                     |   2 -
src/preferences/time/SectionEdit.cpp             | 270 -----------
src/preferences/time/SectionEdit.h               |  73 ---

----------------------------------------------------------------------------

diff --git a/src/preferences/time/DateTimeEdit.h 
b/headers/private/shared/DateTimeEdit.h
similarity index 54%
rename from src/preferences/time/DateTimeEdit.h
rename to headers/private/shared/DateTimeEdit.h
index b3ae28765c..4c3c95531f 100644
--- a/src/preferences/time/DateTimeEdit.h
+++ b/headers/private/shared/DateTimeEdit.h
@@ -11,20 +11,78 @@
 #ifndef _DATE_TIME_EDIT_H
 #define _DATE_TIME_EDIT_H
 
-
+#include <Control.h>
 #include <DateFormat.h>
 #include <DateTime.h>
 #include <Locale.h>
 #include <String.h>
 #include <TimeFormat.h>
 
-#include "SectionEdit.h"
+class BBitmap;
+class BList;
+
 
+namespace BPrivate {
 
-class TTimeEdit : public TSectionEdit {
+
+class SectionEdit : public BControl {
 public:
-                                                               TTimeEdit(const 
char* name,     uint32 sections);
-       virtual                                         ~TTimeEdit();
+                                                               
SectionEdit(const char* name,
+                                                                               
        uint32 sections, BMessage* message);
+       virtual                                         ~SectionEdit();
+
+       virtual void                            AttachedToWindow();
+       virtual void                            Draw(BRect updateRect);
+       virtual void                            MouseDown(BPoint point);
+       virtual void                            MakeFocus(bool focused = true);
+       virtual void                            KeyDown(const char* bytes, 
int32 numBytes);
+
+                       BSize                           MaxSize();
+                       BSize                           MinSize();
+                       BSize                           PreferredSize();
+
+                       uint32                          CountSections() const;
+                       int32                           FocusIndex() const;
+                       BRect                           SectionArea() const;
+
+       virtual status_t                        Invoke(BMessage* message = 
NULL);
+
+protected:
+       virtual void                            DrawBorder(const BRect& 
updateRect);
+       virtual void                            DrawSection(uint32 index, BRect 
bounds,
+                                                                       bool 
isFocus) {}
+       virtual void                            DrawSeparator(uint32 index, 
BRect bounds) {}
+
+                       BRect                           FrameForSection(uint32 
index);
+                       BRect                           
FrameForSeparator(uint32 index);
+
+       virtual void                            SectionFocus(uint32 index) {}
+       virtual void                            SectionChange(uint32 index, 
uint32 value) {}
+       virtual void                            SetSections(BRect area) {}
+
+       virtual float                           SeparatorWidth() = 0;
+       virtual float                           MinSectionWidth() = 0;
+       virtual float                           PreferredHeight() = 0;
+
+       virtual void                            DoUpPress() {}
+       virtual void                            DoDownPress() {}
+
+       virtual void                            PopulateMessage(BMessage* 
message) = 0;
+
+                       BRect                           fUpRect;
+                       BRect                           fDownRect;
+
+                       int32                           fFocus;
+                       uint32                          fSectionCount;
+                       uint32                          fHoldValue;
+};
+
+
+class TimeEdit : public SectionEdit {
+public:
+                                                               TimeEdit(const 
char* name,      uint32 sections,
+                                                                               
BMessage* message);
+       virtual                                         ~TimeEdit();
 
        virtual void                            KeyDown(const char* bytes, 
int32 numBytes);
 
@@ -41,9 +99,10 @@ public:
        virtual void                            DoUpPress();
        virtual void                            DoDownPress();
 
-       virtual void                            BuildDispatch(BMessage* 
message);
+       virtual void                            PopulateMessage(BMessage* 
message);
 
                        void                            SetTime(int32 hour, 
int32 minute, int32 second);
+                       BTime                           GetTime();
 
 private:
                        void                            _UpdateFields();
@@ -66,10 +125,11 @@ private:
 };
 
 
-class TDateEdit : public TSectionEdit {
+class DateEdit : public SectionEdit {
 public:
-                                                               TDateEdit(const 
char* name, uint32 sections);
-       virtual                                         ~TDateEdit();
+                                                               DateEdit(const 
char* name, uint32 sections,
+                                                                               
BMessage* message);
+       virtual                                         ~DateEdit();
        virtual void                            KeyDown(const char* bytes, 
int32 numBytes);
 
        virtual void                            InitView();
@@ -85,17 +145,18 @@ public:
        virtual void                            DoUpPress();
        virtual void                            DoDownPress();
 
-       virtual void                            BuildDispatch(BMessage* 
message);
-       
+       virtual void                            PopulateMessage(BMessage* 
message);
+
 
                        void                            SetDate(int32 year, 
int32 month, int32 day);
+                       BDate                           GetDate();
 
 private:
                        void                            _UpdateFields();
                        void                            _CheckRange();
                        bool                            
_IsValidDoubleDigit(int32 value);
                        int32                           _SectionValue(int32 
index) const;
-                       
+
                        BDate                           fDate;
                        BDateFormat                     fDateFormat;
                        bigtime_t                       fLastKeyDownTime;
@@ -111,5 +172,7 @@ private:
 };
 
 
-#endif // _DATE_TIME_EDIT_H
+}      // namespace BPrivate
+
 
+#endif // _DATE_TIME_EDIT_H
diff --git a/src/preferences/time/DateTimeEdit.cpp 
b/src/kits/shared/DateTimeEdit.cpp
similarity index 59%
rename from src/preferences/time/DateTimeEdit.cpp
rename to src/kits/shared/DateTimeEdit.cpp
index 440895ef0a..86cb629daf 100644
--- a/src/preferences/time/DateTimeEdit.cpp
+++ b/src/kits/shared/DateTimeEdit.cpp
@@ -16,19 +16,24 @@
 
 #include <stdlib.h>
 
+#include <ControlLook.h>
 #include <DateFormat.h>
+#include <LayoutUtils.h>
 #include <List.h>
 #include <Locale.h>
 #include <String.h>
 #include <Window.h>
 
 
-using BPrivate::B_LOCAL_TIME;
+namespace BPrivate {
 
 
-TTimeEdit::TTimeEdit(const char* name, uint32 sections)
+const uint32 kArrowAreaWidth = 16;
+
+
+TimeEdit::TimeEdit(const char* name, uint32 sections, BMessage* message)
        :
-       TSectionEdit(name, sections),
+       SectionEdit(name, sections, message),
        fLastKeyDownTime(0),
        fFields(NULL),
        fFieldCount(0),
@@ -39,7 +44,7 @@ TTimeEdit::TTimeEdit(const char* name, uint32 sections)
 }
 
 
-TTimeEdit::~TTimeEdit()
+TimeEdit::~TimeEdit()
 {
        free(fFieldPositions);
        free(fFields);
@@ -47,18 +52,21 @@ TTimeEdit::~TTimeEdit()
 
 
 void
-TTimeEdit::KeyDown(const char* bytes, int32 numBytes)
+TimeEdit::KeyDown(const char* bytes, int32 numBytes)
 {
-       TSectionEdit::KeyDown(bytes, numBytes);
+       if (IsEnabled() == false)
+               return;
+       SectionEdit::KeyDown(bytes, numBytes);
 
        // only accept valid input
        int32 number = atoi(bytes);
-       if (number - 1 < 0)
+       if (number < 0 || bytes[0] < '0')
                return;
 
        int32 section = FocusIndex();
        if (section < 0 || section > 2)
                return;
+
        bigtime_t currentTime = system_time();
        if (currentTime - fLastKeyDownTime < 1000000) {
                int32 doubleDigit = number + fLastKeyDownInt * 10;
@@ -72,16 +80,16 @@ TTimeEdit::KeyDown(const char* bytes, int32 numBytes)
 
        // update display value
        fHoldValue = number;
-
        _CheckRange();
+       _UpdateFields();
 
        // send message to change time
-       DispatchMessage();
+       Invoke();
 }
 
 
 void
-TTimeEdit::InitView()
+TimeEdit::InitView()
 {
        // make sure we call the base class method, as it
        // will create the arrow bitmaps and the section list
@@ -91,7 +99,7 @@ TTimeEdit::InitView()
 
 
 void
-TTimeEdit::DrawSection(uint32 index, BRect bounds, bool hasFocus)
+TimeEdit::DrawSection(uint32 index, BRect bounds, bool hasFocus)
 {
        if (fFieldPositions == NULL || index * 2 + 1 >= (uint32)fFieldPosCount)
                return;
@@ -116,7 +124,7 @@ TTimeEdit::DrawSection(uint32 index, BRect bounds, bool 
hasFocus)
 
 
 void
-TTimeEdit::DrawSeparator(uint32 index, BRect bounds)
+TimeEdit::DrawSeparator(uint32 index, BRect bounds)
 {
        if (fFieldPositions == NULL || index * 2 + 2 >= (uint32)fFieldPosCount)
                return;
@@ -134,21 +142,21 @@ TTimeEdit::DrawSeparator(uint32 index, BRect bounds)
 
 
 float
-TTimeEdit::SeparatorWidth()
+TimeEdit::SeparatorWidth()
 {
        return 10.0f;
 }
 
 
 float
-TTimeEdit::MinSectionWidth()
+TimeEdit::MinSectionWidth()
 {
        return be_plain_font->StringWidth("00");
 }
 
 
 void
-TTimeEdit::SectionFocus(uint32 index)
+TimeEdit::SectionFocus(uint32 index)
 {
        fLastKeyDownTime = 0;
        fFocus = index;
@@ -158,7 +166,7 @@ TTimeEdit::SectionFocus(uint32 index)
 
 
 void
-TTimeEdit::SetTime(int32 hour, int32 minute, int32 second)
+TimeEdit::SetTime(int32 hour, int32 minute, int32 second)
 {
        // make sure to update date upon overflow
        if (hour == 0 && minute == 0 && second == 0)
@@ -175,8 +183,15 @@ TTimeEdit::SetTime(int32 hour, int32 minute, int32 second)
 }
 
 
+BTime
+TimeEdit::GetTime()
+{
+       return fTime.Time();
+}
+
+
 void
-TTimeEdit::DoUpPress()
+TimeEdit::DoUpPress()
 {
        if (fFocus == -1)
                SectionFocus(0);
@@ -185,14 +200,15 @@ TTimeEdit::DoUpPress()
        fHoldValue += 1;
 
        _CheckRange();
+       _UpdateFields();
 
        // send message to change time
-       DispatchMessage();
+       Invoke();
 }
 
 
 void
-TTimeEdit::DoDownPress()
+TimeEdit::DoDownPress()
 {
        if (fFocus == -1)
                SectionFocus(0);
@@ -201,49 +217,27 @@ TTimeEdit::DoDownPress()
        fHoldValue -= 1;
 
        _CheckRange();
+       _UpdateFields();
 
-       // send message to change time
-       DispatchMessage();
-       
+       Invoke();
 }
 
 
 void
-TTimeEdit::BuildDispatch(BMessage* message)
+TimeEdit::PopulateMessage(BMessage* message)
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return;
 
        message->AddBool("time", true);
-
-       for (int32 index = 0; index < (int)fSectionCount; ++index) {
-               uint32 data = _SectionValue(index);
-
-               if (fFocus == index)
-                       data = fHoldValue;
-
-               switch (fFields[index]) {
-                       case B_DATE_ELEMENT_HOUR:
-                               message->AddInt32("hour", data);
-                               break;
-
-                       case B_DATE_ELEMENT_MINUTE:
-                               message->AddInt32("minute", data);
-                               break;
-
-                       case B_DATE_ELEMENT_SECOND:
-                               message->AddInt32("second", data);
-                               break;
-
-                       default:
-                               break;
-               }
-       }
+       message->AddInt32("hour", fTime.Time().Hour());
+       message->AddInt32("minute", fTime.Time().Minute());
+       message->AddInt32("second", fTime.Time().Second());
 }
 
 
 void
-TTimeEdit::_UpdateFields()
+TimeEdit::_UpdateFields()
 {
        time_t time = fTime.Time_t();
        
@@ -263,7 +257,7 @@ TTimeEdit::_UpdateFields()
 
 
 void
-TTimeEdit::_CheckRange()
+TimeEdit::_CheckRange()
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return;
@@ -318,13 +312,14 @@ TTimeEdit::_CheckRange()
                        return;
        }
 
+
        fHoldValue = value;
        Invalidate(Bounds());
 }
 
 
 bool
-TTimeEdit::_IsValidDoubleDigit(int32 value)
+TimeEdit::_IsValidDoubleDigit(int32 value)
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return false;
@@ -355,7 +350,7 @@ TTimeEdit::_IsValidDoubleDigit(int32 value)
 
 
 int32
-TTimeEdit::_SectionValue(int32 index) const
+TimeEdit::_SectionValue(int32 index) const
 {
        if (index < 0 || index >= fFieldCount)
                return 0;
@@ -384,7 +379,7 @@ TTimeEdit::_SectionValue(int32 index) const
 
 
 float
-TTimeEdit::PreferredHeight()
+TimeEdit::PreferredHeight()
 {
        font_height fontHeight;
        GetFontHeight(&fontHeight);
@@ -392,12 +387,12 @@ TTimeEdit::PreferredHeight()
 }
 
 
-//     #pragma mark -
+// #pragma mark -
 
 
-TDateEdit::TDateEdit(const char* name, uint32 sections)
+DateEdit::DateEdit(const char* name, uint32 sections, BMessage* message)
        :
-       TSectionEdit(name, sections),
+       SectionEdit(name, sections, message),
        fFields(NULL),
        fFieldCount(0),
        fFieldPositions(NULL),
@@ -407,7 +402,7 @@ TDateEdit::TDateEdit(const char* name, uint32 sections)
 }
 
 
-TDateEdit::~TDateEdit()
+DateEdit::~DateEdit()
 {
        free(fFieldPositions);
        free(fFields);
@@ -415,13 +410,15 @@ TDateEdit::~TDateEdit()
 
 
 void
-TDateEdit::KeyDown(const char* bytes, int32 numBytes)
+DateEdit::KeyDown(const char* bytes, int32 numBytes)
 {
-       TSectionEdit::KeyDown(bytes, numBytes);
+       if (IsEnabled() == false)
+               return;
+       SectionEdit::KeyDown(bytes, numBytes);
 
        // only accept valid input
        int32 number = atoi(bytes);
-       if (number - 1 < 0)
+       if (number < 0 || bytes[0] < '0')
                return;
 
        int32 section = FocusIndex();
@@ -447,19 +444,19 @@ TDateEdit::KeyDown(const char* bytes, int32 numBytes)
                        number += 70;
                number += oldCentury;
        }
-
-       // update display value
        fHoldValue = number;
 
+       // update display value
        _CheckRange();
+       _UpdateFields();
 
        // send message to change time
-       DispatchMessage();
+       Invoke();
 }
 
 
 void
-TDateEdit::InitView()
+DateEdit::InitView()
 {
        // make sure we call the base class method, as it
        // will create the arrow bitmaps and the section list
@@ -469,7 +466,7 @@ TDateEdit::InitView()
 
 
 void
-TDateEdit::DrawSection(uint32 index, BRect bounds, bool hasFocus)
+DateEdit::DrawSection(uint32 index, BRect bounds, bool hasFocus)
 {
        if (fFieldPositions == NULL || index * 2 + 1 >= (uint32)fFieldPosCount)
                return;
@@ -494,7 +491,7 @@ TDateEdit::DrawSection(uint32 index, BRect bounds, bool 
hasFocus)
 
 
 void
-TDateEdit::DrawSeparator(uint32 index, BRect bounds)
+DateEdit::DrawSeparator(uint32 index, BRect bounds)
 {
        if (index >= 2)
                return;
@@ -515,7 +512,7 @@ TDateEdit::DrawSeparator(uint32 index, BRect bounds)
 
 
 void
-TDateEdit::SectionFocus(uint32 index)
+DateEdit::SectionFocus(uint32 index)
 {
        fLastKeyDownTime = 0;
        fFocus = index;
@@ -525,21 +522,21 @@ TDateEdit::SectionFocus(uint32 index)
 
 
 float
-TDateEdit::MinSectionWidth()
+DateEdit::MinSectionWidth()
 {
        return be_plain_font->StringWidth("00");
 }
 
 
 float
-TDateEdit::SeparatorWidth()
+DateEdit::SeparatorWidth()
 {
        return 10.0f;
 }
 
 
 void
-TDateEdit::SetDate(int32 year, int32 month, int32 day)
+DateEdit::SetDate(int32 year, int32 month, int32 day)
 {
        fDate.SetDate(year, month, day);
 
@@ -552,8 +549,15 @@ TDateEdit::SetDate(int32 year, int32 month, int32 day)
 }
 
 
+BDate
+DateEdit::GetDate()
+{
+       return fDate;
+}
+
+
 void
-TDateEdit::DoUpPress()
+DateEdit::DoUpPress()
 {
        if (fFocus == -1)
                SectionFocus(0);
@@ -562,14 +566,15 @@ TDateEdit::DoUpPress()
        fHoldValue += 1;
 
        _CheckRange();
+       _UpdateFields();
 
        // send message to change Date
-       DispatchMessage();
+       Invoke();
 }
 
 
 void
-TDateEdit::DoDownPress()
+DateEdit::DoDownPress()
 {
        if (fFocus == -1)
                SectionFocus(0);
@@ -578,48 +583,28 @@ TDateEdit::DoDownPress()
        fHoldValue -= 1;
 
        _CheckRange();
+       _UpdateFields();
 
        // send message to change Date
-       DispatchMessage();
+       Invoke();
 }
 
 
 void
-TDateEdit::BuildDispatch(BMessage* message)
+DateEdit::PopulateMessage(BMessage* message)
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return;
 
        message->AddBool("time", false);
-
-       for (int32 index = 0; index < (int)fSectionCount; ++index) {
-               uint32 data = _SectionValue(index);
-
-               if (fFocus == index)
-                       data = fHoldValue;
-
-               switch (fFields[index]) {
-                       case B_DATE_ELEMENT_MONTH:
-                               message->AddInt32("month", data);
-                               break;
-
-                       case B_DATE_ELEMENT_DAY:
-                               message->AddInt32("day", data);
-                               break;
-
-                       case B_DATE_ELEMENT_YEAR:
-                               message->AddInt32("year", data);
-                               break;
-
-                       default:
-                               break;
-               }
-       }
+       message->AddInt32("year", fDate.Year());
+       message->AddInt32("month", fDate.Month());
+       message->AddInt32("day", fDate.Day());
 }
 
 
 void
-TDateEdit::_UpdateFields()
+DateEdit::_UpdateFields()
 {
        time_t time = BDateTime(fDate, BTime()).Time_t();
 
@@ -640,7 +625,7 @@ TDateEdit::_UpdateFields()
 
 
 void
-TDateEdit::_CheckRange()
+DateEdit::_CheckRange()
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return;
@@ -660,13 +645,21 @@ TDateEdit::_CheckRange()
                }
 
                case B_DATE_ELEMENT_MONTH:
+               {
                        if (value > 12)
                                value = 1;
                        else if (value < 1)
                                value = 12;
 
-                       fDate.SetDate(fDate.Year(), value, fDate.Day());
+                       int32 day = fDate.Day();
+                       fDate.SetDate(fDate.Year(), value, 1);
+
+                       // changing between months with differing amounts of 
days
+                       while (day > fDate.DaysInMonth())
+                               day--;
+                       fDate.SetDate(fDate.Year(), value, day);
                        break;
+               }
 
                case B_DATE_ELEMENT_YEAR:
                        fDate.SetDate(value, fDate.Month(), fDate.Day());
@@ -677,12 +670,12 @@ TDateEdit::_CheckRange()
        }
 
        fHoldValue = value;
-       Draw(Bounds());
+       Invalidate(Bounds());
 }
 
 
 bool
-TDateEdit::_IsValidDoubleDigit(int32 value)
+DateEdit::_IsValidDoubleDigit(int32 value)
 {
        if (fFocus < 0 || fFocus >= fFieldCount)
                return false;
@@ -721,7 +714,7 @@ TDateEdit::_IsValidDoubleDigit(int32 value)
 
 
 int32
-TDateEdit::_SectionValue(int32 index) const
+DateEdit::_SectionValue(int32 index) const
 {
        if (index < 0 || index >= fFieldCount)
                return 0;
@@ -749,10 +742,273 @@ TDateEdit::_SectionValue(int32 index) const
 
 
 float
-TDateEdit::PreferredHeight()
+DateEdit::PreferredHeight()
 {
        font_height fontHeight;
        GetFontHeight(&fontHeight);
        return ceilf((fontHeight.ascent + fontHeight.descent) * 1.4);
 }
 
+
+// #pragma mark -
+
+
+SectionEdit::SectionEdit(const char* name, uint32 sections, BMessage* message)
+       :
+       BControl(name, NULL, message, B_WILL_DRAW | B_NAVIGABLE),
+       fFocus(-1),
+       fSectionCount(sections),
+       fHoldValue(0)
+{
+}
+
+
+SectionEdit::~SectionEdit()
+{
+}
+
+
+void
+SectionEdit::AttachedToWindow()
+{
+       AdoptParentColors();
+       BControl::AttachedToWindow();
+}
+
+
+void
+SectionEdit::Draw(BRect updateRect)
+{
+       DrawBorder(updateRect);
+
+       for (uint32 idx = 0; idx < fSectionCount; idx++) {
+               DrawSection(idx, FrameForSection(idx),
+                       ((uint32)fFocus == idx) && IsFocus());
+               if (idx < fSectionCount - 1)
+                       DrawSeparator(idx, FrameForSeparator(idx));
+       }
+}
+
+
+void
+SectionEdit::MouseDown(BPoint where)
+{
+       if (IsEnabled() == false)
+               return;
+
+       MakeFocus(true);
+
+       if (fUpRect.Contains(where))
+               DoUpPress();
+       else if (fDownRect.Contains(where))
+               DoDownPress();
+       else if (fSectionCount > 0) {
+               for (uint32 idx = 0; idx < fSectionCount; idx++) {
+                       if (FrameForSection(idx).Contains(where)) {
+                               SectionFocus(idx);
+                               return;
+                       }
+               }
+       }
+}
+
+
+BSize
+SectionEdit::MaxSize()
+{
+       return BLayoutUtils::ComposeSize(ExplicitMaxSize(),
+               BSize(B_SIZE_UNLIMITED, PreferredHeight()));
+}
+
+
+BSize
+SectionEdit::MinSize()
+{
+       BSize minSize;
+       minSize.height = PreferredHeight();
+       minSize.width = (SeparatorWidth() + MinSectionWidth())
+               * fSectionCount;
+       return BLayoutUtils::ComposeSize(ExplicitMinSize(),
+               minSize);
+}
+
+
+BSize
+SectionEdit::PreferredSize()
+{
+       return BLayoutUtils::ComposeSize(ExplicitPreferredSize(),
+               MinSize());
+}
+
+
+BRect
+SectionEdit::FrameForSection(uint32 index)
+{
+       BRect area = SectionArea();
+       float sepWidth = SeparatorWidth();
+
+       float width = (area.Width() -
+               sepWidth * (fSectionCount - 1))
+               / fSectionCount;
+       area.left += index * (width + sepWidth);
+       area.right = area.left + width;
+
+       return area;
+}
+
+
+BRect
+SectionEdit::FrameForSeparator(uint32 index)
+{
+       BRect area = SectionArea();
+       float sepWidth = SeparatorWidth();
+
+       float width = (area.Width() -
+               sepWidth * (fSectionCount - 1))
+               / fSectionCount;
+       area.left += (index + 1) * width + index * sepWidth;
+       area.right = area.left + sepWidth;
+
+       return area;
+}
+
+
+void
+SectionEdit::MakeFocus(bool focused)
+{
+       if (focused == IsFocus())
+               return;
+
+       BControl::MakeFocus(focused);
+
+       if (fFocus == -1)
+               SectionFocus(0);
+       else
+               SectionFocus(fFocus);
+}
+
+
+void
+SectionEdit::KeyDown(const char* bytes, int32 numbytes)
+{
+       if (IsEnabled() == false)
+               return;
+       if (fFocus == -1)
+               SectionFocus(0);
+
+       switch (bytes[0]) {
+               case B_LEFT_ARROW:
+                       fFocus -= 1;
+                       if (fFocus < 0)
+                               fFocus = fSectionCount - 1;
+                       SectionFocus(fFocus);
+                       break;
+
+               case B_RIGHT_ARROW:
+                       fFocus += 1;
+                       if ((uint32)fFocus >= fSectionCount)
+                               fFocus = 0;
+                       SectionFocus(fFocus);
+                       break;
+
+               case B_UP_ARROW:
+                       DoUpPress();
+                       break;
+
+               case B_DOWN_ARROW:
+                       DoDownPress();
+                       break;
+
+               default:
+                       BControl::KeyDown(bytes, numbytes);
+                       break;
+       }
+       Draw(Bounds());
+}
+
+
+status_t
+SectionEdit::Invoke(BMessage* message)
+{
+       if (message == NULL)
+               message = Message();
+       if (message == NULL)
+               return BControl::Invoke(NULL);
+
+       BMessage clone(*message);
+       PopulateMessage(&clone);
+       return BControl::Invoke(&clone);
+}
+
+
+uint32
+SectionEdit::CountSections() const
+{
+       return fSectionCount;
+}
+
+
+int32
+SectionEdit::FocusIndex() const
+{
+       return fFocus;
+}
+
+
+BRect
+SectionEdit::SectionArea() const
+{
+       BRect sectionArea = Bounds().InsetByCopy(2, 2);
+       sectionArea.right -= kArrowAreaWidth;
+       return sectionArea;
+}
+
+
+void
+SectionEdit::DrawBorder(const BRect& updateRect)
+{
+       BRect bounds(Bounds());
+       bool showFocus = (IsFocus() && Window() && Window()->IsActive());
+
+       be_control_look->DrawBorder(this, bounds, updateRect, ViewColor(),
+               B_FANCY_BORDER, showFocus ? BControlLook::B_FOCUSED : 0);
+
+       // draw up/down control
+
+       bounds.left = bounds.right - kArrowAreaWidth;
+       bounds.right = Bounds().right - 2;
+       fUpRect.Set(bounds.left + 3, bounds.top + 2, bounds.right,
+               bounds.bottom / 2.0);
+       fDownRect = fUpRect.OffsetByCopy(0, fUpRect.Height() + 2);
+
+       BPoint middle(floorf(fUpRect.left + fUpRect.Width() / 2),
+               fUpRect.top + 1);
+       BPoint left(fUpRect.left + 3, fUpRect.bottom - 1);
+       BPoint right(left.x + 2 * (middle.x - left.x), fUpRect.bottom - 1);
+
+       SetPenSize(2);
+       SetLowColor(ViewColor());
+
+       if (updateRect.Intersects(fUpRect)) {
+               FillRect(fUpRect, B_SOLID_LOW);
+               BeginLineArray(2);
+                       AddLine(left, middle, HighColor());
+                       AddLine(middle, right, HighColor());
+               EndLineArray();
+       }
+       if (updateRect.Intersects(fDownRect)) {
+               middle.y = fDownRect.bottom - 1;
+               left.y = right.y = fDownRect.top + 1;
+
+               FillRect(fDownRect, B_SOLID_LOW);
+               BeginLineArray(2);
+                       AddLine(left, middle, HighColor());
+                       AddLine(middle, right, HighColor());
+               EndLineArray();
+       }
+
+       SetPenSize(1);
+}
+
+
+}      // namespace BPrivate
diff --git a/src/kits/shared/Jamfile b/src/kits/shared/Jamfile
index 5e98940629..30dbb68a32 100644
--- a/src/kits/shared/Jamfile
+++ b/src/kits/shared/Jamfile
@@ -36,6 +36,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                        CalendarView.cpp
                        ColorQuantizer.cpp
                        CommandPipe.cpp
+                       DateTimeEdit.cpp
                        DragTrackingFilter.cpp
                        DriverSettingsMessageAdapter.cpp
                        HashString.cpp
diff --git a/src/preferences/time/DateTimeView.cpp 
b/src/preferences/time/DateTimeView.cpp
index 9f19b75f2a..e1ef87d941 100644
--- a/src/preferences/time/DateTimeView.cpp
+++ b/src/preferences/time/DateTimeView.cpp
@@ -21,6 +21,7 @@
 #include <CheckBox.h>
 #include <ControlLook.h>
 #include <DateTime.h>
+#include <DateTimeEdit.h>
 #include <Entry.h>
 #include <File.h>
 #include <FindDirectory.h>
@@ -31,7 +32,6 @@
 #include <Window.h>
 
 #include "AnalogClock.h"
-#include "DateTimeEdit.h"
 #include "TimeMessages.h"
 #include "TimeWindow.h"
 
@@ -43,6 +43,8 @@
 using BPrivate::BCalendarView;
 using BPrivate::BDateTime;
 using BPrivate::B_LOCAL_TIME;
+using BPrivate::DateEdit;
+using BPrivate::TimeEdit;
 
 
 DateTimeView::DateTimeView(const char* name)
@@ -178,8 +180,8 @@ DateTimeView::_InitView()
        fCalendarView->SetSelectionMessage(new BMessage(kDayChanged));
        fCalendarView->SetInvocationMessage(new BMessage(kDayChanged));
 
-       fDateEdit = new TDateEdit("dateEdit", 3);
-       fTimeEdit = new TTimeEdit("timeEdit", 5);
+       fDateEdit = new DateEdit("dateEdit", 3, new BMessage(H_USER_CHANGE));
+       fTimeEdit = new TimeEdit("timeEdit", 5, new BMessage(H_USER_CHANGE));
        fClock = new TAnalogClock("analogClock");
 
        BTime time(BTime::CurrentTime(B_LOCAL_TIME));
diff --git a/src/preferences/time/DateTimeView.h 
b/src/preferences/time/DateTimeView.h
index f644df08dc..8b13458c5a 100644
--- a/src/preferences/time/DateTimeView.h
+++ b/src/preferences/time/DateTimeView.h
@@ -16,15 +16,17 @@
 #include <LayoutBuilder.h>
 
 
-class TDateEdit;
-class TTimeEdit;
 class TAnalogClock;
 
 
 namespace BPrivate {
        class BCalendarView;
+       class DateEdit;
+       class TimeEdit;
 }
 using BPrivate::BCalendarView;
+using BPrivate::DateEdit;
+using BPrivate::TimeEdit;
 
 
 class DateTimeView : public BGroupView {
@@ -43,8 +45,8 @@ private:
                        void                            _Revert();
                        time_t                          _PrefletUptime() const;
 
-                       TDateEdit*                      fDateEdit;
-                       TTimeEdit*                      fTimeEdit;
+                       DateEdit*                       fDateEdit;
+                       TimeEdit*                       fTimeEdit;
                        BCalendarView*          fCalendarView;
                        TAnalogClock*           fClock;
 
diff --git a/src/preferences/time/Jamfile b/src/preferences/time/Jamfile
index 7c775aff95..7c13316b58 100644
--- a/src/preferences/time/Jamfile
+++ b/src/preferences/time/Jamfile
@@ -8,8 +8,6 @@ local sources =
        AnalogClock.cpp
        BaseView.cpp
        ClockView.cpp
-       DateTimeEdit.cpp
-       SectionEdit.cpp
        DateTimeView.cpp
        NetworkTimeView.cpp
        ntp.cpp
diff --git a/src/preferences/time/SectionEdit.cpp 
b/src/preferences/time/SectionEdit.cpp
deleted file mode 100644
index b04daab5e1..0000000000
--- a/src/preferences/time/SectionEdit.cpp
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2004-2011, Haiku, Inc. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- *             Mike Berg <mike@xxxxxxxxxxx>
- *             Julun <host.haiku@xxxxxx>
- *             Hamish Morrison <hamish@xxxxxxxxxxx>
- */
-
-
-#include "SectionEdit.h"
-
-#include <Bitmap.h>
-#include <ControlLook.h>
-#include <LayoutUtils.h>
-#include <List.h>
-#include <Window.h>
-
-#include "TimeMessages.h"
-
-
-const uint32 kArrowAreaWidth = 16;
-
-
-TSectionEdit::TSectionEdit(const char* name, uint32 sections)
-       :
-       BControl(name, NULL, NULL, B_WILL_DRAW | B_NAVIGABLE),
-       fFocus(-1),
-       fSectionCount(sections),
-       fHoldValue(0)
-{
-}
-
-
-TSectionEdit::~TSectionEdit()
-{
-}
-
-
-void
-TSectionEdit::AttachedToWindow()
-{
-       AdoptParentColors();
-}
-
-
-void
-TSectionEdit::Draw(BRect updateRect)
-{
-       DrawBorder(updateRect);
-
-       for (uint32 idx = 0; idx < fSectionCount; idx++) {
-               DrawSection(idx, FrameForSection(idx),
-                       ((uint32)fFocus == idx) && IsFocus());
-               if (idx < fSectionCount - 1)
-                       DrawSeparator(idx, FrameForSeparator(idx));
-       }
-}
-
-
-void
-TSectionEdit::MouseDown(BPoint where)
-{
-       MakeFocus(true);
-
-       if (fUpRect.Contains(where))
-               DoUpPress();
-       else if (fDownRect.Contains(where))
-               DoDownPress();
-       else if (fSectionCount > 0) {
-               for (uint32 idx = 0; idx < fSectionCount; idx++) {
-                       if (FrameForSection(idx).Contains(where)) {
-                               SectionFocus(idx);
-                               return;
-                       }
-               }
-       }
-}
-
-
-BSize
-TSectionEdit::MaxSize()
-{
-       return BLayoutUtils::ComposeSize(ExplicitMaxSize(),
-               BSize(B_SIZE_UNLIMITED, PreferredHeight()));
-}
-
-
-BSize
-TSectionEdit::MinSize()
-{
-       BSize minSize;
-       minSize.height = PreferredHeight();
-       minSize.width = (SeparatorWidth() + MinSectionWidth())
-               * fSectionCount;
-       return BLayoutUtils::ComposeSize(ExplicitMinSize(),
-               minSize);
-}
-
-
-BSize
-TSectionEdit::PreferredSize()
-{
-       return BLayoutUtils::ComposeSize(ExplicitPreferredSize(),
-               MinSize());
-}
-
-
-BRect
-TSectionEdit::FrameForSection(uint32 index)
-{
-       BRect area = SectionArea();
-       float sepWidth = SeparatorWidth();
-       
-       float width = (area.Width() -
-               sepWidth * (fSectionCount - 1))
-               / fSectionCount;
-       area.left += index * (width + sepWidth);
-       area.right = area.left + width;
-
-       return area;
-}
-
-
-BRect
-TSectionEdit::FrameForSeparator(uint32 index)
-{
-       BRect area = SectionArea();
-       float sepWidth = SeparatorWidth();
-
-       float width = (area.Width() -
-               sepWidth * (fSectionCount - 1))
-               / fSectionCount;
-       area.left += (index + 1) * width + index * sepWidth;
-       area.right = area.left + sepWidth;
-
-       return area;
-}
-
-
-void
-TSectionEdit::MakeFocus(bool focused)
-{
-       if (focused == IsFocus())
-               return;
-
-       BControl::MakeFocus(focused);
-
-       if (fFocus == -1)
-               SectionFocus(0);
-       else
-               SectionFocus(fFocus);
-}
-
-
-void
-TSectionEdit::KeyDown(const char* bytes, int32 numbytes)
-{
-       if (fFocus == -1)
-               SectionFocus(0);
-
-       switch (bytes[0]) {
-               case B_LEFT_ARROW:
-                       fFocus -= 1;
-                       if (fFocus < 0)
-                               fFocus = fSectionCount - 1;
-                       SectionFocus(fFocus);
-                       break;
-
-               case B_RIGHT_ARROW:
-                       fFocus += 1;
-                       if ((uint32)fFocus >= fSectionCount)
-                               fFocus = 0;
-                       SectionFocus(fFocus);
-                       break;
-
-               case B_UP_ARROW:
-                       DoUpPress();
-                       break;
-
-               case B_DOWN_ARROW:
-                       DoDownPress();
-                       break;
-
-               default:
-                       BControl::KeyDown(bytes, numbytes);
-                       break;
-       }
-       Draw(Bounds());
-}
-
-
-void
-TSectionEdit::DispatchMessage()
-{
-       BMessage message(H_USER_CHANGE);
-       BuildDispatch(&message);
-       Window()->PostMessage(&message);
-}
-
-
-uint32
-TSectionEdit::CountSections() const
-{
-       return fSectionCount;
-}
-
-
-int32
-TSectionEdit::FocusIndex() const
-{
-       return fFocus;
-}
-
-
-BRect
-TSectionEdit::SectionArea() const
-{
-       BRect sectionArea = Bounds().InsetByCopy(2, 2);
-       sectionArea.right -= kArrowAreaWidth;
-       return sectionArea;
-}
-
-
-void
-TSectionEdit::DrawBorder(const BRect& updateRect)
-{
-       BRect bounds(Bounds());
-       bool showFocus = (IsFocus() && Window() && Window()->IsActive());
-
-       be_control_look->DrawBorder(this, bounds, updateRect, ViewColor(),
-               B_FANCY_BORDER, showFocus ? BControlLook::B_FOCUSED : 0);
-
-       // draw up/down control
-
-       bounds.left = bounds.right - kArrowAreaWidth;
-       bounds.right = Bounds().right - 2;
-       fUpRect.Set(bounds.left + 3, bounds.top + 2, bounds.right,
-               bounds.bottom / 2.0);
-       fDownRect = fUpRect.OffsetByCopy(0, fUpRect.Height() + 2);
-
-       BPoint middle(floorf(fUpRect.left + fUpRect.Width() / 2),
-               fUpRect.top + 1);
-       BPoint left(fUpRect.left + 3, fUpRect.bottom - 1);
-       BPoint right(left.x + 2 * (middle.x - left.x), fUpRect.bottom - 1);
-
-       SetPenSize(2);
-       SetLowColor(ViewColor());
-
-       if (updateRect.Intersects(fUpRect)) {
-               FillRect(fUpRect, B_SOLID_LOW);
-               BeginLineArray(2);
-                       AddLine(left, middle, HighColor());
-                       AddLine(middle, right, HighColor());
-               EndLineArray();
-       }
-       if (updateRect.Intersects(fDownRect)) {
-               middle.y = fDownRect.bottom - 1;
-               left.y = right.y = fDownRect.top + 1;
-
-               FillRect(fDownRect, B_SOLID_LOW);
-               BeginLineArray(2);
-                       AddLine(left, middle, HighColor());
-                       AddLine(middle, right, HighColor());
-               EndLineArray();
-       }
-
-       SetPenSize(1);
-}
diff --git a/src/preferences/time/SectionEdit.h 
b/src/preferences/time/SectionEdit.h
deleted file mode 100644
index 53bf7323e3..0000000000
--- a/src/preferences/time/SectionEdit.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2004-2011, Haiku, Inc. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- *             Mike Berg <mike@xxxxxxxxxxx>
- *             Julun <host.haiku@xxxxxx>
- *             Hamish Morrison <hamish@xxxxxxxxxxx>
- */
-#ifndef _SECTION_EDIT_H
-#define _SECTION_EDIT_H
-
-
-#include <Control.h>
-
-
-class BBitmap;
-class BList;
-
-
-class TSectionEdit : public BControl {
-public:
-                                                               
TSectionEdit(const char* name,
-                                                                       uint32 
sections);
-       virtual                                         ~TSectionEdit();
-
-       virtual void                            AttachedToWindow();
-       virtual void                            Draw(BRect updateRect);
-       virtual void                            MouseDown(BPoint point);
-       virtual void                            MakeFocus(bool focused = true);
-       virtual void                            KeyDown(const char* bytes, 
int32 numBytes);
-
-                       BSize                           MaxSize();
-                       BSize                           MinSize();
-                       BSize                           PreferredSize();
-
-                       uint32                          CountSections() const;
-                       int32                           FocusIndex() const;
-                       BRect                           SectionArea() const;
-
-protected:
-       virtual void                            DrawBorder(const BRect& 
updateRect);
-       virtual void                            DrawSection(uint32 index, BRect 
bounds,
-                                                                       bool 
isFocus) {}
-       virtual void                            DrawSeparator(uint32 index, 
BRect bounds) {}
-
-                       BRect                           FrameForSection(uint32 
index);
-                       BRect                           
FrameForSeparator(uint32 index);
-
-       virtual void                            SectionFocus(uint32 index) {}
-       virtual void                            SectionChange(uint32 index, 
uint32 value) {}
-       virtual void                            SetSections(BRect area) {}
-       
-       virtual float                           SeparatorWidth() = 0;
-       virtual float                           MinSectionWidth() = 0;
-       virtual float                           PreferredHeight() = 0;
-       
-       virtual void                            DoUpPress() {}
-       virtual void                            DoDownPress() {}
-
-       virtual void                            DispatchMessage();
-       virtual void                            BuildDispatch(BMessage* 
message) = 0;
-                       
-                       BRect                           fUpRect;
-                       BRect                           fDownRect;
-
-                       int32                           fFocus;
-                       uint32                          fSectionCount;
-                       uint32                          fHoldValue;
-};
-
-
-#endif // _SECTION_EDIT_H


Other related posts:

  • » [haiku-commits] haiku: hrev56119 - src/preferences/time src/kits/shared headers/private/shared - Jérôme Duval