mirror of
https://github.com/gnustep/apps-gorm.git
synced 2025-02-24 03:51:22 +00:00
Connection management code.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/gorm/trunk@5587 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
e77dbe5d2e
commit
2a6f2299ed
11 changed files with 797 additions and 77 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Mon Dec 20 14:16:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
|
Added connections inspector so connecting objects should work.
|
||||||
|
Use information from 'ClassInformation.plist' to specify outlets
|
||||||
|
and actions for a class.
|
||||||
|
Added GormClassManager stuff to manage this information.
|
||||||
|
|
||||||
Sat Dec 18 21:24:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
Sat Dec 18 21:24:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
Add partial support for draagging into object view.
|
Add partial support for draagging into object view.
|
||||||
|
|
26
ClassInformation.plist
Normal file
26
ClassInformation.plist
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
NSButton = {
|
||||||
|
Actions = (
|
||||||
|
"takeStringValueFrom:"
|
||||||
|
);
|
||||||
|
Super = NSControl;
|
||||||
|
};
|
||||||
|
NSControl = {
|
||||||
|
Outlets = (
|
||||||
|
target
|
||||||
|
);
|
||||||
|
Super = NSView;
|
||||||
|
};
|
||||||
|
NSResponder = {
|
||||||
|
Super = NSObject;
|
||||||
|
};
|
||||||
|
NSView = {
|
||||||
|
Super = NSResponder;
|
||||||
|
};
|
||||||
|
NSWindow = {
|
||||||
|
Outlets = (
|
||||||
|
delegate
|
||||||
|
);
|
||||||
|
Super = NSResponder;
|
||||||
|
};
|
||||||
|
}
|
|
@ -36,6 +36,7 @@ SUBPROJECTS = \
|
||||||
APP_NAME = Gorm
|
APP_NAME = Gorm
|
||||||
Gorm_APPLICATION_ICON=Gorm.tiff
|
Gorm_APPLICATION_ICON=Gorm.tiff
|
||||||
Gorm_RESOURCE_FILES = \
|
Gorm_RESOURCE_FILES = \
|
||||||
|
ClassInformation.plist \
|
||||||
Palettes/0Menus/0Menus.palette \
|
Palettes/0Menus/0Menus.palette \
|
||||||
Palettes/1Windows/1Windows.palette \
|
Palettes/1Windows/1Windows.palette \
|
||||||
Palettes/2Controls/2Controls.palette \
|
Palettes/2Controls/2Controls.palette \
|
||||||
|
@ -67,6 +68,7 @@ Gorm_OBJC_FILES = \
|
||||||
GormViewKnobs.m \
|
GormViewKnobs.m \
|
||||||
GormObjectEditor.m \
|
GormObjectEditor.m \
|
||||||
GormWindowEditor.m \
|
GormWindowEditor.m \
|
||||||
|
GormClassManager.m \
|
||||||
GormInspectorsManager.m \
|
GormInspectorsManager.m \
|
||||||
GormPalettesManager.m
|
GormPalettesManager.m
|
||||||
|
|
||||||
|
|
16
Gorm.m
16
Gorm.m
|
@ -83,6 +83,15 @@ NSString *GormLinkPboardType = @"GormLinkPboardType";
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (GormClassManager*) classManager
|
||||||
|
{
|
||||||
|
if (classManager == nil)
|
||||||
|
{
|
||||||
|
classManager = [GormClassManager new];
|
||||||
|
}
|
||||||
|
return classManager;
|
||||||
|
}
|
||||||
|
|
||||||
- (id) copy: (id)sender
|
- (id) copy: (id)sender
|
||||||
{
|
{
|
||||||
if ([[selectionOwner selection] count] == 0
|
if ([[selectionOwner selection] count] == 0
|
||||||
|
@ -122,6 +131,7 @@ NSString *GormLinkPboardType = @"GormLinkPboardType";
|
||||||
RELEASE(inspectorsManager);
|
RELEASE(inspectorsManager);
|
||||||
RELEASE(palettesManager);
|
RELEASE(palettesManager);
|
||||||
RELEASE(documents);
|
RELEASE(documents);
|
||||||
|
RELEASE(classManager);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,7 +425,7 @@ NSString *GormLinkPboardType = @"GormLinkPboardType";
|
||||||
|
|
||||||
- (id) save: (id)sender
|
- (id) save: (id)sender
|
||||||
{
|
{
|
||||||
return [(id)activeDocument save: sender];
|
return [(id)activeDocument saveDocument: sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) saveAll: (id)sender
|
- (id) saveAll: (id)sender
|
||||||
|
@ -427,7 +437,7 @@ NSString *GormLinkPboardType = @"GormLinkPboardType";
|
||||||
{
|
{
|
||||||
if ([[doc window] isDocumentEdited] == YES)
|
if ([[doc window] isDocumentEdited] == YES)
|
||||||
{
|
{
|
||||||
[doc save: sender];
|
[doc saveDocument: sender];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
@ -435,7 +445,7 @@ NSString *GormLinkPboardType = @"GormLinkPboardType";
|
||||||
|
|
||||||
- (id) saveAs: (id)sender
|
- (id) saveAs: (id)sender
|
||||||
{
|
{
|
||||||
return [(id)activeDocument saveAs: sender];
|
return [(id)activeDocument saveAsDocument: sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) selectAll: (id)sender
|
- (id) selectAll: (id)sender
|
||||||
|
|
14
GormClassManager.h
Normal file
14
GormClassManager.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef GORMCLASSMANAGER_H
|
||||||
|
#define GORMCLASSMANAGER_H
|
||||||
|
|
||||||
|
@interface GormClassManager : NSObject
|
||||||
|
{
|
||||||
|
NSMutableDictionary *classInformation;
|
||||||
|
}
|
||||||
|
- (NSArray*) allActionsForClass: (Class)aClass;
|
||||||
|
- (NSArray*) allActionsForClassNamed: (NSString*)className;
|
||||||
|
- (NSArray*) allOutletsForClass: (Class)aClass;
|
||||||
|
- (NSArray*) allOutletsForClassNamed: (NSString*)className;
|
||||||
|
@end
|
||||||
|
|
||||||
|
#endif
|
263
GormClassManager.m
Normal file
263
GormClassManager.m
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
/* GormClassManager.m
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Author: Richard Frith-Macdonald <richard@brainstrom.co.uk>
|
||||||
|
* Date: 1999
|
||||||
|
*
|
||||||
|
* This file is part of GNUstep.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "GormPrivate.h"
|
||||||
|
|
||||||
|
@implementation GormClassManager
|
||||||
|
|
||||||
|
- (NSArray*) allActionsForClass: (Class)theClass
|
||||||
|
{
|
||||||
|
NSString *className;
|
||||||
|
NSArray *actions;
|
||||||
|
|
||||||
|
className = NSStringFromClass(theClass);
|
||||||
|
if (className == nil)
|
||||||
|
{
|
||||||
|
NSLog(@"attempt to get actions for non-existent class");
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
actions = [self allActionsForClassNamed: className];
|
||||||
|
while (actions == nil && (theClass = class_get_super_class(theClass)) != nil
|
||||||
|
&& theClass != [NSObject class])
|
||||||
|
{
|
||||||
|
className = NSStringFromClass(theClass);
|
||||||
|
actions = [self allActionsForClassNamed: className];
|
||||||
|
}
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray*) allActionsForClassNamed: (NSString*)className
|
||||||
|
{
|
||||||
|
NSMutableDictionary *info = [classInformation objectForKey: className];
|
||||||
|
|
||||||
|
if (info != nil)
|
||||||
|
{
|
||||||
|
NSMutableArray *allActions = [info objectForKey: @"AllActions"];
|
||||||
|
|
||||||
|
if (allActions == nil)
|
||||||
|
{
|
||||||
|
NSString *superName = [info objectForKey: @"Super"];
|
||||||
|
NSArray *actions = [info objectForKey: @"Actions"];
|
||||||
|
NSArray *superActions;
|
||||||
|
|
||||||
|
if (superName == nil)
|
||||||
|
{
|
||||||
|
superActions = nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
superActions = [self allActionsForClassNamed: superName];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (superActions == nil)
|
||||||
|
{
|
||||||
|
if (actions == nil)
|
||||||
|
{
|
||||||
|
allActions = [NSMutableArray new];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
allActions = [actions mutableCopy];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
allActions = [superActions mutableCopy];
|
||||||
|
if (actions != nil)
|
||||||
|
{
|
||||||
|
NSEnumerator *enumerator = [actions objectEnumerator];
|
||||||
|
NSString *actionName;
|
||||||
|
|
||||||
|
while ((actionName = [enumerator nextObject]) != nil)
|
||||||
|
{
|
||||||
|
if ([allActions containsObject: actionName] == NO)
|
||||||
|
{
|
||||||
|
[allActions addObject: actionName];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[allActions sortUsingSelector: @selector(compare:)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[info setObject: allActions forKey: @"AllActions"];
|
||||||
|
RELEASE(allActions);
|
||||||
|
}
|
||||||
|
return AUTORELEASE([allActions copy]);
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray*) allOutletsForClass: (Class)theClass
|
||||||
|
{
|
||||||
|
NSString *className;
|
||||||
|
NSArray *outlets;
|
||||||
|
|
||||||
|
className = NSStringFromClass(theClass);
|
||||||
|
if (className == nil)
|
||||||
|
{
|
||||||
|
NSLog(@"attempt to get outlets for non-existent class");
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
outlets = [self allOutletsForClassNamed: className];
|
||||||
|
while (outlets == nil && (theClass = class_get_super_class(theClass)) != nil
|
||||||
|
&& theClass != [NSObject class])
|
||||||
|
{
|
||||||
|
className = NSStringFromClass(theClass);
|
||||||
|
outlets = [self allOutletsForClassNamed: className];
|
||||||
|
}
|
||||||
|
return outlets;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray*) allOutletsForClassNamed: (NSString*)className;
|
||||||
|
{
|
||||||
|
NSMutableDictionary *info = [classInformation objectForKey: className];
|
||||||
|
|
||||||
|
if (info != nil)
|
||||||
|
{
|
||||||
|
NSMutableArray *allOutlets = [info objectForKey: @"AllOutlets"];
|
||||||
|
|
||||||
|
if (allOutlets == nil)
|
||||||
|
{
|
||||||
|
NSString *superName = [info objectForKey: @"Super"];
|
||||||
|
NSArray *outlets = [info objectForKey: @"Outlets"];
|
||||||
|
NSArray *superOutlets;
|
||||||
|
|
||||||
|
if (superName == nil)
|
||||||
|
{
|
||||||
|
superOutlets = nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
superOutlets = [self allOutletsForClassNamed: superName];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (superOutlets == nil)
|
||||||
|
{
|
||||||
|
if (outlets == nil)
|
||||||
|
{
|
||||||
|
allOutlets = [NSMutableArray new];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
allOutlets = [outlets mutableCopy];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
allOutlets = [superOutlets mutableCopy];
|
||||||
|
if (outlets != nil)
|
||||||
|
{
|
||||||
|
NSEnumerator *enumerator = [outlets objectEnumerator];
|
||||||
|
NSString *outletName;
|
||||||
|
|
||||||
|
while ((outletName = [enumerator nextObject]) != nil)
|
||||||
|
{
|
||||||
|
if ([allOutlets containsObject: outletName] == NO)
|
||||||
|
{
|
||||||
|
[allOutlets addObject: outletName];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[allOutlets sortUsingSelector: @selector(compare:)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[info setObject: allOutlets forKey: @"AllOutlets"];
|
||||||
|
RELEASE(allOutlets);
|
||||||
|
}
|
||||||
|
return AUTORELEASE([allOutlets copy]);
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
RELEASE(classInformation);
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil)
|
||||||
|
{
|
||||||
|
NSBundle *bundle = [NSBundle mainBundle];
|
||||||
|
NSString *path;
|
||||||
|
NSDictionary *dict;
|
||||||
|
NSEnumerator *enumerator;
|
||||||
|
NSString *key;
|
||||||
|
|
||||||
|
path = [bundle pathForResource: @"ClassInformation" ofType: @"plist"];
|
||||||
|
if (path == nil)
|
||||||
|
{
|
||||||
|
NSLog(@"ClassInformation.plist missing from resources");
|
||||||
|
dict = nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dict = [NSDictionary dictionaryWithContentsOfFile: path];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert property-list data into a mutable structure.
|
||||||
|
*/
|
||||||
|
classInformation = [NSMutableDictionary new];
|
||||||
|
enumerator = [dict keyEnumerator];
|
||||||
|
while ((key = [enumerator nextObject]) != nil)
|
||||||
|
{
|
||||||
|
NSDictionary *classInfo = [dict objectForKey: key];
|
||||||
|
NSMutableDictionary *newInfo;
|
||||||
|
id obj;
|
||||||
|
|
||||||
|
newInfo = [NSMutableDictionary new];
|
||||||
|
[classInformation setObject: newInfo forKey: key];
|
||||||
|
RELEASE(newInfo);
|
||||||
|
|
||||||
|
obj = [classInfo objectForKey: @"Super"];
|
||||||
|
if (obj != nil)
|
||||||
|
{
|
||||||
|
[newInfo setObject: obj forKey: @"Super"];
|
||||||
|
}
|
||||||
|
obj = [classInfo objectForKey: @"Outlets"];
|
||||||
|
if (obj != nil)
|
||||||
|
{
|
||||||
|
obj = [obj mutableCopy];
|
||||||
|
[obj sortUsingSelector: @selector(compare:)];
|
||||||
|
[newInfo setObject: obj forKey: @"Outlets"];
|
||||||
|
RELEASE(obj);
|
||||||
|
}
|
||||||
|
obj = [classInfo objectForKey: @"Actions"];
|
||||||
|
if (obj != nil)
|
||||||
|
{
|
||||||
|
obj = [obj mutableCopy];
|
||||||
|
[obj sortUsingSelector: @selector(compare:)];
|
||||||
|
[newInfo setObject: obj forKey: @"Actions"];
|
||||||
|
RELEASE(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
|
@ -420,6 +420,7 @@ static NSImage *classesImage = nil;
|
||||||
NSEnumerator *e;
|
NSEnumerator *e;
|
||||||
NSNibConnector *con;
|
NSNibConnector *con;
|
||||||
|
|
||||||
|
[connections makeObjectsPerform: @selector(establishConnection)];
|
||||||
/*
|
/*
|
||||||
* Get links for all the top-level objects
|
* Get links for all the top-level objects
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
|
|
||||||
#include "GormPrivate.h"
|
#include "GormPrivate.h"
|
||||||
|
|
||||||
|
#define IVW 272
|
||||||
|
#define IVH 388
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The GormEmptyInspector is a placeholder for an empty selection.
|
* The GormEmptyInspector is a placeholder for an empty selection.
|
||||||
*/
|
*/
|
||||||
|
@ -45,7 +48,7 @@
|
||||||
NSView *contents;
|
NSView *contents;
|
||||||
NSButton *button;
|
NSButton *button;
|
||||||
|
|
||||||
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 272, 360)
|
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, IVW, 360)
|
||||||
styleMask: NSBorderlessWindowMask
|
styleMask: NSBorderlessWindowMask
|
||||||
backing: NSBackingStoreRetained
|
backing: NSBackingStoreRetained
|
||||||
defer: NO];
|
defer: NO];
|
||||||
|
@ -87,7 +90,7 @@
|
||||||
NSView *contents;
|
NSView *contents;
|
||||||
NSButton *button;
|
NSButton *button;
|
||||||
|
|
||||||
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 272, 360)
|
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, IVW, 360)
|
||||||
styleMask: NSBorderlessWindowMask
|
styleMask: NSBorderlessWindowMask
|
||||||
backing: NSBackingStoreRetained
|
backing: NSBackingStoreRetained
|
||||||
defer: NO];
|
defer: NO];
|
||||||
|
@ -128,7 +131,7 @@
|
||||||
NSView *contents;
|
NSView *contents;
|
||||||
NSButton *button;
|
NSButton *button;
|
||||||
|
|
||||||
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 272, 360)
|
window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, IVW, 360)
|
||||||
styleMask: NSBorderlessWindowMask
|
styleMask: NSBorderlessWindowMask
|
||||||
backing: NSBackingStoreRetained
|
backing: NSBackingStoreRetained
|
||||||
defer: NO];
|
defer: NO];
|
||||||
|
@ -200,11 +203,12 @@
|
||||||
- (id) init
|
- (id) init
|
||||||
{
|
{
|
||||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
NSBox *bar;
|
||||||
NSMenuItem *item;
|
NSMenuItem *item;
|
||||||
NSRect contentRect = {{0, 0}, {272, 420}};
|
NSRect contentRect = {{0, 0}, {IVW, 420}};
|
||||||
NSRect popupRect = {{60, 15}, {152, 20}};
|
NSRect popupRect = {{60, 5}, {152, 20}};
|
||||||
NSRect selectionRect = {{0, 380}, {272, 40}};
|
NSRect selectionRect = {{0, 390}, {IVW, 30}};
|
||||||
NSRect inspectorRect = {{0, 0}, {272, 378}};
|
NSRect inspectorRect = {{0, 0}, {IVW, IVH}};
|
||||||
unsigned int style = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
|
unsigned int style = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
|
||||||
|
|
||||||
panel = [[NSPanel alloc] initWithContentRect: contentRect
|
panel = [[NSPanel alloc] initWithContentRect: contentRect
|
||||||
|
@ -261,6 +265,13 @@
|
||||||
[item setKeyEquivalent: @"4"];
|
[item setKeyEquivalent: @"4"];
|
||||||
[item setTag: 3];
|
[item setTag: 3];
|
||||||
|
|
||||||
|
bar = [[NSBox alloc] initWithFrame: NSMakeRect (0, 0, IVW, 2)];
|
||||||
|
[bar setBorderType: NSGrooveBorder];
|
||||||
|
[bar setTitlePosition: NSNoTitle];
|
||||||
|
[bar setAutoresizingMask: NSViewWidthSizable|NSViewMinYMargin];
|
||||||
|
[selectionView addSubview: bar];
|
||||||
|
RELEASE(bar);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The inspector view fills the area below the selection view.
|
* The inspector view fills the area below the selection view.
|
||||||
*/
|
*/
|
||||||
|
@ -308,6 +319,7 @@
|
||||||
[popup selectItemAtIndex: 1];
|
[popup selectItemAtIndex: 1];
|
||||||
[popup setNeedsDisplay: YES];
|
[popup setNeedsDisplay: YES];
|
||||||
[panel makeKeyAndOrderFront: self];
|
[panel makeKeyAndOrderFront: self];
|
||||||
|
current = 1;
|
||||||
}
|
}
|
||||||
[self setCurrentInspector: self];
|
[self setCurrentInspector: self];
|
||||||
}
|
}
|
||||||
|
@ -341,6 +353,8 @@
|
||||||
* Return the inspector view to its original window and release the old
|
* Return the inspector view to its original window and release the old
|
||||||
* inspector.
|
* inspector.
|
||||||
*/
|
*/
|
||||||
|
[[inspector okButton] removeFromSuperview];
|
||||||
|
[[inspector revertButton] removeFromSuperview];
|
||||||
[[inspector window] setContentView: [[inspectorView subviews] lastObject]];
|
[[inspector window] setContentView: [[inspectorView subviews] lastObject]];
|
||||||
DESTROY(inspector);
|
DESTROY(inspector);
|
||||||
|
|
||||||
|
@ -446,10 +460,449 @@
|
||||||
[newView setFrame: rect];
|
[newView setFrame: rect];
|
||||||
[inspectorView addSubview: newView];
|
[inspectorView addSubview: newView];
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Tell inspector to update from its object.
|
|
||||||
*/
|
|
||||||
[inspector revert: self];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@interface GormConnectionInspector : IBInspector
|
||||||
|
{
|
||||||
|
id currentConnector;
|
||||||
|
NSMutableArray *connectors;
|
||||||
|
NSArray *actions;
|
||||||
|
NSArray *outlets;
|
||||||
|
NSBrowser *newBrowser;
|
||||||
|
NSBrowser *oldBrowser;
|
||||||
|
}
|
||||||
|
- (void) updateButtons;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation GormConnectionInspector
|
||||||
|
|
||||||
|
- (int) browser: (NSBrowser*)sender numberOfRowsInColumn: (int)column
|
||||||
|
{
|
||||||
|
int rows = 0;
|
||||||
|
|
||||||
|
if (sender == newBrowser)
|
||||||
|
{
|
||||||
|
if (column == 0)
|
||||||
|
{
|
||||||
|
rows = [outlets count];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSString *name = [[sender selectedCellInColumn: 0] stringValue];
|
||||||
|
|
||||||
|
if ([name isEqual: @"target"])
|
||||||
|
{
|
||||||
|
rows = [actions count];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rows = [connectors count];
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*) browser: (NSBrowser*)sender titleOfColumn: (int)column
|
||||||
|
{
|
||||||
|
if (sender == newBrowser)
|
||||||
|
{
|
||||||
|
if (column == 0)
|
||||||
|
{
|
||||||
|
return @"Outlets";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSString *name = [[sender selectedCellInColumn: 0] stringValue];
|
||||||
|
|
||||||
|
if ([name isEqual: @"target"])
|
||||||
|
{
|
||||||
|
return @"Actions";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return @"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return @"Connections";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) browser: (NSBrowser*)sender
|
||||||
|
selectCellWithString: (NSString*)title
|
||||||
|
inColumn: (int)col
|
||||||
|
{
|
||||||
|
unsigned numConnectors = [connectors count];
|
||||||
|
unsigned index;
|
||||||
|
|
||||||
|
if (sender == newBrowser)
|
||||||
|
{
|
||||||
|
if (col == 0)
|
||||||
|
{
|
||||||
|
if ([title isEqual: @"target"])
|
||||||
|
{
|
||||||
|
if (actions == nil)
|
||||||
|
{
|
||||||
|
actions = [[NSApp classManager] allActionsForClassNamed:
|
||||||
|
NSStringFromClass([[NSApp connectDestination] class])];
|
||||||
|
RETAIN(actions);
|
||||||
|
}
|
||||||
|
for (index = 0; index < numConnectors; index++)
|
||||||
|
{
|
||||||
|
id con = [connectors objectAtIndex: index];
|
||||||
|
|
||||||
|
if ([con isKindOfClass: [NSNibControlConnector class]] == YES)
|
||||||
|
{
|
||||||
|
NSString *action = [con label];
|
||||||
|
|
||||||
|
ASSIGN(currentConnector, con);
|
||||||
|
[newBrowser selectRow: [actions indexOfObject: action]
|
||||||
|
inColumn: 1];
|
||||||
|
[oldBrowser selectRow: index inColumn: 0];
|
||||||
|
[NSApp displayConnectionBetween: object
|
||||||
|
and: [con destination]];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BOOL found = NO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See if there already exists a connector for this outlet.
|
||||||
|
*/
|
||||||
|
for (index = 0; index < numConnectors; index++)
|
||||||
|
{
|
||||||
|
id con = [connectors objectAtIndex: index];
|
||||||
|
|
||||||
|
if ([[con label] isEqual: title] == YES)
|
||||||
|
{
|
||||||
|
ASSIGN(currentConnector, con);
|
||||||
|
[oldBrowser selectRow: index inColumn: 0];
|
||||||
|
[NSApp displayConnectionBetween: object
|
||||||
|
and: [con destination]];
|
||||||
|
found = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* if there was no connector, make one.
|
||||||
|
*/
|
||||||
|
if (found == NO)
|
||||||
|
{
|
||||||
|
RELEASE(currentConnector);
|
||||||
|
currentConnector = [NSNibOutletConnector new];
|
||||||
|
[currentConnector setSource: object];
|
||||||
|
[currentConnector setDestination: [NSApp connectDestination]];
|
||||||
|
[currentConnector setLabel: title];
|
||||||
|
[oldBrowser loadColumnZero];
|
||||||
|
[oldBrowser selectRow: index inColumn: 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BOOL found = NO;
|
||||||
|
|
||||||
|
for (index = 0; index < numConnectors; index++)
|
||||||
|
{
|
||||||
|
id con = [connectors objectAtIndex: index];
|
||||||
|
|
||||||
|
if ([con isKindOfClass: [NSNibControlConnector class]] == YES)
|
||||||
|
{
|
||||||
|
NSString *action = [con label];
|
||||||
|
|
||||||
|
if ([action isEqual: title] == YES)
|
||||||
|
{
|
||||||
|
ASSIGN(currentConnector, con);
|
||||||
|
found = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found == NO)
|
||||||
|
{
|
||||||
|
RELEASE(currentConnector);
|
||||||
|
currentConnector = [NSNibControlConnector new];
|
||||||
|
[currentConnector setSource: object];
|
||||||
|
[currentConnector setDestination: [NSApp connectDestination]];
|
||||||
|
[currentConnector setLabel: title];
|
||||||
|
[oldBrowser loadColumnZero];
|
||||||
|
}
|
||||||
|
[oldBrowser selectRow: index inColumn: 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (index = 0; index < numConnectors; index++)
|
||||||
|
{
|
||||||
|
id con = [connectors objectAtIndex: index];
|
||||||
|
|
||||||
|
if ([title hasPrefix: [con label]] == YES)
|
||||||
|
{
|
||||||
|
NSString *label;
|
||||||
|
NSString *name;
|
||||||
|
id dest = [NSApp connectDestination];
|
||||||
|
|
||||||
|
label = [con label];
|
||||||
|
dest = [con destination];
|
||||||
|
name = [[(id<IB>)NSApp activeDocument] nameForObject: dest];
|
||||||
|
name = [label stringByAppendingFormat: @" (%@)", name];
|
||||||
|
if ([title isEqual: name] == YES)
|
||||||
|
{
|
||||||
|
ASSIGN(currentConnector, con);
|
||||||
|
[NSApp displayConnectionBetween: object
|
||||||
|
and: [con destination]];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[self updateButtons];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) browser: (NSBrowser*)sender
|
||||||
|
willDisplayCell: (id)aCell
|
||||||
|
atRow: (int)row
|
||||||
|
column: (int)col
|
||||||
|
{
|
||||||
|
if (sender == newBrowser)
|
||||||
|
{
|
||||||
|
NSString *name;
|
||||||
|
|
||||||
|
if (col == 0)
|
||||||
|
{
|
||||||
|
if (row >= 0 && row < [outlets count])
|
||||||
|
{
|
||||||
|
name = [outlets objectAtIndex: row];
|
||||||
|
[aCell setStringValue: name];
|
||||||
|
if ([name isEqual: @"target"])
|
||||||
|
{
|
||||||
|
[aCell setLeaf: NO];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[aCell setLeaf: YES];
|
||||||
|
}
|
||||||
|
[aCell setEnabled: YES];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[aCell setStringValue: @""];
|
||||||
|
[aCell setLeaf: YES];
|
||||||
|
[aCell setEnabled: NO];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
name = [[sender selectedCellInColumn: 0] stringValue];
|
||||||
|
if ([name isEqual: @"target"] == NO)
|
||||||
|
{
|
||||||
|
NSLog(@"cell selected in actions column without target");
|
||||||
|
}
|
||||||
|
if (row >= 0 && row < [actions count])
|
||||||
|
{
|
||||||
|
[aCell setStringValue: [actions objectAtIndex: row]];
|
||||||
|
[aCell setEnabled: YES];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[aCell setStringValue: @""];
|
||||||
|
[aCell setEnabled: NO];
|
||||||
|
}
|
||||||
|
[aCell setLeaf: YES];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (row >= 0 && row < [connectors count])
|
||||||
|
{
|
||||||
|
NSString *label;
|
||||||
|
NSString *name;
|
||||||
|
id dest = [NSApp connectDestination];
|
||||||
|
|
||||||
|
label = [[connectors objectAtIndex: row] label];
|
||||||
|
dest = [[connectors objectAtIndex: row] destination];
|
||||||
|
name = [[(id<IB>)NSApp activeDocument] nameForObject: dest];
|
||||||
|
name = [label stringByAppendingFormat: @" (%@)", name];
|
||||||
|
|
||||||
|
[aCell setStringValue: name];
|
||||||
|
[aCell setEnabled: YES];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[aCell setStringValue: @""];
|
||||||
|
[aCell setEnabled: NO];
|
||||||
|
}
|
||||||
|
[aCell setLeaf: YES];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
RELEASE(currentConnector);
|
||||||
|
RELEASE(connectors);
|
||||||
|
RELEASE(actions);
|
||||||
|
RELEASE(outlets);
|
||||||
|
RELEASE(okButton);
|
||||||
|
RELEASE(revertButton);
|
||||||
|
RELEASE(window);
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil)
|
||||||
|
{
|
||||||
|
NSView *contents;
|
||||||
|
NSSplitView *split;
|
||||||
|
NSArray *array;
|
||||||
|
NSRect rect;
|
||||||
|
id obj;
|
||||||
|
|
||||||
|
obj = [[[(Gorm*)NSApp selectionOwner] selection] lastObject];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create list of existing connections for selected object.
|
||||||
|
*/
|
||||||
|
connectors = [NSMutableArray new];
|
||||||
|
array = [[(id<IB>)NSApp activeDocument] connectorsForSource: obj
|
||||||
|
ofClass: [NSNibControlConnector class]];
|
||||||
|
[connectors addObjectsFromArray: array];
|
||||||
|
array = [[(id<IB>)NSApp activeDocument] connectorsForSource: obj
|
||||||
|
ofClass: [NSNibOutletConnector class]];
|
||||||
|
[connectors addObjectsFromArray: array];
|
||||||
|
|
||||||
|
outlets = RETAIN([[NSApp classManager] allOutletsForClassNamed:
|
||||||
|
NSStringFromClass([obj class])]);
|
||||||
|
|
||||||
|
rect = NSMakeRect(0, 0, IVW, IVH);
|
||||||
|
window = [[NSWindow alloc] initWithContentRect: rect
|
||||||
|
styleMask: NSBorderlessWindowMask
|
||||||
|
backing: NSBackingStoreRetained
|
||||||
|
defer: NO];
|
||||||
|
contents = [window contentView];
|
||||||
|
split = [[NSSplitView alloc] initWithFrame: [contents bounds]];
|
||||||
|
[split setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
|
||||||
|
|
||||||
|
newBrowser = [[NSBrowser alloc] initWithFrame: rect];
|
||||||
|
[newBrowser setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
|
||||||
|
[newBrowser setMaxVisibleColumns: 2];
|
||||||
|
[newBrowser setAllowsMultipleSelection: NO];
|
||||||
|
[newBrowser setHasHorizontalScroller: NO];
|
||||||
|
[newBrowser setDelegate: self];
|
||||||
|
|
||||||
|
[split addSubview: newBrowser];
|
||||||
|
RELEASE(newBrowser);
|
||||||
|
|
||||||
|
rect.size.height /= 2;
|
||||||
|
oldBrowser = [[NSBrowser alloc] initWithFrame: rect];
|
||||||
|
[oldBrowser setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
|
||||||
|
[oldBrowser setMaxVisibleColumns: 1];
|
||||||
|
[oldBrowser setAllowsMultipleSelection: NO];
|
||||||
|
[oldBrowser setHasHorizontalScroller: NO];
|
||||||
|
[oldBrowser setDelegate: self];
|
||||||
|
|
||||||
|
[split addSubview: oldBrowser];
|
||||||
|
RELEASE(oldBrowser);
|
||||||
|
|
||||||
|
[contents addSubview: split];
|
||||||
|
RELEASE(split);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See if we can do initial selection based on pre-existing connections.
|
||||||
|
*/
|
||||||
|
if ([NSApp isConnecting] == YES)
|
||||||
|
{
|
||||||
|
id dest = [NSApp connectDestination];
|
||||||
|
unsigned row;
|
||||||
|
|
||||||
|
for (row = 0; row < [connectors count]; row++)
|
||||||
|
{
|
||||||
|
id<IBConnectors> con = [connectors objectAtIndex: row];
|
||||||
|
|
||||||
|
if ([con destination] == dest)
|
||||||
|
{
|
||||||
|
ASSIGN(currentConnector, con);
|
||||||
|
[oldBrowser selectRow: row inColumn: 0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
okButton = [[NSButton alloc] initWithFrame: NSMakeRect(0,0,60,20)];
|
||||||
|
[okButton setAutoresizingMask: NSViewMaxYMargin | NSViewMinXMargin];
|
||||||
|
[okButton setAction: @selector(ok:)];
|
||||||
|
[okButton setTarget: self];
|
||||||
|
[okButton setTitle: @"Connect"];
|
||||||
|
[okButton setEnabled: NO];
|
||||||
|
|
||||||
|
revertButton = [[NSButton alloc] initWithFrame: NSMakeRect(0,0,60,20)];
|
||||||
|
[revertButton setAutoresizingMask: NSViewMaxYMargin | NSViewMinXMargin];
|
||||||
|
[revertButton setAction: @selector(revert:)];
|
||||||
|
[revertButton setTarget: self];
|
||||||
|
[revertButton setTitle: @"Revert"];
|
||||||
|
[revertButton setEnabled: NO];
|
||||||
|
|
||||||
|
if (currentConnector == nil)
|
||||||
|
{
|
||||||
|
if ([outlets count] == 1)
|
||||||
|
{
|
||||||
|
[newBrowser selectRow: 0 inColumn: 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[self updateButtons];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) ok: (id)sender
|
||||||
|
{
|
||||||
|
if ([connectors containsObject: currentConnector] == YES)
|
||||||
|
{
|
||||||
|
[[(id<IB>)NSApp activeDocument] removeConnector: currentConnector];
|
||||||
|
[connectors removeObject: currentConnector];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[connectors addObject: currentConnector];
|
||||||
|
[[(id<IB>)NSApp activeDocument] addConnector: currentConnector];
|
||||||
|
}
|
||||||
|
[self updateButtons];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) updateButtons
|
||||||
|
{
|
||||||
|
if (currentConnector == nil)
|
||||||
|
{
|
||||||
|
[okButton setEnabled: NO];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[okButton setEnabled: YES];
|
||||||
|
if ([connectors containsObject: currentConnector] == YES)
|
||||||
|
{
|
||||||
|
[okButton setTitle: @"Disconnect"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[okButton setTitle: @"Connect"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) wantsButtons
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
}
|
}
|
||||||
- (NSString*) connectInspectorClassName
|
- (NSString*) connectInspectorClassName
|
||||||
{
|
{
|
||||||
return @"GormObjectInspector";
|
return @"GormConnectionInspector";
|
||||||
}
|
}
|
||||||
- (NSString*) sizeInspectorClassName
|
- (NSString*) sizeInspectorClassName
|
||||||
{
|
{
|
||||||
|
@ -116,14 +116,7 @@ static NSMapTable *docMap = 0;
|
||||||
if (index >= 0 && index < [objects count])
|
if (index >= 0 && index < [objects count])
|
||||||
{
|
{
|
||||||
obj = [objects objectAtIndex: index];
|
obj = [objects objectAtIndex: index];
|
||||||
if (obj != selected)
|
[self selectObjects: [NSArray arrayWithObject: obj]];
|
||||||
{
|
|
||||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
|
||||||
|
|
||||||
selected = obj;
|
|
||||||
[nc postNotificationName: IBSelectionChangedNotification
|
|
||||||
object: self];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
@ -352,7 +345,6 @@ static NSMapTable *docMap = 0;
|
||||||
{
|
{
|
||||||
[self selectObjects: [NSArray arrayWithObject: obj]];
|
[self selectObjects: [NSArray arrayWithObject: obj]];
|
||||||
[self makeSelectionVisible: YES];
|
[self makeSelectionVisible: YES];
|
||||||
[self makeSelectionVisible: YES];
|
|
||||||
}
|
}
|
||||||
name = [document nameForObject: obj];
|
name = [document nameForObject: obj];
|
||||||
if ([name isEqualToString: @"NSFirst"] == NO)
|
if ([name isEqualToString: @"NSFirst"] == NO)
|
||||||
|
@ -598,11 +590,8 @@ NSLog(@"Got link from %@", name);
|
||||||
{
|
{
|
||||||
id obj = [anArray lastObject];
|
id obj = [anArray lastObject];
|
||||||
|
|
||||||
if (obj != selected)
|
selected = obj;
|
||||||
{
|
[document setSelectionFromEditor: self];
|
||||||
selected = obj;
|
|
||||||
[document setSelectionFromEditor: self];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray*) selection
|
- (NSArray*) selection
|
||||||
|
|
|
@ -9,11 +9,13 @@
|
||||||
|
|
||||||
#include "GormDocument.h"
|
#include "GormDocument.h"
|
||||||
#include "GormInspectorsManager.h"
|
#include "GormInspectorsManager.h"
|
||||||
|
#include "GormClassManager.h"
|
||||||
#include "GormPalettesManager.h"
|
#include "GormPalettesManager.h"
|
||||||
|
|
||||||
extern NSString *GormLinkPboardType;
|
extern NSString *GormLinkPboardType;
|
||||||
|
|
||||||
@interface NSApplication (Gorm)
|
@interface NSApplication (Gorm)
|
||||||
|
- (GormClassManager*) classManager;
|
||||||
- (NSImage*) linkImage;
|
- (NSImage*) linkImage;
|
||||||
- (void) startConnecting;
|
- (void) startConnecting;
|
||||||
@end
|
@end
|
||||||
|
@ -21,6 +23,7 @@ extern NSString *GormLinkPboardType;
|
||||||
@interface Gorm : NSApplication <IB>
|
@interface Gorm : NSApplication <IB>
|
||||||
{
|
{
|
||||||
id infoPanel;
|
id infoPanel;
|
||||||
|
GormClassManager *classManager;
|
||||||
GormInspectorsManager *inspectorsManager;
|
GormInspectorsManager *inspectorsManager;
|
||||||
GormPalettesManager *palettesManager;
|
GormPalettesManager *palettesManager;
|
||||||
id selectionOwner;
|
id selectionOwner;
|
||||||
|
|
|
@ -133,22 +133,6 @@
|
||||||
{
|
{
|
||||||
return @"GormWindowAttributesInspector";
|
return @"GormWindowAttributesInspector";
|
||||||
}
|
}
|
||||||
- (NSString*) connectInspectorClassName
|
|
||||||
{
|
|
||||||
return @"GormWindowConnectionsInspector";
|
|
||||||
}
|
|
||||||
- (NSString*) sizeInspectorClassName
|
|
||||||
{
|
|
||||||
return @"GormWindowSizeInspector";
|
|
||||||
}
|
|
||||||
- (NSString*) helpInspectorClassName
|
|
||||||
{
|
|
||||||
return @"GormWindowHelpInspector";
|
|
||||||
}
|
|
||||||
- (NSString*) classInspectorClassName
|
|
||||||
{
|
|
||||||
return @"GormWindowClassInspector";
|
|
||||||
}
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,35 +170,3 @@
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@interface GormWindowConnectionsInspector : IBInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation GormWindowConnectionsInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@interface GormWindowSizeInspector : IBInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation GormWindowSizeInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@interface GormWindowHelpInspector : IBInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation GormWindowHelpInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@interface GormWindowClassInspector : IBInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation GormWindowClassInspector
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue