00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef TViewNoCompositingCompatible_H_
00011 #define TViewNoCompositingCompatible_H_
00012
00013 #include "TView.h"
00014 #include "CACFDictionary.h"
00015 #include "AUProperty.h"
00016
00017
00018 #if !defined(SUPPORT_CONTROL_MODIFIERS)
00019 #define SUPPORT_CONTROL_MODIFIERS 1
00020 #endif
00021
00022
00023 #if !defined(HIGH_PRECISION_MODIFIER)
00024 #define HIGH_PRECISION_MODIFIER optionKey
00025 #endif
00026 #if !defined(HIGHEST_PRECISION_MODIFIER)
00027 #define HIGHEST_PRECISION_MODIFIER controlKey
00028 #endif
00029
00074
00075 #define AUGUIDefineControl(classname, parent, name) \
00076 friend class TViewNoCompositingCompatible; \
00077 protected: \
00078 static const AUGUI::property_t mPropertiesList[];\
00079 static const size_t mPropertiesListSize;\
00080 public: \
00081 static CFStringRef GetControlName() { return CFSTR(name);}; \
00082 virtual CFStringRef GetType() { return GetControlName(); }; \
00083 virtual const AUGUI::property_t& GetPropertyDefinition(unsigned int i) const \
00084 { \
00085 if (i < parent::GetPropertiesListSize())\
00086 return parent::GetPropertyDefinition(i);\
00087 else\
00088 return mPropertiesList[i-parent::GetPropertiesListSize()]; \
00089 }\
00090 virtual size_t GetPropertiesListSize() const { return parent::GetPropertiesListSize() + mPropertiesListSize; }
00091
00092 #define AUGUIProperties(CLASS) const AUGUI::property_t CLASS::mPropertiesList[]
00093 #define AUGUIInit(CLASS) const size_t CLASS::mPropertiesListSize = sizeof(mPropertiesList)/sizeof(AUGUI::property_t)-1
00094
00095 class TViewNoCompositingCompatible
00096 : public TView
00097 {
00098 protected:
00099 static const AUGUI::property_t mPropertiesList[];
00100 static const size_t mPropertiesListSize;
00101 public:
00102 typedef enum {
00103 kPropertyTypeInt = 0,
00104 kPropertyTypeDouble,
00105 kPropertyTypeString
00106 } tPropertyType;
00107
00108 static const OSType theViewTag = 'TVew';
00109
00110 static OSStatus RegisterSubclass(CFStringRef inID, ConstructProc inProc );
00111 static OSStatus UnRegisterSubclass( CFStringRef inID);
00112
00113 TViewNoCompositingCompatible( HIViewRef inControl );
00114 virtual ~TViewNoCompositingCompatible();
00115
00116 virtual CFStringRef GetType() = 0;
00117
00118 void ForceRedraw();
00119 void ForceValueChange();
00120
00121 static void SetClassBundle(CFBundleRef sBundle);
00122
00123 virtual void FlushStaticBackground();
00124
00125 virtual OSStatus SetFocusPart(ControlPartCode inDesiredFocus, Boolean inFocusEverything, ControlPartCode* outActualFocus);
00126 virtual void EraseBackground(CGContextRef inContext, bool inCompositing);
00127 virtual void Draw(RgnHandle inLimitRgn, CGContextRef inContext );
00128 virtual void DrawStaticBackground(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing ) {};
00129 virtual void CompatibleDraw(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing ) = 0;
00130
00138 virtual OSStatus SetUpTracking(TCarbonEvent& inEvent);
00139
00140 virtual OSStatus StartTracking(TCarbonEvent&inEvent, HIPoint& from);
00141 virtual OSStatus StillTracking(TCarbonEvent&inEvent, HIPoint& from);
00142 virtual OSStatus StopTracking(TCarbonEvent&inEvent, HIPoint& from);
00143
00147 virtual OSStatus Track(TCarbonEvent& inEvent, ControlPartCode* outPartHit);
00148
00149 virtual OSStatus GetData(OSType inTag, ControlPartCode inPart, Size inSize, Size* outSize, void* inPtr);
00150 virtual ControlPartCode HitTest(
00151 const HIPoint& inWhere );
00152 virtual OSStatus ControlHit(
00153 ControlPartCode inPart,
00154 UInt32 inModifiers );
00155
00157 virtual UInt32 GetBehaviors() { return (TView::GetBehaviors() | kControlSupportsEmbedding); };
00158
00161 virtual bool UseNonblockingTracking() { return false; }
00162
00164 template <class V> static CFStringRef CopyClassIDForBundleID(CFStringRef bundleID);
00166 template <class V> static CFStringRef CopyCanonicalClassID();
00167
00169 template <class V> static void RegisterClassForBundleID(CFStringRef str);
00170
00171
00172
00173 template <class V> static void UnRegisterClassForBundleID(CFStringRef str);
00174
00175 static OSStatus TViewNoCompositingCompatible::NewView(
00176 HIViewRef* outControl,
00177 const HIRect* inBounds,
00178 HIViewRef inView,
00179 CFStringRef classID);
00180
00181 static OSStatus TViewNoCompositingCompatible::NewViewForCurrentBundle(
00182 HIViewRef* outControl,
00183 const HIRect* inBounds,
00184 HIViewRef inView,
00185 CFStringRef className);
00186
00187 template <class V> static OSStatus Construct(
00188 HIObjectRef inBaseObject,
00189 TObject** outInstance );
00190
00191 template <class V> static OSStatus CreateInView(
00192 HIViewRef* outControl,
00193 const HIRect* inBounds,
00194 HIViewRef inRoot,
00195 CFStringRef classID);
00196
00197 template <class V> static OSStatus Create(
00198 HIViewRef* outControl,
00199 const HIRect* inBounds,
00200 WindowRef inWindow,
00201 CFStringRef classID);
00202
00203 template <class V> static TViewNoCompositingCompatible* CreateForCurrentBundle (
00204 const HIRect* inBounds,
00205 HIViewRef inRoot);
00206
00207 static void UnRegisterAllClasses();
00208
00209
00210 static void SetWindowReady(bool ready) { sWindowReady = ready; };
00211
00212 virtual void DrawBackgroundImage(CGContextRef context);
00213
00214
00215 bool IsCompositing();
00216 void ConvertToGlobal(HIPoint& thePoint);
00217 void ConvertToLocal(HIPoint& thePoint);
00218
00219 virtual void WriteToDictionary(CACFDictionary &dict);
00220 virtual void ReadFromDictionary(CACFDictionary &dict);
00221
00222
00223 virtual void SetProperty(OSType propID, double value);
00224 virtual void SetProperty(OSType propID, int32_t value);
00225 virtual void SetProperty(OSType propID, CFStringRef value);
00226 virtual void SetProperty(OSType propID, AUGUI::font_t &value);
00227 virtual void SetProperty(OSType propID, AUGUI::rect_t &value);
00228 virtual void SetProperty(OSType propID, AUGUI::color_t &value);
00229 virtual void SetProperty(OSType propID, AUGUI::point_t &value);
00230 virtual bool GetProperty(OSType propID, double &value);
00231 virtual bool GetProperty(OSType propID, int32_t &value);
00232 virtual bool GetProperty(OSType propID, CFStringRef &value);
00233 virtual bool GetProperty(OSType propID, AUGUI::font_t &value);
00234 virtual bool GetProperty(OSType propID, AUGUI::rect_t &value);
00235 virtual bool GetProperty(OSType propID, AUGUI::color_t &value);
00236 virtual bool GetProperty(OSType propID, AUGUI::point_t &value);
00237
00238 virtual void PropertiesChanged() {};
00239
00240 virtual const AUGUI::property_t& GetPropertyDefinition(unsigned int i) const { return mPropertiesList[i];}
00241 virtual size_t GetPropertiesListSize() const { return mSaveMinMaxVal?mPropertiesListSize:(mPropertiesListSize-3); }
00242
00243 void SaveMinMaxVal(bool save) { mSaveMinMaxVal = save; }
00244
00245
00246 protected:
00247 virtual bool Prerender() { return true; };
00248 bool IsWindowReady() const { return sWindowReady; };
00249 virtual OSStatus mouseDragged(TCarbonEvent&inEvent);
00250 virtual OSStatus mouseUp(TCarbonEvent&inEvent);
00251 virtual void PrerenderStaticBackground();
00252 CFBundleRef mBundleRef;
00253
00254 int mCurrentFocusPart;
00255 CGImageRef mStaticBackground;
00256
00257 private:
00258 bool mRedrawn;
00259 HIPoint mFromPoint;
00260 EventHandlerRef mMouseEventHandler;
00261
00262
00263 bool mSaveMinMaxVal;
00264
00265 static CFBundleRef sStaticBundle;
00266
00267 static bool sWindowReady;
00268
00269 static pascal OSStatus MouseEventHandler(
00270 EventHandlerCallRef inCallRef,
00271 EventRef inEvent,
00272 void* inUserData );
00273
00274 static CFMutableDictionaryRef mRegisteryCache;
00275 };
00276 typedef TViewNoCompositingCompatible* TViewNoCompositingCompatiblePtr;
00277
00278 template <class V>
00279 CFStringRef TViewNoCompositingCompatible::CopyCanonicalClassID()
00280 {
00281 return TViewNoCompositingCompatible::CopyClassIDForBundleID<V>(CFBundleGetIdentifier(V::sStaticBundle));
00282 }
00283
00286 template <class V>
00287 CFStringRef TViewNoCompositingCompatible::CopyClassIDForBundleID(CFStringRef bundleID)
00288 {
00289 return CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%@.%@"), bundleID, V::GetControlName());
00290 }
00291
00292 template <class V>
00293 void TViewNoCompositingCompatible::RegisterClassForBundleID(CFStringRef str)
00294 {
00295 CFStringRef reg = CopyClassIDForBundleID<V>(str);
00296 RegisterSubclass( reg, (ConstructProc)Construct<V>);
00297 CFRelease(reg);
00298 }
00299
00300
00301
00302 template <class V>
00303 void TViewNoCompositingCompatible::UnRegisterClassForBundleID(CFStringRef str)
00304 {
00305 CFStringRef reg = CopyClassIDForBundleID<V>(str);
00306 UnRegisterSubclass( reg);
00307 CFRelease(reg);
00308 }
00309
00310 template <class V>
00311 OSStatus TViewNoCompositingCompatible::Construct(
00312 HIObjectRef inBaseObject,
00313 TObject** outInstance )
00314 {
00315 *outInstance = new V( (HIViewRef)inBaseObject );
00316 return noErr;
00317 }
00318
00319
00320 template <class V>
00321 OSStatus TViewNoCompositingCompatible::CreateInView(
00322 HIViewRef* outControl,
00323 const HIRect* inBounds,
00324 HIViewRef inView,
00325 CFStringRef classID)
00326 {
00327 RegisterSubclass(classID, TViewNoCompositingCompatible::Construct<V>);
00328 return NewView( outControl, inBounds, inView, classID );
00329 }
00330
00331 template <class V>
00332 OSStatus TViewNoCompositingCompatible::Create(
00333 HIViewRef* outControl,
00334 const HIRect* inBounds,
00335 WindowRef inWindow,
00336 CFStringRef classID)
00337 {
00338 HIViewRef root = 0;
00339 if ( inWindow != NULL )
00340 GetRootControl( inWindow, &root );
00341 return CreateInView<V>(outControl, inBounds, root, classID);
00342 }
00343
00344 template <class V>
00345 TViewNoCompositingCompatible* TViewNoCompositingCompatible::CreateForCurrentBundle (
00346 const HIRect* inBounds,
00347 HIViewRef root)
00348 {
00349 HIViewRef ctrl = 0;
00350 TViewNoCompositingCompatible *tview = 0;
00351 CFStringRef classID = TViewNoCompositingCompatible::CopyCanonicalClassID<V>();
00352 TViewNoCompositingCompatible::CreateInView<V>(&ctrl, inBounds, root, classID);
00353 CFRelease(classID);
00354 if (ctrl)
00355 GetControlData(ctrl, 0, TViewNoCompositingCompatible::theViewTag, sizeof(tview), &tview, 0);
00356 return tview;
00357 }
00358
00359 namespace AUGUI {
00361
00362
00363
00364
00365 template <class V>
00366 inline TViewNoCompositingCompatible* CreateForCurrentBundle (const HIRect* inBounds, HIViewRef root)
00367 {
00368 return TViewNoCompositingCompatible::CreateForCurrentBundle<V>(inBounds, root);
00369 }
00370
00371
00374 template <class V>
00375 inline CFStringRef CopyCanonicalClassID()
00376 {
00377 return TViewNoCompositingCompatible::CopyCanonicalClassID<V>();
00378 }
00379
00380 template <class V>
00381 inline CFStringRef CopyClassIDForBundleID(CFStringRef bundleID)
00382 {
00383 return TViewNoCompositingCompatible::CopyClassIDForBundleID<V>(bundleID);
00384 }
00386
00387 template <class V>
00388 inline void AddPropertyInfo(uint32_t tag, std::string name, std::string label, property_type_t type)
00389 {
00390 V::mPropertiesList[tag] = property_t(tag, name, label, type);
00391 }
00392
00393 }
00394
00395
00396 #endif