mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-12-22 02:29:56 +00:00
113 lines
3.9 KiB
C++
113 lines
3.9 KiB
C++
#include "TemplateInitalisation.h"
|
|
#include "TemplateWindow.h"
|
|
globals g;
|
|
|
|
/*** INITALISE NEW EDITOR INSTANCE ***/
|
|
OSStatus Plug_InitInstance( Plug_PlugInRef plug, Plug_ResourceRef resource )
|
|
{
|
|
// get system version
|
|
OSStatus error = Gestalt( gestaltSystemVersion, &g.systemVersion );
|
|
if( error ) return error;
|
|
|
|
// check appearance availablilty
|
|
#if TARGET_API_MAC_CARBON
|
|
g.useAppearance = true;
|
|
#else
|
|
ProcessSerialNumber psn;
|
|
error = GetCurrentProcess( &psn );
|
|
if( error ) g.useAppearance = false;
|
|
else g.useAppearance = IsAppearanceClient( &psn );
|
|
#endif
|
|
|
|
// get template for resource
|
|
ResType type = Host_GetResourceType( resource );
|
|
Handle tmpl = Host_GetDefaultTemplate( type );
|
|
SInt32 size = GetHandleSize( tmpl ); // cannot be less than 5 (string length of zero, four char code)
|
|
if( tmpl == null || size < 5 ) return paramErr; // not the best error to return for this situation
|
|
|
|
// create window
|
|
Rect creationBounds;
|
|
WindowRef window;
|
|
SetRect( &creationBounds, 0, 0, kDefaultWindowWidth, kDefaultWindowHeight );
|
|
OffsetRect( &creationBounds, 8, 48 );
|
|
WindowAttributes attributes = kWindowStandardDocumentAttributes | kWindowStandardHandlerAttribute | kWindowInWindowMenuAttribute;
|
|
if( g.systemVersion >= kMacOSX ) attributes |= kWindowLiveResizeAttribute;
|
|
error = CreateNewWindow( kDocumentWindowClass, attributes, &creationBounds, &window );
|
|
Plug_WindowRef plugWindow = Host_RegisterWindow( plug, resource, window );
|
|
|
|
#if TARGET_API_MAC_CARBON
|
|
// install window event handler
|
|
EventHandlerRef ref = null;
|
|
EventHandlerUPP handler = NewEventHandlerUPP( CarbonWindowEventHandler );
|
|
EventTypeSpec events[] = { { kEventClassWindow, kEventWindowClose } };
|
|
InstallWindowEventHandler( window, handler, GetEventTypeCount(events), events, plug, &ref );
|
|
#else
|
|
ClassicEventHandlerUPP handler = NewClassicEventHandlerUPP( ClassicWindowEventHandler );
|
|
Host_InstallClassicWindowEventHandler( plugWindow, handler );
|
|
#endif
|
|
|
|
// set window's background to default for theme
|
|
if( g.useAppearance )
|
|
SetThemeWindowBackground( window, kThemeBrushModelessDialogBackgroundActive, false );
|
|
|
|
// cerate new template window class
|
|
TemplateWindowPtr templateWindow = new TemplateWindow( window );
|
|
Host_SetWindowRefCon( plugWindow, (UInt32) templateWindow );
|
|
|
|
// parse the resource data
|
|
Handle data = Host_GetResourceData( resource );
|
|
error = templateWindow->UseTemplate( tmpl ); // pass responsibility for disposing to the window
|
|
error = templateWindow->ParseData( data ); // parses the resource into an array of Elements
|
|
|
|
// show window
|
|
ShowWindow( window );
|
|
SelectWindow( window );
|
|
return error;
|
|
}
|
|
|
|
/*** ELEMENT CONSTRUCTOR ***/
|
|
Element::Element( void )
|
|
{
|
|
BlockZero( this, sizeof(Element) );
|
|
}
|
|
|
|
/*** CARBON WINDOW EVENT HANDLER ***/
|
|
pascal OSStatus CarbonWindowEventHandler( EventHandlerCallRef handler, EventRef event, void *userData )
|
|
{
|
|
#pragma unused( handler )
|
|
OSStatus error = eventNotHandledErr;
|
|
Plug_PlugInRef plugRef = (Plug_PlugInRef) userData;
|
|
WindowRef window = GetUserFocusWindow(); // overridden below for window class events
|
|
|
|
// get event type
|
|
UInt32 eventClass = GetEventClass( event );
|
|
UInt32 eventKind = GetEventKind( event );
|
|
|
|
// get event parameters
|
|
if( eventClass == kEventClassWindow )
|
|
GetEventParameter( event, kEventParamDirectObject, typeWindowRef, null, sizeof(WindowRef), null, &window );
|
|
if( !window ) return error;
|
|
Plug_WindowRef plugWindow = Host_GetPlugWindowFromWindowRef( window );
|
|
if( !plugWindow ) return error;
|
|
TemplateWindowPtr templateWindow = (TemplateWindowPtr) Host_GetWindowRefCon( plugWindow );
|
|
if( !templateWindow ) return error;
|
|
|
|
// get window rect
|
|
Rect windowBounds;
|
|
GetWindowPortBounds( window, &windowBounds );
|
|
|
|
// handle event
|
|
static EventHandlerRef resizeEventHandlerRef = null;
|
|
switch( eventClass )
|
|
{
|
|
case kEventClassWindow:
|
|
switch( eventKind )
|
|
{
|
|
case kEventWindowClose:
|
|
delete templateWindow;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return error;
|
|
} |