mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-05-20 22:06:42 +00:00
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:
parent
3874966236
commit
c7d86ddccb
1 changed files with 156 additions and 11 deletions
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue