ResKnife/Carbon/Classes/InspectorWindow.cpp

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
}