@@ -163,6 +163,7 @@ OBJECTS := \ | |||
$(OBJDIR)/juce_FileTreeComponent_8cb2d3a3.o \ | |||
$(OBJDIR)/juce_ImagePreviewComponent_a108ea50.o \ | |||
$(OBJDIR)/juce_WildcardFileFilter_9337b18.o \ | |||
$(OBJDIR)/juce_CaretComponent_26bf4433.o \ | |||
$(OBJDIR)/juce_KeyboardFocusTraverser_6325fc08.o \ | |||
$(OBJDIR)/juce_KeyListener_631ada24.o \ | |||
$(OBJDIR)/juce_KeyMappingEditorComponent_a0183a92.o \ | |||
@@ -1002,6 +1003,11 @@ $(OBJDIR)/juce_WildcardFileFilter_9337b18.o: ../../src/gui/components/filebrowse | |||
@echo "Compiling juce_WildcardFileFilter.cpp" | |||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
$(OBJDIR)/juce_CaretComponent_26bf4433.o: ../../src/gui/components/keyboard/juce_CaretComponent.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling juce_CaretComponent.cpp" | |||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
$(OBJDIR)/juce_KeyboardFocusTraverser_6325fc08.o: ../../src/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling juce_KeyboardFocusTraverser.cpp" | |||
@@ -132,6 +132,7 @@ | |||
0D91D36C2195315FE534F304 = { isa = PBXBuildFile; fileRef = A418FC3BDDBF1CE9F2903490; }; | |||
A1E82F70796B8611D7323247 = { isa = PBXBuildFile; fileRef = 949854EDE6B5B16CEFB6108F; }; | |||
BC1856E0B20406DDCE5EBF94 = { isa = PBXBuildFile; fileRef = 8A67B45A2BA1D19D1AC43315; }; | |||
FF3A28F88174E10CB478931E = { isa = PBXBuildFile; fileRef = 912C419859C9C56BC96AA6FB; }; | |||
C39AE37828718E9A45589A24 = { isa = PBXBuildFile; fileRef = 5ABC6616473BA4791AA8101E; }; | |||
4400B0595B35F919291C1A01 = { isa = PBXBuildFile; fileRef = 29A79478AE8567250972ED43; }; | |||
BB1DAC0CA8D7B3DEEDEE76C6 = { isa = PBXBuildFile; fileRef = 7F5A271EAB78C7CF8B2341DE; }; | |||
@@ -664,6 +665,8 @@ | |||
F39059E72B927A700010851B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImagePreviewComponent.h; path = ../../src/gui/components/filebrowser/juce_ImagePreviewComponent.h; sourceTree = SOURCE_ROOT; }; | |||
8A67B45A2BA1D19D1AC43315 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = ../../src/gui/components/filebrowser/juce_WildcardFileFilter.cpp; sourceTree = SOURCE_ROOT; }; | |||
ECDD0F8397F3EE4E7FA7ACCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WildcardFileFilter.h; path = ../../src/gui/components/filebrowser/juce_WildcardFileFilter.h; sourceTree = SOURCE_ROOT; }; | |||
912C419859C9C56BC96AA6FB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CaretComponent.cpp; path = ../../src/gui/components/keyboard/juce_CaretComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
717295136FD426125079F78C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CaretComponent.h; path = ../../src/gui/components/keyboard/juce_CaretComponent.h; sourceTree = SOURCE_ROOT; }; | |||
5ABC6616473BA4791AA8101E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyboardFocusTraverser.cpp; path = ../../src/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp; sourceTree = SOURCE_ROOT; }; | |||
F61C34EE417006881D0869F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyboardFocusTraverser.h; path = ../../src/gui/components/keyboard/juce_KeyboardFocusTraverser.h; sourceTree = SOURCE_ROOT; }; | |||
29A79478AE8567250972ED43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyListener.cpp; path = ../../src/gui/components/keyboard/juce_KeyListener.cpp; sourceTree = SOURCE_ROOT; }; | |||
@@ -1424,6 +1427,8 @@ | |||
8A67B45A2BA1D19D1AC43315, | |||
ECDD0F8397F3EE4E7FA7ACCC ); name = filebrowser; sourceTree = "<group>"; }; | |||
558A664D5D1ECEC607F4775D = { isa = PBXGroup; children = ( | |||
912C419859C9C56BC96AA6FB, | |||
717295136FD426125079F78C, | |||
5ABC6616473BA4791AA8101E, | |||
F61C34EE417006881D0869F4, | |||
29A79478AE8567250972ED43, | |||
@@ -2149,6 +2154,7 @@ | |||
0D91D36C2195315FE534F304, | |||
A1E82F70796B8611D7323247, | |||
BC1856E0B20406DDCE5EBF94, | |||
FF3A28F88174E10CB478931E, | |||
C39AE37828718E9A45589A24, | |||
4400B0595B35F919291C1A01, | |||
BB1DAC0CA8D7B3DEEDEE76C6, | |||
@@ -525,6 +525,8 @@ | |||
<File RelativePath="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.h"/> | |||
</Filter> | |||
<Filter Name="keyboard"> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyListener.cpp"/> | |||
@@ -525,6 +525,8 @@ | |||
<File RelativePath="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.h"/> | |||
</Filter> | |||
<Filter Name="keyboard"> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyListener.cpp"/> | |||
@@ -527,6 +527,8 @@ | |||
<File RelativePath="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.h"/> | |||
</Filter> | |||
<Filter Name="keyboard"> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_CaretComponent.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.h"/> | |||
<File RelativePath="..\..\src\gui\components\keyboard\juce_KeyListener.cpp"/> | |||
@@ -246,6 +246,7 @@ | |||
<ClCompile Include="..\..\src\gui\components\filebrowser\juce_FileTreeComponent.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\filebrowser\juce_ImagePreviewComponent.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_CaretComponent.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_KeyListener.cpp"/> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_KeyMappingEditorComponent.cpp"/> | |||
@@ -616,6 +617,7 @@ | |||
<ClInclude Include="..\..\src\gui\components\filebrowser\juce_FileTreeComponent.h"/> | |||
<ClInclude Include="..\..\src\gui\components\filebrowser\juce_ImagePreviewComponent.h"/> | |||
<ClInclude Include="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.h"/> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_CaretComponent.h"/> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.h"/> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_KeyListener.h"/> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_KeyMappingEditorComponent.h"/> | |||
@@ -598,6 +598,9 @@ | |||
<ClCompile Include="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.cpp"> | |||
<Filter>Juce\Source\gui\components\filebrowser</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_CaretComponent.cpp"> | |||
<Filter>Juce\Source\gui\components\keyboard</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.cpp"> | |||
<Filter>Juce\Source\gui\components\keyboard</Filter> | |||
</ClCompile> | |||
@@ -1782,6 +1785,9 @@ | |||
<ClInclude Include="..\..\src\gui\components\filebrowser\juce_WildcardFileFilter.h"> | |||
<Filter>Juce\Source\gui\components\filebrowser</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_CaretComponent.h"> | |||
<Filter>Juce\Source\gui\components\keyboard</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\src\gui\components\keyboard\juce_KeyboardFocusTraverser.h"> | |||
<Filter>Juce\Source\gui\components\keyboard</Filter> | |||
</ClInclude> | |||
@@ -132,6 +132,7 @@ | |||
0D91D36C2195315FE534F304 = { isa = PBXBuildFile; fileRef = A418FC3BDDBF1CE9F2903490; }; | |||
A1E82F70796B8611D7323247 = { isa = PBXBuildFile; fileRef = 949854EDE6B5B16CEFB6108F; }; | |||
BC1856E0B20406DDCE5EBF94 = { isa = PBXBuildFile; fileRef = 8A67B45A2BA1D19D1AC43315; }; | |||
FF3A28F88174E10CB478931E = { isa = PBXBuildFile; fileRef = 912C419859C9C56BC96AA6FB; }; | |||
C39AE37828718E9A45589A24 = { isa = PBXBuildFile; fileRef = 5ABC6616473BA4791AA8101E; }; | |||
4400B0595B35F919291C1A01 = { isa = PBXBuildFile; fileRef = 29A79478AE8567250972ED43; }; | |||
BB1DAC0CA8D7B3DEEDEE76C6 = { isa = PBXBuildFile; fileRef = 7F5A271EAB78C7CF8B2341DE; }; | |||
@@ -664,6 +665,8 @@ | |||
F39059E72B927A700010851B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImagePreviewComponent.h; path = ../../src/gui/components/filebrowser/juce_ImagePreviewComponent.h; sourceTree = SOURCE_ROOT; }; | |||
8A67B45A2BA1D19D1AC43315 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = ../../src/gui/components/filebrowser/juce_WildcardFileFilter.cpp; sourceTree = SOURCE_ROOT; }; | |||
ECDD0F8397F3EE4E7FA7ACCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WildcardFileFilter.h; path = ../../src/gui/components/filebrowser/juce_WildcardFileFilter.h; sourceTree = SOURCE_ROOT; }; | |||
912C419859C9C56BC96AA6FB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CaretComponent.cpp; path = ../../src/gui/components/keyboard/juce_CaretComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
717295136FD426125079F78C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CaretComponent.h; path = ../../src/gui/components/keyboard/juce_CaretComponent.h; sourceTree = SOURCE_ROOT; }; | |||
5ABC6616473BA4791AA8101E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyboardFocusTraverser.cpp; path = ../../src/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp; sourceTree = SOURCE_ROOT; }; | |||
F61C34EE417006881D0869F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyboardFocusTraverser.h; path = ../../src/gui/components/keyboard/juce_KeyboardFocusTraverser.h; sourceTree = SOURCE_ROOT; }; | |||
29A79478AE8567250972ED43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyListener.cpp; path = ../../src/gui/components/keyboard/juce_KeyListener.cpp; sourceTree = SOURCE_ROOT; }; | |||
@@ -1424,6 +1427,8 @@ | |||
8A67B45A2BA1D19D1AC43315, | |||
ECDD0F8397F3EE4E7FA7ACCC ); name = filebrowser; sourceTree = "<group>"; }; | |||
558A664D5D1ECEC607F4775D = { isa = PBXGroup; children = ( | |||
912C419859C9C56BC96AA6FB, | |||
717295136FD426125079F78C, | |||
5ABC6616473BA4791AA8101E, | |||
F61C34EE417006881D0869F4, | |||
29A79478AE8567250972ED43, | |||
@@ -2153,6 +2158,7 @@ | |||
0D91D36C2195315FE534F304, | |||
A1E82F70796B8611D7323247, | |||
BC1856E0B20406DDCE5EBF94, | |||
FF3A28F88174E10CB478931E, | |||
C39AE37828718E9A45589A24, | |||
4400B0595B35F919291C1A01, | |||
BB1DAC0CA8D7B3DEEDEE76C6, | |||
@@ -683,6 +683,10 @@ | |||
file="src/gui/components/filebrowser/juce_WildcardFileFilter.h"/> | |||
</GROUP> | |||
<GROUP id="PAM9sn3Rp" name="keyboard"> | |||
<FILE id="KAEiwD" name="juce_CaretComponent.cpp" compile="1" resource="0" | |||
file="src/gui/components/keyboard/juce_CaretComponent.cpp"/> | |||
<FILE id="UpJwqg" name="juce_CaretComponent.h" compile="0" resource="0" | |||
file="src/gui/components/keyboard/juce_CaretComponent.h"/> | |||
<FILE id="mUtddLtZX" name="juce_KeyboardFocusTraverser.cpp" compile="1" | |||
resource="0" file="src/gui/components/keyboard/juce_KeyboardFocusTraverser.cpp"/> | |||
<FILE id="edrEUIDT" name="juce_KeyboardFocusTraverser.h" compile="0" | |||
@@ -274,6 +274,7 @@ | |||
#include "../src/gui/components/keyboard/juce_KeyPress.cpp" | |||
#include "../src/gui/components/keyboard/juce_KeyPressMappingSet.cpp" | |||
#include "../src/gui/components/keyboard/juce_ModifierKeys.cpp" | |||
#include "../src/gui/components/keyboard/juce_CaretComponent.cpp" | |||
#include "../src/gui/components/layout/juce_ComponentAnimator.cpp" | |||
#include "../src/gui/components/layout/juce_ComponentBuilder.cpp" | |||
#include "../src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp" | |||
@@ -210,6 +210,19 @@ namespace | |||
LRESULT CALLBACK mouseWheelHookCallback (int nCode, WPARAM wParam, LPARAM lParam) | |||
{ | |||
#ifndef WM_MOUSEWHEEL | |||
#define WM_MOUSEWHEEL 0x20a | |||
struct MSLLHOOKSTRUCT | |||
{ | |||
POINT pt; | |||
DWORD mouseData; | |||
DWORD flags; | |||
DWORD time; | |||
ULONG_PTR dwExtraInfo; | |||
}; | |||
#endif | |||
if (nCode >= 0 && wParam == WM_MOUSEWHEEL) | |||
{ | |||
const MSLLHOOKSTRUCT& hs = *(MSLLHOOKSTRUCT*) lParam; | |||
@@ -226,6 +239,10 @@ namespace | |||
void registerMouseWheelHook() | |||
{ | |||
#ifndef WH_MOUSE_LL | |||
#define WH_MOUSE_LL 14 | |||
#endif | |||
if (mouseHookUsers++ == 0) | |||
mouseWheelHook = SetWindowsHookEx (WH_MOUSE_LL, mouseWheelHookCallback, | |||
(HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(), 0); | |||
@@ -42,7 +42,7 @@ public: | |||
registerColour (TextEditor::highlightColourId, "highlight", "hilitecol"); | |||
registerColour (TextEditor::outlineColourId, "outline", "outlinecol"); | |||
registerColour (TextEditor::shadowColourId, "shadow", "shadowcol"); | |||
registerColour (TextEditor::caretColourId, "caret", "caretcol"); | |||
registerColour (CaretComponent::caretColourId, "caret", "caretcol"); | |||
} | |||
//============================================================================== | |||
@@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||
*/ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 53 | |||
#define JUCE_BUILDNUMBER 55 | |||
#define JUCE_BUILDNUMBER 56 | |||
/** Current Juce version number. | |||
@@ -41819,6 +41819,61 @@ public: | |||
#endif // __JUCE_TEXTINPUTTARGET_JUCEHEADER__ | |||
/*** End of inlined file: juce_TextInputTarget.h ***/ | |||
/*** Start of inlined file: juce_CaretComponent.h ***/ | |||
#ifndef __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
#define __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
/** | |||
*/ | |||
class JUCE_API CaretComponent : public Component, | |||
public Timer | |||
{ | |||
public: | |||
/** Creates the caret component. | |||
The keyFocusOwner is an optional component which the caret will check, making | |||
itself visible only when the keyFocusOwner has keyboard focus. | |||
*/ | |||
CaretComponent (Component* keyFocusOwner); | |||
/** Destructor. */ | |||
~CaretComponent(); | |||
/** Sets the caret's position to place it next to the given character. | |||
The area is the rectangle containing the entire character that the caret is | |||
positioned on, so by default a vertical-line caret may choose to just show itself | |||
at the left of this area. You can override this method to customise its size. | |||
This method will also force the caret to reset its timer and become visible (if | |||
appropriate), so that as it moves, you can see where it is. | |||
*/ | |||
virtual void setCaretPosition (const Rectangle<int>& characterArea); | |||
/** A set of colour IDs to use to change the colour of various aspects of the caret. | |||
These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() | |||
methods. | |||
@see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour | |||
*/ | |||
enum ColourIds | |||
{ | |||
caretColourId = 0x1000204, /**< The colour with which to draw the caret. */ | |||
}; | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
/** @internal */ | |||
void timerCallback(); | |||
private: | |||
Component* owner; | |||
bool shouldBeShown() const; | |||
JUCE_DECLARE_NON_COPYABLE (CaretComponent); | |||
}; | |||
#endif // __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
/*** End of inlined file: juce_CaretComponent.h ***/ | |||
/** | |||
A component containing text that can be edited. | |||
@@ -41910,9 +41965,7 @@ public: | |||
bool isReadOnly() const; | |||
/** Makes the caret visible or invisible. | |||
By default the caret is visible. | |||
@see setCaretColour, setCaretPosition | |||
*/ | |||
void setCaretVisible (bool shouldBeVisible); | |||
@@ -41920,7 +41973,7 @@ public: | |||
/** Returns true if the caret is enabled. | |||
@see setCaretVisible | |||
*/ | |||
bool isCaretVisible() const { return caretVisible; } | |||
bool isCaretVisible() const { return caret != 0; } | |||
/** Enables/disables a vertical scrollbar. | |||
@@ -41994,8 +42047,6 @@ public: | |||
highlightedTextColourId = 0x1000203, /**< The colour with which to draw the text in highlighted sections. */ | |||
caretColourId = 0x1000204, /**< The colour with which to draw the caret. */ | |||
outlineColourId = 0x1000205, /**< If this is non-transparent, it will be used to draw a box around | |||
the edge of the component. */ | |||
@@ -42385,19 +42436,17 @@ private: | |||
bool multiline : 1; | |||
bool wordWrap : 1; | |||
bool returnKeyStartsNewLine : 1; | |||
bool caretVisible : 1; | |||
bool popupMenuEnabled : 1; | |||
bool selectAllTextWhenFocused : 1; | |||
bool scrollbarVisible : 1; | |||
bool wasFocused : 1; | |||
bool caretFlashState : 1; | |||
bool keepCursorOnScreen : 1; | |||
bool tabKeyUsed : 1; | |||
bool menuActive : 1; | |||
bool valueTextNeedsUpdating : 1; | |||
UndoManager undoManager; | |||
float cursorX, cursorY, cursorHeight; | |||
ScopedPointer<CaretComponent> caret; | |||
int maxTextLength; | |||
Range<int> selection; | |||
int leftIndent, topIndent; | |||
@@ -42441,7 +42490,6 @@ private: | |||
void updateTextHolderSize(); | |||
float getWordWrapWidth() const; | |||
void timerCallbackInt(); | |||
void repaintCaret(); | |||
void repaintText (const Range<int>& range); | |||
UndoManager* getUndoManager() throw(); | |||
@@ -51637,7 +51685,6 @@ public: | |||
enum ColourIds | |||
{ | |||
backgroundColourId = 0x1004500, /**< A colour to use to fill the editor's background. */ | |||
caretColourId = 0x1004501, /**< The colour to draw the caret. */ | |||
highlightColourId = 0x1004502, /**< The colour to use for the highlighted background under | |||
selected text. */ | |||
defaultTextColourId = 0x1004503 /**< The colour to use for text when no syntax colouring is | |||
@@ -51697,8 +51744,6 @@ private: | |||
CodeDocument::Position caretPos; | |||
CodeDocument::Position selectionStart, selectionEnd; | |||
class CaretComponent; | |||
friend class ScopedPointer <CaretComponent>; | |||
ScopedPointer<CaretComponent> caret; | |||
ScrollBar verticalScrollBar, horizontalScrollBar; | |||
@@ -51724,6 +51769,7 @@ private: | |||
void getIteratorForPosition (int position, CodeDocument::Iterator& result); | |||
void moveLineDelta (int delta, bool selecting); | |||
void updateCaretPosition(); | |||
void updateScrollBars(); | |||
void scrollToLineInternal (int line); | |||
void scrollToColumnInternal (double column); | |||
@@ -57710,6 +57756,9 @@ private: | |||
#endif | |||
#ifndef __JUCE_MODALCOMPONENTMANAGER_JUCEHEADER__ | |||
#endif | |||
#ifndef __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
#endif | |||
#ifndef __JUCE_KEYBOARDFOCUSTRAVERSER_JUCEHEADER__ | |||
@@ -59878,6 +59927,7 @@ class FilePreviewComponent; | |||
class ImageButton; | |||
class CallOutBox; | |||
class Drawable; | |||
class CaretComponent; | |||
/** | |||
LookAndFeel objects define the appearance of all the JUCE widgets, and subclasses | |||
@@ -60099,6 +60149,8 @@ public: | |||
virtual void fillTextEditorBackground (Graphics& g, int width, int height, TextEditor& textEditor); | |||
virtual void drawTextEditorOutline (Graphics& g, int width, int height, TextEditor& textEditor); | |||
virtual CaretComponent* createCaretComponent (Component* keyFocusOwner); | |||
// These return a pointer to an internally cached drawable - make sure you don't keep | |||
// a copy of this pointer anywhere, as it may become invalid in the future. | |||
virtual const Drawable* getDefaultFolderImage(); | |||
@@ -33,7 +33,7 @@ | |||
*/ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 53 | |||
#define JUCE_BUILDNUMBER 55 | |||
#define JUCE_BUILDNUMBER 56 | |||
/** Current Juce version number. | |||
@@ -32,44 +32,6 @@ BEGIN_JUCE_NAMESPACE | |||
#include "../../../utilities/juce_SystemClipboard.h" | |||
//============================================================================== | |||
class CodeEditorComponent::CaretComponent : public Component, | |||
public Timer | |||
{ | |||
public: | |||
CaretComponent (CodeEditorComponent& owner_) | |||
: owner (owner_) | |||
{ | |||
setAlwaysOnTop (true); | |||
setInterceptsMouseClicks (false, false); | |||
} | |||
void paint (Graphics& g) | |||
{ | |||
g.fillAll (findColour (CodeEditorComponent::caretColourId)); | |||
} | |||
void timerCallback() | |||
{ | |||
setVisible (shouldBeShown() && ! isVisible()); | |||
} | |||
void updatePosition() | |||
{ | |||
startTimer (400); | |||
setVisible (shouldBeShown()); | |||
setBounds (owner.getCharacterBounds (owner.getCaretPos()).withWidth (2)); | |||
} | |||
private: | |||
CodeEditorComponent& owner; | |||
bool shouldBeShown() const { return owner.hasKeyboardFocus (true); } | |||
JUCE_DECLARE_NON_COPYABLE (CaretComponent); | |||
}; | |||
//============================================================================== | |||
class CodeEditorComponent::CodeEditorLine | |||
{ | |||
@@ -311,7 +273,7 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_, | |||
addAndMakeVisible (&horizontalScrollBar); | |||
horizontalScrollBar.setSingleStepSize (1.0); | |||
addAndMakeVisible (caret = new CaretComponent (*this)); | |||
addAndMakeVisible (caret = getLookAndFeel().createCaretComponent (this)); | |||
Font f (12.0f); | |||
f.setTypefaceName (Font::getDefaultMonospacedFontName()); | |||
@@ -354,7 +316,7 @@ void CodeEditorComponent::codeDocumentChanged (const CodeDocument::Position& aff | |||
triggerAsyncUpdate(); | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
columnToTryToMaintain = -1; | |||
if (affectedTextEnd.getPosition() >= selectionStart.getPosition() | |||
@@ -374,7 +336,7 @@ void CodeEditorComponent::resized() | |||
columnsOnScreen = (int) ((getWidth() - scrollbarThickness) / charWidth); | |||
lines.clear(); | |||
rebuildLineTokens(); | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
verticalScrollBar.setBounds (getWidth() - scrollbarThickness, 0, scrollbarThickness, getHeight() - scrollbarThickness); | |||
horizontalScrollBar.setBounds (gutter, getHeight() - scrollbarThickness, getWidth() - scrollbarThickness - gutter, scrollbarThickness); | |||
@@ -467,6 +429,11 @@ void CodeEditorComponent::rebuildLineTokens() | |||
} | |||
//============================================================================== | |||
void CodeEditorComponent::updateCaretPosition() | |||
{ | |||
caret->setCaretPosition (getCharacterBounds (getCaretPos())); | |||
} | |||
void CodeEditorComponent::moveCaretTo (const CodeDocument::Position& newPos, const bool highlighting) | |||
{ | |||
caretPos = newPos; | |||
@@ -517,7 +484,7 @@ void CodeEditorComponent::moveCaretTo (const CodeDocument::Position& newPos, con | |||
deselectAll(); | |||
} | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
scrollToKeepCaretOnScreen(); | |||
updateScrollBars(); | |||
} | |||
@@ -548,7 +515,7 @@ void CodeEditorComponent::scrollToLineInternal (int newFirstLineOnScreen) | |||
if (newFirstLineOnScreen != firstLineOnScreen) | |||
{ | |||
firstLineOnScreen = newFirstLineOnScreen; | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
updateCachedIterators (firstLineOnScreen); | |||
triggerAsyncUpdate(); | |||
@@ -562,7 +529,7 @@ void CodeEditorComponent::scrollToColumnInternal (double column) | |||
if (xOffset != newOffset) | |||
{ | |||
xOffset = newOffset; | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
repaint(); | |||
} | |||
} | |||
@@ -1104,12 +1071,12 @@ void CodeEditorComponent::scrollBarMoved (ScrollBar* scrollBarThatHasMoved, doub | |||
//============================================================================== | |||
void CodeEditorComponent::focusGained (FocusChangeType) | |||
{ | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
} | |||
void CodeEditorComponent::focusLost (FocusChangeType) | |||
{ | |||
caret->updatePosition(); | |||
updateCaretPosition(); | |||
} | |||
//============================================================================== | |||
@@ -29,6 +29,7 @@ | |||
#include "../juce_Component.h" | |||
#include "../layout/juce_ScrollBar.h" | |||
#include "../keyboard/juce_TextInputTarget.h" | |||
#include "../keyboard/juce_CaretComponent.h" | |||
#include "juce_CodeDocument.h" | |||
#include "juce_CodeTokeniser.h" | |||
@@ -208,7 +209,6 @@ public: | |||
enum ColourIds | |||
{ | |||
backgroundColourId = 0x1004500, /**< A colour to use to fill the editor's background. */ | |||
caretColourId = 0x1004501, /**< The colour to draw the caret. */ | |||
highlightColourId = 0x1004502, /**< The colour to use for the highlighted background under | |||
selected text. */ | |||
defaultTextColourId = 0x1004503 /**< The colour to use for text when no syntax colouring is | |||
@@ -270,8 +270,6 @@ private: | |||
CodeDocument::Position caretPos; | |||
CodeDocument::Position selectionStart, selectionEnd; | |||
class CaretComponent; | |||
friend class ScopedPointer <CaretComponent>; | |||
ScopedPointer<CaretComponent> caret; | |||
ScrollBar verticalScrollBar, horizontalScrollBar; | |||
@@ -299,6 +297,7 @@ private: | |||
void moveLineDelta (int delta, bool selecting); | |||
//============================================================================== | |||
void updateCaretPosition(); | |||
void updateScrollBars(); | |||
void scrollToLineInternal (int line); | |||
void scrollToColumnInternal (double column); | |||
@@ -30,6 +30,7 @@ BEGIN_JUCE_NAMESPACE | |||
#include "juce_Label.h" | |||
#include "../lookandfeel/juce_LookAndFeel.h" | |||
#include "../windows/juce_ComponentPeer.h" | |||
#include "../keyboard/juce_CaretComponent.h" | |||
//============================================================================== | |||
@@ -311,10 +312,10 @@ TextEditor* Label::createEditorComponent() | |||
TextEditor::textColourId, | |||
TextEditor::highlightColourId, | |||
TextEditor::highlightedTextColourId, | |||
TextEditor::caretColourId, | |||
TextEditor::outlineColourId, | |||
TextEditor::focusedOutlineColourId, | |||
TextEditor::shadowColourId }; | |||
TextEditor::shadowColourId, | |||
CaretComponent::caretColourId }; | |||
for (int i = 0; i < numElementsInArray (cols); ++i) | |||
ed->setColour (cols[i], findColour (cols[i])); | |||
@@ -884,6 +884,11 @@ public: | |||
owner.drawContent (g); | |||
} | |||
void restartTimer() | |||
{ | |||
startTimer (350); | |||
} | |||
void timerCallback() | |||
{ | |||
owner.timerCallbackInt(); | |||
@@ -943,8 +948,6 @@ private: | |||
//============================================================================== | |||
namespace TextEditorDefs | |||
{ | |||
const int flashSpeedIntervalMs = 380; | |||
const int textChangeMessageId = 0x10003001; | |||
const int returnKeyMessageId = 0x10003002; | |||
const int escapeKeyMessageId = 0x10003003; | |||
@@ -968,19 +971,14 @@ TextEditor::TextEditor (const String& name, | |||
multiline (false), | |||
wordWrap (false), | |||
returnKeyStartsNewLine (false), | |||
caretVisible (true), | |||
popupMenuEnabled (true), | |||
selectAllTextWhenFocused (false), | |||
scrollbarVisible (true), | |||
wasFocused (false), | |||
caretFlashState (true), | |||
keepCursorOnScreen (true), | |||
tabKeyUsed (false), | |||
menuActive (false), | |||
valueTextNeedsUpdating (false), | |||
cursorX (0), | |||
cursorY (0), | |||
cursorHeight (0), | |||
maxTextLength (0), | |||
leftIndent (4), | |||
topIndent (4), | |||
@@ -998,8 +996,8 @@ TextEditor::TextEditor (const String& name, | |||
viewport->setWantsKeyboardFocus (false); | |||
viewport->setScrollBarsShown (false, false); | |||
setMouseCursor (MouseCursor::IBeamCursor); | |||
setWantsKeyboardFocus (true); | |||
setCaretVisible (true); | |||
} | |||
TextEditor::~TextEditor() | |||
@@ -1142,15 +1140,26 @@ void TextEditor::colourChanged() | |||
void TextEditor::setCaretVisible (const bool shouldCaretBeVisible) | |||
{ | |||
caretVisible = shouldCaretBeVisible; | |||
if (shouldCaretBeVisible) | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
if (shouldCaretBeVisible && ! isReadOnly()) | |||
{ | |||
if (caret == 0) | |||
textHolder->addChildComponent (caret = getLookAndFeel().createCaretComponent (this)); | |||
} | |||
else | |||
{ | |||
caret = 0; | |||
} | |||
setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | |||
: MouseCursor::NormalCursor); | |||
} | |||
void TextEditor::updateCaretPosition() | |||
{ | |||
if (caret != 0) | |||
caret->setCaretPosition (getCaretRectangle().translated (leftIndent, topIndent)); | |||
} | |||
void TextEditor::setInputRestrictions (const int maxLen, | |||
const String& chars) | |||
{ | |||
@@ -1279,22 +1288,8 @@ void TextEditor::removeListener (TextEditorListener* const listenerToRemove) | |||
//============================================================================== | |||
void TextEditor::timerCallbackInt() | |||
{ | |||
const bool newState = (! caretFlashState) && ! isCurrentlyBlockedByAnotherModalComponent(); | |||
if (caretFlashState != newState) | |||
{ | |||
caretFlashState = newState; | |||
if (caretFlashState) | |||
wasFocused = true; | |||
if (caretVisible | |||
&& hasKeyboardFocus (false) | |||
&& ! isReadOnly()) | |||
{ | |||
repaintCaret(); | |||
} | |||
} | |||
if (hasKeyboardFocus (false) && ! isCurrentlyBlockedByAnotherModalComponent()) | |||
wasFocused = true; | |||
const unsigned int now = Time::getApproximateMillisecondCounter(); | |||
@@ -1302,15 +1297,6 @@ void TextEditor::timerCallbackInt() | |||
newTransaction(); | |||
} | |||
void TextEditor::repaintCaret() | |||
{ | |||
if (! findColour (caretColourId).isTransparent()) | |||
repaint (borderSize.getLeft() + textHolder->getX() + leftIndent + roundToInt (cursorX) - 1, | |||
borderSize.getTop() + textHolder->getY() + topIndent + roundToInt (cursorY) - 1, | |||
4, | |||
roundToInt (cursorHeight) + 2); | |||
} | |||
void TextEditor::repaintText (const Range<int>& range) | |||
{ | |||
if (! range.isEmpty()) | |||
@@ -1353,12 +1339,10 @@ void TextEditor::moveCaret (int newCaretPos) | |||
if (newCaretPos != getCaretPosition()) | |||
{ | |||
repaintCaret(); | |||
caretFlashState = true; | |||
caretPosition = newCaretPos; | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
textHolder->restartTimer(); | |||
scrollToMakeSureCursorIsVisible(); | |||
repaintCaret(); | |||
updateCaretPosition(); | |||
} | |||
} | |||
@@ -1378,17 +1362,15 @@ void TextEditor::scrollEditorToPositionCaret (const int desiredCaretX, | |||
{ | |||
updateCaretPosition(); | |||
int vx = roundToInt (cursorX) - desiredCaretX; | |||
int vy = roundToInt (cursorY) - desiredCaretY; | |||
const Rectangle<int> caretPos (getCaretRectangle()); | |||
int vx = caretPos.getX() - desiredCaretX; | |||
int vy = caretPos.getY() - desiredCaretY; | |||
if (desiredCaretX < jmax (1, proportionOfWidth (0.05f))) | |||
{ | |||
vx += desiredCaretX - proportionOfWidth (0.2f); | |||
} | |||
else if (desiredCaretX > jmax (0, viewport->getMaximumVisibleWidth() - (wordWrap ? 2 : 10))) | |||
{ | |||
vx += desiredCaretX + (isMultiLine() ? proportionOfWidth (0.2f) : 10) - viewport->getMaximumVisibleWidth(); | |||
} | |||
vx = jlimit (0, jmax (0, textHolder->getWidth() + 8 - viewport->getMaximumVisibleWidth()), vx); | |||
@@ -1400,16 +1382,10 @@ void TextEditor::scrollEditorToPositionCaret (const int desiredCaretX, | |||
{ | |||
vy = jlimit (0, jmax (0, textHolder->getHeight() - viewport->getMaximumVisibleHeight()), vy); | |||
const int curH = roundToInt (cursorHeight); | |||
if (desiredCaretY < 0) | |||
{ | |||
vy = jmax (0, desiredCaretY + vy); | |||
} | |||
else if (desiredCaretY > jmax (0, viewport->getMaximumVisibleHeight() - topIndent - curH)) | |||
{ | |||
vy += desiredCaretY + 2 + curH + topIndent - viewport->getMaximumVisibleHeight(); | |||
} | |||
else if (desiredCaretY > jmax (0, viewport->getMaximumVisibleHeight() - topIndent - caretPos.getHeight())) | |||
vy += desiredCaretY + 2 + caretPos.getHeight() + topIndent - viewport->getMaximumVisibleHeight(); | |||
} | |||
viewport->setViewPosition (vx, vy); | |||
@@ -1417,18 +1393,18 @@ void TextEditor::scrollEditorToPositionCaret (const int desiredCaretX, | |||
const Rectangle<int> TextEditor::getCaretRectangle() | |||
{ | |||
updateCaretPosition(); | |||
float cursorX, cursorY; | |||
float cursorHeight = currentFont.getHeight(); // (in case the text is empty and the call below doesn't set this value) | |||
getCharPosition (caretPosition, cursorX, cursorY, cursorHeight); | |||
return Rectangle<int> (roundToInt (cursorX) - viewport->getX(), | |||
roundToInt (cursorY) - viewport->getY(), | |||
1, roundToInt (cursorHeight)); | |||
return Rectangle<int> (roundToInt (cursorX), roundToInt (cursorY), 2, roundToInt (cursorHeight)); | |||
} | |||
//============================================================================== | |||
float TextEditor::getWordWrapWidth() const | |||
{ | |||
return (wordWrap) ? (float) (viewport->getMaximumVisibleWidth() - leftIndent - leftIndent / 2) | |||
: 1.0e10f; | |||
return wordWrap ? (float) (viewport->getMaximumVisibleWidth() - leftIndent - leftIndent / 2) | |||
: std::numeric_limits<float>::max(); | |||
} | |||
void TextEditor::updateTextHolderSize() | |||
@@ -1448,7 +1424,7 @@ void TextEditor::updateTextHolderSize() | |||
const int h = topIndent + roundToInt (jmax (i.lineY + i.lineHeight, | |||
currentFont.getHeight())); | |||
textHolder->setSize (w + 1, h + 1); | |||
textHolder->setSize (w + 2, h + 1); // (the +2 allows a bit of space for the cursor to be at the right-hand-edge) | |||
} | |||
} | |||
@@ -1485,12 +1461,6 @@ void TextEditor::setScrollToShowCursor (const bool shouldScrollToShowCursor) | |||
keepCursorOnScreen = shouldScrollToShowCursor; | |||
} | |||
void TextEditor::updateCaretPosition() | |||
{ | |||
cursorHeight = currentFont.getHeight(); // (in case the text is empty and the call below doesn't set this value) | |||
getCharPosition (caretPosition, cursorX, cursorY, cursorHeight); | |||
} | |||
void TextEditor::scrollToMakeSureCursorIsVisible() | |||
{ | |||
updateCaretPosition(); | |||
@@ -1500,8 +1470,10 @@ void TextEditor::scrollToMakeSureCursorIsVisible() | |||
int x = viewport->getViewPositionX(); | |||
int y = viewport->getViewPositionY(); | |||
const int relativeCursorX = roundToInt (cursorX) - x; | |||
const int relativeCursorY = roundToInt (cursorY) - y; | |||
const Rectangle<int> caretPos (getCaretRectangle()); | |||
const int relativeCursorX = caretPos.getX() - x; | |||
const int relativeCursorY = caretPos.getY() - y; | |||
if (relativeCursorX < jmax (1, proportionOfWidth (0.05f))) | |||
{ | |||
@@ -1520,15 +1492,13 @@ void TextEditor::scrollToMakeSureCursorIsVisible() | |||
} | |||
else | |||
{ | |||
const int curH = roundToInt (cursorHeight); | |||
if (relativeCursorY < 0) | |||
{ | |||
y = jmax (0, relativeCursorY + y); | |||
} | |||
else if (relativeCursorY > jmax (0, viewport->getMaximumVisibleHeight() - topIndent - curH)) | |||
else if (relativeCursorY > jmax (0, viewport->getMaximumVisibleHeight() - topIndent - caretPos.getHeight())) | |||
{ | |||
y += relativeCursorY + 2 + curH + topIndent - viewport->getMaximumVisibleHeight(); | |||
y += relativeCursorY + 2 + caretPos.getHeight() + topIndent - viewport->getMaximumVisibleHeight(); | |||
} | |||
} | |||
@@ -1720,18 +1690,6 @@ void TextEditor::paint (Graphics& g) | |||
void TextEditor::paintOverChildren (Graphics& g) | |||
{ | |||
if (caretFlashState | |||
&& hasKeyboardFocus (false) | |||
&& caretVisible | |||
&& ! isReadOnly()) | |||
{ | |||
g.setColour (findColour (caretColourId)); | |||
g.fillRect (borderSize.getLeft() + textHolder->getX() + leftIndent + cursorX, | |||
borderSize.getTop() + textHolder->getY() + topIndent + cursorY, | |||
2.0f, cursorHeight); | |||
} | |||
if (textToShowWhenEmpty.isNotEmpty() | |||
&& (! hasKeyboardFocus (false)) | |||
&& getTotalNumChars() == 0) | |||
@@ -1803,7 +1761,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) | |||
void TextEditor::mouseUp (const MouseEvent& e) | |||
{ | |||
newTransaction(); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
textHolder->restartTimer(); | |||
if (wasFocused || ! selectAllTextWhenFocused) | |||
{ | |||
@@ -1892,6 +1850,7 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
return false; | |||
const bool moveInWholeWordSteps = key.getModifiers().isCtrlDown() || key.getModifiers().isAltDown(); | |||
const Rectangle<float> caretPos (getCaretRectangle().toFloat()); | |||
if (key.isKeyCode (KeyPress::leftKey) | |||
|| key.isKeyCode (KeyPress::upKey)) | |||
@@ -1901,7 +1860,7 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
int newPos; | |||
if (isMultiLine() && key.isKeyCode (KeyPress::upKey)) | |||
newPos = indexAtPosition (cursorX, cursorY - 1); | |||
newPos = indexAtPosition (caretPos.getX(), caretPos.getY() - 1.0f); | |||
else if (moveInWholeWordSteps) | |||
newPos = findWordBreakBefore (getCaretPosition()); | |||
else | |||
@@ -1917,7 +1876,7 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
int newPos; | |||
if (isMultiLine() && key.isKeyCode (KeyPress::downKey)) | |||
newPos = indexAtPosition (cursorX, cursorY + cursorHeight + 1); | |||
newPos = indexAtPosition (caretPos.getX(), caretPos.getBottom() + 1.0f); | |||
else if (moveInWholeWordSteps) | |||
newPos = findWordBreakAfter (getCaretPosition()); | |||
else | |||
@@ -1929,14 +1888,14 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
{ | |||
newTransaction(); | |||
moveCursorTo (indexAtPosition (cursorX, cursorY + cursorHeight + viewport->getViewHeight()), | |||
moveCursorTo (indexAtPosition (caretPos.getX(), caretPos.getBottom() + viewport->getViewHeight()), | |||
key.getModifiers().isShiftDown()); | |||
} | |||
else if (key.isKeyCode (KeyPress::pageUpKey) && isMultiLine()) | |||
{ | |||
newTransaction(); | |||
moveCursorTo (indexAtPosition (cursorX, cursorY - viewport->getViewHeight()), | |||
moveCursorTo (indexAtPosition (caretPos.getX(), caretPos.getY() - viewport->getViewHeight()), | |||
key.getModifiers().isShiftDown()); | |||
} | |||
else if (key.isKeyCode (KeyPress::homeKey)) | |||
@@ -1944,7 +1903,7 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
newTransaction(); | |||
if (isMultiLine() && ! moveInWholeWordSteps) | |||
moveCursorTo (indexAtPosition (0.0f, cursorY), | |||
moveCursorTo (indexAtPosition (0.0f, caretPos.getY()), | |||
key.getModifiers().isShiftDown()); | |||
else | |||
moveCursorTo (0, key.getModifiers().isShiftDown()); | |||
@@ -1954,7 +1913,7 @@ bool TextEditor::keyPressed (const KeyPress& key) | |||
newTransaction(); | |||
if (isMultiLine() && ! moveInWholeWordSteps) | |||
moveCursorTo (indexAtPosition ((float) textHolder->getWidth(), cursorY), | |||
moveCursorTo (indexAtPosition ((float) textHolder->getWidth(), caretPos.getY()), | |||
key.getModifiers().isShiftDown()); | |||
else | |||
moveCursorTo (getTotalNumChars(), key.getModifiers().isShiftDown()); | |||
@@ -2131,8 +2090,6 @@ void TextEditor::focusGained (FocusChangeType) | |||
{ | |||
newTransaction(); | |||
caretFlashState = true; | |||
if (selectAllTextWhenFocused) | |||
{ | |||
moveCursorTo (0, false); | |||
@@ -2140,9 +2097,7 @@ void TextEditor::focusGained (FocusChangeType) | |||
} | |||
repaint(); | |||
if (caretVisible) | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
updateCaretPosition(); | |||
ComponentPeer* const peer = getPeer(); | |||
if (peer != 0 && ! isReadOnly()) | |||
@@ -2155,7 +2110,7 @@ void TextEditor::focusLost (FocusChangeType) | |||
wasFocused = false; | |||
textHolder->stopTimer(); | |||
caretFlashState = false; | |||
updateCaretPosition(); | |||
postCommandMessage (TextEditorDefs::focusLossMessageId); | |||
repaint(); | |||
@@ -34,6 +34,7 @@ | |||
#include "../menus/juce_PopupMenu.h" | |||
#include "../../../containers/juce_Value.h" | |||
#include "../keyboard/juce_TextInputTarget.h" | |||
#include "../keyboard/juce_CaretComponent.h" | |||
//============================================================================== | |||
@@ -133,9 +134,7 @@ public: | |||
//============================================================================== | |||
/** Makes the caret visible or invisible. | |||
By default the caret is visible. | |||
@see setCaretColour, setCaretPosition | |||
*/ | |||
void setCaretVisible (bool shouldBeVisible); | |||
@@ -143,7 +142,7 @@ public: | |||
/** Returns true if the caret is enabled. | |||
@see setCaretVisible | |||
*/ | |||
bool isCaretVisible() const { return caretVisible; } | |||
bool isCaretVisible() const { return caret != 0; } | |||
//============================================================================== | |||
/** Enables/disables a vertical scrollbar. | |||
@@ -222,8 +221,6 @@ public: | |||
highlightedTextColourId = 0x1000203, /**< The colour with which to draw the text in highlighted sections. */ | |||
caretColourId = 0x1000204, /**< The colour with which to draw the caret. */ | |||
outlineColourId = 0x1000205, /**< If this is non-transparent, it will be used to draw a box around | |||
the edge of the component. */ | |||
@@ -622,19 +619,17 @@ private: | |||
bool multiline : 1; | |||
bool wordWrap : 1; | |||
bool returnKeyStartsNewLine : 1; | |||
bool caretVisible : 1; | |||
bool popupMenuEnabled : 1; | |||
bool selectAllTextWhenFocused : 1; | |||
bool scrollbarVisible : 1; | |||
bool wasFocused : 1; | |||
bool caretFlashState : 1; | |||
bool keepCursorOnScreen : 1; | |||
bool tabKeyUsed : 1; | |||
bool menuActive : 1; | |||
bool valueTextNeedsUpdating : 1; | |||
UndoManager undoManager; | |||
float cursorX, cursorY, cursorHeight; | |||
ScopedPointer<CaretComponent> caret; | |||
int maxTextLength; | |||
Range<int> selection; | |||
int leftIndent, topIndent; | |||
@@ -678,7 +673,6 @@ private: | |||
void updateTextHolderSize(); | |||
float getWordWrapWidth() const; | |||
void timerCallbackInt(); | |||
void repaintCaret(); | |||
void repaintText (const Range<int>& range); | |||
UndoManager* getUndoManager() throw(); | |||
@@ -0,0 +1,69 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-11 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#include "../../../core/juce_StandardHeader.h" | |||
BEGIN_JUCE_NAMESPACE | |||
#include "juce_CaretComponent.h" | |||
//============================================================================== | |||
CaretComponent::CaretComponent (Component* const keyFocusOwner) | |||
: owner (keyFocusOwner) | |||
{ | |||
setAlwaysOnTop (true); | |||
setInterceptsMouseClicks (false, false); | |||
} | |||
CaretComponent::~CaretComponent() | |||
{ | |||
} | |||
void CaretComponent::paint (Graphics& g) | |||
{ | |||
g.fillAll (findColour (caretColourId)); | |||
} | |||
void CaretComponent::timerCallback() | |||
{ | |||
setVisible (shouldBeShown() && ! isVisible()); | |||
} | |||
void CaretComponent::setCaretPosition (const Rectangle<int>& characterArea) | |||
{ | |||
startTimer (380); | |||
setVisible (shouldBeShown()); | |||
setBounds (characterArea.withWidth (2)); | |||
} | |||
bool CaretComponent::shouldBeShown() const | |||
{ | |||
return owner == 0 || (owner->hasKeyboardFocus (true) | |||
&& ! owner->isCurrentlyBlockedByAnotherModalComponent()); | |||
} | |||
END_JUCE_NAMESPACE |
@@ -0,0 +1,84 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-11 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#ifndef __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
#define __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
#include "../juce_Component.h" | |||
#include "../../../events/juce_Timer.h" | |||
//============================================================================== | |||
/** | |||
*/ | |||
class JUCE_API CaretComponent : public Component, | |||
public Timer | |||
{ | |||
public: | |||
//============================================================================== | |||
/** Creates the caret component. | |||
The keyFocusOwner is an optional component which the caret will check, making | |||
itself visible only when the keyFocusOwner has keyboard focus. | |||
*/ | |||
CaretComponent (Component* keyFocusOwner); | |||
/** Destructor. */ | |||
~CaretComponent(); | |||
//============================================================================== | |||
/** Sets the caret's position to place it next to the given character. | |||
The area is the rectangle containing the entire character that the caret is | |||
positioned on, so by default a vertical-line caret may choose to just show itself | |||
at the left of this area. You can override this method to customise its size. | |||
This method will also force the caret to reset its timer and become visible (if | |||
appropriate), so that as it moves, you can see where it is. | |||
*/ | |||
virtual void setCaretPosition (const Rectangle<int>& characterArea); | |||
/** A set of colour IDs to use to change the colour of various aspects of the caret. | |||
These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() | |||
methods. | |||
@see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour | |||
*/ | |||
enum ColourIds | |||
{ | |||
caretColourId = 0x1000204, /**< The colour with which to draw the caret. */ | |||
}; | |||
//============================================================================== | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
/** @internal */ | |||
void timerCallback(); | |||
private: | |||
Component* owner; | |||
bool shouldBeShown() const; | |||
JUCE_DECLARE_NON_COPYABLE (CaretComponent); | |||
}; | |||
#endif // __JUCE_CARETCOMPONENT_JUCEHEADER__ |
@@ -52,6 +52,7 @@ BEGIN_JUCE_NAMESPACE | |||
#include "../controls/juce_ProgressBar.h" | |||
#include "../controls/juce_TreeView.h" | |||
#include "../keyboard/juce_KeyMappingEditorComponent.h" | |||
#include "../keyboard/juce_CaretComponent.h" | |||
#include "../code_editor/juce_CodeEditorComponent.h" | |||
#include "../filebrowser/juce_FilenameComponent.h" | |||
#include "../filebrowser/juce_DirectoryContentsDisplayComponent.h" | |||
@@ -191,11 +192,12 @@ LookAndFeel::LookAndFeel() | |||
TextEditor::textColourId, 0xff000000, | |||
TextEditor::highlightColourId, textHighlightColour, | |||
TextEditor::highlightedTextColourId, 0xff000000, | |||
TextEditor::caretColourId, 0xff000000, | |||
TextEditor::outlineColourId, 0x00000000, | |||
TextEditor::focusedOutlineColourId, textButtonColour, | |||
TextEditor::shadowColourId, 0x38000000, | |||
CaretComponent::caretColourId, 0xff000000, | |||
Label::backgroundColourId, 0x00000000, | |||
Label::textColourId, 0xff000000, | |||
Label::outlineColourId, 0x00000000, | |||
@@ -278,7 +280,6 @@ LookAndFeel::LookAndFeel() | |||
MidiKeyboardComponent::upDownButtonArrowColourId, 0xff000000, | |||
CodeEditorComponent::backgroundColourId, 0xffffffff, | |||
CodeEditorComponent::caretColourId, 0xff000000, | |||
CodeEditorComponent::highlightColourId, textHighlightColour, | |||
CodeEditorComponent::defaultTextColourId, 0xff000000, | |||
@@ -1325,6 +1326,11 @@ void LookAndFeel::drawTextEditorOutline (Graphics& g, int width, int height, Tex | |||
} | |||
} | |||
CaretComponent* LookAndFeel::createCaretComponent (Component* keyFocusOwner) | |||
{ | |||
return new CaretComponent (keyFocusOwner); | |||
} | |||
//============================================================================== | |||
void LookAndFeel::drawComboBox (Graphics& g, int width, int height, | |||
const bool isButtonDown, | |||
@@ -59,6 +59,7 @@ class FilePreviewComponent; | |||
class ImageButton; | |||
class CallOutBox; | |||
class Drawable; | |||
class CaretComponent; | |||
//============================================================================== | |||
/** | |||
@@ -294,6 +295,8 @@ public: | |||
virtual void fillTextEditorBackground (Graphics& g, int width, int height, TextEditor& textEditor); | |||
virtual void drawTextEditorOutline (Graphics& g, int width, int height, TextEditor& textEditor); | |||
virtual CaretComponent* createCaretComponent (Component* keyFocusOwner); | |||
//============================================================================== | |||
// These return a pointer to an internally cached drawable - make sure you don't keep | |||
// a copy of this pointer anywhere, as it may become invalid in the future. | |||
@@ -401,6 +401,9 @@ | |||
#ifndef __JUCE_MODALCOMPONENTMANAGER_JUCEHEADER__ | |||
#include "gui/components/juce_ModalComponentManager.h" | |||
#endif | |||
#ifndef __JUCE_CARETCOMPONENT_JUCEHEADER__ | |||
#include "gui/components/keyboard/juce_CaretComponent.h" | |||
#endif | |||
#ifndef __JUCE_KEYBOARDFOCUSTRAVERSER_JUCEHEADER__ | |||
#include "gui/components/keyboard/juce_KeyboardFocusTraverser.h" | |||
#endif | |||