/* * Copyright 2004-2011, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * McCall * Mike Berg * Julun * Hamish Morrison */ #ifndef _DATE_TIME_EDIT_H #define _DATE_TIME_EDIT_H #include #include #include #include #include #include class BBitmap; class BList; namespace BPrivate { class SectionEdit : public BControl { public: 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); virtual void InitView(); virtual void DrawSection(uint32 index, BRect bounds, bool isfocus); virtual void DrawSeparator(uint32 index, BRect bounds); virtual void SectionFocus(uint32 index); virtual float MinSectionWidth(); virtual float SeparatorWidth(); virtual float PreferredHeight(); virtual void DoUpPress(); virtual void DoDownPress(); virtual void PopulateMessage(BMessage* message); void SetTime(int32 hour, int32 minute, int32 second); BTime GetTime(); private: void _UpdateFields(); void _CheckRange(); bool _IsValidDoubleDigit(int32 value); int32 _SectionValue(int32 index) const; BDateTime fTime; BTimeFormat fTimeFormat; bigtime_t fLastKeyDownTime; int32 fLastKeyDownInt; BString fText; // TODO: morph the following into a proper class BDateElement* fFields; int fFieldCount; int* fFieldPositions; int fFieldPosCount; }; class DateEdit : public SectionEdit { public: DateEdit(const char* name, uint32 sections, BMessage* message); virtual ~DateEdit(); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void InitView(); virtual void DrawSection(uint32 index, BRect bounds, bool isfocus); virtual void DrawSeparator(uint32 index, BRect bounds); virtual void SectionFocus(uint32 index); virtual float MinSectionWidth(); virtual float SeparatorWidth(); virtual float PreferredHeight(); virtual void DoUpPress(); virtual void DoDownPress(); 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; int32 fLastKeyDownInt; BString fText; // TODO: morph the following into a proper class BDateElement* fFields; int fFieldCount; int* fFieldPositions; int fFieldPosCount; }; } // namespace BPrivate #endif // _DATE_TIME_EDIT_H