00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#ifndef TViewNoCompositingCompatible_H_
00011
#define TViewNoCompositingCompatible_H_
00012
00013
#include "TView.h"
00014
00015
00016
#if !defined(SUPPORT_CONTROL_MODIFIERS)
00017 #define SUPPORT_CONTROL_MODIFIERS 1
00018
#endif
00019
00020
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
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
00137
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
00152 static void SetWindowReady(
bool ready) { sWindowReady = ready; };
00153
00154
virtual void DrawBackgroundImage(CGContextRef context);
00155
00156
00157
bool IsCompositing();
00158
void ConvertToGlobal(HIPoint& thePoint);
00159
void ConvertToLocal(HIPoint& thePoint);
00160
00161
00162
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;
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
00218
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 }
00292
00293
00294
#endif