Implemented tree view/history window.

svn path=/trunk/netsurf/; revision=11309
This commit is contained in:
Sven Weidauer 2011-01-13 15:19:47 +00:00
parent b65a405c3e
commit a9b60753f9
6 changed files with 485 additions and 6 deletions

View File

@ -87,6 +87,7 @@
2612265C12D7ACB500E10F91 /* quirks.css in Resources */ = {isa = PBXBuildFile; fileRef = 2612265912D7ACB500E10F91 /* quirks.css */; };
2612266D12D7AD6800E10F91 /* adblock.css in Resources */ = {isa = PBXBuildFile; fileRef = 2612265D12D7AD6800E10F91 /* adblock.css */; };
2612269112D7AE4100E10F91 /* Messages in Resources */ = {isa = PBXBuildFile; fileRef = 2612268F12D7AE4100E10F91 /* Messages */; };
2622F1D712DCD84600CD5A62 /* TreeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2622F1D612DCD84600CD5A62 /* TreeView.m */; };
265F311A12D663F50048B600 /* gui.m in Sources */ = {isa = PBXBuildFile; fileRef = 265F311912D663F50048B600 /* gui.m */; };
265F314812D666660048B600 /* plotter.m in Sources */ = {isa = PBXBuildFile; fileRef = 265F314712D666660048B600 /* plotter.m */; };
265F315212D667060048B600 /* history.m in Sources */ = {isa = PBXBuildFile; fileRef = 265F315112D667060048B600 /* history.m */; };
@ -110,6 +111,7 @@
265F321412D66CD90048B600 /* utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 265F321312D66CD90048B600 /* utils.m */; };
265F321F12D66D510048B600 /* font.m in Sources */ = {isa = PBXBuildFile; fileRef = 265F321E12D66D510048B600 /* font.m */; };
26AFE63F12DDEB0A005AD082 /* NetSurf.icns in Resources */ = {isa = PBXBuildFile; fileRef = 26AFE63E12DDEB0A005AD082 /* NetSurf.icns */; };
26AFE8E412DF4200005AD082 /* ScrollableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFE8E312DF4200005AD082 /* ScrollableView.m */; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
/* End PBXBuildFile section */
@ -281,6 +283,8 @@
2612269412D7AEA800E10F91 /* en */ = {isa = PBXFileReference; lastKnownFileType = text; name = en; path = en.lproj/Messages; sourceTree = "<group>"; };
2612269512D7AEB500E10F91 /* it */ = {isa = PBXFileReference; lastKnownFileType = text; name = it; path = it.lproj/Messages; sourceTree = "<group>"; };
2612269612D7AEBE00E10F91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text; name = fr; path = fr.lproj/Messages; sourceTree = "<group>"; };
2622F1D512DCD84600CD5A62 /* TreeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeView.h; sourceTree = "<group>"; };
2622F1D612DCD84600CD5A62 /* TreeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeView.m; sourceTree = "<group>"; };
262711B212DDDCB800B2FA62 /* debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = debug.xcconfig; sourceTree = "<group>"; };
262711B412DDDCB800B2FA62 /* local.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = local.xcconfig; sourceTree = "<group>"; };
262711BE12DDDD1500B2FA62 /* release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = release.xcconfig; sourceTree = "<group>"; };
@ -322,6 +326,8 @@
265F321312D66CD90048B600 /* utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = utils.m; sourceTree = "<group>"; };
265F321E12D66D510048B600 /* font.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = font.m; sourceTree = "<group>"; };
26AFE63E12DDEB0A005AD082 /* NetSurf.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = NetSurf.icns; sourceTree = "<group>"; };
26AFE8E212DF4200005AD082 /* ScrollableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollableView.h; sourceTree = "<group>"; };
26AFE8E312DF4200005AD082 /* ScrollableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollableView.m; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* NetSurf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetSurf.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -595,6 +601,10 @@
26121E3E12D70A1A00E10F91 /* BrowserWindow.m */,
26121EFB12D7132100E10F91 /* BrowserView.h */,
26121EFC12D7132100E10F91 /* BrowserView.m */,
2622F1D512DCD84600CD5A62 /* TreeView.h */,
2622F1D612DCD84600CD5A62 /* TreeView.m */,
26AFE8E212DF4200005AD082 /* ScrollableView.h */,
26AFE8E312DF4200005AD082 /* ScrollableView.m */,
);
name = cocoa;
sourceTree = "<group>";
@ -839,6 +849,8 @@
26121DD912D703F400E10F91 /* NetSurfApp.m in Sources */,
26121E3F12D70A1A00E10F91 /* BrowserWindow.m in Sources */,
26121EFD12D7132100E10F91 /* BrowserView.m in Sources */,
2622F1D712DCD84600CD5A62 /* TreeView.m in Sources */,
26AFE8E412DF4200005AD082 /* ScrollableView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

29
cocoa/ScrollableView.h Normal file
View File

@ -0,0 +1,29 @@
/*
* Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
@interface ScrollableView : NSView {
NSSize minimumSize;
NSView *observedSuperview;
}
@property (readwrite, assign, nonatomic) NSSize minimumSize;
@end

69
cocoa/ScrollableView.m Normal file
View File

@ -0,0 +1,69 @@
/*
* Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
#import "ScrollableView.h"
@interface ScrollableView ()
- (void) adjustFrame;
- (void) frameChangeNotification: (NSNotification *) note;
@end
@implementation ScrollableView
@synthesize minimumSize;
- (void) setMinimumSize: (NSSize)newSize;
{
minimumSize = newSize;
[self adjustFrame];
}
- (void) adjustFrame;
{
NSSize frameSize = [[self superview] frame].size;
[self setFrameSize: NSMakeSize( MAX( minimumSize.width, frameSize.width ),
MAX( minimumSize.height, frameSize.height ) )];
}
- (void) frameChangeNotification: (NSNotification *) note;
{
[self adjustFrame];
}
- (void) viewDidMoveToSuperview;
{
if (observedSuperview) {
[[NSNotificationCenter defaultCenter] removeObserver: self
name: NSViewFrameDidChangeNotification
object: observedSuperview];
observedSuperview = nil;
}
NSView *newSuperView = [self superview];
if (nil != newSuperView) {
observedSuperview = newSuperView;
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(frameChangeNotification:)
name: NSViewFrameDidChangeNotification
object: observedSuperview];
[observedSuperview setPostsFrameChangedNotifications: YES];
}
}
@end

31
cocoa/TreeView.h Normal file
View File

@ -0,0 +1,31 @@
/*
* Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#import "ScrollableView.h"
@interface TreeView : ScrollableView {
struct tree *treeHandle;
BOOL isDragging;
NSPoint dragStart;
}
@end

131
cocoa/TreeView.m Normal file
View File

@ -0,0 +1,131 @@
/*
* Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf 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; version 2 of the License.
*
* NetSurf 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, see <http://www.gnu.org/licenses/>.
*/
#import "TreeView.h"
#import "desktop/tree.h"
#import "desktop/plotters.h"
#import "desktop/history_global_core.h"
#define UNIMPL() NSLog( @"Function '%s' unimplemented", __func__ )
@implementation TreeView
static void tree_redraw_request( int x, int y, int w, int h, void *data );
static void tree_resized( struct tree *tree, int w, int h, void *data );
static void tree_scroll_visible( int y, int height, void *data );
static void tree_get_window_dimensions( int *width, int *height, void *data );
static const struct treeview_table cocoa_tree_callbacks = {
.redraw_request = tree_redraw_request,
.resized = tree_resized,
.scroll_visible = tree_scroll_visible,
.get_window_dimensions = tree_get_window_dimensions
};
- (id)initWithFrame:(NSRect)frame
{
if ((self = [super initWithFrame:frame]) == nil) return nil;
treeHandle = tree_create( history_global_get_tree_flags(), &cocoa_tree_callbacks, self );
if (NULL == treeHandle) {
[self release];
self = nil;
}
history_global_initialise( treeHandle, "" );
return self;
}
- (void) dealloc;
{
tree_delete( treeHandle );
[super dealloc];
}
- (void)drawRect:(NSRect)dirtyRect
{
tree_set_redraw( treeHandle, true );
tree_draw( treeHandle, 0, 0, NSMinX( dirtyRect ), NSMinY( dirtyRect ), NSWidth( dirtyRect ), NSHeight( dirtyRect ) );
}
- (BOOL) isFlipped;
{
return YES;
}
- (void) mouseDown: (NSEvent *)theEvent;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
dragStart = point;
tree_mouse_action( treeHandle, BROWSER_MOUSE_PRESS_1, point.x, point.y );
}
- (void) mouseUp: (NSEvent *)theEvent;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (isDragging) {
tree_drag_end( treeHandle, BROWSER_MOUSE_DRAG_1, dragStart.x, dragStart.y, point.x, point.y );
isDragging = NO;
} else {
tree_mouse_action( treeHandle, BROWSER_MOUSE_CLICK_1, point.x, point.y );
}
}
#define squared(x) ((x)*(x))
#define MinDragDistance (5.0)
- (void) mouseDragged: (NSEvent *)theEvent;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (!isDragging) {
const CGFloat distance = squared( dragStart.x - point.x ) + squared( dragStart.y - point.y );
if (distance >= squared( MinDragDistance)) isDragging = YES;
}
if (isDragging) {
tree_mouse_action( treeHandle, BROWSER_MOUSE_DRAG_1, point.x, point.y );
}
}
static void tree_redraw_request( int x, int y, int w, int h, void *data )
{
[(TreeView *)data setNeedsDisplayInRect: NSMakeRect( x, y, w, h )];
}
static void tree_resized( struct tree *tree, int w, int h, void *data )
{
[(TreeView *)data setMinimumSize: NSMakeSize( w, h )];
}
static void tree_scroll_visible( int y, int height, void *data )
{
[(TreeView *)data scrollPoint: NSMakePoint( 0, y )];
}
static void tree_get_window_dimensions( int *width, int *height, void *data )
{
NSSize size = [(TreeView *)data frame].size;
*width = size.width;
*height = size.height;
}
@end

View File

@ -12,7 +12,8 @@
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="106"/>
<integer value="24"/>
<integer value="811"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -527,6 +528,24 @@
<reference key="NSOnImage" ref="756751024"/>
<reference key="NSMixedImage" ref="908425081"/>
</object>
<object class="NSMenuItem" id="971013910">
<reference key="NSMenu" ref="835318025"/>
<bool key="NSIsDisabled">YES</bool>
<bool key="NSIsSeparator">YES</bool>
<string key="NSTitle"/>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="756751024"/>
<reference key="NSMixedImage" ref="908425081"/>
</object>
<object class="NSMenuItem" id="532573582">
<reference key="NSMenu" ref="835318025"/>
<string key="NSTitle">History</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="756751024"/>
<reference key="NSMixedImage" ref="908425081"/>
</object>
<object class="NSMenuItem" id="299356726">
<reference key="NSMenu" ref="835318025"/>
<bool key="NSIsDisabled">YES</bool>
@ -577,6 +596,88 @@
</object>
<string key="NSName">_NSMainMenu</string>
</object>
<object class="NSWindowTemplate" id="346681284">
<int key="NSWindowStyleMask">15</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{196, 123}, {300, 387}}</string>
<int key="NSWTFlags">1685585920</int>
<string key="NSWindowTitle">History</string>
<string key="NSWindowClass">NSWindow</string>
<nil key="NSViewClass"/>
<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
<object class="NSView" key="NSWindowView" id="75583718">
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSScrollView" id="429678852">
<reference key="NSNextResponder" ref="75583718"/>
<int key="NSvFlags">274</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSClipView" id="862897293">
<reference key="NSNextResponder" ref="429678852"/>
<int key="NSvFlags">2304</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSCustomView" id="363409241">
<reference key="NSNextResponder" ref="862897293"/>
<int key="NSvFlags">268</int>
<string key="NSFrameSize">{300, 387}</string>
<reference key="NSSuperview" ref="862897293"/>
<string key="NSClassName">TreeView</string>
</object>
</object>
<string key="NSFrame">{{1, 1}, {300, 387}}</string>
<reference key="NSSuperview" ref="429678852"/>
<reference key="NSNextKeyView" ref="363409241"/>
<reference key="NSDocView" ref="363409241"/>
<object class="NSColor" key="NSBGColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<int key="NScvFlags">4</int>
</object>
<object class="NSScroller" id="1030123989">
<reference key="NSNextResponder" ref="429678852"/>
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{319, 1}, {15, 371}}</string>
<reference key="NSSuperview" ref="429678852"/>
<reference key="NSTarget" ref="429678852"/>
<string key="NSAction">_doScroller:</string>
<double key="NSPercent">0.99741602067183466</double>
</object>
<object class="NSScroller" id="523968414">
<reference key="NSNextResponder" ref="429678852"/>
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{1, 373}, {500, 15}}</string>
<reference key="NSSuperview" ref="429678852"/>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="429678852"/>
<string key="NSAction">_doScroller:</string>
<double key="NSPercent">1</double>
</object>
</object>
<string key="NSFrame">{{-1, -1}, {302, 389}}</string>
<reference key="NSSuperview" ref="75583718"/>
<reference key="NSNextKeyView" ref="862897293"/>
<int key="NSsFlags">562</int>
<reference key="NSVScroller" ref="1030123989"/>
<reference key="NSHScroller" ref="523968414"/>
<reference key="NSContentView" ref="862897293"/>
</object>
</object>
<string key="NSFrameSize">{300, 387}</string>
<reference key="NSSuperview"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
</object>
</object>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
@ -829,6 +930,14 @@
</object>
<int key="connectionID">775</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">makeKeyAndOrderFront:</string>
<reference key="source" ref="346681284"/>
<reference key="destination" ref="532573582"/>
</object>
<int key="connectionID">819</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -1078,6 +1187,8 @@
<reference ref="625202149"/>
<reference ref="575023229"/>
<reference ref="1011231497"/>
<reference ref="971013910"/>
<reference ref="532573582"/>
</object>
<reference key="parent" ref="713487014"/>
</object>
@ -1284,6 +1395,60 @@
<reference key="object" ref="548069040"/>
<reference key="parent" ref="930654435"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">811</int>
<reference key="object" ref="346681284"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="75583718"/>
</object>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">812</int>
<reference key="object" ref="75583718"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="429678852"/>
</object>
<reference key="parent" ref="346681284"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">813</int>
<reference key="object" ref="429678852"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1030123989"/>
<reference ref="523968414"/>
<reference ref="363409241"/>
</object>
<reference key="parent" ref="75583718"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">814</int>
<reference key="object" ref="1030123989"/>
<reference key="parent" ref="429678852"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">815</int>
<reference key="object" ref="523968414"/>
<reference key="parent" ref="429678852"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">816</int>
<reference key="object" ref="363409241"/>
<reference key="parent" ref="429678852"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">817</int>
<reference key="object" ref="971013910"/>
<reference key="parent" ref="835318025"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">818</int>
<reference key="object" ref="532573582"/>
<reference key="parent" ref="835318025"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@ -1401,6 +1566,17 @@
<string>81.IBPluginDependency</string>
<string>81.ImportedFromIB2</string>
<string>81.editorWindowContentRectSynchronizationRect</string>
<string>811.IBEditorWindowLastContentRect</string>
<string>811.IBPluginDependency</string>
<string>811.IBWindowTemplateEditedContentRect</string>
<string>811.NSWindowTemplate.visibleAtLaunch</string>
<string>812.IBPluginDependency</string>
<string>813.IBPluginDependency</string>
<string>814.IBPluginDependency</string>
<string>815.IBPluginDependency</string>
<string>816.IBPluginDependency</string>
<string>817.IBPluginDependency</string>
<string>818.IBPluginDependency</string>
<string>82.IBPluginDependency</string>
<string>82.ImportedFromIB2</string>
<string>83.IBPluginDependency</string>
@ -1413,7 +1589,7 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{533, 633}, {157, 23}}</string>
<string>{{881, 774}, {157, 23}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{596, 852}, {216, 23}}</string>
@ -1451,11 +1627,11 @@
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{462, 583}, {194, 73}}</string>
<string>{{810, 694}, {194, 103}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{525, 802}, {197, 73}}</string>
<string>{{242, 656}, {352, 20}}</string>
<string>{{590, 797}, {352, 20}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{74, 862}</string>
@ -1521,6 +1697,17 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{323, 672}, {199, 203}}</string>
<string>{{331, 320}, {300, 387}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{331, 320}, {300, 387}}</string>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -1545,9 +1732,29 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">810</int>
<int key="maxID">819</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBPartialClassDescription">
<string key="className">ScrollableView</string>
<string key="superclassName">NSView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">ScrollableView.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">TreeView</string>
<string key="superclassName">ScrollableView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">TreeView.h</string>
</object>
</object>
</object>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes"/>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">