On Jan 7, 2009, James Walker wrote:

  Having the indentation affect the top level may be technically
consistent, but I don't know why anyone would want it to work that way.


Yes, I agree. Top-level items should stay near the left margin, and setting the indent to 0 should not cause top-level disclosure controls to impinge on neighboring columns. The following fixed it for my purposes.


// Add to a subclass of NSOutlineView

#define kApplyNSOutlineViewIndentationFix 1

// Changing the indentation of NSOutlineView causes the 0-level items
// to indent possibly large amounts as well, which looks bad.
// Similarly, if the indent is set to small values, disclosure triangles of // top level items draw to far to the side and appear in the neighboring column.

#if kApplyNSOutlineViewIndentationFix
#define kMaxFirstLevelIndentation 16
#define kMinFirstLevelIndentation 10


// corrects text and icons (if using ImageAndTextCell)
- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row
{       
        NSRect frame = [super frameOfCellAtColumn:column row:row];
        
        if ( column == 1 ) {
                
                CGFloat indent = [self indentationPerLevel];
                
                if ( indent > kMaxFirstLevelIndentation ) {
                        frame.origin.x -= (indent - kMaxFirstLevelIndentation);
                        frame.size.width += (indent - 
kMaxFirstLevelIndentation);
                }
                else if ( indent < kMinFirstLevelIndentation ) {
                        frame.origin.x += (kMinFirstLevelIndentation - indent);
                        frame.size.width -= (kMinFirstLevelIndentation - 
indent);
                }
                
        }
        return frame;
}

// corrects disclosure control icon
- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row;
{       
        NSRect frame = [super frameOfOutlineCellAtRow:row];
        
        CGFloat indent = [self indentationPerLevel];
        if ( indent > kMaxFirstLevelIndentation )
                frame.origin.x -= (indent - kMaxFirstLevelIndentation);
        else if ( indent < kMinFirstLevelIndentation )
                frame.origin.x += (kMinFirstLevelIndentation - indent);

return frame;
}

#endif // kApplyNSOutlineViewIndentationFix
_______________________________________________

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