This is how I solved it. I my OutlineViewController, I created an array with 
the static items names:

    topLevelGroups = [[NSArray arrayWithObjects:@"LIBRARY", @"FAVORITES", nil] 
retain];
 
And then create the entities for these names:

    for (NSString *name in topLevelGroups)
    {
          [MyOutlineGroup groupWithName: [name uppercaseString] 
inManagedObjectContext:[[NSApp delegate] managedObjectContext]];
    }


I also created a convenience method to test if an item is a topLevelGroup:

- (BOOL) isToplevelItem: (id) item
{
    MyOutlineGroup *group = (IMyOutlineGroup*) [item representedObject];
    
    return ([topLevelGroups containsObject: group.name]);  
}


Then in the NSOutlineView delegate methods, I call:

-(BOOL) outlineView : (NSOutlineView *) outlineView isGroupItem:(id)item
{    
    return [self isToplevelItem: item];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView 
shouldShowOutlineCellForItem:(id)item
{
    return [self isToplevelItem: item];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
{
    return ![self isToplevelItem: item];
}


- Koen.









On Oct 14, 2011, at 2:51 PM, Quincey Morris wrote:

> On Oct 14, 2011, at 09:24 , Koen van der Drift wrote:
> 
>> I’m trying to find out how to create the grayish, static items in an
>> NSOutlineView, eg “Library” in iTunes or “Mailboxes” in Mail.
>> Sometimes they have a disclosure triangle, eg "Devices" in the Finder.
>> I think I need to subclass NSCell to change the font, etc.
> 
> Subclassing isn't necessary. This is how "group" rows appear in an outline 
> view with the "source list" display style. You use delegate methods to 
> customize the exact appearance: 'outlineView:isGroupItem:' indicates a group 
> item; 'outlineView:shouldShowOutlineCellForItem:' suppresses the disclosure 
> triangle on those rows. There may be other methods you need to use to get 
> exactly the horizontal and vertical spacing of the iTunes list -- I forget 
> the details.
> 
>> But I am
>> not sure how to identify these, would an attribute “isStaticItem” for
>> my Group Entity or something like that be a good approach?
>> 
>> Secondly, are they part of the NSOutlineView, and the underlying
>> NSTreeController and CoreData model?  Just like in the abovementioned
>> examples, these items are already present when the app is started up
>> the first time, so if they are part of the core data model, they must
>> be created programmatically at first, and become part of the model
>> once the user starts adding folders and items. So if the app doesn’t
>> find a database, it will create the starting list.  Again, is this the
>> correct approach?
> 
> One way to do this is to set up an "intermediate" data model for your list, 
> since the structure of the list doesn't match the structure of your actual 
> data model. When I do this, I typically define a ListItem class -- a subclass 
> of NSTreeNode is easiest, since you'll likely want to follow parent/child 
> relationships for various reasons -- with a "representedObject" property that 
> can be set to various things -- a string, for header items, or a Core Data 
> object for detail rows.
> 
> Thus you end up with a tree structure of ListItem objects, which you can then 
> feed to the outline view either via your data source or via bindings.
> 
> Incidentally, since this tree structure exists only to service the outline 
> view, the proper place to create it is in the outline view's window's window 
> controller. It's basically glue code, so you definitely don't want to expose 
> it to the rest of your app.
> 
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to