This is MiscClipTextField.m in view mode; [Download] [Up]
//
// MiscClipTextField.m -- a TextField subclass for displaying long string
// values
// Written and Copyright (c) 1995 by Balazs Pataki.
// Version 1.0. All rights reserved.
//
// This notice may not be removed from this source code.
//
// This object is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
#import <appkit/appkit.h>
#import <misckit/MiscString.h>
#import <objc/objc-runtime.h>
#import "MiscClipTextField.h"
#import "MiscClipTextFieldCell.h"
#define CLASS_NAME "MiscClipTextField"
#define CLASS_VERSION 1
#define CELL_CLASS [MiscClipTextFieldCell class]
#define DELIMITERS [delimiters stringValue]
static id CellClass; // Class variable of MiscClipTextField
/*
********************************
* *
* MiscClipTextField *
* *
********************************
*/
@implementation MiscClipTextField
+ initialize
// Set class version
{
if (self == objc_lookUpClass(CLASS_NAME)) {
[self setVersion:CLASS_VERSION];
CellClass = CELL_CLASS;
}
return self;
}
+ setCellClass:classId
{
CellClass=classId;
return self;
}
- initFrame:(const NXRect *)rect
// Designated initializer
{
id oldCell;
[super initFrame:rect];
/* Plug in our own cell */
oldCell = [self setCell:[[CellClass alloc] initTextCell:""]];
[oldCell free];
return self;
}
- setStringValue:(const char*)stringValue
{
id theCell = [self cell];
// Change the alignemt to origAlignment because if previously there was
// a triple-click the cells alignemnt changed to left, which may not have
// been our original alignment
[theCell setSelectable:NO]; /* Disable selecting and scrolling */
[theCell setScrollable:NO];
[theCell setAlignment:origAlignment];
return [super setStringValue:stringValue];
}
- setAlignment:(int)align
{
// Save alignment to change it back after a triple-click (triple-click
// event changes the cell to display the cell left aligned and we have to
// take care to undo it)
origAlignment = align;
return self;
}
- resetStringValue:sender
{
id theCell = [self cell];
[theCell setSelectable:NO]; /* Disable selecting and scrolling */
[theCell setScrollable:NO];
[theCell setAlignment:origAlignment];
[[self cell] resetStringValue:sender];
return self;
}
- setClipEnabled:(BOOL)flag
// Sets whether the next `setStringValue:' message should clip the text or not
{
[[self cell] setClipEnabled:flag];
return self;
}
- setClipOnRight:(BOOL)flag
// If flag is YES clipping happens on the right, otherwise on the left of the
// string in the cell.
{
[[self cell] setClipOnRight:flag];
return self;
}
- setClipperString:(const char*)aString
// Sets `aString' as the string that is displayed in place of the clipped part
// of the original string.
{
[[self cell] setClipperString:aString];
return self;
}
- setClipDelimiters:(const char*)delimChars
// Sets `delimChars' as the delimiters by which the clipping has to happen.
// If `delimChars' is NULL or an empty string clipping will occur to any
// character in the string.
{
[[self cell] setClipDelimiters:delimChars];
return self;
}
- sizeTo:(NXCoord)width :(NXCoord)height
// Adjusts the current text to the new size and redisplays it
{
[super sizeTo:width :height];
[self resetStringValue:self];
return self;
}
- mouseDown:(NXEvent *)event
// In case of triple-click event displays the full text instead of the clipped
// one and allows selecting and scrolling the string
// NOTE: This trick alters the alignment of the cell and changes it to
// align its text to left and to truncate the text - don't know any
// workaround (maybe we should stay with left aligned text only :-(
{
// Handling only triple-click event
if (event->data.mouse.click == 3) {
id theCell = [self cell];
[[self window] disableDisplay];
[theCell setSelectable:YES];
[theCell setScrollable:YES];
[theCell setClipEnabled:NO]; /* Turn off clipping for a moment */
[theCell resetStringValue:self];
[theCell setClipEnabled:YES]; /* ... and turn it back */
[[self window] reenableDisplay];
[self display];
}
return [super mouseDown:event];
}
- (const char*)fullStringValue; { return [[self cell] fullStringValue]; }
- clipper { return [[self cell] clipper]; }
- delimiters { return [[self cell] delimiters]; }
- (BOOL) doesClipOnRight { return [[self cell] doesClipOnRight]; }
- (BOOL) isClipEnabled { return [[self cell] isClipEnabled]; }
- write:(NXTypedStream *)stream
{
[super write:stream];
NXWriteType(stream, @encode(int), &origAlignment);
return self;
}
- read:(NXTypedStream *)stream
{
[super read:stream];
NXReadType(stream, @encode(int), &origAlignment);
return self;
}
@end
/*
********************************
* *
* MiscClipTextField(IBStuff) *
* *
* -- InterfaceBuilder Stuff-- *
* *
********************************
*/
@implementation MiscClipTextField(IBStuff)
- (const char *)getInspectorClassName
// Return the class name of our inspector.
{
return "MiscClipTextFieldInspector";
}
@end
/*
********************************
* *
* MiscClipTextField(Test) *
* *
* -- Debug and Test Methods -- *
* *
********************************
*/
@implementation MiscClipTextField(Test)
- changeFont:sender
{
[[self cell] setFont:[sender selFont]];
[[self cell] resetStringValue:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.