From 4233f603db25ca47c867327d1e012a1b8e6ec520 Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 5 Jul 2012 11:29:03 +0100 Subject: [PATCH] More MouseInputSource tweaks. --- .../Code Editor/jucer_SourceCodeEditor.cpp | 31 ++++++++++++------- .../Code Editor/jucer_SourceCodeEditor.h | 24 +++++++++++--- .../mouse/juce_MouseInputSource.cpp | 28 +++++++++-------- .../native/juce_ios_UIViewComponentPeer.mm | 4 +-- 4 files changed, 56 insertions(+), 31 deletions(-) diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp index 1ec6567adf..fe0d215f43 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp @@ -28,11 +28,28 @@ //============================================================================== -SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_, - CodeDocument& codeDocument) +SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_, CodeDocument& codeDocument) : DocumentEditorComponent (document_) { - addAndMakeVisible (editor = createEditor (codeDocument)); + createEditor (codeDocument); +} + +SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_) + : DocumentEditorComponent (document_) +{ +} + +void SourceCodeEditor::createEditor (CodeDocument& codeDocument) +{ + if (document->getFile().hasFileExtension (sourceOrHeaderFileExtensions)) + setEditor (new CppCodeEditorComponent (codeDocument)); + else + setEditor (new CodeEditorComponent (codeDocument, nullptr)); +} + +void SourceCodeEditor::setEditor (CodeEditorComponent* newEditor) +{ + addAndMakeVisible (editor = newEditor); #if JUCE_MAC Font font (13.0f); @@ -54,14 +71,6 @@ SourceCodeEditor::~SourceCodeEditor() getAppSettings().appearance.settings.removeListener (this); } -CodeEditorComponent* SourceCodeEditor::createEditor (CodeDocument& codeDocument) -{ - if (document->getFile().hasFileExtension (sourceOrHeaderFileExtensions)) - return new CppCodeEditorComponent (codeDocument); - - return new CodeEditorComponent (codeDocument, nullptr); -} - //============================================================================== void SourceCodeEditor::resized() { diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h index 119e141ee6..adb6eee809 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h @@ -34,14 +34,16 @@ class SourceCodeEditor : public DocumentEditorComponent, private ValueTree::Listener { public: - SourceCodeEditor (OpenDocumentManager::Document* document, - CodeDocument& codeDocument); + SourceCodeEditor (OpenDocumentManager::Document* document, CodeDocument& codeDocument); + SourceCodeEditor (OpenDocumentManager::Document* document); ~SourceCodeEditor(); + void createEditor (CodeDocument& codeDocument); + void setEditor (CodeEditorComponent*); + private: ScopedPointer editor; - CodeEditorComponent* createEditor (CodeDocument&); void resized(); void valueTreePropertyChanged (ValueTree&, const Identifier&); @@ -125,6 +127,8 @@ private: static String getIndentForCurrentBlock (CodeDocument::Position pos) { + int braceCount = 0; + while (pos.getLineNumber() > 0) { pos = pos.movedByLines (-1); @@ -132,8 +136,18 @@ private: const String line (pos.getLineText()); const String trimmedLine (line.trimStart()); - if (trimmedLine.startsWithChar ('{')) - return getLeadingWhitespace (line); + StringArray tokens; + tokens.addTokens (trimmedLine, true); + + for (int i = tokens.size(); --i >= 0;) + { + if (tokens[i] == "}") + ++braceCount; + + if (tokens[i] == "{") + if (--braceCount < 0) + return getLeadingWhitespace (line); + } } return String::empty; diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index 9dfc9c170e..6a5a02f12d 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -28,13 +28,18 @@ class MouseInputSourceInternal : public AsyncUpdater public: //============================================================================== MouseInputSourceInternal (MouseInputSource& source_, const int index_, const bool isMouseDevice_) - : index (index_), isMouseDevice (isMouseDevice_), isDragging (false), source (source_), - lastPeer (nullptr), isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), - currentCursorHandle (nullptr), mouseEventCounter (0) + : index (index_), isMouseDevice (isMouseDevice_), source (source_), lastPeer (nullptr), + isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (nullptr), + mouseEventCounter (0), mouseMovedSignificantlySincePressed (false) { } //============================================================================== + bool isDragging() const noexcept + { + return buttonState.isAnyMouseButtonDown(); + } + Component* getComponentUnderMouse() const { return static_cast (componentUnderMouse); @@ -129,7 +134,7 @@ public: return false; // (avoid sending a spurious mouse-drag when we receive a mouse-up) - if (! (buttonState.isAnyMouseButtonDown() && ! newButtonState.isAnyMouseButtonDown())) + if (! (isDragging() && ! newButtonState.isAnyMouseButtonDown())) setScreenPos (screenPos, time, false); // (ignore secondary clicks when there's already a button down) @@ -149,7 +154,6 @@ public: { const ModifierKeys oldMods (getCurrentModifiers()); buttonState = newButtonState; // must change this before calling sendMouseUp, in case it runs a modal loop - isDragging = false; sendMouseUp (current, screenPos + unboundedMouseOffset, time, oldMods); } @@ -167,7 +171,6 @@ public: if (current != nullptr) { - isDragging = true; registerMouseDown (screenPos, time, current, buttonState); sendMouseDown (current, screenPos, time); } @@ -223,7 +226,7 @@ public: void setScreenPos (const Point& newScreenPos, const Time& time, const bool forceUpdate) { - if (! isDragging) + if (! isDragging()) setComponentUnderMouse (findComponentAt (newScreenPos), newScreenPos, time); if (newScreenPos != lastScreenPos || forceUpdate) @@ -235,7 +238,7 @@ public: if (current != nullptr) { - if (isDragging) + if (isDragging()) { registerMouseDrag (newScreenPos); sendMouseDrag (current, newScreenPos + unboundedMouseOffset, time); @@ -261,7 +264,7 @@ public: ++mouseEventCounter; const Point screenPos (newPeer->localToGlobal (positionWithinPeer)); - if (isDragging && newMods.isAnyMouseButtonDown()) + if (isDragging() && newMods.isAnyMouseButtonDown()) { setScreenPos (screenPos, time, false); } @@ -294,7 +297,7 @@ public: setScreenPos (screenPos, time, false); triggerFakeMove(); - if (! isDragging) + if (! isDragging()) { Component* current = getComponentUnderMouse(); if (current != nullptr) @@ -347,7 +350,7 @@ public: //============================================================================== void enableUnboundedMouseMovement (bool enable, bool keepCursorVisibleUntilOffscreen) { - enable = enable && isDragging; + enable = enable && isDragging(); isCursorVisibleUntilOffscreen = keepCursorVisibleUntilOffscreen; if (enable != isUnboundedMouseModeOn) @@ -422,7 +425,6 @@ public: //============================================================================== const int index; const bool isMouseDevice; - bool isDragging; Point lastScreenPos; ModifierKeys buttonState; @@ -495,7 +497,7 @@ bool MouseInputSource::isTouch() const { return bool MouseInputSource::canHover() const { return isMouse(); } bool MouseInputSource::hasMouseWheel() const { return isMouse(); } int MouseInputSource::getIndex() const { return pimpl->index; } -bool MouseInputSource::isDragging() const { return pimpl->isDragging; } +bool MouseInputSource::isDragging() const { return pimpl->isDragging(); } Point MouseInputSource::getScreenPosition() const { return pimpl->getScreenPosition(); } ModifierKeys MouseInputSource::getCurrentModifiers() const { return pimpl->getCurrentModifiers(); } Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index 766b4ea106..8cc89d7dc1 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -779,7 +779,7 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, const bool isDown, cons if (isCancel) { currentTouches.clear(); - currentModifiers = currentModifiers.withoutMouseButtons(); + modsToSend = currentModifiers = currentModifiers.withoutMouseButtons(); } handleMouseEvent (touchIndex, pos, modsToSend, time); @@ -788,7 +788,7 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, const bool isDown, cons if (isUp || isCancel) { - handleMouseEvent (touchIndex, Point (-1, -1), currentModifiers, time); + handleMouseEvent (touchIndex, Point (-1, -1), modsToSend, time); if (! isValidPeer (this)) return; }