@@ -40,17 +40,17 @@ | |||
#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 | |||
//#define JUCE_FORCE_DEBUG 1 | |||
#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, | |||
however, the jassert and jassertfalse macros will not be compiled in a | |||
@@ -63,48 +63,42 @@ | |||
#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 | |||
#define JUCE_ASIO 1 | |||
#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 | |||
// #define JUCE_WASAPI 1 | |||
#endif | |||
/** Comment out this macro to disable the Windows WASAPI audio device type. | |||
/** JUCE_DIRECTSOUND: Enables DirectSound audio (MS Windows only). | |||
*/ | |||
#ifndef JUCE_DIRECTSOUND | |||
#define JUCE_DIRECTSOUND 1 | |||
#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 | |||
#define JUCE_ALSA 1 | |||
#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 | |||
#define JUCE_JACK 1 | |||
#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. | |||
*/ | |||
#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 | |||
#define JUCE_OPENGL 1 | |||
#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 | |||
#define JUCE_USE_FLAC 1 | |||
#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 | |||
#define JUCE_USE_OGGVORBIS 1 | |||
#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) | |||
#define JUCE_USE_CDBURNER 1 | |||
#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 | |||
#define JUCE_USE_CDREADER 1 | |||
#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) | |||
// #define JUCE_USE_CAMERA 1 | |||
#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 | |||
// #define JUCE_ENABLE_REPAINT_DEBUGGING 1 | |||
#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 | |||
#define JUCE_USE_XINERAMA 1 | |||
#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 | |||
#define JUCE_USE_XSHM 1 | |||
#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 | |||
*/ | |||
#ifndef JUCE_PLUGINHOST_VST | |||
// #define JUCE_PLUGINHOST_VST 1 | |||
#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 | |||
*/ | |||
#ifndef JUCE_PLUGINHOST_AU | |||
@@ -197,15 +200,15 @@ | |||
#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 | |||
//#define JUCE_ONLY_BUILD_CORE_LIBRARY 1 | |||
#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 | |||
#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 | |||
#define JUCE_SUPPORT_CARBON 1 | |||
#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 | |||
#define JUCE_INCLUDE_ZLIB_CODE 1 | |||
@@ -247,25 +251,23 @@ | |||
#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). | |||
*/ | |||
#ifndef JUCE_CHECK_MEMORY_LEAKS | |||
#define JUCE_CHECK_MEMORY_LEAKS 1 | |||
#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. | |||
*/ | |||
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS | |||
#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 | |||
#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 | |||
#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 of inlined file: juce_UndoManager.cpp *********/ | |||
@@ -42226,7 +42236,7 @@ int Desktop::getNumComponents() const throw() | |||
Component* Desktop::getComponent (const int index) const throw() | |||
{ | |||
return (Component*) desktopComponents [index]; | |||
return desktopComponents [index]; | |||
} | |||
Component* Desktop::findComponentAt (const int screenX, | |||
@@ -42234,7 +42244,7 @@ Component* Desktop::findComponentAt (const int screenX, | |||
{ | |||
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; | |||
c->globalPositionToRelative (x, y); | |||
@@ -42264,7 +42274,21 @@ void Desktop::componentBroughtToFront (Component* const c) throw() | |||
jassert (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 | |||
@@ -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, | |||
const tchar passwordCharacter_) | |||
@@ -52531,7 +52560,7 @@ void TextEditor::setCaretVisible (const bool shouldCaretBeVisible) | |||
caretVisible = shouldCaretBeVisible; | |||
if (shouldCaretBeVisible) | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | |||
: MouseCursor::NormalCursor); | |||
@@ -52630,7 +52659,7 @@ void TextEditor::textWasChangedByValue() | |||
void TextEditor::textChanged() | |||
{ | |||
updateTextHolderSize(); | |||
postCommandMessage (textChangeMessageId); | |||
postCommandMessage (TextEditorDefs::textChangeMessageId); | |||
if (textValue.getValueSource().getReferenceCount() > 1) | |||
{ | |||
@@ -52641,12 +52670,12 @@ void TextEditor::textChanged() | |||
void TextEditor::returnPressed() | |||
{ | |||
postCommandMessage (returnKeyMessageId); | |||
postCommandMessage (TextEditorDefs::returnKeyMessageId); | |||
} | |||
void TextEditor::escapePressed() | |||
{ | |||
postCommandMessage (escapeKeyMessageId); | |||
postCommandMessage (TextEditorDefs::escapeKeyMessageId); | |||
} | |||
void TextEditor::addListener (TextEditorListener* const newListener) | |||
@@ -52740,7 +52769,7 @@ void TextEditor::moveCaret (int newCaretPos) | |||
repaintCaret(); | |||
caretFlashState = true; | |||
caretPosition = newCaretPos; | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
scrollToMakeSureCursorIsVisible(); | |||
repaintCaret(); | |||
} | |||
@@ -53195,7 +53224,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) | |||
void TextEditor::mouseUp (const MouseEvent& e) | |||
{ | |||
newTransaction(); | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
if (wasFocused || ! selectAllTextWhenFocused) | |||
{ | |||
@@ -53524,7 +53553,7 @@ void TextEditor::focusGained (FocusChangeType) | |||
repaint(); | |||
if (caretVisible) | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
ComponentPeer* const peer = getPeer(); | |||
if (peer != 0 && ! isReadOnly()) | |||
@@ -53540,7 +53569,7 @@ void TextEditor::focusLost (FocusChangeType) | |||
textHolder->stopTimer(); | |||
caretFlashState = false; | |||
postCommandMessage (focusLossMessageId); | |||
postCommandMessage (TextEditorDefs::focusLossMessageId); | |||
repaint(); | |||
} | |||
@@ -53573,19 +53602,19 @@ void TextEditor::handleCommandMessage (const int commandId) | |||
{ | |||
switch (commandId) | |||
{ | |||
case textChangeMessageId: | |||
case TextEditorDefs::textChangeMessageId: | |||
tl->textEditorTextChanged (*this); | |||
break; | |||
case returnKeyMessageId: | |||
case TextEditorDefs::returnKeyMessageId: | |||
tl->textEditorReturnKeyPressed (*this); | |||
break; | |||
case escapeKeyMessageId: | |||
case TextEditorDefs::escapeKeyMessageId: | |||
tl->textEditorEscapeKeyPressed (*this); | |||
break; | |||
case focusLossMessageId: | |||
case TextEditorDefs::focusLossMessageId: | |||
tl->textEditorFocusLost (*this); | |||
break; | |||
@@ -53623,6 +53652,9 @@ void TextEditor::insert (const String& text, | |||
{ | |||
if (um != 0) | |||
{ | |||
if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||
newTransaction(); | |||
um->perform (new TextEditorInsertAction (*this, | |||
text, | |||
insertIndex, | |||
@@ -53772,6 +53804,9 @@ void TextEditor::remove (const int startIndex, | |||
index = nextIndex; | |||
} | |||
if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||
newTransaction(); | |||
um->perform (new TextEditorRemoveAction (*this, | |||
startIndex, | |||
endIndex, | |||
@@ -245879,9 +245914,14 @@ void NSViewComponentPeer::setVisible (bool shouldBeVisible) | |||
else | |||
{ | |||
if (shouldBeVisible) | |||
{ | |||
[window orderFront: nil]; | |||
handleBroughtToFront(); | |||
} | |||
else | |||
{ | |||
[window orderOut: nil]; | |||
} | |||
} | |||
} | |||
@@ -246137,6 +246177,8 @@ void NSViewComponentPeer::toFront (bool makeActiveWindow) | |||
[window makeKeyAndOrderFront: nil]; | |||
else | |||
[window orderFront: nil]; | |||
handleBroughtToFront(); | |||
} | |||
} | |||
@@ -6423,6 +6423,8 @@ public: | |||
void getActionsInCurrentTransaction (Array <const UndoableAction*>& actionsFound) const; | |||
int getNumActionsInCurrentTransaction() const; | |||
bool canRedo() const; | |||
const String getRedoDescription() const; | |||
@@ -12775,7 +12777,7 @@ private: | |||
friend class Component; | |||
friend class ComponentPeer; | |||
SortedSet <void*> mouseListeners, focusListeners; | |||
VoidArray desktopComponents; | |||
Array <Component*> desktopComponents; | |||
friend class DeletedAtShutdown; | |||
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, | |||
@@ -1137,7 +1141,7 @@ void TextEditor::setCaretVisible (const bool shouldCaretBeVisible) | |||
caretVisible = shouldCaretBeVisible; | |||
if (shouldCaretBeVisible) | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
setMouseCursor (shouldCaretBeVisible ? MouseCursor::IBeamCursor | |||
: MouseCursor::NormalCursor); | |||
@@ -1239,7 +1243,7 @@ void TextEditor::textWasChangedByValue() | |||
void TextEditor::textChanged() | |||
{ | |||
updateTextHolderSize(); | |||
postCommandMessage (textChangeMessageId); | |||
postCommandMessage (TextEditorDefs::textChangeMessageId); | |||
if (textValue.getValueSource().getReferenceCount() > 1) | |||
{ | |||
@@ -1250,12 +1254,12 @@ void TextEditor::textChanged() | |||
void TextEditor::returnPressed() | |||
{ | |||
postCommandMessage (returnKeyMessageId); | |||
postCommandMessage (TextEditorDefs::returnKeyMessageId); | |||
} | |||
void TextEditor::escapePressed() | |||
{ | |||
postCommandMessage (escapeKeyMessageId); | |||
postCommandMessage (TextEditorDefs::escapeKeyMessageId); | |||
} | |||
void TextEditor::addListener (TextEditorListener* const newListener) | |||
@@ -1351,7 +1355,7 @@ void TextEditor::moveCaret (int newCaretPos) | |||
repaintCaret(); | |||
caretFlashState = true; | |||
caretPosition = newCaretPos; | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
scrollToMakeSureCursorIsVisible(); | |||
repaintCaret(); | |||
} | |||
@@ -1810,7 +1814,7 @@ void TextEditor::mouseDrag (const MouseEvent& e) | |||
void TextEditor::mouseUp (const MouseEvent& e) | |||
{ | |||
newTransaction(); | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
if (wasFocused || ! selectAllTextWhenFocused) | |||
{ | |||
@@ -2142,7 +2146,7 @@ void TextEditor::focusGained (FocusChangeType) | |||
repaint(); | |||
if (caretVisible) | |||
textHolder->startTimer (flashSpeedIntervalMs); | |||
textHolder->startTimer (TextEditorDefs::flashSpeedIntervalMs); | |||
ComponentPeer* const peer = getPeer(); | |||
if (peer != 0 && ! isReadOnly()) | |||
@@ -2158,7 +2162,7 @@ void TextEditor::focusLost (FocusChangeType) | |||
textHolder->stopTimer(); | |||
caretFlashState = false; | |||
postCommandMessage (focusLossMessageId); | |||
postCommandMessage (TextEditorDefs::focusLossMessageId); | |||
repaint(); | |||
} | |||
@@ -2192,19 +2196,19 @@ void TextEditor::handleCommandMessage (const int commandId) | |||
{ | |||
switch (commandId) | |||
{ | |||
case textChangeMessageId: | |||
case TextEditorDefs::textChangeMessageId: | |||
tl->textEditorTextChanged (*this); | |||
break; | |||
case returnKeyMessageId: | |||
case TextEditorDefs::returnKeyMessageId: | |||
tl->textEditorReturnKeyPressed (*this); | |||
break; | |||
case escapeKeyMessageId: | |||
case TextEditorDefs::escapeKeyMessageId: | |||
tl->textEditorEscapeKeyPressed (*this); | |||
break; | |||
case focusLossMessageId: | |||
case TextEditorDefs::focusLossMessageId: | |||
tl->textEditorFocusLost (*this); | |||
break; | |||
@@ -2243,6 +2247,9 @@ void TextEditor::insert (const String& text, | |||
{ | |||
if (um != 0) | |||
{ | |||
if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||
newTransaction(); | |||
um->perform (new TextEditorInsertAction (*this, | |||
text, | |||
insertIndex, | |||
@@ -2392,6 +2399,9 @@ void TextEditor::remove (const int startIndex, | |||
index = nextIndex; | |||
} | |||
if (um->getNumActionsInCurrentTransaction() > TextEditorDefs::maxActionsPerTransaction) | |||
newTransaction(); | |||
um->perform (new TextEditorRemoveAction (*this, | |||
startIndex, | |||
endIndex, | |||
@@ -149,7 +149,7 @@ int Desktop::getNumComponents() const throw() | |||
Component* Desktop::getComponent (const int index) const throw() | |||
{ | |||
return (Component*) desktopComponents [index]; | |||
return desktopComponents [index]; | |||
} | |||
Component* Desktop::findComponentAt (const int screenX, | |||
@@ -157,7 +157,7 @@ Component* Desktop::findComponentAt (const int screenX, | |||
{ | |||
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; | |||
c->globalPositionToRelative (x, y); | |||
@@ -188,7 +188,21 @@ void Desktop::componentBroughtToFront (Component* const c) throw() | |||
jassert (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 ComponentPeer; | |||
SortedSet <void*> mouseListeners, focusListeners; | |||
VoidArray desktopComponents; | |||
Array <Component*> desktopComponents; | |||
friend class DeletedAtShutdown; | |||
friend class TopLevelWindowManager; | |||
@@ -769,9 +769,14 @@ void NSViewComponentPeer::setVisible (bool shouldBeVisible) | |||
else | |||
{ | |||
if (shouldBeVisible) | |||
{ | |||
[window orderFront: nil]; | |||
handleBroughtToFront(); | |||
} | |||
else | |||
{ | |||
[window orderOut: nil]; | |||
} | |||
} | |||
} | |||
@@ -1027,6 +1032,8 @@ void NSViewComponentPeer::toFront (bool makeActiveWindow) | |||
[window makeKeyAndOrderFront: nil]; | |||
else | |||
[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 |
@@ -185,6 +185,12 @@ public: | |||
*/ | |||
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. | |||