mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-06-16 06:29:27 +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
|
|
} |