Implemented column resizing

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@7437 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Nicola Pero 2000-09-07 16:36:05 +00:00
parent 3874966236
commit c7d86ddccb

View file

@ -12,8 +12,8 @@
First actual coding. First actual coding.
Author: Nicola Pero <nicola@brainstorm.co.uk> Author: Nicola Pero <nicola@brainstorm.co.uk>
Date: August 2000 Date: August 2000, Semptember 2000
Selection and Dragging of Columns. Selection and resizing of Columns.
This file is part of the GNUstep GUI Library. This file is part of the GNUstep GUI Library.
@ -40,6 +40,13 @@
#include <AppKit/NSTableView.h> #include <AppKit/NSTableView.h>
#include <AppKit/NSEvent.h> #include <AppKit/NSEvent.h>
#include <AppKit/NSApplication.h> #include <AppKit/NSApplication.h>
#include <AppKit/NSColor.h>
@interface NSTableView (GNUstepPrivate)
- (void) _userResizedTableColumn: (int)index
leftWidth: (float)lwidth
rightWidth: (float)rwidth;
@end
@implementation NSTableHeaderView @implementation NSTableHeaderView
{ {
@ -70,6 +77,7 @@
{ {
self = [super initWithFrame: frameRect]; self = [super initWithFrame: frameRect];
_tableView = nil; _tableView = nil;
_resizedColumn = -1;
return self; return self;
} }
/* /*
@ -89,25 +97,24 @@
/* /*
* Checking altered columns * Checking altered columns
*/ */
- (int)draggedColumn - (int) draggedColumn
{ {
// TODO // TODO
return -1; return -1;
} }
- (float)draggedDistance - (float) draggedDistance
{ {
// TODO // TODO
return -1; return -1;
} }
- (int)resizedColumn - (int) resizedColumn
{ {
// TODO return _resizedColumn;
return -1;
} }
/* /*
* Utility methods * Utility methods
*/ */
- (int)columnAtPoint: (NSPoint)aPoint - (int) columnAtPoint: (NSPoint)aPoint
{ {
if (_tableView == nil) if (_tableView == nil)
return -1; return -1;
@ -200,10 +207,148 @@
return; return;
} }
if (clickCount == 1) if (clickCount == 1 && [_tableView allowsColumnResizing])
{ {
// TODO: Resizing table columns /* Start resizing if the mouse is down on the bounds of a column. */
// Start resizing if the mouse is down on the bounds of a column. NSRect rect = [self headerRectOfColumn: columnIndex];
/* Safety check */
if (_resizedColumn != -1)
{
NSLog (@"Bug: starting resizing of column while already resizing!");
_resizedColumn = -1;
}
if (location.x >= NSMaxX (rect) - 1)
{
if (columnIndex != ([_tableView numberOfColumns] - 1))
{
_resizedColumn = columnIndex;
}
}
else if (location.x <= NSMinX (rect) + 2)
{
if (columnIndex > 0)
{
_resizedColumn = columnIndex - 1;
}
}
/* Resizing */
if (_resizedColumn != -1)
{
/* Width of the highlighted area. */
const float divWidth = 4;
/* Dragging limits */
float minCoord;
float maxCoord;
NSArray *columns;
/* Column on the left of resizing bound */
NSTableColumn *columnLow;
NSRect rectLow = [self headerRectOfColumn: _resizedColumn];
/* Column on the right of resizing bound */
NSTableColumn *columnHigh;
NSRect rectHigh = [self headerRectOfColumn: (_resizedColumn + 1)];
/* Old highlighted rect, used to avoid useless redrawing */
NSRect oldRect = NSZeroRect;
/* Current highlighted rect */
NSRect r;
/* Mouse position */
float p;
/* YES if some highlighting was done and needs to be undone */
BOOL lit = NO;
NSEvent *e;
NSDate *farAway = [NSDate distantFuture];
unsigned int eventMask = NSLeftMouseUpMask | NSLeftMouseDraggedMask;
/* Determine dragging limits, constrained to visible rect */
rect = [self visibleRect];
minCoord = MAX (NSMinX (rectLow), NSMinX (rect)) + divWidth;
maxCoord = MIN (NSMaxX (rectHigh), NSMaxX (rect)) - divWidth;
/* Then constrain to minimum and maximum column width if any */
columns = [_tableView tableColumns];
/* Column at the left */
columnLow = [columns objectAtIndex: _resizedColumn];
/* We use p as a temporary variable for a while */
p = NSMinX (rectLow) + [columnLow minWidth];
minCoord = MAX (p, minCoord);
p = NSMinX (rectLow) + [columnLow maxWidth];
maxCoord = MIN (p, maxCoord);
/* Column at the right */
columnHigh = [columns objectAtIndex: _resizedColumn + 1];
/* This is trickier - think to what happens at the column on
the right when the user released the mouse somewhere */
p = NSMaxX (rectHigh) - [columnHigh minWidth];
maxCoord = MIN (p, maxCoord);
p = NSMaxX (rectHigh) - [columnHigh maxWidth];
minCoord = MAX (p, minCoord);
/* Do we need to check that we already fit into this area ?
We should */
[self lockFocus];
[[NSRunLoop currentRunLoop] limitDateForMode: NSEventTrackingRunLoopMode];
[[NSColor lightGrayColor] set];
r.size.width = divWidth;
r.size.height = NSHeight (rect);
r.origin.y = NSMinY (rect);
e = [NSApp nextEventMatchingMask: eventMask
untilDate: farAway
inMode: NSEventTrackingRunLoopMode
dequeue: YES];
while ([e type] != NSLeftMouseUp)
{
p = [self convertPoint: [e locationInWindow] fromView: nil].x;
if (p < minCoord)
{
p = minCoord;
}
if (p > maxCoord)
{
p = maxCoord;
}
r.origin.x = p - (divWidth / 2.);
if (NSEqualRects(r, oldRect) == NO)
{
if (lit == YES)
{
NSHighlightRect (oldRect);
}
NSHighlightRect (r);
lit = YES;
oldRect = r;
}
e = [NSApp nextEventMatchingMask: eventMask
untilDate: farAway
inMode: NSEventTrackingRunLoopMode
dequeue: YES];
}
if (lit == YES)
{
NSHighlightRect(oldRect);
}
[self unlockFocus];
/* The following tiles the table. We use a private method
which avoids tiling the table twice. */
[_tableView _userResizedTableColumn: _resizedColumn
leftWidth: (p - NSMinX (rectLow))
rightWidth: (NSMaxX (rectHigh) - p)];
/* Clean up */
_resizedColumn = -1;
return;
}
/* Dragging */ /* Dragging */
/* Wait for mouse dragged events. /* Wait for mouse dragged events.