#ifndef _c_Text_Element_Control_h #define _c_Text_Element_Control_h #include #include #include #include #include #include // =========================================================================== // cTextElementControl.cpp Version 1.4.2 ©1998-1999 Joakim Braun All rights reserved. // =========================================================================== // // CONTENTS: A framework for constructing LControls of the "date field" kind: // that is, made up of several text elements which may be selected and increased or decreased separately. // Includes code for a clock control, a date control and an SMPTE time code control. // User can click on the text elements to activate them (a focus ring will show) // and use arrow keys or LLittleArrows (automatically created on request) to change control values. // NOTE: Controls may be left or right aligned in relation to its frame in Constructor. // I found this useful since the controls auto-adjust their own size after creation, // based on text element size and text traits. // Date and clock controls set up element order and separator characters according // to information in current 'itl0' resource. // The clock control comes in two flavors: Live (you get a clock tracking the current time, // but can't edit the time shown), or editable (which isn't updated as time passes). // You set the clock type up in Constructor. // Note that these are pure clock controls, not timers. // In upcoming versions there'll be "timer" clocks as well. // HOW TO USE: Add the provided CTYP to your PPOB, register the class you want to use, // then use Constructor to add the control panes. Code should be self-explanatory. // cTextElementControl is free for any and all use. // Do not distribute modified source code under my name. // No support promised, no liability accepted. Provided "as is". // That said, I can be reached at braun@swipnet.se. // Latest version of this and more at http://home4.swipnet.se/~w-41308/ // Change history: // 1.0 December 8, 1998 First release // 1.1 December 9, 1998 Had forgotten to adjust pane height // in cTimeCodeControl::FinishCreateSelf() and cDateControl::FinishCreateSelf() // 1.2 December 10, 1998 Fixed last-minute error in HandleKeyPress() where a ! was misplaced, // resulting in control not reacting to non-cmd key presses. // 1.3 January 10, 1999 Added demo application. // 1.3.1 January 24, 1999 Fixed bug in leap year calculation. // Made InitDateOrder() take a ResIDT parameter for customizability. // 1.4 January 31, 1999 Restructured code by adding a cTimeControl base class for time-related controls. // Added cClockControl. // "SwitchTarget(NULL)" doesn't make the app very responsive. // 1.4.1 February 1, 1999 Rewriting cTextElementLittleArrows wasn't so smart since GA didn't work. // Removed cClockControl::DrawElementSeparator() and fixed base function that didn't erase if it should // 1.4.2 March 20, 1999 Made some slight changes to always use LGALittleArrowsImp, since AM LLittleArrows // for some reason don't work as they should here. This will have to be looked into again. class cTextElementControl : public LControl, public LListener, public LCommander{ public: cTextElementControl(LStream* inStream); virtual ~cTextElementControl(void); virtual void IncrementCurrentElement(void); virtual void DecrementCurrentElement(void); virtual Int16 GetCurrentElement(void){ return mCurrentElement; } virtual void SetCurrentElement(Int16 inWhichElement); virtual void GetElementString(Int16 inWhichElement, Int16 inIndex, Str32 outString); virtual Boolean ObeyCommand( CommandT inCommand, void *ioParam); virtual void ListenToMessage(MessageT inMessage, void *ioParam); protected: TextTraitsRecord mTextTraits, mTitleTextTraits; Str31 mTitle; char mAlignment; Boolean mUseCustomHiliting; RGBColor mCustomHiliteColor; Int16 mCurrentElement; FontInfo mFinfo; LLittleArrows* mLittleArrows; enum { eNoCurrentElement = -1, eElementRectSlopValue = 2, eFocusRingThickness = 2, eFocusRingMargin = 1 }; virtual void FinishCreateSelf(void); virtual Int16 GetElementCount(void) = 0; virtual Int16 GetElementValue(Int16 inWhichElement) = 0; virtual void SetElementValue(Int16 inWhichElement, Int16 inValue) = 0; virtual Int16 GetElementMaxIndex(Int16 inWhichElement) = 0; virtual void GetElementRect(Int16 inWhichElement, Rect& outLocalRect) ; virtual Int16 GetMaxElementStringWidth(Int16 inWhichElement) ; virtual void GetElementSeparatorString(Int16 inAfterWhichElement, Str32 outString) = 0; // LControl overrides virtual void ClickSelf( const SMouseDownEvent &inMouseDown); virtual Int16 FindHotSpot( Point inPoint) const; virtual Boolean PointInHotSpot(Point inPoint, Int16 inHotSpot) const; virtual void HotSpotAction(Int16 inHotSpot, Boolean inCurrInside, Boolean inPrevInside); // Drawing funcs virtual void DrawSelf(); virtual void DrawElement(Int16 inWhichElement, Boolean inIsTarget, Boolean inErase); void RedrawElement(Int16 inWhichElement, Boolean inIsTarget); virtual void DrawElementAsCurrent(Int16 inWhichElement, Boolean inErase = true); virtual void DrawElementAsNonCurrent(Int16 inWhichElement, Boolean inErase = true); virtual void DrawHilitedElement(Int16 inWhichElement, Boolean inErase = true); virtual void DrawCustomHilitedElement(Int16 inWhichElement, Boolean inErase = true); virtual void DrawElementSeparator(Int16 inAfterWhichElement, Boolean inErase = true); virtual void DrawFocusRing(Boolean inHasRing); virtual void DrawTitle(void); Int16 GetTitleWidth(void); // LCommander overrides virtual Boolean HandleKeyPress(const EventRecord &inKeyEvent); virtual Boolean HandleNavigationKey(const EventRecord &inKeyEvent); virtual Boolean HandlePrintingKey(const EventRecord &inKeyEvent){ return false; } virtual void BeTarget(void); virtual void DontBeTarget(void); virtual void ActivateSelf(void); virtual void DeactivateSelf(void); virtual void DisableSelf(void); void CreateLittleArrows(void); void AdjustLittleArrows(void); }; //******************************************************************************************** class cStaticRectTextElementControl : public cTextElementControl{ public: enum { class_ID = 'txEl' }; cStaticRectTextElementControl(LStream* inStream); protected: TArray mRectArray; virtual void FinishCreateSelf(void); virtual void GetElementRect(Int16 inWhichElement, Rect& outLocalRect) ; }; //******************************************************************************************** class cTextElementLittleArrows : public LLittleArrows{ public: cTextElementLittleArrows( const SPaneInfo &inPaneInfo, MessageT inValueIncreasedMessage, MessageT inValueDecreasedMessage, Int32 inImpID = LGALittleArrowsImp::class_ID); protected: MessageT mValueIncreasedMessage, mValueDecreasedMessage; Int32 mPreviousValue; virtual void BroadcastValueMessage(void); }; //******************************************************************************************** class cTimeCodeControl : public cStaticRectTextElementControl{ public: enum { class_ID = 'tmEl' }; cTimeCodeControl(LStream* inStream); virtual void IncrementCurrentElement(void); virtual void DecrementCurrentElement(void); void SetTimeCodeValue(TimeCodeTime& inTimeCode); void GetTimeCodeValue(TimeCodeTime& outTimeCode); void SetTimeCodeMinValue(TimeCodeTime& inTimeCode); void GetTimeCodeMinValue(TimeCodeTime& outTimeCode); void SetTimeCodeMaxValue(TimeCodeTime& inTimeCode); void GetTimeCodeMaxValue(TimeCodeTime& outTimeCode); void SetFrameRate(Byte inFramesPerSecond); Byte GetFrameRate(void){ return mFramesPerSecond; } protected: TimeCodeTime mTimeCodeValue, mTimeCodeMinimum, mTimeCodeMaximum; Byte mFramesPerSecond; virtual void FinishCreateSelf(void); virtual Int16 GetElementCount(void) { return 4; }; virtual Int16 GetElementValue(Int16 inWhichElement); virtual void SetElementValue(Int16 inWhichElement, Int16 inValue); virtual Int16 GetElementMaxIndex(Int16 inWhichElement); virtual void GetElementSeparatorString(Int16 inAfterWhichElement, Str32 outString) ; Boolean AddHours(TimeCodeTime& ioTimeCode, Int16 inHours); Boolean AddMinutes(TimeCodeTime& ioTimeCode, Int16 inMinutes); Boolean AddSeconds(TimeCodeTime& ioTimeCode, Int16 inSeconds); Boolean AddFrames(TimeCodeTime& ioTimeCode, Int16 inFrames); Boolean SubtractHours(TimeCodeTime& ioTimeCode, Int16 inHours); Boolean SubtractMinutes(TimeCodeTime& ioTimeCode, Int16 inMinutes); Boolean SubtractSeconds(TimeCodeTime& ioTimeCode, Int16 inSeconds); Boolean SubtractFrames(TimeCodeTime& ioTimeCode, Int16 inFrames); }; //******************************************************************************************** class cTimeControl : public cStaticRectTextElementControl{ public: cTimeControl(LStream* inStream); virtual ~cTimeControl(void); void SetTimeValue(time_t& inTime); void GetTimeValue(time_t& outTime); void SetTimeValue(tm& inTime); void GetTimeValue(tm& outTime); void SetTimeValueToNow(void); void SetTimeMinValue(time_t& inTime); void GetTimeMinValue(time_t& outTime); void SetTimeMinValue(tm& inTime); void GetTimeMinValue(tm& outTime); void SetTimeMaxValue(time_t& inTime); void GetTimeMaxValue(time_t& outTime); void SetTimeMaxValue(tm& inTime); void GetTimeMaxValue(tm& outTime); protected: Intl0Hndl mTimeFormat; time_t mTimeValue, mMinTimeValue, mMaxTimeValue; virtual void InitTimeFormat(ResIDT inItl0ResNum); }; //******************************************************************************************** class cDateControl : public cTimeControl{ public: enum { class_ID = 'dtEl' }; cDateControl(LStream* inStream); virtual void IncrementCurrentElement(void); virtual void DecrementCurrentElement(void); protected: enum{ eYearElement = 0, eMonthElement, eDayElement }; virtual void FinishCreateSelf(void); virtual Int16 GetElementCount(void) { return 3; }; virtual Int16 GetElementValue(Int16 inWhichElement); virtual void SetElementValue(Int16 inWhichElement, Int16 inValue); virtual Int16 GetElementMaxIndex(Int16 inWhichElement); virtual void GetElementString(Int16 inWhichElement, Int16 inIndex, Str32 outString); virtual Int16 GetMaxElementStringWidth(Int16 inWhichElement) ; virtual void GetElementSeparatorString(Int16 inAfterWhichElement, Str32 outString); Int16 GetElementKind(Int16 inWhichElement); Boolean IsLeapYear(Int16 inYear); }; //******************************************************************************************** class cClockControl : public cTimeControl, public LPeriodical{ public: enum { class_ID = 'clEl' }; cClockControl(LStream* inStream); void SetTimeValue(Int16 inHours, Int16 inMinutes, Int16 inSeconds); void GetTimeValue(Int16& outHours, Int16& outMinutes, Int16& outSeconds); void SetTimeMinValue(Int16 inHours, Int16 inMinutes, Int16 inSeconds); void GetTimeMinValue(Int16& outHours, Int16& outMinutes, Int16& outSeconds); void SetTimeMaxValue(Int16 inHours, Int16 inMinutes, Int16 inSeconds); void GetTimeMaxValue(Int16& outHours, Int16& outMinutes, Int16& outSeconds); virtual void IncrementCurrentElement(void); virtual void DecrementCurrentElement(void); virtual void SpendTime( const EventRecord &inMacEvent); virtual Boolean ObeyCommand( CommandT inCommand, void *ioParam); protected: enum{ eHourElement = 0, eMinuteElement, eSecondElement }; Boolean mIsLive, mShowSeconds; virtual void FinishCreateSelf(void); virtual void ClickSelf( const SMouseDownEvent &inMouseDown); virtual void EnableSelf(void); virtual void DisableSelf(void); virtual Int16 GetElementCount(void); virtual Int16 GetElementValue(Int16 inWhichElement); virtual void SetElementValue(Int16 inWhichElement, Int16 inValue); virtual Int16 GetElementMaxIndex(Int16 inWhichElement); virtual void GetElementString(Int16 inWhichElement, Int16 inIndex, Str32 outString); virtual Int16 GetMaxElementStringWidth(Int16 inWhichElement) ; virtual void GetElementSeparatorString(Int16 inAfterWhichElement, Str32 outString); }; #endif