mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-12-31 00:29:22 +00:00
273 lines
10 KiB
C++
273 lines
10 KiB
C++
#include "InspectorWindow.h"
|
|
#include "FileWindow.h"
|
|
#include "ResourceObject.h"
|
|
#include "Utility.h"
|
|
extern globals g;
|
|
|
|
/*******************/
|
|
/* WINDOW & EVENTS */
|
|
/*******************/
|
|
|
|
/*** CONSTRUCTOR ***/
|
|
InspectorWindow::InspectorWindow( void )
|
|
{
|
|
// if inspector already exists, return
|
|
if( g.inspector )
|
|
{
|
|
SelectWindow( g.inspector->Window() );
|
|
return;
|
|
}
|
|
|
|
#if TARGET_API_MAC_CARBON
|
|
// create window
|
|
Str255 windowName;
|
|
Rect creationBounds;
|
|
SetRect( &creationBounds, 0, 0, kInspectorWindowWidth, kInspectorWindowHeight );
|
|
OffsetRect( &creationBounds, 520, 45 );
|
|
OSStatus error = CreateNewWindow( kFloatingWindowClass, kWindowStandardFloatingAttributes | kWindowStandardHandlerAttribute, &creationBounds, &window );
|
|
if( !error )
|
|
{
|
|
GetIndString( windowName, kWindowNameStrings, kStringInspectorWindowName );
|
|
SetWindowTitle( window, windowName );
|
|
SetWindowKind( window, kInspectorWindowKind );
|
|
SetThemeWindowBackground( window, kThemeBrushUtilityWindowBackgroundActive, false );
|
|
|
|
// install window event handler
|
|
EventHandlerRef ref = null;
|
|
EventHandlerUPP eventHandler = NewEventHandlerUPP( CloseInspectorWindow );
|
|
EventTypeSpec events[] = { { kEventClassWindow, kEventWindowClose } };
|
|
InstallWindowEventHandler( window, eventHandler, GetEventTypeCount(events), (EventTypeSpec *) &events, this, &ref );
|
|
|
|
// create root control
|
|
Rect bounds;
|
|
if( g.systemVersion < kMacOSX )
|
|
{
|
|
ControlRef root;
|
|
CreateRootControl( window, &root );
|
|
}
|
|
|
|
// create image well
|
|
ControlRef imageWell;
|
|
ControlButtonContentInfo content;
|
|
content.contentType = kControlNoContent;
|
|
SetRect( &bounds, 0, 0, 44, 44 );
|
|
OffsetRect( &bounds, 8, 8 );
|
|
CreateImageWellControl( window, &bounds, &content, &imageWell );
|
|
|
|
// create static text controls
|
|
Rect windowRect;
|
|
ControlRef name, type, id;
|
|
ControlFontStyleRec fontStyle;
|
|
fontStyle.flags = kControlUseFontMask + kControlUseJustMask;
|
|
fontStyle.font = kControlFontSmallSystemFont;
|
|
fontStyle.just = teJustLeft;
|
|
GetWindowPortBounds( window, &windowRect );
|
|
SetRect( &bounds, windowRect.left +60, windowRect.top +8, windowRect.right - windowRect.left -8, windowRect.top +36 );
|
|
CreateStaticTextControl( window, &bounds, CFSTR(""), &fontStyle, &name );
|
|
fontStyle.font = kControlFontSmallBoldSystemFont;
|
|
SetRect( &bounds, windowRect.left +60, windowRect.top +38, windowRect.right - windowRect.left -70, windowRect.top +52 );
|
|
CreateStaticTextControl( window, &bounds, CFSTR(""), &fontStyle, &type );
|
|
SetRect( &bounds, windowRect.right - windowRect.left -70, windowRect.top +38, windowRect.right - windowRect.left -8, windowRect.top +52 );
|
|
CreateStaticTextControl( window, &bounds, CFSTR(""), &fontStyle, &id );
|
|
|
|
// create group control
|
|
ControlRef group;
|
|
GetWindowPortBounds( window, &bounds );
|
|
InsetRect( &bounds, 8, 8 );
|
|
bounds.top += kInspectorHeaderHeight;
|
|
CreateGroupBoxControl( window, &bounds, CFSTR("Attributes"), true, &group );
|
|
|
|
// create checkboxes
|
|
ControlRef changedBox, preloadBox, protectedBox,
|
|
lockedBox, purgeableBox, sysHeapBox;
|
|
InsetRect( &bounds, 4, 4 );
|
|
bounds.top = bounds.bottom - kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("System Heap"), kControlCheckBoxUncheckedValue, true, &sysHeapBox );
|
|
bounds.top -= kControlCheckBoxHeight;
|
|
bounds.bottom -= kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("Purgeable"), kControlCheckBoxUncheckedValue, true, &purgeableBox );
|
|
bounds.top -= kControlCheckBoxHeight;
|
|
bounds.bottom -= kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("Locked"), kControlCheckBoxUncheckedValue, true, &lockedBox );
|
|
bounds.top -= kControlCheckBoxHeight;
|
|
bounds.bottom -= kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("Protected"), kControlCheckBoxUncheckedValue, true, &protectedBox );
|
|
bounds.top -= kControlCheckBoxHeight;
|
|
bounds.bottom -= kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("Preload"), kControlCheckBoxUncheckedValue, true, &preloadBox );
|
|
bounds.top -= kControlCheckBoxHeight;
|
|
bounds.bottom -= kControlCheckBoxHeight;
|
|
CreateCheckBoxControl( window, &bounds, CFSTR("Changed"), kControlCheckBoxUncheckedValue, true, &changedBox );
|
|
|
|
// embed controls
|
|
EmbedControl( changedBox, group );
|
|
EmbedControl( preloadBox, group );
|
|
EmbedControl( protectedBox, group );
|
|
EmbedControl( lockedBox, group );
|
|
EmbedControl( purgeableBox, group );
|
|
EmbedControl( sysHeapBox, group );
|
|
}
|
|
else window = NULL;
|
|
#else
|
|
if( g.useAppearance && g.systemVersion >= kMacOS8 )
|
|
window = GetNewCWindow( kFileWindow8, null, kFirstWindowOfClass );
|
|
else
|
|
window = GetNewCWindow( kFileWindow7, null, kFirstWindowOfClass );
|
|
#endif
|
|
|
|
if( window )
|
|
{
|
|
// update and show window
|
|
Update();
|
|
ShowWindow( window );
|
|
g.inspector = this;
|
|
}
|
|
else g.inspector = NULL;
|
|
}
|
|
|
|
/*** DESTRUCTOR ***/
|
|
InspectorWindow::~InspectorWindow( void )
|
|
{
|
|
g.inspector = null;
|
|
}
|
|
|
|
/*** CLOSW WINDOW EVENT HANDLER ***/
|
|
pascal OSStatus CloseInspectorWindow( EventHandlerCallRef callRef, EventRef event, void *userData )
|
|
{
|
|
#pragma unused( callRef, event, userData )
|
|
if( g.inspector ) delete g.inspector;
|
|
return eventNotHandledErr;
|
|
}
|
|
|
|
/*** UPDATE WINDOW ***/
|
|
OSStatus InspectorWindow::Update( RgnHandle region )
|
|
{
|
|
#pragma unused( region )
|
|
#if TARGET_API_MAC_CARBON
|
|
// get target file
|
|
FileWindowPtr file = null;
|
|
WindowRef fileWindow = GetFrontWindowOfClass( kDocumentWindowClass, true );
|
|
if( !fileWindow ) return noErr; // no window is open - BUG: items in window are not cleared
|
|
|
|
OSStatus error = noErr;
|
|
Boolean validWindow = false;
|
|
while( !validWindow || error )
|
|
{
|
|
WindowKind kind = (WindowKind) GetWindowKind( fileWindow );
|
|
if( kind != kFileWindowKind )
|
|
{
|
|
fileWindow = GetNextWindowOfClass( fileWindow, kDocumentWindowClass, true );
|
|
if( !window ) error = paramErr;
|
|
}
|
|
else
|
|
{
|
|
file = (FileWindowPtr) GetWindowRefCon( fileWindow );
|
|
if( file ) validWindow = true;
|
|
else error = paramErr;
|
|
}
|
|
}
|
|
if( error ) return error;
|
|
|
|
// get selection
|
|
UInt32 itemCount;
|
|
ControlRef browser = null;
|
|
GetWindowProperty( fileWindow, kResKnifeCreator, kDataBrowserSignature, sizeof(ControlRef), null, &browser );
|
|
GetDataBrowserItemCount( browser, kDataBrowserNoItem, true, kDataBrowserItemIsSelected, &itemCount );
|
|
|
|
// get controls
|
|
ControlRef root, well, name, type, id, group;
|
|
ControlRef changedBox, preloadBox, protectedBox, lockedBox, purgeableBox, sysHeapBox;
|
|
ControlButtonContentInfo content;
|
|
GetRootControl( window, &root );
|
|
GetIndexedSubControl( root, 1, &well );
|
|
GetIndexedSubControl( root, 2, &name );
|
|
GetIndexedSubControl( root, 3, &type );
|
|
GetIndexedSubControl( root, 4, &id );
|
|
GetIndexedSubControl( root, 5, &group );
|
|
GetIndexedSubControl( group, 1, &changedBox );
|
|
GetIndexedSubControl( group, 2, &preloadBox );
|
|
GetIndexedSubControl( group, 3, &protectedBox );
|
|
GetIndexedSubControl( group, 4, &lockedBox );
|
|
GetIndexedSubControl( group, 5, &purgeableBox );
|
|
GetIndexedSubControl( group, 6, &sysHeapBox );
|
|
|
|
if( itemCount != 1 )
|
|
{
|
|
// set icon
|
|
content.contentType = kControlNoContent;
|
|
SetImageWellContentInfo( well, &content );
|
|
DrawOneControl( well ); // bug: work around for bug in ControlManager
|
|
// DisableControl( well );
|
|
|
|
// set name
|
|
StringPtr blank = (StringPtr) NewPtrClear( sizeof(Str255) );
|
|
CopyPascalStringToC( "\p", (char *) blank );
|
|
SetControlData( name, kControlLabelPart, kControlStaticTextTextTag, 1, blank );
|
|
SetControlTitle( name, "\p" );
|
|
|
|
// set type
|
|
SetControlData( type, kControlLabelPart, kControlStaticTextTextTag, 1, blank );
|
|
SetControlTitle( type, "\p" );
|
|
|
|
// set ID
|
|
SetControlData( id, kControlLabelPart, kControlStaticTextTextTag, 1, blank );
|
|
SetControlTitle( id, "\p" );
|
|
|
|
// set control values
|
|
SetControlValue( changedBox, kControlCheckBoxUncheckedValue );
|
|
SetControlValue( preloadBox, kControlCheckBoxUncheckedValue );
|
|
SetControlValue( protectedBox, kControlCheckBoxUncheckedValue );
|
|
SetControlValue( lockedBox, kControlCheckBoxUncheckedValue );
|
|
SetControlValue( purgeableBox, kControlCheckBoxUncheckedValue );
|
|
SetControlValue( sysHeapBox, kControlCheckBoxUncheckedValue );
|
|
// DisableControl( group );
|
|
}
|
|
else
|
|
{
|
|
// get selected resource
|
|
DataBrowserItemID first, last;
|
|
GetDataBrowserSelectionAnchor( browser, &first, &last ); // first must == last
|
|
ResourceObjectPtr resource = file->GetResource(first);
|
|
|
|
// set icon
|
|
content.contentType = kControlContentIconSuiteRes;
|
|
content.u.resID = kDefaultResourceIcon;
|
|
SetImageWellContentInfo( well, &content );
|
|
DrawOneControl( well ); // bug: work around for bug in ControlManager
|
|
// EnableControl( well );
|
|
|
|
// set name
|
|
StringPtr label = (StringPtr) NewPtrClear( sizeof(Str255) );
|
|
if( PStringLength( resource->Name()) == 0 ) GetIndString( label, kResourceNameStrings, kStringUntitledResource );
|
|
else CopyPascalStringToC( resource->Name(), (char *) label );
|
|
SetControlData( name, kControlLabelPart, kControlStaticTextTextTag, PStringLength(resource->Name()), label );
|
|
SetControlTitle( name, resource->Name() );
|
|
|
|
// set type
|
|
Str255 string;
|
|
TypeToPString( resource->Type(), string );
|
|
CopyPascalStringToC( string, (char *) label );
|
|
SetControlData( type, kControlLabelPart, kControlStaticTextTextTag, string[0], label );
|
|
SetControlTitle( type, string );
|
|
|
|
// set ID
|
|
NumToString( resource->ID(), string );
|
|
CopyPascalStringToC( string, (char *) label );
|
|
SetControlData( id, kControlLabelPart, kControlStaticTextTextTag, string[0], label );
|
|
SetControlTitle( id, string );
|
|
|
|
// set control values
|
|
SetControlValue( changedBox, (resource->Attributes() & resChanged)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
SetControlValue( preloadBox, (resource->Attributes() & resPreload)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
SetControlValue( protectedBox, (resource->Attributes() & resProtected)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
SetControlValue( lockedBox, (resource->Attributes() & resLocked)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
SetControlValue( purgeableBox, (resource->Attributes() & resPurgeable)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
SetControlValue( sysHeapBox, (resource->Attributes() & resSysHeap)? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue );
|
|
DeactivateControl( changedBox );
|
|
// EnableControl( group );
|
|
}
|
|
return error;
|
|
#else
|
|
return noErr;
|
|
#endif
|
|
} |