00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #if !defined(_TTransparentEditText_h_)
00011 #define _TTransparentEditText_h_
00012
00013 #include "TViewNoCompositingCompatible.h"
00014 #include "TUnicodeTextStorage.h"
00015
00016 enum {
00019 kTransparentEditTextCFStringTag = kControlEditTextCFStringTag,
00020
00023 kTransparentEditTextFontStyleTag = kControlFontStyleTag,
00024
00028 kTransparentEditTextKeyFilterTag = kControlEditTextKeyFilterTag,
00029
00031 kTransparentEditTextSelectionTag = kControlEditTextSelectionTag,
00032
00035 kTransparentEditTextLockedTag = kControlEditTextLockedTag,
00036
00045 kTransparentEditTextFocusCGImageRefTag = FOUR_CHAR_CODE('Fimg'),
00046
00054 kTransparentEditTextFocusImageURLTag = FOUR_CHAR_CODE('Furl'),
00055
00058 kTransparentEditTextNextKeyboardFocusControlIDTag = FOUR_CHAR_CODE('NFID'),
00059
00062 kTransparentEditTextNextKeyboardFocusControlRefTag = FOUR_CHAR_CODE('NFCR'),
00063
00065 kTransparentEditTextNextKeyboardFocusPartTag = FOUR_CHAR_CODE('NFPC'),
00066
00068 kTransparentEditTextBackgroundImageTag = FOUR_CHAR_CODE('BKIM'),
00069
00071 kTransparentEditTextFontATSUStyleTag = FOUR_CHAR_CODE('ATSU'),
00072
00074 kTransparentEditTextFontDrawFrameTag = FOUR_CHAR_CODE('FRAM')
00075
00076 };
00077
00086 class TTransparentEditText : public TViewNoCompositingCompatible
00087 {
00088 AUGUIDefineControl(TTransparentEditText, TViewNoCompositingCompatible, "edittext");
00089 protected:
00090
00091 TTransparentEditText(HIViewRef inControl);
00092 virtual ~TTransparentEditText();
00093
00094 virtual ControlKind GetKind();
00095
00096 virtual bool UseNonblockingTracking() { return true; }
00097
00099
00100 virtual OSStatus Initialize(TCarbonEvent& inEvent);
00101 virtual void TitleChanged();
00102 virtual void ActiveStateChanged();
00103 virtual OSStatus SetFocusPart(ControlPartCode inDesiredFocus, Boolean inFocusEverything, ControlPartCode* outActualFocus);
00104 virtual OSStatus BoundsChanged(UInt32 inOptions, const HIRect& inOriginalBounds, const HIRect& inCurrentBounds, RgnHandle inInvalRgn);
00105 virtual ControlPartCode HitTest(const HIPoint& inWhere);
00106 virtual OSStatus StillTracking(TCarbonEvent& inEvent, HIPoint& from);
00107 virtual OSStatus StartTracking(TCarbonEvent& inEvent, HIPoint& from);
00108 virtual void DrawStaticBackground(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing );
00109 virtual void CompatibleDraw(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing);
00110 virtual UInt32 GetBehaviors() { return TViewNoCompositingCompatible::GetBehaviors() | kControlSupportsEmbedding | kControlSupportsFocus | kControlGetsFocusOnClick; }
00111 virtual OSStatus SetData(OSType inTag, ControlPartCode inPart, Size inSize, const void* inPtr);
00112 virtual OSStatus GetData(OSType inTag, ControlPartCode inPart, Size inSize, Size* outSize, void* inPtr);
00113 virtual OSStatus TextInput(TCarbonEvent& inEvent);
00115
00117 virtual void ProcessTextInput(UniChar* text, uint32_t count, uint32_t modifiers);
00118
00119 virtual void SetDrawFrame(bool draw) { mDrawFrame = draw; };
00120
00121 private:
00122 ATSUStyle mTextStyle;
00123 ATSUTextLayout mTextLayout;
00124 TUnicodeTextStorage mTextStorage;
00125 float mTextInset;
00126 bool mIsActive;
00127 bool mIsFocused;
00128 bool mDrawFrame;
00129 uint32_t mSelectionStart;
00130 uint32_t mSelectionEnd;
00131 bool mSelectionIsLeading;
00132 CFRunLoopTimerRef mCaretUpdateTimer;
00133 bool mCaretIsVisible;
00134 uint32_t mSelectionAnchor;
00135 EventTime mLastClickTime;
00136 HIPoint mLastClickPoint;
00137 int mClickCount;
00138 CGImageRef mFocusImage;
00139 CGImageRef mBackImage;
00140 bool mIsLocked;
00141 ControlKeyFilterProcPtr mKeyFilter;
00142 ControlRef mNextFocusControl;
00143 ControlPartCode mNextFocusPart;
00144
00145 void UpdateTextLayout();
00146 void GetLineHeight(uint32_t lineStartOffset, float* outAscent, float* outDescent);
00147 float GetBaselineForLine(uint32_t lineStartOffset);
00148 void FindWordAtOffset(uint32_t offset, uint32_t* wordStart, uint32_t* wordEnd);
00149
00150 void InstallCaretUpdateTimer();
00151 void RemoveCaretUpdateTimer();
00152
00153 void UpdateCaret();
00154
00155 static void CaretUpdateTimerCallback(CFRunLoopTimerRef timer, void *info);
00156 };
00157
00158 #endif //_TTransparentEditText_h_