| @@ -40,17 +40,17 @@ | |||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Normally, JUCE_DEBUG is set to 1 or 0 based on compiler and project settings, | |||||
| but if you define this value, you can override this can force it to be true or | |||||
| false. | |||||
| /** JUCE_FORCE_DEBUG: Normally, JUCE_DEBUG is set to 1 or 0 based on compiler and | |||||
| project settings, but if you define this value, you can override this can force | |||||
| it to be true or false. | |||||
| */ | */ | ||||
| #ifndef JUCE_FORCE_DEBUG | #ifndef JUCE_FORCE_DEBUG | ||||
| //#define JUCE_FORCE_DEBUG 1 | //#define JUCE_FORCE_DEBUG 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** If this flag is enabled, the the jassert and jassertfalse macros will | |||||
| always use Logger::writeToLog() to write a message when an assertion happens. | |||||
| /** JUCE_LOG_ASSERTIONS: If this flag is enabled, the the jassert and jassertfalse | |||||
| macros will always use Logger::writeToLog() to write a message when an assertion happens. | |||||
| Enabling it will also leave this turned on in release builds. When it's disabled, | Enabling it will also leave this turned on in release builds. When it's disabled, | ||||
| however, the jassert and jassertfalse macros will not be compiled in a | however, the jassert and jassertfalse macros will not be compiled in a | ||||
| @@ -63,48 +63,42 @@ | |||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Comment out this macro if you haven't got the Steinberg ASIO SDK, without | |||||
| which the ASIOAudioIODevice class can't be built. See the comments in the | |||||
| ASIOAudioIODevice class's header file for more info about this. | |||||
| /** JUCE_ASIO: Enables ASIO audio devices (MS Windows only). | |||||
| Turning this on means that you'll need to have the Steinberg ASIO SDK installed | |||||
| on your Windows build machine. | |||||
| (This only affects a Win32 build) | |||||
| See the comments in the ASIOAudioIODevice class's header file for more | |||||
| info about this. | |||||
| */ | */ | ||||
| #ifndef JUCE_ASIO | #ifndef JUCE_ASIO | ||||
| #define JUCE_ASIO 1 | #define JUCE_ASIO 1 | ||||
| #endif | #endif | ||||
| /** Comment out this macro to disable the Windows WASAPI audio device type. | |||||
| /** JUCE_WASAPI: Enables WASAPI audio devices (Windows Vista and above). | |||||
| */ | */ | ||||
| #ifndef JUCE_WASAPI | #ifndef JUCE_WASAPI | ||||
| // #define JUCE_WASAPI 1 | // #define JUCE_WASAPI 1 | ||||
| #endif | #endif | ||||
| /** Comment out this macro to disable the Windows WASAPI audio device type. | |||||
| /** JUCE_DIRECTSOUND: Enables DirectSound audio (MS Windows only). | |||||
| */ | */ | ||||
| #ifndef JUCE_DIRECTSOUND | #ifndef JUCE_DIRECTSOUND | ||||
| #define JUCE_DIRECTSOUND 1 | #define JUCE_DIRECTSOUND 1 | ||||
| #endif | #endif | ||||
| /** Comment out this macro to disable building of ALSA device support on Linux. | |||||
| */ | |||||
| /** JUCE_ALSA: Enables ALSA audio devices (Linux only). */ | |||||
| #ifndef JUCE_ALSA | #ifndef JUCE_ALSA | ||||
| #define JUCE_ALSA 1 | #define JUCE_ALSA 1 | ||||
| #endif | #endif | ||||
| /** Comment out this macro to disable building of JACK device support on Linux. | |||||
| */ | |||||
| /** JUCE_JACK: Enables JACK audio devices (Linux only). */ | |||||
| #ifndef JUCE_JACK | #ifndef JUCE_JACK | ||||
| #define JUCE_JACK 1 | #define JUCE_JACK 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Comment out this macro if you don't want to enable QuickTime or if you don't | |||||
| have the SDK installed. | |||||
| If this flag is not enabled, the QuickTimeMovieComponent and QuickTimeAudioFormat | |||||
| classes will be unavailable. | |||||
| On Windows, if you enable this, you'll need to have the QuickTime SDK | |||||
| /** JUCE_QUICKTIME: Enables the QuickTimeMovieComponent class (Mac and Windows). | |||||
| If you're building on Windows, you'll need to have the Apple QuickTime SDK | |||||
| installed, and its header files will need to be on your include path. | installed, and its header files will need to be on your include path. | ||||
| */ | */ | ||||
| #if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC)) | #if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC)) | ||||
| @@ -113,83 +107,92 @@ | |||||
| //============================================================================= | //============================================================================= | ||||
| /** Comment out this macro if you don't want to enable OpenGL or if you don't | |||||
| have the appropriate headers and libraries available. If it's not enabled, the | |||||
| OpenGLComponent class will be unavailable. | |||||
| /** JUCE_OPENGL: Enables the OpenGLComponent class (available on all platforms). | |||||
| If you're not using OpenGL, you might want to turn this off to reduce your binary's size. | |||||
| */ | */ | ||||
| #ifndef JUCE_OPENGL | #ifndef JUCE_OPENGL | ||||
| #define JUCE_OPENGL 1 | #define JUCE_OPENGL 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** These flags enable the Ogg-Vorbis and Flac audio formats. | |||||
| If you're not going to need either of these formats, turn off the flags to | |||||
| avoid bloating your codebase with them. | |||||
| /** JUCE_USE_FLAC: Enables the FLAC audio codec classes (available on all platforms). | |||||
| If your app doesn't need to read FLAC files, you might want to disable this to | |||||
| reduce the size of your codebase and build time. | |||||
| */ | */ | ||||
| #ifndef JUCE_USE_FLAC | #ifndef JUCE_USE_FLAC | ||||
| #define JUCE_USE_FLAC 1 | #define JUCE_USE_FLAC 1 | ||||
| #endif | #endif | ||||
| /** JUCE_USE_OGGBORBIS: Enables the Ogg-Vorbis audio codec classes (available on all platforms). | |||||
| If your app doesn't need to read Ogg-Vorbis files, you might want to disable this to | |||||
| reduce the size of your codebase and build time. | |||||
| */ | |||||
| #ifndef JUCE_USE_OGGVORBIS | #ifndef JUCE_USE_OGGVORBIS | ||||
| #define JUCE_USE_OGGVORBIS 1 | #define JUCE_USE_OGGVORBIS 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** This flag lets you enable the AudioCDBurner class. You might want to disable | |||||
| it to build without the MS SDK under windows. | |||||
| /** JUCE_USE_CDBURNER: Enables the audio CD reader code (Mac and Windows only). | |||||
| Unless you're using CD-burning, you should probably turn this flag off to | |||||
| reduce code size. | |||||
| */ | */ | ||||
| #if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC) | #if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC) | ||||
| #define JUCE_USE_CDBURNER 1 | #define JUCE_USE_CDBURNER 1 | ||||
| #endif | #endif | ||||
| /** This flag lets you enable support for the AudioCDReader class. You might want to disable | |||||
| it to build without the MS SDK under windows. | |||||
| /** JUCE_USE_CDREADER: Enables the audio CD reader code (Mac and Windows only). | |||||
| Unless you're using CD-reading, you should probably turn this flag off to | |||||
| reduce code size. | |||||
| */ | */ | ||||
| #ifndef JUCE_USE_CDREADER | #ifndef JUCE_USE_CDREADER | ||||
| #define JUCE_USE_CDREADER 1 | #define JUCE_USE_CDREADER 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enabling this provides support for cameras, using the CameraDevice class | |||||
| /** JUCE_USE_CAMERA: Enables web-cam support using the CameraDevice class (Mac and Windows). | |||||
| */ | */ | ||||
| #if JUCE_QUICKTIME && ! defined (JUCE_USE_CAMERA) | #if JUCE_QUICKTIME && ! defined (JUCE_USE_CAMERA) | ||||
| // #define JUCE_USE_CAMERA 1 | // #define JUCE_USE_CAMERA 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enabling this macro means that all regions that get repainted will have a coloured | |||||
| line drawn around them. | |||||
| This is handy if you're trying to optimise drawing, because it lets you easily see | |||||
| when anything is being repainted unnecessarily. | |||||
| /** JUCE_ENABLE_REPAINT_DEBUGGING: If this option is turned on, each area of the screen that | |||||
| gets repainted will flash in a random colour, so that you can check exactly how much and how | |||||
| often your components are being drawn. | |||||
| */ | */ | ||||
| #ifndef JUCE_ENABLE_REPAINT_DEBUGGING | #ifndef JUCE_ENABLE_REPAINT_DEBUGGING | ||||
| // #define JUCE_ENABLE_REPAINT_DEBUGGING 1 | // #define JUCE_ENABLE_REPAINT_DEBUGGING 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enable this under Linux to use Xinerama for multi-monitor support. | |||||
| /** JUCE_USE_XINERAMA: Enables Xinerama multi-monitor support (Linux only). | |||||
| Unless you specifically want to disable this, it's best to leave this option turned on. | |||||
| */ | */ | ||||
| #ifndef JUCE_USE_XINERAMA | #ifndef JUCE_USE_XINERAMA | ||||
| #define JUCE_USE_XINERAMA 1 | #define JUCE_USE_XINERAMA 1 | ||||
| #endif | #endif | ||||
| /** Enable this under Linux to use XShm for faster shared-memory rendering. | |||||
| /** JUCE_USE_XSHM: Enables X shared memory for faster rendering on Linux. This is best left | |||||
| turned on unless you have a good reason to disable it. | |||||
| */ | */ | ||||
| #ifndef JUCE_USE_XSHM | #ifndef JUCE_USE_XSHM | ||||
| #define JUCE_USE_XSHM 1 | #define JUCE_USE_XSHM 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enabling this builds support for VST audio plugins. | |||||
| /** JUCE_PLUGINHOST_VST: Enables the VST audio plugin hosting classes. This requires the | |||||
| Steinberg VST SDK to be installed on your machine, and should be left turned off unless | |||||
| you're building a plugin hosting app. | |||||
| @see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU | @see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU | ||||
| */ | */ | ||||
| #ifndef JUCE_PLUGINHOST_VST | #ifndef JUCE_PLUGINHOST_VST | ||||
| // #define JUCE_PLUGINHOST_VST 1 | // #define JUCE_PLUGINHOST_VST 1 | ||||
| #endif | #endif | ||||
| /** Enabling this builds support for AudioUnit audio plugins. | |||||
| /** JUCE_PLUGINHOST_AU: Enables the AudioUnit plugin hosting classes. This is Mac-only, | |||||
| of course, and should only be enabled if you're building a plugin hosting app. | |||||
| @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST | @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST | ||||
| */ | */ | ||||
| #ifndef JUCE_PLUGINHOST_AU | #ifndef JUCE_PLUGINHOST_AU | ||||
| @@ -197,15 +200,15 @@ | |||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enabling this will avoid including any UI code in the build. This is handy for | |||||
| writing command-line utilities, e.g. on linux boxes which don't have some | |||||
| of the UI libraries installed. | |||||
| /** JUCE_ONLY_BUILD_CORE_LIBRARY: Enabling this will avoid including any UI classes in the build. | |||||
| This should be enabled if you're writing a console application. | |||||
| */ | */ | ||||
| #ifndef JUCE_ONLY_BUILD_CORE_LIBRARY | #ifndef JUCE_ONLY_BUILD_CORE_LIBRARY | ||||
| //#define JUCE_ONLY_BUILD_CORE_LIBRARY 1 | //#define JUCE_ONLY_BUILD_CORE_LIBRARY 1 | ||||
| #endif | #endif | ||||
| /** This lets you disable building of the WebBrowserComponent, if it's not required. | |||||
| /** JUCE_WEB_BROWSER: This lets you disable the WebBrowserComponent class (Mac and Windows). | |||||
| If you're not using any embedded web-pages, turning this off may reduce your code size. | |||||
| */ | */ | ||||
| #ifndef JUCE_WEB_BROWSER | #ifndef JUCE_WEB_BROWSER | ||||
| #define JUCE_WEB_BROWSER 1 | #define JUCE_WEB_BROWSER 1 | ||||
| @@ -213,18 +216,19 @@ | |||||
| //============================================================================= | //============================================================================= | ||||
| /** Setting this allows the build to use old Carbon libraries that will be | |||||
| deprecated in newer versions of OSX. This is handy for some backwards-compatibility | |||||
| reasons. | |||||
| /** JUCE_SUPPORT_CARBON: Enabling this allows the Mac code to use old Carbon library functions. | |||||
| Carbon isn't required for a normal app, but may be needed by specialised classes like | |||||
| plugin-hosts, which support older APIs. | |||||
| */ | */ | ||||
| #ifndef JUCE_SUPPORT_CARBON | #ifndef JUCE_SUPPORT_CARBON | ||||
| #define JUCE_SUPPORT_CARBON 1 | #define JUCE_SUPPORT_CARBON 1 | ||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /* These flags let you avoid the direct inclusion of some 3rd-party libs in the | |||||
| codebase - you might need to use this if you're linking to some of these libraries | |||||
| yourself. | |||||
| /* JUCE_INCLUDE_ZLIB_CODE: Can be used to disable Juce's embedded 3rd-party zlib code. | |||||
| You might need to tweak this if you're linking to an external zlib library in your app, | |||||
| but for normal apps, this option should be left alone. | |||||
| */ | */ | ||||
| #ifndef JUCE_INCLUDE_ZLIB_CODE | #ifndef JUCE_INCLUDE_ZLIB_CODE | ||||
| #define JUCE_INCLUDE_ZLIB_CODE 1 | #define JUCE_INCLUDE_ZLIB_CODE 1 | ||||
| @@ -247,25 +251,23 @@ | |||||
| #endif | #endif | ||||
| //============================================================================= | //============================================================================= | ||||
| /** Enable this to add extra memory-leak info to the new and delete operators. | |||||
| /** JUCE_CHECK_MEMORY_LEAKS: Enables a memory-leak check when an app terminates. | |||||
| (Currently, this only affects Windows builds in debug mode). | (Currently, this only affects Windows builds in debug mode). | ||||
| */ | */ | ||||
| #ifndef JUCE_CHECK_MEMORY_LEAKS | #ifndef JUCE_CHECK_MEMORY_LEAKS | ||||
| #define JUCE_CHECK_MEMORY_LEAKS 1 | #define JUCE_CHECK_MEMORY_LEAKS 1 | ||||
| #endif | #endif | ||||
| /** Enable this to turn on juce's internal catching of exceptions. | |||||
| Turning it off will avoid any exception catching. With it on, all exceptions | |||||
| /** JUCE_CATCH_UNHANDLED_EXCEPTIONS: Turn on juce's internal catching of exceptions | |||||
| that are thrown by the message dispatch loop. With it enabled, any unhandled exceptions | |||||
| are passed to the JUCEApplication::unhandledException() callback for logging. | are passed to the JUCEApplication::unhandledException() callback for logging. | ||||
| */ | */ | ||||
| #ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS | #ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS | ||||
| #define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 | #define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 | ||||
| #endif | #endif | ||||
| /** If this macro is set, the Juce String class will use unicode as its | |||||
| internal representation. If it isn't set, it'll use ANSI. | |||||
| /** JUCE_STRINGS_ARE_UNICODE: If this macro is set, the Juce String class will use | |||||
| unicode as its internal representation. If disabled, it'll use ANSI. | |||||
| */ | */ | ||||
| #ifndef JUCE_STRINGS_ARE_UNICODE | #ifndef JUCE_STRINGS_ARE_UNICODE | ||||
| #define JUCE_STRINGS_ARE_UNICODE 1 | #define JUCE_STRINGS_ARE_UNICODE 1 | ||||
| @@ -18980,6 +18980,16 @@ void UndoManager::getActionsInCurrentTransaction (Array <const UndoableAction*>& | |||||
| } | } | ||||
| } | } | ||||
| int UndoManager::getNumActionsInCurrentTransaction() const | |||||
| { | |||||
| const OwnedArray <UndoableAction>* const commandSet = transactions [nextIndex - 1]; | |||||
| if (commandSet != 0 && ! newTransaction) | |||||
| return commandSet->size(); | |||||
| return 0; | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| /********* End of inlined file: juce_UndoManager.cpp *********/ | /********* End of inlined file: juce_UndoManager.cpp *********/ | ||||
| @@ -42226,7 +42236,7 @@ int Desktop::getNumComponents() const throw() | |||||
| Component* Desktop::getComponent (const int index) const throw() | Component* Desktop::getComponent (const int index) const throw() | ||||
| { | { | ||||
| return (Component*) desktopComponents [index]; | |||||
| return desktopComponents [index]; | |||||
| } | } | ||||
| Component* Desktop::findComponentAt (const int screenX, | Component* Desktop::findComponentAt (const int screenX, | ||||
| @@ -42234,7 +42244,7 @@ Component* Desktop::findComponentAt (const int screenX, | |||||
| { | { | ||||
| for (int i = desktopComponents.size(); --i >= 0;) | for (int i = desktopComponents.size(); --i >= 0;) | ||||
| { | { | ||||
| Component* const c = (Component*) desktopComponents.getUnchecked(i); | |||||
| Component* const c = desktopComponents.getUnchecked(i); | |||||
| int x = screenX, y = screenY; | int x = screenX, y = screenY; | ||||
| c->globalPositionToRelative (x, y); | c->globalPositionToRelative (x, y); | ||||
| @@ -42264,7 +42274,21 @@ void Desktop::componentBroughtToFront (Component* const c) throw() | |||||
| jassert (index >= 0); | jassert (index >= 0); | ||||
| if (index >= 0) | if (index >= 0) | ||||
| desktopComponents.move (index, -1); | |||||
| { | |||||
| int newIndex = -1; | |||||
| if (! c->isAlwaysOnTop()) | |||||
| { | |||||
| newIndex = desktopComponents.size(); | |||||
| while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop()) | |||||
| --newIndex; | |||||
| --newIndex; | |||||
| } | |||||
| desktopComponents.move (index, newIndex); | |||||
| } | |||||
| } | } | ||||
| // from Component.cpp | // from Component.cpp | ||||
| @@ -52352,12 +52376,17 @@ public: | |||||
| } | } | ||||
| }; | }; | ||||
| const int flashSpeedIntervalMs = 380; | |||||
| namespace TextEditorDefs | |||||
| { | |||||
| const int flashSpeedIntervalMs = 380; | |||||
| const int textChangeMessageId = 0x10003001; | |||||
| const int returnKeyMessageId = 0x10003002; | |||||
| const int escapeKeyMessageId = 0x10003003; | |||||
| const int focusLossMessageId = 0x10003004; | |||||
| const int textChangeMessageId = 0x10003001; | |||||
| const int returnKeyMessageId = 0x10003002; | |||||
| const int escapeKeyMessageId = 0x10003003; | |||||
| const int focusLossMessageId = 0x10003004; | |||||
| const int maxActionsPerTransaction = 100; | |||||
| } | |||||
| TextEditor::TextEditor (const String& name, | TextEditor::TextEditor (const String& name, | ||||
| const tchar passwordCharacter_) | const tchar passwordCharacter_) | ||||
| @@ -52531,7 +52560,7 @@ void TextEditor::setCaretVisible (const bool shouldCaretBeVisible) | |||||
| caretVisible = shouldCaretBeVisible; | caretVisible = shouldCaretBeVisible; | ||||
| if (shouldCaretBeVisible) | if (shouldCaretBeVisible) | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | ||||
| : MouseCursor::NormalCursor); | : MouseCursor::NormalCursor); | ||||
| @@ -52630,7 +52659,7 @@ void TextEditor::textWasChangedByValue() | |||||
| void TextEditor::textChanged() | void TextEditor::textChanged() | ||||
| { | { | ||||
| updateTextHolderSize(); | updateTextHolderSize(); | ||||
| postCommandMessage (textChangeMessageId); | |||||
| postCommandMessage (TextEditorDefs::textChangeMessageId); | |||||
| if (textValue.getValueSource().getReferenceCount() > 1) | if (textValue.getValueSource().getReferenceCount() > 1) | ||||
| { | { | ||||
| @@ -52641,12 +52670,12 @@ void TextEditor::textChanged() | |||||
| void TextEditor::returnPressed() | void TextEditor::returnPressed() | ||||
| { | { | ||||
| postCommandMessage (returnKeyMessageId); | |||||
| postCommandMessage (TextEditorDefs::returnKeyMessageId); | |||||
| } | } | ||||
| void TextEditor::escapePressed() | void TextEditor::escapePressed() | ||||
| { | { | ||||
| postCommandMessage (escapeKeyMessageId); | |||||
| postCommandMessage (TextEditorDefs::escapeKeyMessageId); | |||||
| } | } | ||||
| void TextEditor::addListener (TextEditorListener* const newListener) | void TextEditor::addListener (TextEditorListener* const newListener) | ||||
| @@ -52740,7 +52769,7 @@ void TextEditor::moveCaret (int newCaretPos) | |||||
| repaintCaret(); | repaintCaret(); | ||||
| caretFlashState = true; | caretFlashState = true; | ||||
| caretPosition = newCaretPos; | caretPosition = newCaretPos; | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| scrollToMakeSureCursorIsVisible(); | scrollToMakeSureCursorIsVisible(); | ||||
| repaintCaret(); | repaintCaret(); | ||||
| } | } | ||||
| @@ -53195,7 +53224,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) | |||||
| void TextEditor::mouseUp (const MouseEvent& e) | void TextEditor::mouseUp (const MouseEvent& e) | ||||
| { | { | ||||
| newTransaction(); | newTransaction(); | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| if (wasFocused || ! selectAllTextWhenFocused) | if (wasFocused || ! selectAllTextWhenFocused) | ||||
| { | { | ||||
| @@ -53524,7 +53553,7 @@ void TextEditor::focusGained (FocusChangeType) | |||||
| repaint(); | repaint(); | ||||
| if (caretVisible) | if (caretVisible) | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| ComponentPeer* const peer = getPeer(); | ComponentPeer* const peer = getPeer(); | ||||
| if (peer != 0 && ! isReadOnly()) | if (peer != 0 && ! isReadOnly()) | ||||
| @@ -53540,7 +53569,7 @@ void TextEditor::focusLost (FocusChangeType) | |||||
| textHolder->stopTimer(); | textHolder->stopTimer(); | ||||
| caretFlashState = false; | caretFlashState = false; | ||||
| postCommandMessage (focusLossMessageId); | |||||
| postCommandMessage (TextEditorDefs::focusLossMessageId); | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| @@ -53573,19 +53602,19 @@ void TextEditor::handleCommandMessage (const int commandId) | |||||
| { | { | ||||
| switch (commandId) | switch (commandId) | ||||
| { | { | ||||
| case textChangeMessageId: | |||||
| case TextEditorDefs::textChangeMessageId: | |||||
| tl->textEditorTextChanged (*this); | tl->textEditorTextChanged (*this); | ||||
| break; | break; | ||||
| case returnKeyMessageId: | |||||
| case TextEditorDefs::returnKeyMessageId: | |||||
| tl->textEditorReturnKeyPressed (*this); | tl->textEditorReturnKeyPressed (*this); | ||||
| break; | break; | ||||
| case escapeKeyMessageId: | |||||
| case TextEditorDefs::escapeKeyMessageId: | |||||
| tl->textEditorEscapeKeyPressed (*this); | tl->textEditorEscapeKeyPressed (*this); | ||||
| break; | break; | ||||
| case focusLossMessageId: | |||||
| case TextEditorDefs::focusLossMessageId: | |||||
| tl->textEditorFocusLost (*this); | tl->textEditorFocusLost (*this); | ||||
| break; | break; | ||||
| @@ -53623,6 +53652,9 @@ void TextEditor::insert (const String& text, | |||||
| { | { | ||||
| if (um != 0) | if (um != 0) | ||||
| { | { | ||||
| if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||||
| newTransaction(); | |||||
| um->perform (new TextEditorInsertAction (*this, | um->perform (new TextEditorInsertAction (*this, | ||||
| text, | text, | ||||
| insertIndex, | insertIndex, | ||||
| @@ -53772,6 +53804,9 @@ void TextEditor::remove (const int startIndex, | |||||
| index = nextIndex; | index = nextIndex; | ||||
| } | } | ||||
| if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||||
| newTransaction(); | |||||
| um->perform (new TextEditorRemoveAction (*this, | um->perform (new TextEditorRemoveAction (*this, | ||||
| startIndex, | startIndex, | ||||
| endIndex, | endIndex, | ||||
| @@ -245879,9 +245914,14 @@ void NSViewComponentPeer::setVisible (bool shouldBeVisible) | |||||
| else | else | ||||
| { | { | ||||
| if (shouldBeVisible) | if (shouldBeVisible) | ||||
| { | |||||
| [window orderFront: nil]; | [window orderFront: nil]; | ||||
| handleBroughtToFront(); | |||||
| } | |||||
| else | else | ||||
| { | |||||
| [window orderOut: nil]; | [window orderOut: nil]; | ||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -246137,6 +246177,8 @@ void NSViewComponentPeer::toFront (bool makeActiveWindow) | |||||
| [window makeKeyAndOrderFront: nil]; | [window makeKeyAndOrderFront: nil]; | ||||
| else | else | ||||
| [window orderFront: nil]; | [window orderFront: nil]; | ||||
| handleBroughtToFront(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -6423,6 +6423,8 @@ public: | |||||
| void getActionsInCurrentTransaction (Array <const UndoableAction*>& actionsFound) const; | void getActionsInCurrentTransaction (Array <const UndoableAction*>& actionsFound) const; | ||||
| int getNumActionsInCurrentTransaction() const; | |||||
| bool canRedo() const; | bool canRedo() const; | ||||
| const String getRedoDescription() const; | const String getRedoDescription() const; | ||||
| @@ -12775,7 +12777,7 @@ private: | |||||
| friend class Component; | friend class Component; | ||||
| friend class ComponentPeer; | friend class ComponentPeer; | ||||
| SortedSet <void*> mouseListeners, focusListeners; | SortedSet <void*> mouseListeners, focusListeners; | ||||
| VoidArray desktopComponents; | |||||
| Array <Component*> desktopComponents; | |||||
| friend class DeletedAtShutdown; | friend class DeletedAtShutdown; | ||||
| friend class TopLevelWindowManager; | friend class TopLevelWindowManager; | ||||
| @@ -953,13 +953,17 @@ public: | |||||
| }; | }; | ||||
| //============================================================================== | //============================================================================== | ||||
| const int flashSpeedIntervalMs = 380; | |||||
| namespace TextEditorDefs | |||||
| { | |||||
| const int flashSpeedIntervalMs = 380; | |||||
| const int textChangeMessageId = 0x10003001; | |||||
| const int returnKeyMessageId = 0x10003002; | |||||
| const int escapeKeyMessageId = 0x10003003; | |||||
| const int focusLossMessageId = 0x10003004; | |||||
| const int textChangeMessageId = 0x10003001; | |||||
| const int returnKeyMessageId = 0x10003002; | |||||
| const int escapeKeyMessageId = 0x10003003; | |||||
| const int focusLossMessageId = 0x10003004; | |||||
| const int maxActionsPerTransaction = 100; | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| TextEditor::TextEditor (const String& name, | TextEditor::TextEditor (const String& name, | ||||
| @@ -1137,7 +1141,7 @@ void TextEditor::setCaretVisible (const bool shouldCaretBeVisible) | |||||
| caretVisible = shouldCaretBeVisible; | caretVisible = shouldCaretBeVisible; | ||||
| if (shouldCaretBeVisible) | if (shouldCaretBeVisible) | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | ||||
| : MouseCursor::NormalCursor); | : MouseCursor::NormalCursor); | ||||
| @@ -1239,7 +1243,7 @@ void TextEditor::textWasChangedByValue() | |||||
| void TextEditor::textChanged() | void TextEditor::textChanged() | ||||
| { | { | ||||
| updateTextHolderSize(); | updateTextHolderSize(); | ||||
| postCommandMessage (textChangeMessageId); | |||||
| postCommandMessage (TextEditorDefs::textChangeMessageId); | |||||
| if (textValue.getValueSource().getReferenceCount() > 1) | if (textValue.getValueSource().getReferenceCount() > 1) | ||||
| { | { | ||||
| @@ -1250,12 +1254,12 @@ void TextEditor::textChanged() | |||||
| void TextEditor::returnPressed() | void TextEditor::returnPressed() | ||||
| { | { | ||||
| postCommandMessage (returnKeyMessageId); | |||||
| postCommandMessage (TextEditorDefs::returnKeyMessageId); | |||||
| } | } | ||||
| void TextEditor::escapePressed() | void TextEditor::escapePressed() | ||||
| { | { | ||||
| postCommandMessage (escapeKeyMessageId); | |||||
| postCommandMessage (TextEditorDefs::escapeKeyMessageId); | |||||
| } | } | ||||
| void TextEditor::addListener (TextEditorListener* const newListener) | void TextEditor::addListener (TextEditorListener* const newListener) | ||||
| @@ -1351,7 +1355,7 @@ void TextEditor::moveCaret (int newCaretPos) | |||||
| repaintCaret(); | repaintCaret(); | ||||
| caretFlashState = true; | caretFlashState = true; | ||||
| caretPosition = newCaretPos; | caretPosition = newCaretPos; | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| scrollToMakeSureCursorIsVisible(); | scrollToMakeSureCursorIsVisible(); | ||||
| repaintCaret(); | repaintCaret(); | ||||
| } | } | ||||
| @@ -1810,7 +1814,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) | |||||
| void TextEditor::mouseUp (const MouseEvent& e) | void TextEditor::mouseUp (const MouseEvent& e) | ||||
| { | { | ||||
| newTransaction(); | newTransaction(); | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| if (wasFocused || ! selectAllTextWhenFocused) | if (wasFocused || ! selectAllTextWhenFocused) | ||||
| { | { | ||||
| @@ -2142,7 +2146,7 @@ void TextEditor::focusGained (FocusChangeType) | |||||
| repaint(); | repaint(); | ||||
| if (caretVisible) | if (caretVisible) | ||||
| textHolder->startTimer (flashSpeedIntervalMs); | |||||
| textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||||
| ComponentPeer* const peer = getPeer(); | ComponentPeer* const peer = getPeer(); | ||||
| if (peer != 0 && ! isReadOnly()) | if (peer != 0 && ! isReadOnly()) | ||||
| @@ -2158,7 +2162,7 @@ void TextEditor::focusLost (FocusChangeType) | |||||
| textHolder->stopTimer(); | textHolder->stopTimer(); | ||||
| caretFlashState = false; | caretFlashState = false; | ||||
| postCommandMessage (focusLossMessageId); | |||||
| postCommandMessage (TextEditorDefs::focusLossMessageId); | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| @@ -2192,19 +2196,19 @@ void TextEditor::handleCommandMessage (const int commandId) | |||||
| { | { | ||||
| switch (commandId) | switch (commandId) | ||||
| { | { | ||||
| case textChangeMessageId: | |||||
| case TextEditorDefs::textChangeMessageId: | |||||
| tl->textEditorTextChanged (*this); | tl->textEditorTextChanged (*this); | ||||
| break; | break; | ||||
| case returnKeyMessageId: | |||||
| case TextEditorDefs::returnKeyMessageId: | |||||
| tl->textEditorReturnKeyPressed (*this); | tl->textEditorReturnKeyPressed (*this); | ||||
| break; | break; | ||||
| case escapeKeyMessageId: | |||||
| case TextEditorDefs::escapeKeyMessageId: | |||||
| tl->textEditorEscapeKeyPressed (*this); | tl->textEditorEscapeKeyPressed (*this); | ||||
| break; | break; | ||||
| case focusLossMessageId: | |||||
| case TextEditorDefs::focusLossMessageId: | |||||
| tl->textEditorFocusLost (*this); | tl->textEditorFocusLost (*this); | ||||
| break; | break; | ||||
| @@ -2243,6 +2247,9 @@ void TextEditor::insert (const String& text, | |||||
| { | { | ||||
| if (um != 0) | if (um != 0) | ||||
| { | { | ||||
| if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||||
| newTransaction(); | |||||
| um->perform (new TextEditorInsertAction (*this, | um->perform (new TextEditorInsertAction (*this, | ||||
| text, | text, | ||||
| insertIndex, | insertIndex, | ||||
| @@ -2392,6 +2399,9 @@ void TextEditor::remove (const int startIndex, | |||||
| index = nextIndex; | index = nextIndex; | ||||
| } | } | ||||
| if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||||
| newTransaction(); | |||||
| um->perform (new TextEditorRemoveAction (*this, | um->perform (new TextEditorRemoveAction (*this, | ||||
| startIndex, | startIndex, | ||||
| endIndex, | endIndex, | ||||
| @@ -149,7 +149,7 @@ int Desktop::getNumComponents() const throw() | |||||
| Component* Desktop::getComponent (const int index) const throw() | Component* Desktop::getComponent (const int index) const throw() | ||||
| { | { | ||||
| return (Component*) desktopComponents [index]; | |||||
| return desktopComponents [index]; | |||||
| } | } | ||||
| Component* Desktop::findComponentAt (const int screenX, | Component* Desktop::findComponentAt (const int screenX, | ||||
| @@ -157,7 +157,7 @@ Component* Desktop::findComponentAt (const int screenX, | |||||
| { | { | ||||
| for (int i = desktopComponents.size(); --i >= 0;) | for (int i = desktopComponents.size(); --i >= 0;) | ||||
| { | { | ||||
| Component* const c = (Component*) desktopComponents.getUnchecked(i); | |||||
| Component* const c = desktopComponents.getUnchecked(i); | |||||
| int x = screenX, y = screenY; | int x = screenX, y = screenY; | ||||
| c->globalPositionToRelative (x, y); | c->globalPositionToRelative (x, y); | ||||
| @@ -188,7 +188,21 @@ void Desktop::componentBroughtToFront (Component* const c) throw() | |||||
| jassert (index >= 0); | jassert (index >= 0); | ||||
| if (index >= 0) | if (index >= 0) | ||||
| desktopComponents.move (index, -1); | |||||
| { | |||||
| int newIndex = -1; | |||||
| if (! c->isAlwaysOnTop()) | |||||
| { | |||||
| newIndex = desktopComponents.size(); | |||||
| while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop()) | |||||
| --newIndex; | |||||
| --newIndex; | |||||
| } | |||||
| desktopComponents.move (index, newIndex); | |||||
| } | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -240,7 +240,7 @@ private: | |||||
| friend class Component; | friend class Component; | ||||
| friend class ComponentPeer; | friend class ComponentPeer; | ||||
| SortedSet <void*> mouseListeners, focusListeners; | SortedSet <void*> mouseListeners, focusListeners; | ||||
| VoidArray desktopComponents; | |||||
| Array <Component*> desktopComponents; | |||||
| friend class DeletedAtShutdown; | friend class DeletedAtShutdown; | ||||
| friend class TopLevelWindowManager; | friend class TopLevelWindowManager; | ||||
| @@ -769,9 +769,14 @@ void NSViewComponentPeer::setVisible (bool shouldBeVisible) | |||||
| else | else | ||||
| { | { | ||||
| if (shouldBeVisible) | if (shouldBeVisible) | ||||
| { | |||||
| [window orderFront: nil]; | [window orderFront: nil]; | ||||
| handleBroughtToFront(); | |||||
| } | |||||
| else | else | ||||
| { | |||||
| [window orderOut: nil]; | [window orderOut: nil]; | ||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1027,6 +1032,8 @@ void NSViewComponentPeer::toFront (bool makeActiveWindow) | |||||
| [window makeKeyAndOrderFront: nil]; | [window makeKeyAndOrderFront: nil]; | ||||
| else | else | ||||
| [window orderFront: nil]; | [window orderFront: nil]; | ||||
| handleBroughtToFront(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -281,5 +281,15 @@ void UndoManager::getActionsInCurrentTransaction (Array <const UndoableAction*>& | |||||
| } | } | ||||
| } | } | ||||
| int UndoManager::getNumActionsInCurrentTransaction() const | |||||
| { | |||||
| const OwnedArray <UndoableAction>* const commandSet = transactions [nextIndex - 1]; | |||||
| if (commandSet != 0 && ! newTransaction) | |||||
| return commandSet->size(); | |||||
| return 0; | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -185,6 +185,12 @@ public: | |||||
| */ | */ | ||||
| void getActionsInCurrentTransaction (Array <const UndoableAction*>& actionsFound) const; | void getActionsInCurrentTransaction (Array <const UndoableAction*>& actionsFound) const; | ||||
| /** Returns the number of UndoableAction objects that have been performed during the | |||||
| transaction that is currently open. | |||||
| @see getActionsInCurrentTransaction | |||||
| */ | |||||
| int getNumActionsInCurrentTransaction() const; | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Returns true if there's at least one action in the list to redo. | /** Returns true if there's at least one action in the list to redo. | ||||