Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

TViewNoCompositingCompatible.h

Go to the documentation of this file.
00001 /* 00002 * TViewNoCompositingCompatible.h 00003 * NeuSynth 00004 * 00005 * Created by Airy AndrŽ on Wed Nov 06 2002. 00006 * Copyright (c) 2002 Airy AndrŽ. All rights reserved. 00007 * 00008 */ 00009 00010 #ifndef TViewNoCompositingCompatible_H_ 00011 #define TViewNoCompositingCompatible_H_ 00012 00013 #include "TView.h" 00014 00015 // Using modifier keys with controls is supported by default. 00016 #if !defined(SUPPORT_CONTROL_MODIFIERS) 00017 #define SUPPORT_CONTROL_MODIFIERS 1 00018 #endif 00019 00020 // Definitions of which actual modifiers to use. 00021 #if !defined(HIGH_PRECISION_MODIFIER) 00022 #define HIGH_PRECISION_MODIFIER optionKey 00023 #endif 00024 #if !defined(HIGHEST_PRECISION_MODIFIER) 00025 #define HIGHEST_PRECISION_MODIFIER controlKey 00026 #endif 00027 00071 //----------------------------------------------------------------------------------- 00072 // RegisterClassForBundleID 00073 //----------------------------------------------------------------------------------- 00074 // 00075 class TViewNoCompositingCompatible 00076 : public TView 00077 { 00078 public: 00079 static const OSType theViewTag = 'TVew'; 00080 00081 static OSStatus RegisterSubclass(CFStringRef inID, ConstructProc inProc ); 00082 static OSStatus UnRegisterSubclass( CFStringRef inID); 00083 00084 TViewNoCompositingCompatible( HIViewRef inControl ); 00085 ~TViewNoCompositingCompatible(); 00086 00087 static void SetClassBundle(CFBundleRef sBundle); 00088 00089 virtual void FlushStaticBackground(); 00090 00091 virtual void Draw(RgnHandle inLimitRgn, CGContextRef inContext ); 00092 virtual void DrawStaticBackground(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing ) {}; 00093 virtual void CompatibleDraw(RgnHandle inLimitRgn, CGContextRef inContext, bool inCompositing ) = 0; 00094 00102 virtual OSStatus SetUpTracking(TCarbonEvent& inEvent); 00103 00104 virtual OSStatus StartTracking(TCarbonEvent&inEvent, HIPoint& from); 00105 virtual OSStatus StillTracking(TCarbonEvent&inEvent, HIPoint& from); 00106 virtual OSStatus StopTracking(TCarbonEvent&inEvent, HIPoint& from); 00107 00111 virtual OSStatus Track(TCarbonEvent& inEvent, ControlPartCode* outPartHit); 00112 00113 virtual OSStatus GetData(OSType inTag, ControlPartCode inPart, Size inSize, Size* outSize, void* inPtr); 00114 virtual OSStatus GetRegion(ControlPartCode inPart, RgnHandle outRgn); 00115 virtual ControlPartCode HitTest( 00116 const HIPoint& inWhere ); 00117 virtual OSStatus ControlHit( 00118 ControlPartCode inPart, 00119 UInt32 inModifiers ); 00120 00122 virtual UInt32 GetBehaviors() { return TView::GetBehaviors(); } 00123 00126 virtual bool UseNonblockingTracking() { return false; } 00127 00129 template <class V> static CFStringRef CopyClassIDForBundleID(CFStringRef bundleID); 00131 template <class V> static CFStringRef CopyCanonicalClassID(); 00132 00134 template <class V> static void RegisterClassForBundleID(CFStringRef str); 00135 00136 // The following is only needed if you need to unregister a single class 00137 // UnRegisterAllClasses is usually used. 00138 template <class V> static void UnRegisterClassForBundleID(CFStringRef str); 00139 template <class V> static OSStatus Construct( 00140 HIObjectRef inBaseObject, 00141 TObject** outInstance ); 00142 00143 template <class V> static OSStatus Create( 00144 HIViewRef* outControl, 00145 const HIRect* inBounds, 00146 WindowRef inWindow, 00147 CFStringRef classID); 00148 00149 static void UnRegisterAllClasses(); 00150 00151 // Must be false while the window is building 00152 static void SetWindowReady(bool ready) { sWindowReady = ready; }; 00153 00154 virtual void DrawBackgroundImage(CGContextRef context); 00155 00156 // utilities 00157 bool IsCompositing(); 00158 void ConvertToGlobal(HIPoint& thePoint); 00159 void ConvertToLocal(HIPoint& thePoint); 00160 00161 // We have to redefine Initialize and ObjectEventHandler because that are "private" in TView and we need them for 00162 // the unregistering stuff... Too bad 00163 protected: 00164 virtual OSStatus mouseDragged(TCarbonEvent&inEvent); 00165 virtual OSStatus mouseUp(TCarbonEvent&inEvent); 00166 void PrerenderStaticBackground(); 00167 00168 CFBundleRef mBundleRef; 00169 00170 private: 00171 HIPoint mFromPoint; 00172 EventHandlerRef mMouseEventHandler; 00173 00174 CGImageRef mStaticBackground; // The composited background 00175 00176 static CFBundleRef sStaticBundle; 00177 00178 static bool sWindowReady; 00179 00180 #if 0 00181 static pascal OSStatus ObjectEventHandler( 00182 EventHandlerCallRef inCallRef, 00183 EventRef inEvent, 00184 void* inUserData ); 00185 #endif 00186 static pascal OSStatus MouseEventHandler( 00187 EventHandlerCallRef inCallRef, 00188 EventRef inEvent, 00189 void* inUserData ); 00190 00191 static CFMutableDictionaryRef mRegisteryCache; 00192 }; 00193 typedef TViewNoCompositingCompatible* TViewNoCompositingCompatiblePtr; 00194 00195 template <class V> 00196 CFStringRef TViewNoCompositingCompatible::CopyCanonicalClassID() 00197 { 00198 return TViewNoCompositingCompatible::CopyClassIDForBundleID<V>(CFBundleGetIdentifier(V::sStaticBundle)); 00199 } 00200 00203 template <class V> 00204 CFStringRef TViewNoCompositingCompatible::CopyClassIDForBundleID(CFStringRef bundleID) 00205 { 00206 return CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%@.%@"), bundleID, V::GetControlName()); 00207 } 00208 00209 template <class V> 00210 void TViewNoCompositingCompatible::RegisterClassForBundleID(CFStringRef str) 00211 { 00212 CFStringRef reg = CopyClassIDForBundleID<V>(str); 00213 RegisterSubclass( reg, (ConstructProc)Construct<V>); 00214 CFRelease(reg); 00215 } 00216 00217 // The following is only needed if you need to unregister a single class 00218 // UnRegisterAllClasses is usually used. 00219 template <class V> 00220 void TViewNoCompositingCompatible::UnRegisterClassForBundleID(CFStringRef str) 00221 { 00222 CFStringRef reg = CopyClassIDForBundleID<V>(str); 00223 UnRegisterSubclass( reg); 00224 CFRelease(reg); 00225 } 00226 00227 template <class V> 00228 OSStatus TViewNoCompositingCompatible::Construct( 00229 HIObjectRef inBaseObject, 00230 TObject** outInstance ) 00231 { 00232 *outInstance = new V( (HIViewRef)inBaseObject ); 00233 return noErr; 00234 } 00235 00236 template <class V> 00237 OSStatus TViewNoCompositingCompatible::Create( 00238 HIViewRef* outControl, 00239 const HIRect* inBounds, 00240 WindowRef inWindow, 00241 CFStringRef classID) 00242 { 00243 OSStatus err; 00244 EventRef event = CreateInitializationEvent(); 00245 ControlRef root; 00246 00247 RegisterSubclass(classID, TViewNoCompositingCompatible::Construct<V>); 00248 err = HIObjectCreate( classID, event, (HIObjectRef*) outControl ); 00249 00250 ReleaseEvent( event ); 00251 00252 require_noerr( err, CantCreateHIObject ); 00253 00254 if ( inWindow != NULL ) 00255 { 00256 GetRootControl( inWindow, &root ); 00257 HIViewAddSubview( root, *outControl ); 00258 } 00259 00260 if ( inBounds != NULL ) 00261 HIViewSetFrame( *outControl, inBounds ); 00262 00263 CantCreateHIObject: 00264 00265 return err; 00266 } 00267 00268 00269 namespace AUGUI { 00270 00272 00273 00274 00275 00276 00277 00278 template <class V> 00279 inline CFStringRef CopyCanonicalClassID() 00280 { 00281 return TViewNoCompositingCompatible::CopyCanonicalClassID<V>(); 00282 } 00283 00284 template <class V> 00285 inline CFStringRef CopyClassIDForBundleID(CFStringRef bundleID) 00286 { 00287 return TViewNoCompositingCompatible::CopyClassIDForBundleID<V>(bundleID); 00288 } 00290 00291 } // end namespace 00292 00293 00294 #endif





Generated on Sun May 23 19:32:00 2004 for AUGUI Framework by doxygen1.3.7

hosted on SourceForge.net Logo