mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 03:11:18 +00:00
Implemented blinking insertion point
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@11287 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
b6957f43f0
commit
b9e1b6d6ed
1 changed files with 110 additions and 41 deletions
|
@ -119,6 +119,11 @@ if (_layoutManager != nil) _layoutManager->_beganEditing = X
|
|||
static NSNotificationCenter *nc;
|
||||
|
||||
@interface NSTextView (GNUstepPrivate)
|
||||
/*
|
||||
* Used to implement the blinking insertion point
|
||||
*/
|
||||
- (void) _blink;
|
||||
|
||||
/*
|
||||
* these NSLayoutManager- like methods are here only informally
|
||||
*/
|
||||
|
@ -220,19 +225,20 @@ static NSNotificationCenter *nc;
|
|||
_tf.uses_ruler = YES;
|
||||
_tf.is_ruler_visible = NO;
|
||||
_original_selected_range.location = NSNotFound;
|
||||
ASSIGN (_caret_color, [NSColor blackColor]);
|
||||
ASSIGN (_caret_color, [NSColor blackColor]);
|
||||
|
||||
[self setTypingAttributes: [isa defaultTypingAttributes]];
|
||||
|
||||
[self setBackgroundColor: [NSColor textBackgroundColor]];
|
||||
|
||||
//[self setSelectedRange: NSMakeRange (0, 0)];
|
||||
|
||||
[aTextContainer setTextView: self];
|
||||
|
||||
[self setEditable: YES];
|
||||
[self setUsesFontPanel: YES];
|
||||
[self setUsesRuler: YES];
|
||||
|
||||
[self setSelectedRange: NSMakeRange (0, 0)];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
@ -290,6 +296,8 @@ static NSNotificationCenter *nc;
|
|||
/* See initWithFrame: for comments on this RELEASE */
|
||||
RELEASE (self);
|
||||
|
||||
[self setSelectedRange: NSMakeRange (0, 0)];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
@ -307,6 +315,12 @@ static NSNotificationCenter *nc;
|
|||
RELEASE (_textStorage);
|
||||
}
|
||||
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
}
|
||||
|
||||
RELEASE (_selectedTextAttributes);
|
||||
RELEASE (_markedTextAttributes);
|
||||
RELEASE (_caret_color);
|
||||
|
@ -1068,7 +1082,7 @@ static NSNotificationCenter *nc;
|
|||
- (BOOL) shouldDrawInsertionPoint
|
||||
{
|
||||
return (_selected_range.length == 0) && _tf.is_editable
|
||||
&& [_window isKeyWindow];
|
||||
&& [_window isKeyWindow] && ([_window firstResponder] == self);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1229,7 +1243,20 @@ static NSNotificationCenter *nc;
|
|||
{
|
||||
NSTEXTVIEW_SYNC (@selector(setEditable:));
|
||||
[super setEditable: flag];
|
||||
/* FIXME/TODO: Update/show the insertion point */
|
||||
|
||||
if ([self shouldDrawInsertionPoint])
|
||||
{
|
||||
[self updateInsertionPointStateAndRestartTimer: YES];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
_drawInsertionPointNow = NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void) setFieldEditor: (BOOL)flag
|
||||
|
@ -1356,7 +1383,12 @@ static NSNotificationCenter *nc;
|
|||
/* Insertion Point */
|
||||
if (range.length)
|
||||
{
|
||||
/* <!>disable caret timed entry */
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
_drawInsertionPointNow = YES;
|
||||
}
|
||||
}
|
||||
else /* no selection, only insertion point */
|
||||
{
|
||||
|
@ -1486,7 +1518,12 @@ static NSNotificationCenter *nc;
|
|||
/* Simple case - no insertion point */
|
||||
if ((_selected_range.length > 0) || _selected_range.location == NSNotFound)
|
||||
{
|
||||
_insertionPointRect = NSZeroRect;
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
_drawInsertionPointNow = YES;
|
||||
}
|
||||
|
||||
/* FIXME: horizontal position of insertion point */
|
||||
_originalInsertPoint = 0;
|
||||
|
@ -1554,7 +1591,24 @@ static NSNotificationCenter *nc;
|
|||
|
||||
if (flag)
|
||||
{
|
||||
/* TODO: Restart blinking timer */
|
||||
/* Start blinking timer if not yet started */
|
||||
if (_insertionPointTimer == nil && [self shouldDrawInsertionPoint])
|
||||
{
|
||||
_insertionPointTimer = [NSTimer scheduledTimerWithTimeInterval: 0.5
|
||||
target: self
|
||||
selector: @selector(_blink)
|
||||
userInfo: nil
|
||||
repeats: YES];
|
||||
RETAIN (_insertionPointTimer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2432,6 +2486,13 @@ afterString in order over charRange. */
|
|||
|
||||
- (BOOL) resignFirstResponder
|
||||
{
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
_drawInsertionPointNow = NO;
|
||||
}
|
||||
|
||||
if (_tvf.multiple_textviews == YES)
|
||||
{
|
||||
id futureFirstResponder;
|
||||
|
@ -2471,10 +2532,8 @@ afterString in order over charRange. */
|
|||
|
||||
if ([self shouldDrawInsertionPoint])
|
||||
{
|
||||
[self setNeedsDisplayInRect: _insertionPointRect
|
||||
avoidAdditionalLayout: YES];
|
||||
//<!> stop timed entry
|
||||
}
|
||||
[self updateInsertionPointStateAndRestartTimer: NO];
|
||||
}
|
||||
|
||||
SET_BEGAN_EDITING (NO);
|
||||
|
||||
|
@ -2490,6 +2549,7 @@ afterString in order over charRange. */
|
|||
yes, the notification name is misleading. */
|
||||
[nc postNotificationName: NSTextDidEndEditingNotification
|
||||
object: _notifObject];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
@ -2505,32 +2565,14 @@ afterString in order over charRange. */
|
|||
|
||||
/* Draw selection, update insertion point */
|
||||
|
||||
//if ([self shouldDrawInsertionPoint])
|
||||
// {
|
||||
// [self lockFocus];
|
||||
// [self drawInsertionPointAtIndex: _selected_range.location
|
||||
// color: _caret_color turnedOn: YES];
|
||||
// [self unlockFocus];
|
||||
// //<!> restart timed entry
|
||||
// }
|
||||
if ([self shouldDrawInsertionPoint])
|
||||
{
|
||||
[self updateInsertionPointStateAndRestartTimer: YES];
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void) becomeKeyWindow
|
||||
{
|
||||
[self setNeedsDisplayInRect: _insertionPointRect
|
||||
avoidAdditionalLayout: YES];
|
||||
//<!> start timed entry
|
||||
}
|
||||
|
||||
- (void) resignKeyWindow
|
||||
{
|
||||
[self setNeedsDisplayInRect: _insertionPointRect
|
||||
avoidAdditionalLayout: YES];
|
||||
//<!> stop timed entry
|
||||
}
|
||||
|
||||
- (void) drawRect: (NSRect)rect
|
||||
{
|
||||
/* TODO: Only do relayout if needed */
|
||||
|
@ -2548,13 +2590,16 @@ afterString in order over charRange. */
|
|||
if ([self shouldDrawInsertionPoint])
|
||||
{
|
||||
unsigned location = _selected_range.location;
|
||||
|
||||
|
||||
if (NSLocationInRange (location, drawnRange)
|
||||
|| location == NSMaxRange (drawnRange))
|
||||
{
|
||||
[self drawInsertionPointInRect: _insertionPointRect
|
||||
color: _caret_color
|
||||
turnedOn: YES];
|
||||
if (_drawInsertionPointNow)
|
||||
{
|
||||
[self drawInsertionPointInRect: _insertionPointRect
|
||||
color: _caret_color
|
||||
turnedOn: YES];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3200,6 +3245,25 @@ other than copy/paste or dragging. */
|
|||
|
||||
@implementation NSTextView (GNUstepPrivate)
|
||||
|
||||
- (void) _blink
|
||||
{
|
||||
if (_drawInsertionPointNow)
|
||||
{
|
||||
_drawInsertionPointNow = NO;
|
||||
}
|
||||
else
|
||||
{
|
||||
_drawInsertionPointNow = YES;
|
||||
}
|
||||
|
||||
[self setNeedsDisplayInRect: _insertionPointRect
|
||||
avoidAdditionalLayout: YES];
|
||||
/* Because we are called by a timer which is independent of any
|
||||
event processing in the gui runloop, we need to manually update
|
||||
the windows. */
|
||||
[NSApp updateWindows];
|
||||
}
|
||||
|
||||
+ (NSDictionary*) defaultTypingAttributes
|
||||
{
|
||||
return [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
|
@ -3247,9 +3311,14 @@ other than copy/paste or dragging. */
|
|||
@selector(textShouldEndEditing:)])
|
||||
&& ([_delegate textShouldEndEditing: self] == NO))
|
||||
return;
|
||||
|
||||
// Add any clean-up stuff here
|
||||
|
||||
|
||||
/* FIXME */
|
||||
if (_insertionPointTimer != nil)
|
||||
{
|
||||
[_insertionPointTimer invalidate];
|
||||
DESTROY (_insertionPointTimer);
|
||||
}
|
||||
|
||||
number = [NSNumber numberWithInt: textMovement];
|
||||
uiDictionary = [NSDictionary dictionaryWithObject: number
|
||||
forKey: @"NSTextMovement"];
|
||||
|
|
Loading…
Reference in a new issue