diff options
Diffstat (limited to 'cocoa/ScintillaCocoa.mm')
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 109 |
1 files changed, 82 insertions, 27 deletions
diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index 027bdffbf..f8c53932c 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -395,6 +395,10 @@ ScintillaCocoa::ScintillaCocoa(SCIContentView* view, SCIMarginView* viewMargin) idleTimer = NULL; observer = NULL; layerFindIndicator = NULL; + for (TickReason tr=tickCaret; tr<=tickPlatform; tr = static_cast<TickReason>(tr+1)) + { + timers[tr] = nil; + } Initialise(); } @@ -435,7 +439,10 @@ void ScintillaCocoa::Initialise() void ScintillaCocoa::Finalise() { ObserverRemove(); - SetTicking(false); + for (TickReason tr=tickCaret; tr<=tickPlatform; tr = static_cast<TickReason>(tr+1)) + { + FineTickerCancel(tr); + } ScintillaBase::Finalise(); } @@ -862,32 +869,72 @@ sptr_t ScintillaCocoa::DefWndProc(unsigned int, uptr_t, sptr_t) //-------------------------------------------------------------------------------------------------- /** - * Enables or disables a timer that can trigger background processing at a regular interval, like - * drag scrolling or caret blinking. + * Handle any ScintillaCocoa-specific ticking or call superclass. */ -void ScintillaCocoa::SetTicking(bool on) +void ScintillaCocoa::TickFor(TickReason reason) { - if (timer.ticking != on) + if (reason == tickPlatform) { - timer.ticking = on; - if (timer.ticking) - { - // Scintilla ticks = milliseconds - tickTimer = [NSTimer scheduledTimerWithTimeInterval: timer.tickSize / 1000.0 - target: timerTarget - selector: @selector(timerFired:) - userInfo: nil - repeats: YES]; - timer.tickerID = reinterpret_cast<TickerID>(tickTimer); - } - else - if (timer.tickerID != NULL) - { - [reinterpret_cast<NSTimer*>(timer.tickerID) invalidate]; - timer.tickerID = 0; - } + DragScroll(); + } + else + { + Editor::TickFor(reason); + } +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Report that this Editor subclass has a working implementation of FineTickerStart. + */ +bool ScintillaCocoa::FineTickerAvailable() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Is a particular timer currently running? + */ +bool ScintillaCocoa::FineTickerRunning(TickReason reason) +{ + return timers[reason] != nil; +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Start a fine-grained timer. + */ +void ScintillaCocoa::FineTickerStart(TickReason reason, int millis, int tolerance) +{ + FineTickerCancel(reason); + NSTimer *fineTimer = [NSTimer scheduledTimerWithTimeInterval: millis / 1000.0 + target: timerTarget + selector: @selector(timerFired:) + userInfo: nil + repeats: YES]; + if (tolerance && [fineTimer respondsToSelector: @selector(setTolerance:)]) + { + [fineTimer setTolerance: tolerance / 1000.0]; + } + timers[reason] = fineTimer; +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Cancel a fine-grained timer. + */ +void ScintillaCocoa::FineTickerCancel(TickReason reason) +{ + if (timers[reason]) + { + [timers[reason] invalidate]; + timers[reason] = nil; } - timer.ticksToWait = caret.period; } //-------------------------------------------------------------------------------------------------- @@ -1175,6 +1222,8 @@ void ScintillaCocoa::StartDrag() inDragDrop = ddDragging; + FineTickerStart(tickPlatform, timer.tickSize, 0); + // Put the data to be dragged on the drag pasteboard. SelectionText selectedText; NSPasteboard* pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard]; @@ -1336,6 +1385,7 @@ void ScintillaCocoa::StartDrag() */ NSDragOperation ScintillaCocoa::DraggingEntered(id <NSDraggingInfo> info) { + FineTickerStart(tickPlatform, timer.tickSize, 0); return DraggingUpdated(info); } @@ -1378,6 +1428,7 @@ void ScintillaCocoa::DraggingExited(id <NSDraggingInfo> info) { #pragma unused(info) SetDragPosition(SelectionPosition(invalidPosition)); + FineTickerCancel(tickPlatform); inDragDrop = ddNone; } @@ -1822,9 +1873,13 @@ bool ScintillaCocoa::CanRedo() void ScintillaCocoa::TimerFired(NSTimer* timer) { -#pragma unused(timer) - Tick(); - DragScroll(); + for (TickReason tr=tickCaret; tr<=tickPlatform; tr = static_cast<TickReason>(tr+1)) + { + if (timers[tr] == timer) + { + TickFor(tr); + } + } } //-------------------------------------------------------------------------------------------------- @@ -2145,7 +2200,7 @@ void ScintillaCocoa::ActiveStateChanged(bool isActive) if (!isActive) { DropCaret(); //SetFocusState( false ); - SetTicking( false ); + FineTickerCancel(tickCaret); } else { ShowCaretAtCurrentPosition(); } |