From 4cfdcb69fdd8edf3a6f60c1e704b25441063efde Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Fri, 19 Nov 2010 22:03:35 +0000 Subject: [PATCH] Updated the ChangeBroadcaster class - sendChangeMessage() now has no parameters, and ChangeListener::changeListenerCallback() no longer provides a void*, it provides the ChangeBroadcaster* that triggered the callback. Also deleted the ChangeListenerList class, as it didn't offer anything that ChangeBroadcaster doesn't do. Changed the new jucer to expand preprocessor tokens in the header search path string. --- Builds/Linux/Makefile | 6 - Builds/MacOSX/Juce.xcodeproj/project.pbxproj | 6 - Builds/VisualStudio2005/Juce.vcproj | 2 - Builds/VisualStudio2008/Juce.vcproj | 2 - Builds/VisualStudio2008_DLL/Juce.vcproj | 2 - Builds/VisualStudio2010/Juce.vcxproj | 2 - Builds/VisualStudio2010/Juce.vcxproj.filters | 6 - Builds/iPhone/Juce.xcodeproj/project.pbxproj | 6 - Juce.jucer | 4 - amalgamation/juce_amalgamated_template.cpp | 1 - .../Project/jucer_ProjectContentComponent.cpp | 2 +- .../Project/jucer_ProjectContentComponent.h | 2 +- .../Source/Project/jucer_ProjectExport_MSVC.h | 4 +- .../Source/Project/jucer_ProjectExport_Make.h | 2 +- .../Project/jucer_ProjectExport_XCode.h | 2 +- .../jucer_ProjectInformationComponent.cpp | 4 +- .../jucer_ProjectInformationComponent.h | 2 +- extras/audio plugin host/Source/FilterGraph.h | 2 +- .../Source/GraphEditorPanel.cpp | 2 +- .../Source/GraphEditorPanel.h | 2 +- .../Source/MainHostWindow.cpp | 2 +- .../audio plugin host/Source/MainHostWindow.h | 2 +- extras/juce demo/Builds/MacOSX/Icon.icns | Bin 81944 -> 81944 bytes .../Builds/VisualStudio2005/icon.ico | Bin 82726 -> 82726 bytes .../Builds/VisualStudio2008/icon.ico | Bin 82726 -> 82726 bytes .../Builds/VisualStudio2010/icon.ico | Bin 82726 -> 82726 bytes extras/juce demo/Builds/iPhone/Icon.icns | Bin 81944 -> 81944 bytes .../Source/demos/AudioDemoPlaybackPage.cpp | 2 +- extras/juce demo/Source/demos/WidgetsDemo.cpp | 9 +- .../components/jucer_GroupComponentHandler.h | 2 +- .../components/jucer_ImageButtonHandler.h | 2 +- .../components/jucer_JucerComponentHandler.h | 2 +- .../src/model/components/jucer_LabelHandler.h | 8 +- .../components/jucer_TabbedComponentHandler.h | 6 +- .../model/components/jucer_ViewportHandler.h | 4 +- .../model/documents/jucer_ButtonDocument.cpp | 2 +- .../paintelements/jucer_ColouredElement.cpp | 14 +- .../jucer_ElementSiblingComponent.h | 2 +- .../jucer_ImageResourceProperty.h | 2 +- .../paintelements/jucer_PaintElement.cpp | 4 +- .../model/paintelements/jucer_PaintElement.h | 4 +- .../paintelements/jucer_PaintElementImage.h | 4 +- .../paintelements/jucer_PaintElementPath.cpp | 8 +- .../paintelements/jucer_PaintElementPath.h | 2 +- .../jucer_PaintElementRoundedRectangle.h | 2 +- .../paintelements/jucer_PaintElementText.h | 10 +- .../jucer_ComponentBooleanProperty.h | 2 +- .../jucer_ComponentChoiceProperty.h | 2 +- .../jucer_ComponentColourProperty.h | 2 +- .../properties/jucer_ComponentTextProperty.h | 2 +- .../properties/jucer_PositionPropertyBase.h | 2 +- .../src/ui/jucer_ComponentLayoutEditor.cpp | 2 +- .../src/ui/jucer_ComponentLayoutEditor.h | 2 +- .../src/ui/jucer_ComponentLayoutPanel.cpp | 2 +- .../ui/jucer_ComponentOverlayComponent.cpp | 2 +- .../src/ui/jucer_ComponentOverlayComponent.h | 2 +- .../src/ui/jucer_JucerDocumentHolder.cpp | 6 +- .../src/ui/jucer_JucerDocumentHolder.h | 2 +- .../src/ui/jucer_PaintRoutineEditor.cpp | 2 +- .../src/ui/jucer_PaintRoutineEditor.h | 2 +- .../src/ui/jucer_PaintRoutinePanel.cpp | 4 +- .../src/ui/jucer_ResourceEditorPanel.cpp | 2 +- .../src/ui/jucer_ResourceEditorPanel.h | 2 +- .../src/utility/jucer_ColourEditorComponent.h | 2 +- juce_amalgamated.cpp | 936 +++++++++--------- juce_amalgamated.h | 514 +++++----- .../juce_ApplicationCommandManager.h | 4 +- .../juce_AudioThumbnail.cpp | 4 +- .../juce_AudioTransportSource.cpp | 6 +- src/audio/devices/juce_AudioDeviceManager.cpp | 12 +- src/audio/plugins/juce_KnownPluginList.cpp | 8 +- .../plugins/juce_PluginListComponent.cpp | 2 +- src/audio/plugins/juce_PluginListComponent.h | 2 +- src/audio/synthesisers/juce_Synthesiser.h | 4 +- src/core/juce_StandardHeader.h | 8 +- src/events/juce_ChangeBroadcaster.cpp | 64 +- src/events/juce_ChangeBroadcaster.h | 54 +- src/events/juce_ChangeListener.h | 26 +- src/events/juce_ChangeListenerList.cpp | 107 -- src/events/juce_ChangeListenerList.h | 119 --- src/events/juce_ListenerList.h | 6 + src/gui/components/controls/juce_ListBox.cpp | 1 + .../juce_DirectoryContentsList.cpp | 3 +- .../filebrowser/juce_FileListComponent.cpp | 2 +- .../filebrowser/juce_FileListComponent.h | 2 +- .../filebrowser/juce_FileTreeComponent.cpp | 2 +- src/gui/components/juce_Component.cpp | 406 ++++---- src/gui/components/juce_Component.h | 34 +- .../juce_KeyMappingEditorComponent.cpp | 2 +- .../keyboard/juce_KeyPressMappingSet.cpp | 14 +- .../layout/juce_ComponentAnimator.cpp | 8 +- .../layout/juce_TabbedButtonBar.cpp | 2 +- .../lookandfeel/juce_LookAndFeel.cpp | 4 +- .../properties/juce_SliderPropertyComponent.h | 2 - .../juce_AudioDeviceSelectorComponent.cpp | 4 +- .../juce_AudioDeviceSelectorComponent.h | 2 +- .../special/juce_ColourSelector.cpp | 2 +- .../components/special/juce_ColourSelector.h | 5 +- .../special/juce_MidiKeyboardComponent.cpp | 6 +- src/gui/graphics/contexts/juce_Graphics.cpp | 5 + src/gui/graphics/contexts/juce_Graphics.h | 12 +- src/juce_app_includes.h | 3 - src/native/mac/juce_mac_AudioCDBurner.mm | 2 +- .../windows/juce_win32_AudioCDReader.cpp | 2 +- .../windows/juce_win32_CameraDevice.cpp | 4 +- src/native/windows/juce_win32_Windowing.cpp | 295 +++--- src/utilities/juce_FileBasedDocument.cpp | 4 +- src/utilities/juce_PropertiesFile.cpp | 3 +- src/utilities/juce_SelectedItemSet.h | 4 +- src/utilities/juce_UndoManager.cpp | 8 +- 110 files changed, 1317 insertions(+), 1598 deletions(-) delete mode 100644 src/events/juce_ChangeListenerList.cpp delete mode 100644 src/events/juce_ChangeListenerList.h diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index b40eb105a9..794f302f33 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -122,7 +122,6 @@ OBJECTS := \ $(OBJDIR)/juce_ActionListenerList_9e099ae4.o \ $(OBJDIR)/juce_AsyncUpdater_a7e1cb89.o \ $(OBJDIR)/juce_ChangeBroadcaster_3eb8fecc.o \ - $(OBJDIR)/juce_ChangeListenerList_c2dafc5e.o \ $(OBJDIR)/juce_InterprocessConnection_13086b6d.o \ $(OBJDIR)/juce_InterprocessConnectionServer_a4d7b350.o \ $(OBJDIR)/juce_Message_ac79f635.o \ @@ -779,11 +778,6 @@ $(OBJDIR)/juce_ChangeBroadcaster_3eb8fecc.o: ../../src/events/juce_ChangeBroadca @echo "Compiling juce_ChangeBroadcaster.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" -$(OBJDIR)/juce_ChangeListenerList_c2dafc5e.o: ../../src/events/juce_ChangeListenerList.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling juce_ChangeListenerList.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - $(OBJDIR)/juce_InterprocessConnection_13086b6d.o: ../../src/events/juce_InterprocessConnection.cpp -@mkdir -p $(OBJDIR) @echo "Compiling juce_InterprocessConnection.cpp" diff --git a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj index a15c9f6f77..0b6da29176 100644 --- a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj @@ -91,7 +91,6 @@ 5BE4BAA99FDC6F1B3177096F = { isa = PBXBuildFile; fileRef = 5A46476E16BA4F9DA95E9E6A; }; 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; - 769227C780221EE89081BDFF = { isa = PBXBuildFile; fileRef = F978BD0E708FA56FD1EAE238; }; 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; 9DF800566462E24A14246EAE = { isa = PBXBuildFile; fileRef = 843A7B398E9411F0AF28D65D; }; 89F0DA39878F8A41E60B8C67 = { isa = PBXBuildFile; fileRef = 9CF077D3ED7B7B56F351AAF6; }; @@ -563,8 +562,6 @@ B80F8CD026033ACCCE11A1A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeBroadcaster.cpp; path = ../../src/events/juce_ChangeBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; 5F454A6B5A82ECE2396C5716 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeBroadcaster.h; path = ../../src/events/juce_ChangeBroadcaster.h; sourceTree = SOURCE_ROOT; }; B2D08C8EEE3E22026533D2EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListener.h; path = ../../src/events/juce_ChangeListener.h; sourceTree = SOURCE_ROOT; }; - F978BD0E708FA56FD1EAE238 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeListenerList.cpp; path = ../../src/events/juce_ChangeListenerList.cpp; sourceTree = SOURCE_ROOT; }; - 4D15D2E39EAC0DDFCFC2FCE6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListenerList.h; path = ../../src/events/juce_ChangeListenerList.h; sourceTree = SOURCE_ROOT; }; AE68ECB6E063BD8D4984C0B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnection.cpp; path = ../../src/events/juce_InterprocessConnection.cpp; sourceTree = SOURCE_ROOT; }; 4B935D7360C9F166C80A158D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnection.h; path = ../../src/events/juce_InterprocessConnection.h; sourceTree = SOURCE_ROOT; }; 843A7B398E9411F0AF28D65D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnectionServer.cpp; path = ../../src/events/juce_InterprocessConnectionServer.cpp; sourceTree = SOURCE_ROOT; }; @@ -1293,8 +1290,6 @@ B80F8CD026033ACCCE11A1A4, 5F454A6B5A82ECE2396C5716, B2D08C8EEE3E22026533D2EA, - F978BD0E708FA56FD1EAE238, - 4D15D2E39EAC0DDFCFC2FCE6, AE68ECB6E063BD8D4984C0B3, 4B935D7360C9F166C80A158D, 843A7B398E9411F0AF28D65D, @@ -2016,7 +2011,6 @@ 5BE4BAA99FDC6F1B3177096F, 55737E2F1817DE642AA7DA05, 6D2C50B0A69855A7F8C062E7, - 769227C780221EE89081BDFF, 70EE7A1273945B62B013DB43, 9DF800566462E24A14246EAE, 89F0DA39878F8A41E60B8C67, diff --git a/Builds/VisualStudio2005/Juce.vcproj b/Builds/VisualStudio2005/Juce.vcproj index 8454b730c9..ce011d1ca4 100644 --- a/Builds/VisualStudio2005/Juce.vcproj +++ b/Builds/VisualStudio2005/Juce.vcproj @@ -430,8 +430,6 @@ - - diff --git a/Builds/VisualStudio2008/Juce.vcproj b/Builds/VisualStudio2008/Juce.vcproj index 408d6dcbd1..04fe6697b7 100644 --- a/Builds/VisualStudio2008/Juce.vcproj +++ b/Builds/VisualStudio2008/Juce.vcproj @@ -430,8 +430,6 @@ - - diff --git a/Builds/VisualStudio2008_DLL/Juce.vcproj b/Builds/VisualStudio2008_DLL/Juce.vcproj index 1e0c471ccc..d72532cbaa 100644 --- a/Builds/VisualStudio2008_DLL/Juce.vcproj +++ b/Builds/VisualStudio2008_DLL/Juce.vcproj @@ -432,8 +432,6 @@ - - diff --git a/Builds/VisualStudio2010/Juce.vcxproj b/Builds/VisualStudio2010/Juce.vcxproj index 9c753e4dd2..421c1f46c2 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj +++ b/Builds/VisualStudio2010/Juce.vcxproj @@ -205,7 +205,6 @@ - @@ -556,7 +555,6 @@ - diff --git a/Builds/VisualStudio2010/Juce.vcxproj.filters b/Builds/VisualStudio2010/Juce.vcxproj.filters index cb6dde432f..6da4c7d4b9 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj.filters +++ b/Builds/VisualStudio2010/Juce.vcxproj.filters @@ -463,9 +463,6 @@ Juce\Source\events - - Juce\Source\events - Juce\Source\events @@ -1590,9 +1587,6 @@ Juce\Source\events - - Juce\Source\events - Juce\Source\events diff --git a/Builds/iPhone/Juce.xcodeproj/project.pbxproj b/Builds/iPhone/Juce.xcodeproj/project.pbxproj index 8edaa5342c..cdf9877597 100644 --- a/Builds/iPhone/Juce.xcodeproj/project.pbxproj +++ b/Builds/iPhone/Juce.xcodeproj/project.pbxproj @@ -91,7 +91,6 @@ 5BE4BAA99FDC6F1B3177096F = { isa = PBXBuildFile; fileRef = 5A46476E16BA4F9DA95E9E6A; }; 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; - 769227C780221EE89081BDFF = { isa = PBXBuildFile; fileRef = F978BD0E708FA56FD1EAE238; }; 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; 9DF800566462E24A14246EAE = { isa = PBXBuildFile; fileRef = 843A7B398E9411F0AF28D65D; }; 89F0DA39878F8A41E60B8C67 = { isa = PBXBuildFile; fileRef = 9CF077D3ED7B7B56F351AAF6; }; @@ -563,8 +562,6 @@ B80F8CD026033ACCCE11A1A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeBroadcaster.cpp; path = ../../src/events/juce_ChangeBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; 5F454A6B5A82ECE2396C5716 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeBroadcaster.h; path = ../../src/events/juce_ChangeBroadcaster.h; sourceTree = SOURCE_ROOT; }; B2D08C8EEE3E22026533D2EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListener.h; path = ../../src/events/juce_ChangeListener.h; sourceTree = SOURCE_ROOT; }; - F978BD0E708FA56FD1EAE238 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeListenerList.cpp; path = ../../src/events/juce_ChangeListenerList.cpp; sourceTree = SOURCE_ROOT; }; - 4D15D2E39EAC0DDFCFC2FCE6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListenerList.h; path = ../../src/events/juce_ChangeListenerList.h; sourceTree = SOURCE_ROOT; }; AE68ECB6E063BD8D4984C0B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnection.cpp; path = ../../src/events/juce_InterprocessConnection.cpp; sourceTree = SOURCE_ROOT; }; 4B935D7360C9F166C80A158D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnection.h; path = ../../src/events/juce_InterprocessConnection.h; sourceTree = SOURCE_ROOT; }; 843A7B398E9411F0AF28D65D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnectionServer.cpp; path = ../../src/events/juce_InterprocessConnectionServer.cpp; sourceTree = SOURCE_ROOT; }; @@ -1293,8 +1290,6 @@ B80F8CD026033ACCCE11A1A4, 5F454A6B5A82ECE2396C5716, B2D08C8EEE3E22026533D2EA, - F978BD0E708FA56FD1EAE238, - 4D15D2E39EAC0DDFCFC2FCE6, AE68ECB6E063BD8D4984C0B3, 4B935D7360C9F166C80A158D, 843A7B398E9411F0AF28D65D, @@ -2016,7 +2011,6 @@ 5BE4BAA99FDC6F1B3177096F, 55737E2F1817DE642AA7DA05, 6D2C50B0A69855A7F8C062E7, - 769227C780221EE89081BDFF, 70EE7A1273945B62B013DB43, 9DF800566462E24A14246EAE, 89F0DA39878F8A41E60B8C67, diff --git a/Juce.jucer b/Juce.jucer index 17ed25708a..050e81d2fa 100644 --- a/Juce.jucer +++ b/Juce.jucer @@ -507,10 +507,6 @@ file="src/events/juce_ChangeBroadcaster.h"/> - - setAttribute ("StringPooling", "true"); } - compiler->setAttribute ("AdditionalIncludeDirectories", getHeaderSearchPaths (config).joinIntoString (";")); + compiler->setAttribute ("AdditionalIncludeDirectories", replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (";"))); compiler->setAttribute ("PreprocessorDefinitions", getPreprocessorDefs (config, ";")); compiler->setAttribute ("RuntimeLibrary", isRTAS() ? (isDebug ? 3 : 2) // MT DLL : (isDebug ? 1 : 0)); // MT static @@ -988,7 +988,7 @@ private: << "# ADD BASE CPP /nologo /W3 /GX /" << optimisationFlag << " /D " << defines << " /YX /FD /c " << extraDebugFlags << " /Zm1024" << newLine << "# ADD CPP /nologo " << (isDebug ? "/MTd" : "/MT") << " /W3 /GR /GX /" << optimisationFlag - << " /I " << getHeaderSearchPaths (config).joinIntoString (" /I ") + << " /I " << replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" /I ")) << " /D " << defines << " /D \"_UNICODE\" /D \"UNICODE\" /FD /c /Zm1024 " << extraDebugFlags << " " << replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim() << newLine; diff --git a/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h b/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h index 1fe3956ac9..65ceb84427 100644 --- a/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h +++ b/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h @@ -167,7 +167,7 @@ private: headerPaths.insert (0, juceWrapperFolder.toUnixStyle()); for (int i = 0; i < headerPaths.size(); ++i) - out << " -I " << FileHelpers::unixStylePath (headerPaths[i]).quoted(); + out << " -I " << FileHelpers::unixStylePath (replacePreprocessorTokens (config, headerPaths[i])).quoted(); } void writeCppFlags (OutputStream& out, const Project::BuildConfiguration& config) diff --git a/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_XCode.h b/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_XCode.h index e5a5375b9d..f2b4dd38d2 100644 --- a/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_XCode.h +++ b/extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_XCode.h @@ -518,7 +518,7 @@ private: StringArray s; s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\""); s.add ("PREBINDING = NO"); - s.add ("HEADER_SEARCH_PATHS = \"" + getHeaderSearchPaths (config).joinIntoString (" ") + " $(inherited)\""); + s.add ("HEADER_SEARCH_PATHS = \"" + replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" ")) + " $(inherited)\""); s.add ("GCC_OPTIMIZATION_LEVEL = " + config.getGCCOptimisationFlag()); s.add ("INFOPLIST_FILE = " + infoPlistFile.getFileName()); diff --git a/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.cpp b/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.cpp index 5d53a9d811..5011cfb2e6 100644 --- a/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.cpp +++ b/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.cpp @@ -127,7 +127,7 @@ ProjectInformationComponent::ProjectInformationComponent (Project& project_) #if JUCE_MAC || JUCE_WINDOWS openProjectButton.setCommandToTrigger (commandManager, CommandIDs::openInIDE, true); openProjectButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::openInIDE)); - + saveAndOpenButton.setCommandToTrigger (commandManager, CommandIDs::saveAndOpenInIDE, true); saveAndOpenButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::saveAndOpenInIDE)); #else @@ -341,7 +341,7 @@ void ProjectInformationComponent::showExporterMenu() project.addNewExporter (r - 10000); } -void ProjectInformationComponent::changeListenerCallback (void*) +void ProjectInformationComponent::changeListenerCallback (ChangeBroadcaster*) { updateConfigTabs(); } diff --git a/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.h b/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.h index ed062c25aa..ab040ef048 100644 --- a/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.h +++ b/extras/Jucer (experimental)/Source/Project/jucer_ProjectInformationComponent.h @@ -42,7 +42,7 @@ public: //============================================================================== //[UserMethods] -- You can add your own custom methods in this section. - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void rebuildConfigTabs(); //[/UserMethods] diff --git a/extras/audio plugin host/Source/FilterGraph.h b/extras/audio plugin host/Source/FilterGraph.h index 38bc7c217a..424d1f6c14 100644 --- a/extras/audio plugin host/Source/FilterGraph.h +++ b/extras/audio plugin host/Source/FilterGraph.h @@ -235,7 +235,7 @@ public: void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); //============================================================================== static int compareElements (FilterInGraph* const first, FilterInGraph* const second) throw(); diff --git a/extras/audio plugin host/Source/GraphEditorPanel.cpp b/extras/audio plugin host/Source/GraphEditorPanel.cpp index 94348d94a1..c2c9237e10 100644 --- a/extras/audio plugin host/Source/GraphEditorPanel.cpp +++ b/extras/audio plugin host/Source/GraphEditorPanel.cpp @@ -811,7 +811,7 @@ void GraphEditorPanel::resized() updateComponents(); } -void GraphEditorPanel::changeListenerCallback (void*) +void GraphEditorPanel::changeListenerCallback (ChangeBroadcaster*) { updateComponents(); } diff --git a/extras/audio plugin host/Source/GraphEditorPanel.h b/extras/audio plugin host/Source/GraphEditorPanel.h index eefbaf9362..e47e9eba3e 100644 --- a/extras/audio plugin host/Source/GraphEditorPanel.h +++ b/extras/audio plugin host/Source/GraphEditorPanel.h @@ -54,7 +54,7 @@ public: PinComponent* findPinAt (const int x, const int y) const; void resized(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void updateComponents(); //============================================================================== diff --git a/extras/audio plugin host/Source/MainHostWindow.cpp b/extras/audio plugin host/Source/MainHostWindow.cpp index 203f068f1e..26e59aa8f6 100644 --- a/extras/audio plugin host/Source/MainHostWindow.cpp +++ b/extras/audio plugin host/Source/MainHostWindow.cpp @@ -158,7 +158,7 @@ bool MainHostWindow::tryToQuitApplication() return false; } -void MainHostWindow::changeListenerCallback (void*) +void MainHostWindow::changeListenerCallback (ChangeBroadcaster*) { menuItemsChanged(); diff --git a/extras/audio plugin host/Source/MainHostWindow.h b/extras/audio plugin host/Source/MainHostWindow.h index 4afd1a6fa1..e2e3dd6d66 100644 --- a/extras/audio plugin host/Source/MainHostWindow.h +++ b/extras/audio plugin host/Source/MainHostWindow.h @@ -60,7 +60,7 @@ public: //============================================================================== void closeButtonPressed(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); bool isInterestedInFileDrag (const StringArray& files); void fileDragEnter (const StringArray& files, int, int); diff --git a/extras/juce demo/Builds/MacOSX/Icon.icns b/extras/juce demo/Builds/MacOSX/Icon.icns index fea3a04779b05729d6eec816a10b2bd38fc4c9d6..397a57cec2aa35e38f0ff96cb8c6bec9f5e104ac 100644 GIT binary patch literal 81944 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 E0G6?2yZ`_I literal 81944 zcmeHQ2YeO9*1rioB!Q5S010U%kdQ(NkU&fb1VZnEAUzb3j-YgHdMvA`oIlte@-FvgUGkf|ub7uCzL8Hf8oRX?M zI3cFK#mQ3E@?YAVFm46TI3|>|K`DHe29&V@ACgcG;9`REIJO7#|9QT;R^5yD<^5G( zs&6$Ge*V*n1_Nds6YnJeqyy@|83uc{wfBn;P!GI&WD_N%wrrar-Q$|S-(uTAm?V{<~pxu&958e0T(j@;U z-mK>~?5XZ;TD7Vbm;j{^2Z66|yD#t0e%K%TW&a$9;suV6<5V_6*@u7l07%K9Wk+|j ztW*C|CsS9~0Mr6deq(^-_^Kr>$>9~sJT$+3?91=fExTq@ueih8Tll7@)pNSJGtwfy zuWP`bnijFs*CKWW0&3VG#Q46`&m#8J;(1PDZyn3^T~U_vJ7b&I3A9RdV%9K>jd)eKYRcrIB52CFO74EFGY9ST5kYlED#V1 zpq_5zUb1AX1dlSk`-fC~`i;b(H5)qDJDHZ`DfWQYd!h__?yU`4*0YFx@lN8$rq1H$ zl#=4tF6G2;_q&RtsTIVD;hqMJ@D#rfa1+1vag+c5C8Y$;cM|&=8MY8!Rm{ng60jIHY407i=A;`jmq952Vs@hjWF=i>9xp8bE<2ljNQ zeAv^SI+eCI2tXO5?rl=JY{@=@{L4Q7@t_VnzG)qLeNSvTu^aT+6(ngR_BC-52iunx zNBdV0XD3w^>GOib^~K>LImwN-QkuiyBn0)`c3x+b6-mi@7keqi8wd_94E)i zadZ594tqZM|Edr2LwDNOFhCtZ(=gYP!yc|z<(*YM?>YS~9hSK&Mb>UVyE2P7}7#Wi2y`gOcVL!qy% zC$7F&Q=CCRNBUNf{r&*`u(P`4guEO%wiPa`O9qXIiu$m|Nmwc@FfX~V2RemDz@V{;oNPA}hdEKn* z=`Sn4j`~u`d!nCf*$H!7)ZMVYWAyd32q&>S6tWIkJJ_+b_~X&)BICnoAt=+N2lY1S zA!Rwgbj~Y3sPlM#@&fx~zvQ;}||aeI439dtHE^{wJEEJ$an|kCJ)j;h0-t48?eg`m$}i&?+x} z(AekOP3=R@ZwrS_2mIc*ocQzc>QeV+d_cO}^fT$8xB2 z+y8h>n_;sr8Sh7lD=*X(7iRm5BfZKA_@F1YMwiy5L1px6w zJSknEaEPD&YnmD}^*v=?>3e18$@5C)sS{hrRdN4vL)Yl^v^u3k8shT3h~Z8Q^AH*D zf(G=(ly1+Yk3CIow5E(M2@v8#(hWeGk&Y|!$qP$EjqA3J65^*9ggEx85P$3t;?KQ8 zoLDQw56=j(X#n^P`d{`{9eqGYNWQa;jeg}P+<2J9V6oK z?9_SGeM%Q7zd+f8|2DtCp7!Kr>U+k(@r$DlK1av6O8jlG4~Is)(@eE;qST_~&MgO#91wmd|-p-;;C7p;Ui zyG;n|Wsz;mxFE#kBSIWrBE;9J7(uzzrN<6XMzlA%1xS ze1P*Q*V*y_Xiq-+W-zWfYmoiS??PYwqR?L$CA3F73hjyeg#P*@p>O<1h)aLoW{q3u z^X#{{b}0J5cs>RXIpTv)V}yohIya??_`Z(CnigjHc}r5I5tExYXas!FF9-q9F48A9 z+XFKX;9q~sM*1sTPyOWzpgvRjp1yrOKs?~(_u52R_cU;d4c0J^D+4vIVkFaA7Y(!*t^Snnv{L+t;7K0r7pm14^(_$uLp42->Q-JwD-!^ zllIJcF&|F7Mtx5nZxilYWyPxILDH|MJv`LSMds#YuEva~JC5OJEsp>$@%il-$RFsd z1ML}*^FPlDebW-5J=IrOyHya@HlSM@XJLi^sLkpo^q;@Oxj30J`dOllE}*%hJ?+L9 zDMH-1AjGW<$njFp-bU*VC2$|!%LKePc_Rtu!~;5&5!&LZLR^5}$bjx)`-A!bc7Z;D zv_13_O}q^q$Nb^}h5vv8~V7>F47(Z0vI1rhLm6Uchm!l_8c4Ko_?O9 zJ#9VbNE!p?FHR0Sz2lw=VmI=qKevEyzYsD)pPsPXgc~!Ss7FcnRgm4Cj{(Q~C3?k~ z<3j)NX`zp5B=K);0y+>Vr>#L70%?RCzO}Wp(AWOQxbB?d0qPLahWBm=+i}p~r}v*U zu1Usq9ZF`UyO{@g+#b9^V4u_z$Pa5%Tf-k%D#VpbMt>K76=KUU!~W1eRnJB}V2c^k zp9&VgBs(*wd^|11cgO=ZTpI#kjEg8cl%c;X5146B9i`-+ehgzf+BEvP<0sbk;CveS zTpU0ShxvH15qZ^|VmZo<^yzvEar$cmpBd1xTUH5cpX$O2pFz@`w4zLs7LfTYvf3WM zLw{@cc?t2Gjdy;0&afej-9CWdxaUdZ-oO87$aHhkG8fus;RW&m`k`HjGsdJ(Ocwf{ z4MJRpJz+cW7W94+`lSxD@j7Ez<}EkIiJNalh+lyh@W7!hP09})>|cgH5@m-n^mpU| zd)iY+DY;j)r`!*Jpk~FRn;VuAyWry=>E|Z2WxzXay+fG?K1dhZ<5kcL-_JLEIiOHK zvR`PgJ|e6sz%k|8EQ49-0a}>9lQ+l%un*!U=yCZs!QoX7Z)xlzc4EHlDCSr-(w6$(Vg3de^xc$?6g!p}# zfw${dVc+484T%ueM!;)cbhDZMJjONJy&jPDjmACqJR!vU&2mF@+ zI*f$f`QtSF^mIcP+x!Zt`{~aYhU{nQ-{z0NUTMRi`;b$RjsCz#{*VRmfmsjGFN7^1 zzV?x`6jZjG#?wDa6&w;J-h?e>kQN zGUueI8>tIXZ*Xa0F!1Ljb_Q9#S>Ge3b!C?_j18GbVJ?mNRN|j8S8?!wqP;oJ;~1E) zss-R2PKSEcJh!ZC9j0xk&Tmx`^Ps5u)Y@9LAj0P``l#W&7LI_S%u6WRk&kaNfl z2X!%hvKPky|A_OM&xh^TPaYQ5F69kfU6}pZ-%I(S^9IUi6^GwL&bS)r4?HNG z@RK~ixCplL#+wm{m7TR6ftFRPyVPw89CPl7IU?enxnjoKMV%ia?Fpnk`%=C> z>~4?0f_|rNrwopPZ%LnAH*z)lcb^u$?5nXeHb9<0KLp;pc?veM*`2DLTkJyZNAyxQ@%d)`OIDROKDX1%x2bH zV*c*p9OyO1c#d>F?H&E!%?}{oc2$Ure+q3zCnJYa6m(a(C;ger?OEB#2^vy}9PTTI zuddE3>QCr3?FHx{CNP=9mO219QFOQe#Js`9r-F3Mll=NkWA8!T8$~n$zKM6nTFeou zn1FUb`GYttlt$Vsn@?Lqn`8F(=VHfwfq8qx@RWT=aUSPG=<{)&gblu!#@I~y_mEG8qoVqx4TcTSKX@9p-ztZoJwK{= z=}$f%4tcji{!e}eI~WL@AO>f0t6csKilMd1tB>wVf9 zv(2YJGPG-A?2VmasDXv+Ova^2fSd=pYul43;DT6LC(#jKj$S8i{yp=)B(WbNz|Gmrar!;oOj2rFvmv(N9r&s_q4|19#L z8gefGo+YfP=`8%1I|qKC55QRbVfbBVj~eu!(Y1K#&$-3XjSU$%{0?y9Z|KBKImyNj zzz?8qWsT|1YL+c)dp7A_+uxUT;5C(&(GXFxmOgeEMPQ`?z zU0H}AykM5MBaSosJx#wpBpI?Kg9ol^IGju=c&)O=~SBPs@ zgte=y5$oB{*(q8T$tUPfUjsD)`o7Hu{V`W3=lhGKKRaDS{{tZQegpe|9{5PM<$xU7 zO9y&@HF5B*&rS7Z9oeNFF)kCww@XX{J!l6Q6EZF{#{;BeetAI2KJ5s3i9AK#B9GDE zZv{x(*fCtLgZiayX`|MW^^Q5wpYz|G(`9`Xd@pTA7sKzr+xfP;r5F8g`heS36*K+8 zdyGFHf$d>C@p)O~HXm8?U+PYugHJ*R>SGVWei_`z3 z|Ao0EeGPK(Xx2$Bib4KCd-epQkk%g~7s@=4TyqeBPaCkVng3JxQ+$BhA?wn*;$U0n8{0#jW)5%DlsbTU zIQoKt0On}!MhB4oO7@xSG24B{dz}E=*L1F?rg7^v~{Aujl7F(&DvAatK!D9*Z*mV+|qZfUW&&VD1rgXWO?(h<98-^D2h@ z|Dpxvz2Ou7_^c2|KZ0#oCB%^rQS&wx^8oM>Sf@n)i8V12$G{`jxBfB1Pwc90*|@TI z^IqF@q(wPR?hzTJ zbb#^$n5$DdATKt6^k?3Hu>-GDd0yt4Iq%RBu;Yu?Va!E~D~pihXZ>2PGEdr*PfVcZ zyfzOu)=@AQleSi9$ctHHi&z(s{;bJB+|RmTZNZSDp+EaUu0bE)6tcX}pzOha8};F* zHW+ij{1xGl{@rIrZ5!r?t*mK%u#U_TYIAxC{lp>TT3$o?(`HC~0M0`%YL$5E$~zBx7W2+w28#~6Zs1pNu-8Cw9RjBF8ic1vUlS<`Wg z>$7r|eewtLKCIdQu)1O6Xy>G@!*|-bjs3yn=Z$B)cwT64KW5N_^;5*5lBL4> zSkocnke9|4e*TyCp7lyy+-}qU^6!xKEykP|pZ3gAp}jN~b|C=v2YP~WDeVw_A^M6u z=3HoZFQM=F(!kID=L{c#bLWh;P&0P%nPBd3a|`vgqng(6YXdqlMq{j|@&WYYlplyg zhfV2z`hBhd>JG*d)Ft#Q+5wh*G@z}%9rL?~x|GJcO!S{4{cUvTI>`;aVB226TAbHz z!```|eQ%={YIPj!-fH6+`S<4?sQn2y;-$i(ySfkQ4;{nx8{*bYq5XSi;nJV?XPn3N z2UtfUGzhr4LD%UY%@@|rs5u~yklt!+jy{<$>RLhQ#||QIb_z1z1@;3m7j*z?E3}X6 zh+kTxcG%DI{^9{0=$|n^L!BK2F#CZy*#Od?vhOJ7Ylh!b>jhN%d1L!eiGMDgWfM2ys-Bv!#CzX&m9xm<2`^Mn=H^TaD<=y{zm%H zCNl?o6ZIcU7Zl$7FUQC_GAXl&?^WYmQ~Do5e{YV^x_cOP>y&Rt>r3pPhxdeT(B68~ zxZ8m@482JmK>33ocoKVIV2^|&n^UUy0IjI2sk1`?Dj$@a4Ipng^7}Z?$b8S-sm)m!q5opydDJ)P zt6zZ+=xz8mcQe-sUeOSzN?nrv6Y}VZkgrg~24H_0&JF&6^$^&%?BR}$q8!-(b1nen z%+i$Z&&lsw_GWSjbB;3al<^T_R!8zr+SA@2de5LKXiIu)siB6hqrOu>9oeI@&>rh7 z^sn9%`f=zt*2c+p1Bn?P8wx|edI|gwzn~B13}_RHL(Uu9%Sv9pll~mTFvK8;KlQCE z3hw_=M+2l!aUMFFjWU1y7g_Ts*8}i***76C<20W`9eBSl?)NM1d&Q`cW-g630P{lJ zn}~T>>`nFV^9jLb8xROeD;q%D?#Kq1bwB++>I~|R7yx6+)JUI7KdfyVE_TB9pPN+0 z(EWGJ@zN)O-rqgLc>c4P-^DzuT%&`0tE3lcrhv~xoIn>#xVNIv=G<@ShabPg{M<3) zKIXs24hVf-f1&m8HE2d&kai&-I3@lWYYu`A!x!gp?;ya)T_T;fRNzxHmFL)1?kgik+CXg#YMbjSbme9xTv zBz~x0;19{hb&Q|J+wzB?Kl1O_UqPK~-(%>Nfu=IzJ8{zf){Y^6iS5KFG> ziZ~#|pabXL;0ylPyo8<>YI*DV_6<6KZubDpxgf@M^zkU~s*(QG31+`P1mCGUs6%>J zEakj$X}c(q7Gx2}217?P?zH#)WKIwAe+a(al`GN?N}Zlp+S@;?jZw2_|E*p`q6d&LB6D(A#=1VIrYo`@qU@HlWj3Sc`&E`&G*dDG3CEc0M?T3#+a`g>xvcqX#-Guf%Sv> z&JfF%)g7a|f_BXSoU^L|U>@HcKp&6vR*m$hPM~g}j_?IgXDGjaL?h2~`@U@MFMYp1 zrd2g^evCWJzCY>z3G@;8Qa|{E5!X-3HW59F9T!u{w!0{1E}r;&H4L$ad>^Ev!K=Z&U!5c*HsjJ`pCu0z*4!G2KY^J;^# z>nEq*(ZANUq7d5k@8acWk@H2~IScK{2drP@J}mIpwbid0 zx;rnrIH%`z^gr?eZAyo7SXbFn=wD;5#N7Tog<9E{K#y{U9?nh{NlWmEe$a^1v}tXP z``Ys>d5^Rw@1a&r!(K4r{7Km(`AwUKxxuxEu_&tsN-9&=qg=c;aMnByF1;JzqypyCPAPx65aXwY8hyEjOb$UoG{zof}{ zS*{ajtS7GnE!FkJC44jeM?;RaXHpHDU>-A%NmuSO06x-}JcIn(HKU8qq3`M2a||iC zm%49Je$w_}-1@su7|(j}E#N)ekUi1>`<}7}Z*N`8&7F0eUYXN0obxrDw}}EUm&=^4 z@&Rxt8|hD*K-)kYL0dtaLEF&{@b;p<9YmTh;(qWR>rNc5XoF(APR@P}ubU%(Urm8;=mz z)aMwtKDRGyZkll(d=KjrJwXSXJQjtH%MMrUi}p{h9l>ypt~Bz0GUo#N+ww6#COK!o z2VDMk@0Rodk^pr9!2r^iK0fKqM%_2#yYdmeEwMtk3n z`JPW2V;v9jQm2mz>%ba@?_bpPH{*$XAY(wpjYA_q_xB~ej_Cl4VHbxVTw;ZxXO$j#ul;-tHJPDTH@7#G`_O$Oen z11SIW$uJ*qxJP-e5%_vp+uAA@%sh^L9soZ{`qLLE2cU02AE6eY5ug>I7vS5EV%%ko z=c$oi=a0{kWF()+NO12a(hByi=E|XDI4V;z-5i=*S1e&zbaBzCZH>^c6UNNZ+9kV9%#X0dkM? zvy*%b+i#!uW6p0~Cj(!<()Y*Qpv0q1mlic%vb#ThHs%i&4#WKN6*)fcA!9}SpmI(6 z2Tw`<(0@nlz*v*IgFM5AS{?o63C6jML9^?pIDaSoC#N9JLj0G$5Anh!STf$(z{`m4NOZTzl$|9&_=u%X92a&6b2tnp^8mwoI< z+rN2`fwP~!HRO-}nY}MvoOohi)brHk^#8c-{@2~c7_kSChJ8S+jbYp0KtACn<{B=X z6WZb_LdUuU+29wlUQ5<(@mUxH6!-WY^+)qV?fBhjsAa3^VPQ3 zu>7>XOWnSpA7ePulXO+}0F-w&N3mZde&>8Y^GE#w$G3EdVqRIKKN%qP%N_J5|LvG4 z(Z)Tmq@K)ePTSG571eLF37qeP?Uwmur3*fuFX#Ta7A3P`Ur&AG2binF-V@C8$e8Xg z)?;S8kp8F-66eoA2OLGr*Dfplkpsfs<62rx%b|^}Ymk1VBk9SQ-XB0YXROa=roXw~ zgE0g1z5@WKwzUZpduyTA^QmA%{%L2-u&gHX-%lF!-@N>`uWcUpUwuqnKpoDykNHE8 z_d95iT*n8&*7ViL9Z+B3y+N6_zBv8Z-0+0Fr8W%y7X0kYS`f4R!~Ul~6`)~1>&ttCTXKfFf{@EKw z?uY($ZqHII|F_95^S$&1I(Z50fd<%5%r0+aqd(V#ab2RuH31!wLn1FoUj{nlueN8z z7wJEuzO1JZH;zO8QNw1YKkW0Rc|qE)aLdt+$$q3C=}3Aq2M`EQIRG4H%0KCEKkviq zQUPbTwyco@{V^8SvL1X}%8|C@*`mw+<%?fHcgihe0n)I$r_la2LWo^!Ve8Kt)INC- zYk*cmj;_k@vIb$_H^%>17lIr!bG_1sfc;SMDKl~wL zWVq7rJZ{Y8=ZjX9twIFSojx1u3V<)`tb64gf2N{`{ntN#O=yELuZX!t$q%pr)?QeP z-o-;`jIY&RZR7*)2aJ7$r5;dmz+Yh#=*N)$Pxdr;^z0U64tTjO{-^&(`ad0@?FxhZ zx9}tVNXPupzYflC3SjPN5a8t2cH#0Jc-Vu)vHhp~A6bt0AGv?b&q=%&COz|dFVe*3 z>&f^I^->yZ&Mv@LVnZHB|MXQOKS{q1HeP!WI7>f|vEM>&r-G65qmD(rl8g;ev&W{x zFVtW&tV1IWzmR;z{)&?iY`IR>7s$qXS;pckFz-$~O#0LQ&+*r=AH$K2DFKB+|D)e@ ziIHo()1N^6hx^~*|FaJ580MsIA@|SySvmimSDF>pd90(Pjb~lwm^h(rT?x6i(Vg`B z=3}9w-p`8nhDn{kxR5cy!%bxk81n;G)E~(l0C|WxW#|wMdycX`RK|!z`dQR$BWBE; zU*dVi#RD8O@TD(b#F1c*<5gS!AO4`CKm32h>DrD^`2X$03rc@pzyHgw4Q2lSJl?x? zXZ(-cFa3|>pJP1(*7UxJxVkv$&$yg;;d&0@2J)S0-+?0i9BPQ49gK5u9{o7V5P6O? zBmJ@VpL@TG^s~l#bhF>eW7-kU?@%ACdS0Sk?h$_+b!dE6o41 zR}bu&_L(t`osSv5w^~bMi~r9}s>=M&{x3R2=0<-f(3f++j{HAm|Mz@cr<~lond?mC z+)tLePtqU$$B8dN|66i?RL0HrV=wIQq#tol-wuAgKDR&i3;s#!cp^vEi@pnAq!;3N zGu_oVcs=-3=Nb^aGeSRo1baim-#61=oy$*|Q+C4p1mH`YMBatXR_DhxIvj({dr)`q z-sWoy>zMS1{o&sCA_F#SQ-8zvR`D3=kM%&OMpkD2cklALWk~;={J)&&ul)b5?KF!%+K0eZh0&oTN?H zsA~)INxmZe)!dJ)|4Xpte&GXCDw*A31G64MP?wua54aepB?H(?`zf>-)ACW6pKl;2ZK3;{foAHns`;#JS*oTMiL? zB-fLSKs}MohbRK&7uSF&`KMk+9pHhsrEfw0H@w@mG3m$r zkBa|Q4S;?A$4vi7oX>nwN5BBUn^W5~*5w}FSfh4>?^@-4uBuOdE=5fU_wnS&_H8x% zE6RbwbwNLgZ_*R%rL?(ygs%2bW{04=hPn(n=SaUp`sL(32QqIS2k8%=L7zVmw7Vg6 z;8n_QuJpI@HLoX4sE61uWM8h)L%b*(NTeZ;%)LIO&%yEYIr4gc^H_OI*+;#TY!?qe z&T-6r@>&0{XaV~3-PL%nPzK&Dwe;C`jYvPzF}M65>Ce2dKOh2N&i}tKFxc(J&W2^h zKKRyGu@~tb^k?nY+D;&T2I4@>qj6s!6(89@M}EE&Us8`k-%e=-9lPFme*R^ie)BS+ zag8AJ^whbG=}4En^r7hg9CAX4{q%2^89bI>`l$X`D*~OMJ<{CBDcNEVuz{>ywjyU| zZI5|T@&O??J7azZ75B;gDsV^U+DLo*Jp&<^H&CC2H9$9ZH7fDO__|g5ftI=D|5fd0 zC7fFwz5KLs@haC;>0hCCn>?G___F&y`zOCL z=R`gj1H14EViBdQtnd-m{aa`=yU4u&Bws5(fzPY>j`vZ|!r!PznYTtwmCiZ8%b2&| zUJ*->b1}=l^!;MRg(m~Vu3DD#?-DD`Oo*!0$3{oeQ`G>H&gS_)MSl>nfRkV<@5Hd zDfDHFjM!We|2p=CC!P8Q8~X+lH+fk(M$XagFmGmW@%K_Nv|Ev11ia2Kd4{L>4FQV#yMmbw78y9zo z;X7^pKnaY zT>VakE#niuwzgoXfm`B5(h1k+Mvt8SkMZdr&Xf0Ny^qAZyf5S~r|a_aKk_B{*`}Yg z@lA#P@w2z*9oZ}1Q>brQAvCN7*A_kq`<^1Sp>>4zKwZ?h--9~Z0Wy}6wH`eG(7V_- z0rmH+w=v5;<&VBUa&vgUsE&8-YTTcqhQ1T87WfSiUf5M4O7-fz;6)FKYM;mHvuHI9B>F zwmgOQK(vvgx`g=MzFkIb@##|rT)24qzt^BUxSsZtINMy0$>$^Osr$JX4Bj1tcZTSA z&-CIkO~QwOZruUNfck(CKox*HpbS7Yh$DCA-Kh%{5Fg0PXo$TvzCUx{Huw&fS z0WJZY*JEubfop5+bv|h?bw79ldB5NLSCH=uTHdAMDA24Qpgn-G9AkQO?9ZI9YV-m4 zUB!Tm0T=_aW{fcaeMtHetLJq}Fl+$cRVm-ien%ZRbrE=gYeCku!<_I3KrCWH)iiZr z`@HfSVwpFQ(|8#5Oy3(nB5soJ`=YGVPUJ?%yZyhS|4!sB(X>}k=Si9rIsI+Cz~`eL zg#Sm`knLtV>gXmJJfQYbP`Q0YYx_^B`>`)H)@5)HX6ym--sF_H2SG2^{GP{b`tv(|Li&dE5o!VG1JZY(4?$nz`FrE)p8Fd6f8ZUJ;_@?yKUUl2filNNJpg_s zFVH7sZixF9aX*m#i;P;qO~|`(%>Z*pzd`4*9sL<`Q=CBu(&uhzo0sbp{lAAULgPDu zj2r@WwOL+^_?SEZUqsF|b09a*8#tpL&BUio&K-Rx{i*xs1c<%SmK!_jI!&wM?rOIE z^yNYU^zG>5(f6azryA+c@3aZ@4IHfj8id~`zy|DJ-XU7<|8rs}Z2*cbZ2otR^*Y1m-OMp4tiHiw|w)(df6-(Nz1+BNb3be+D! zHowUCLNT{v&h2KwtBD_IgRvj(NpXwsbIfjBx&2Ps+iFGyYw{V>(?>39x~u!swjl1* ze@>&+A!qSd(I31{o5L8GJn;20IUe!dc*saDI)Ji|`Tm=4M~MB{4<35?-G^JojsTsQ zw`mKY4QD=&Hl6uh+IZS}GyU;3vks89!9EYv3co2E@KkJA(5bH)R}(+fv51T}A#5@b_{Ue<}URldNN4?F#ZmG8Uq5^l1~w zS1vLJ-OqiX_k>&0w=^m}wUVprP|%BUdrLqAKuv&(`)T88>nZc*#_#-{wt+T+abgXC ziUU~-mI@dLSog1XF}J7#PLIWVv>fJwv*Q8iD%Ogx?SecJe15zGKwmIKXp9T7AAh0y z_)6C8Kb5?p-bwveFg$Jcb^2P0|*8%?o)9;ZM`G{-_44+G2ji#)#r!Fq)+8HyxNq@%S*h@_9B~pCxUk<(v$Hh7( zypKxUK-_fhJNN*=ucH{iru%O!4j20xTF!57>^9rCvM1?7I<*5(_eTKy0XgY@{988C zpSD5S0COBbT|%8Q1TX=x<;~8q*6#wb7uZD91hFR25xukg2H9twz`D+e39X3rucDT+ zwqf(B`^@wy>SN-WIpo2RE!6X|>F>-g!u(GTG&esh#|2%;+^?)j;1c?k zzBl~7lUS3x)6eqdymoODK|r(aXZ)5I-H+2`qfVf1P;mft26YE@2>nRIdd#_@=v>u zIVC7|pC8?iOJySu*!zJY_>J=i%>eWR$z$ZTO|P|yl>0)U z-b7@)2Rj9xlyebgnODcOW6S|uJ|g8!<2#p%EZ?4sz9s!J_pf0e57v>eajj2*=KmFM z74(zzUx_>b-j64aAQn_>dlVj}>^BnEUJn!du^$iKvA*Kbl!mm)w9TCFX#vQq-;YzX zG^GRV{Xp^({RzgD zt@d<5tfjyGSY}~a8~HALR6o}kaaqpIcT zx{guvVuF2DzP}^rLR%dT2m;WCy8&p^9r^wE`Hn^#KpntXu_AzeU?_lj#AHA>Kq`Q- z#w*>L#AKvlZ5V2f#My~eWG>R79iR>4+{W2&<+JI}4zkq;;JNK-Q`FyW^Dp|A)ffx> zY&Kc{UFNT&Klu*(Olk8|5gWrlK8_er`csIRlqYSi3Z`4{&2u5005jO*rgh?@rd(;uf_ z-WiYtV9urnfPNoyIn3!$p7TO`oF>mBuaIZVu^?j!+7+`7pdT=^jFZ#p4fj-*YXpAl z=?b3}J`49FReUQy;j=8k`XSC|bH1B-KhEza7c&nK*Nm~a_doV369-;}O|tnUsO2v9 z@i6ZLKS=8d-D#VP5^2+HxnGm)L+9T@oOQ5s8ScaT>&oW-^Mbr8jtBmg?9)G|pI#fF z^1ZG&rY+B_?Bi6~$SdR-+70Re+L1tj(gE}X?gtD5JOX&VOH>Uj_8b%YAk$Z0M2^pq z4xkO-oc6_E;oo4+=Zz`FocFcKHDW*Q71VvQeKROCAEjfTpu4VHy<0s%n~ynQ^)5>B zM;hcO@lM%?UzLtLZ(1PreyO+at?4rfcpnMq2ViWT1W>YH1;@1AD&I@`=ckeWj&y+X z1DfOiT>t|B)IZciYv;C!)wiQY^l*0<%w<7u*{>5|{Q~!_-}M+&0Ez+rJZ8)R8Gw@m}$o4R)pfIfc;fOem;x>@!qza;>9)%`d%v)Sta`T?vVVJyIU zVwDdVieu`b*`=JE4y@{2Po!1Dd*FxRxmY81$NT_v8s`9PIbgZ(8hszi0d?Ws%28gf zBV8GD^h6Ewuit~OxI?E9#F=9syLQ(U_K=CzC8A*m5n-oV=uhZ z2mX;c*8|*HVfXpIjh#W3(`#bfo~vKYlXxb+mELcL;}`(_Ghcx6`3oZZxQ%S&0qPIl zi@t;>fchm2&e_ep%F6X3CsB{C(f`Y$2fzcI|6kJ=u561b`%d53h{?b&?d?DS@lO0x@6+e= z2T(`TUn>is|3({58s2T=wY&%K#e2E~s9%BrQGj?r8vtWZWe29?c+KOq9)Q*W=Hy5RrT3|$8M75c@8j|;jXXddP#RDk-~muMA+sIm zgWrb(7!N#A#>ukfnNVlzcFYmt8D!2v+5!7|G0q8W9gg@L^g!djz1IH0h9Axv?ZV;# z`hD;*w6|v%=;yoFS0his7@KQXm}lpE>9I~rn>WCSOA4~Kh~wtGCi`W)k&1mpu*Og} z>s8qO1)zH%Y$4(ynd67dllGuHYbs8S!@GQtSKA$I*)+etH)U!(K-v8EI8Ff61%v=d z57LG7G3)(;$Ubf*n^_0&-qbH%0A&Xn;y4+=xdG-OMgbU`%q?H4MB3ucv7Dn2d!rB+ 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 bR(%)Y>UT8&`H4}mp+DJ-Z}~KE#tr`uLY8y= diff --git a/extras/juce demo/Builds/VisualStudio2005/icon.ico b/extras/juce demo/Builds/VisualStudio2005/icon.ico index 9dfea84c64e909aa654bec54fd80b51e3f96d197..f95f8be2b7b6609a268bb3b4d062d5a1d9baab20 100644 GIT binary patch literal 82726 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 literal 82726 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 literal 82726 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 literal 82726 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 E0G6?2yZ`_I literal 81944 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%0A&Xn;y4+=xdG-OMgbU`%q?H4MB3ucv7Dn2d!rB+ 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 bR(%)Y>UT8&`H4}mp+DJ-Z}~KE#tr`uLY8y= diff --git a/extras/juce demo/Source/demos/AudioDemoPlaybackPage.cpp b/extras/juce demo/Source/demos/AudioDemoPlaybackPage.cpp index 1e57f6049c..50dcd12f61 100644 --- a/extras/juce demo/Source/demos/AudioDemoPlaybackPage.cpp +++ b/extras/juce demo/Source/demos/AudioDemoPlaybackPage.cpp @@ -99,7 +99,7 @@ public: } } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { // this method is called by the thumbnail when it has changed, so we should repaint it.. repaint(); diff --git a/extras/juce demo/Source/demos/WidgetsDemo.cpp b/extras/juce demo/Source/demos/WidgetsDemo.cpp index 9a3bebd020..8c647b178c 100644 --- a/extras/juce demo/Source/demos/WidgetsDemo.cpp +++ b/extras/juce demo/Source/demos/WidgetsDemo.cpp @@ -271,14 +271,11 @@ public: callOut.runModalLoop(); } - void changeListenerCallback (void* source) + void changeListenerCallback (ChangeBroadcaster* source) { - ColourSelector* cs = static_cast (source); + ColourSelector* cs = dynamic_cast (source); - if (cs->getName() == "text") - setColour (TextButton::textColourOffId, cs->getCurrentColour()); - else - setColour (TextButton::buttonColourId, cs->getCurrentColour()); + setColour (TextButton::buttonColourId, cs->getCurrentColour()); } }; diff --git a/extras/the jucer/src/model/components/jucer_GroupComponentHandler.h b/extras/the jucer/src/model/components/jucer_GroupComponentHandler.h index a3210abdb2..f4adfcfec1 100644 --- a/extras/the jucer/src/model/components/jucer_GroupComponentHandler.h +++ b/extras/the jucer/src/model/components/jucer_GroupComponentHandler.h @@ -201,7 +201,7 @@ private: return group->getTextLabelPosition(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: GroupComponent* const group; diff --git a/extras/the jucer/src/model/components/jucer_ImageButtonHandler.h b/extras/the jucer/src/model/components/jucer_ImageButtonHandler.h index 3ed7ba0fc3..ff301b8335 100644 --- a/extras/the jucer/src/model/components/jucer_ImageButtonHandler.h +++ b/extras/the jucer/src/model/components/jucer_ImageButtonHandler.h @@ -508,7 +508,7 @@ public: void resetToDefault() {} - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/components/jucer_JucerComponentHandler.h b/extras/the jucer/src/model/components/jucer_JucerComponentHandler.h index 1147bc35fe..be5752375d 100644 --- a/extras/the jucer/src/model/components/jucer_JucerComponentHandler.h +++ b/extras/the jucer/src/model/components/jucer_JucerComponentHandler.h @@ -192,7 +192,7 @@ private: return component->findFile(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/components/jucer_LabelHandler.h b/extras/the jucer/src/model/components/jucer_LabelHandler.h index 528890a85e..a62adfeef3 100644 --- a/extras/the jucer/src/model/components/jucer_LabelHandler.h +++ b/extras/the jucer/src/model/components/jucer_LabelHandler.h @@ -400,7 +400,7 @@ private: return label->getJustificationType(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: Label* const label; @@ -466,7 +466,7 @@ private: return label->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: Label* const label; @@ -535,7 +535,7 @@ private: return label->getFont().getHeight(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: Label* const label; @@ -621,7 +621,7 @@ private: return 0; } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: Label* const label; diff --git a/extras/the jucer/src/model/components/jucer_TabbedComponentHandler.h b/extras/the jucer/src/model/components/jucer_TabbedComponentHandler.h index 7e084cb3e7..9e182d8d9c 100644 --- a/extras/the jucer/src/model/components/jucer_TabbedComponentHandler.h +++ b/extras/the jucer/src/model/components/jucer_TabbedComponentHandler.h @@ -601,7 +601,7 @@ private: return component->getTabBarDepth(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -868,7 +868,7 @@ private: jassertfalse // shouldn't get called } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: TabbedComponent* component; @@ -1002,7 +1002,7 @@ private: return document.getFile().getSiblingFile (getTabJucerFile (component, tabIndex)); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: TabbedComponent* const component; diff --git a/extras/the jucer/src/model/components/jucer_ViewportHandler.h b/extras/the jucer/src/model/components/jucer_ViewportHandler.h index 1f08d19a99..d03babc977 100644 --- a/extras/the jucer/src/model/components/jucer_ViewportHandler.h +++ b/extras/the jucer/src/model/components/jucer_ViewportHandler.h @@ -400,7 +400,7 @@ private: return component->getScrollBarThickness(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -533,7 +533,7 @@ private: return document.getFile().getSiblingFile (filename); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/documents/jucer_ButtonDocument.cpp b/extras/the jucer/src/model/documents/jucer_ButtonDocument.cpp index c991823196..2762f64be5 100644 --- a/extras/the jucer/src/model/documents/jucer_ButtonDocument.cpp +++ b/extras/the jucer/src/model/documents/jucer_ButtonDocument.cpp @@ -270,7 +270,7 @@ public: } private: - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/paintelements/jucer_ColouredElement.cpp b/extras/the jucer/src/model/paintelements/jucer_ColouredElement.cpp index b4633a9fb5..4e451cf826 100644 --- a/extras/the jucer/src/model/paintelements/jucer_ColouredElement.cpp +++ b/extras/the jucer/src/model/paintelements/jucer_ColouredElement.cpp @@ -108,7 +108,7 @@ public: return 0; } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -211,7 +211,7 @@ public: jassertfalse // option shouldn't be visible } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -297,7 +297,7 @@ public: void setState (bool newState) { owner->enableStroke (newState, true); } bool getState() const { return owner->isStrokeEnabled(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: ColouredElement* const owner; @@ -332,7 +332,7 @@ public: double getValue() const { return owner->getStrokeType().stroke.getStrokeThickness(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: ColouredElement* const owner; @@ -391,7 +391,7 @@ public: return 0; } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: ColouredElement* const owner; @@ -450,7 +450,7 @@ public: return 0; } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: ColouredElement* const owner; @@ -594,7 +594,7 @@ public: return element->getFillType().imageOpacity; } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/paintelements/jucer_ElementSiblingComponent.h b/extras/the jucer/src/model/paintelements/jucer_ElementSiblingComponent.h index f7e1a429c7..d4c33c0ae1 100644 --- a/extras/the jucer/src/model/paintelements/jucer_ElementSiblingComponent.h +++ b/extras/the jucer/src/model/paintelements/jucer_ElementSiblingComponent.h @@ -52,7 +52,7 @@ public: //============================================================================== - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { updatePosition(); } diff --git a/extras/the jucer/src/model/paintelements/jucer_ImageResourceProperty.h b/extras/the jucer/src/model/paintelements/jucer_ImageResourceProperty.h index 4b832dfcaf..48bdf797d8 100644 --- a/extras/the jucer/src/model/paintelements/jucer_ImageResourceProperty.h +++ b/extras/the jucer/src/model/paintelements/jucer_ImageResourceProperty.h @@ -114,7 +114,7 @@ public: return choices.indexOf (getResource()); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElement.cpp b/extras/the jucer/src/model/paintelements/jucer_PaintElement.cpp index 929f8afd37..05ee536b9d 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElement.cpp +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElement.cpp @@ -422,7 +422,7 @@ void PaintElement::getCurrentAbsoluteBoundsDouble (double& x, double& y, double& position.getRectangleDouble (x, y, w, h, area, getDocument()->getComponentLayout()); } -void PaintElement::changeListenerCallback (void*) +void PaintElement::changeListenerCallback (ChangeBroadcaster*) { const bool nowSelected = owner != 0 && owner->getSelectedElements().isSelected (this); @@ -449,7 +449,7 @@ void PaintElement::createSiblingComponents() void PaintElement::siblingComponentsChanged() { siblingComponents.clear(); - selfChangeListenerList.sendChangeMessage (0); + selfChangeListenerList.sendChangeMessage(); } void PaintElement::updateSiblingComps() diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElement.h b/extras/the jucer/src/model/paintelements/jucer_PaintElement.h index d4d5ecd105..d28aca5192 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElement.h +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElement.h @@ -90,7 +90,7 @@ public: void mouseDown (const MouseEvent& e); void mouseDrag (const MouseEvent& e); void mouseUp (const MouseEvent& e); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void parentHierarchyChanged(); int borderThickness; @@ -130,7 +130,7 @@ private: String typeName; bool selected, dragging, mouseDownSelectStatus; double originalAspectRatio; - ChangeListenerList selfChangeListenerList; + ChangeBroadcaster selfChangeListenerList; }; diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElementImage.h b/extras/the jucer/src/model/paintelements/jucer_PaintElementImage.h index cbf0936da6..a86a4b3038 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElementImage.h +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElementImage.h @@ -455,7 +455,7 @@ private: return element->getOpacity(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -494,7 +494,7 @@ private: return (int) element->getStretchMode(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.cpp b/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.cpp index 5f4a9f7d8a..b40e9eee2c 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.cpp +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.cpp @@ -120,7 +120,7 @@ public: void setIndex (int newIndex) { owner->setNonZeroWinding (newIndex == 0, true); } int getIndex() const { return owner->isNonZeroWinding() ? 0 : 1; } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementPath* const owner; @@ -1276,7 +1276,7 @@ public: return 0; } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -1345,7 +1345,7 @@ public: owner->getDocument()->removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -1671,7 +1671,7 @@ void PathPointComponent::mouseUp (const MouseEvent& e) mouseDownSelectStatus); } -void PathPointComponent::changeListenerCallback (void* source) +void PathPointComponent::changeListenerCallback (ChangeBroadcaster* source) { ElementSiblingComponent::changeListenerCallback (source); diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.h b/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.h index 15782aa47e..56ce0d3cf5 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.h +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElementPath.h @@ -183,7 +183,7 @@ public: void mouseDrag (const MouseEvent& e); void mouseUp (const MouseEvent& e); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); //============================================================================== juce_UseDebuggingNewOperator diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElementRoundedRectangle.h b/extras/the jucer/src/model/paintelements/jucer_PaintElementRoundedRectangle.h index 6e88725b54..04014b271b 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElementRoundedRectangle.h +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElementRoundedRectangle.h @@ -229,7 +229,7 @@ private: double getValue() const { return owner->getCornerSize(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementRoundedRectangle* const owner; diff --git a/extras/the jucer/src/model/paintelements/jucer_PaintElementText.h b/extras/the jucer/src/model/paintelements/jucer_PaintElementText.h index f5c5418133..a4129f7ead 100644 --- a/extras/the jucer/src/model/paintelements/jucer_PaintElementText.h +++ b/extras/the jucer/src/model/paintelements/jucer_PaintElementText.h @@ -387,7 +387,7 @@ private: void setText (const String& newText) { element->setText (newText, true); } const String getText() const { return element->getText(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementText* const element; @@ -413,7 +413,7 @@ private: void setTypefaceName (const String& newFontName) { element->setTypefaceName (newFontName, true); } const String getTypefaceName() const { return element->getTypefaceName(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementText* const element; @@ -463,7 +463,7 @@ private: return 0; } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementText* const element; @@ -501,7 +501,7 @@ private: return element->getFont().getHeight(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementText* const element; @@ -534,7 +534,7 @@ private: return element->getJustification(); } - void changeListenerCallback (void*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } private: PaintElementText* const element; diff --git a/extras/the jucer/src/properties/jucer_ComponentBooleanProperty.h b/extras/the jucer/src/properties/jucer_ComponentBooleanProperty.h index 60f1864623..f05e63726d 100644 --- a/extras/the jucer/src/properties/jucer_ComponentBooleanProperty.h +++ b/extras/the jucer/src/properties/jucer_ComponentBooleanProperty.h @@ -52,7 +52,7 @@ public: document.removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/properties/jucer_ComponentChoiceProperty.h b/extras/the jucer/src/properties/jucer_ComponentChoiceProperty.h index d1880ae85e..087ad9cb58 100644 --- a/extras/the jucer/src/properties/jucer_ComponentChoiceProperty.h +++ b/extras/the jucer/src/properties/jucer_ComponentChoiceProperty.h @@ -50,7 +50,7 @@ public: document.removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/properties/jucer_ComponentColourProperty.h b/extras/the jucer/src/properties/jucer_ComponentColourProperty.h index 8457ec04bd..405ab0322c 100644 --- a/extras/the jucer/src/properties/jucer_ComponentColourProperty.h +++ b/extras/the jucer/src/properties/jucer_ComponentColourProperty.h @@ -53,7 +53,7 @@ public: document.removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/properties/jucer_ComponentTextProperty.h b/extras/the jucer/src/properties/jucer_ComponentTextProperty.h index e9911a9bca..aa95a2cd83 100644 --- a/extras/the jucer/src/properties/jucer_ComponentTextProperty.h +++ b/extras/the jucer/src/properties/jucer_ComponentTextProperty.h @@ -52,7 +52,7 @@ public: document.removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/properties/jucer_PositionPropertyBase.h b/extras/the jucer/src/properties/jucer_PositionPropertyBase.h index ec44ce7302..cab0eaef32 100644 --- a/extras/the jucer/src/properties/jucer_PositionPropertyBase.h +++ b/extras/the jucer/src/properties/jucer_PositionPropertyBase.h @@ -169,7 +169,7 @@ public: } } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } diff --git a/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.cpp b/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.cpp index 824077d80f..0c842a0090 100644 --- a/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.cpp +++ b/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.cpp @@ -146,7 +146,7 @@ void ComponentLayoutEditor::visibilityChanged() } } -void ComponentLayoutEditor::changeListenerCallback (void*) +void ComponentLayoutEditor::changeListenerCallback (ChangeBroadcaster*) { refreshAllComponents(); } diff --git a/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.h b/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.h index 4950baa3d3..388ab3e69b 100644 --- a/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.h +++ b/extras/the jucer/src/ui/jucer_ComponentLayoutEditor.h @@ -48,7 +48,7 @@ public: void paint (Graphics& g); void resized(); void visibilityChanged(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void mouseDown (const MouseEvent& e); void mouseDrag (const MouseEvent& e); diff --git a/extras/the jucer/src/ui/jucer_ComponentLayoutPanel.cpp b/extras/the jucer/src/ui/jucer_ComponentLayoutPanel.cpp index 0858d46340..e9db4773c0 100644 --- a/extras/the jucer/src/ui/jucer_ComponentLayoutPanel.cpp +++ b/extras/the jucer/src/ui/jucer_ComponentLayoutPanel.cpp @@ -56,7 +56,7 @@ public: propsPanel->setBounds (4, 4, getWidth() - 8, getHeight() - 8); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { updateList(); } diff --git a/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.cpp b/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.cpp index 3aecccd561..3d3b0fc0c8 100644 --- a/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.cpp +++ b/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.cpp @@ -63,7 +63,7 @@ ComponentOverlayComponent::~ComponentOverlayComponent() delete border; } -void ComponentOverlayComponent::changeListenerCallback (void*) +void ComponentOverlayComponent::changeListenerCallback (ChangeBroadcaster*) { const bool nowSelected = layout.getSelectedSet().isSelected (target); diff --git a/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.h b/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.h index 2328b81725..74886f7a22 100644 --- a/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.h +++ b/extras/the jucer/src/ui/jucer_ComponentOverlayComponent.h @@ -57,7 +57,7 @@ public: void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void resizeStart(); void resizeEnd(); diff --git a/extras/the jucer/src/ui/jucer_JucerDocumentHolder.cpp b/extras/the jucer/src/ui/jucer_JucerDocumentHolder.cpp index 0bcb134ffc..831fc0c776 100644 --- a/extras/the jucer/src/ui/jucer_JucerDocumentHolder.cpp +++ b/extras/the jucer/src/ui/jucer_JucerDocumentHolder.cpp @@ -112,7 +112,7 @@ public: listBox->repaint(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -173,7 +173,7 @@ public: panel2->setBounds (panel1->getRight() + 20, panel1->getY(), pw, panel1->getHeight()); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { panel1->refreshAll(); panel2->refreshAll(); @@ -505,7 +505,7 @@ void JucerDocumentHolder::resized() tabbedComponent->setBounds (0, 0, getWidth(), getHeight()); } -void JucerDocumentHolder::changeListenerCallback (void*) +void JucerDocumentHolder::changeListenerCallback (ChangeBroadcaster*) { setName (document->getClassName()); updateTabs(); diff --git a/extras/the jucer/src/ui/jucer_JucerDocumentHolder.h b/extras/the jucer/src/ui/jucer_JucerDocumentHolder.h index af67e7e13c..d59759eb12 100644 --- a/extras/the jucer/src/ui/jucer_JucerDocumentHolder.h +++ b/extras/the jucer/src/ui/jucer_JucerDocumentHolder.h @@ -62,7 +62,7 @@ public: //============================================================================== void paint (Graphics& g); void resized(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); //============================================================================== ApplicationCommandTarget* getNextCommandTarget(); diff --git a/extras/the jucer/src/ui/jucer_PaintRoutineEditor.cpp b/extras/the jucer/src/ui/jucer_PaintRoutineEditor.cpp index 3f7411d107..096154b8cd 100644 --- a/extras/the jucer/src/ui/jucer_PaintRoutineEditor.cpp +++ b/extras/the jucer/src/ui/jucer_PaintRoutineEditor.cpp @@ -213,7 +213,7 @@ void PaintRoutineEditor::refreshAllElements() } } -void PaintRoutineEditor::changeListenerCallback (void* source) +void PaintRoutineEditor::changeListenerCallback (ChangeBroadcaster* source) { refreshAllElements(); } diff --git a/extras/the jucer/src/ui/jucer_PaintRoutineEditor.h b/extras/the jucer/src/ui/jucer_PaintRoutineEditor.h index cee752d3cd..7d46f81261 100644 --- a/extras/the jucer/src/ui/jucer_PaintRoutineEditor.h +++ b/extras/the jucer/src/ui/jucer_PaintRoutineEditor.h @@ -51,7 +51,7 @@ public: void paint (Graphics& g); void paintOverChildren (Graphics& g); void resized(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void mouseDown (const MouseEvent& e); void mouseDrag (const MouseEvent& e); diff --git a/extras/the jucer/src/ui/jucer_PaintRoutinePanel.cpp b/extras/the jucer/src/ui/jucer_PaintRoutinePanel.cpp index a5b19bbf11..86d592bbd7 100644 --- a/extras/the jucer/src/ui/jucer_PaintRoutinePanel.cpp +++ b/extras/the jucer/src/ui/jucer_PaintRoutinePanel.cpp @@ -48,7 +48,7 @@ public: document.removeChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { refresh(); } @@ -99,7 +99,7 @@ public: propsPanel->setBounds (4, 4, getWidth() - 8, getHeight() - 8); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { updateList(); } diff --git a/extras/the jucer/src/ui/jucer_ResourceEditorPanel.cpp b/extras/the jucer/src/ui/jucer_ResourceEditorPanel.cpp index 878eeade19..2d8c27c2ad 100644 --- a/extras/the jucer/src/ui/jucer_ResourceEditorPanel.cpp +++ b/extras/the jucer/src/ui/jucer_ResourceEditorPanel.cpp @@ -245,7 +245,7 @@ void ResourceEditorPanel::visibilityChanged() listBox->updateContent(); } -void ResourceEditorPanel::changeListenerCallback (void*) +void ResourceEditorPanel::changeListenerCallback (ChangeBroadcaster*) { if (isVisible()) listBox->updateContent(); diff --git a/extras/the jucer/src/ui/jucer_ResourceEditorPanel.h b/extras/the jucer/src/ui/jucer_ResourceEditorPanel.h index 0e6e33cb41..f2092e7f6a 100644 --- a/extras/the jucer/src/ui/jucer_ResourceEditorPanel.h +++ b/extras/the jucer/src/ui/jucer_ResourceEditorPanel.h @@ -45,7 +45,7 @@ public: void resized(); void visibilityChanged(); - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); void buttonClicked (Button*); int getNumRows(); diff --git a/extras/the jucer/src/utility/jucer_ColourEditorComponent.h b/extras/the jucer/src/utility/jucer_ColourEditorComponent.h index 60ac07799f..5a0e39e029 100644 --- a/extras/the jucer/src/utility/jucer_ColourEditorComponent.h +++ b/extras/the jucer/src/utility/jucer_ColourEditorComponent.h @@ -85,7 +85,7 @@ public: m.showAt (this); } - void changeListenerCallback (void* source) + void changeListenerCallback (ChangeBroadcaster* source) { const ColourSelector* const cs = (const ColourSelector*) source; diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 37034f0d83..8933b02fbb 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -20140,7 +20140,7 @@ void PropertiesFile::timerCallback() void PropertiesFile::propertyChanged() { - sendChangeMessage (this); + sendChangeMessage(); needsWriting = true; @@ -20237,14 +20237,14 @@ void FileBasedDocument::setChangedFlag (const bool hasChanged) if (changedSinceSave != hasChanged) { changedSinceSave = hasChanged; - sendChangeMessage (this); + sendChangeMessage(); } } void FileBasedDocument::changed() { changedSinceSave = true; - sendChangeMessage (this); + sendChangeMessage(); } void FileBasedDocument::setFile (const File& newFile) @@ -20610,7 +20610,7 @@ void UndoManager::clearUndoHistory() transactionNames.clear(); totalUnitsStored = 0; nextIndex = 0; - sendChangeMessage (this); + sendChangeMessage(); } int UndoManager::getNumberOfUnitsTakenUpByStoredCommands() const @@ -20700,7 +20700,7 @@ bool UndoManager::perform (UndoableAction* const command_, const String& actionN --nextIndex; } - sendChangeMessage (this); + sendChangeMessage(); return true; } @@ -20769,7 +20769,7 @@ bool UndoManager::undo() beginNewTransaction(); - sendChangeMessage (this); + sendChangeMessage(); return true; } @@ -20802,7 +20802,7 @@ bool UndoManager::redo() beginNewTransaction(); - sendChangeMessage (this); + sendChangeMessage(); return true; } @@ -22153,7 +22153,7 @@ void AudioThumbnail::setSource (InputSource* const newSource) } } - sendChangeMessage (this); + sendChangeMessage(); } bool AudioThumbnail::useTimeSlice() @@ -22177,7 +22177,7 @@ bool AudioThumbnail::useTimeSlice() readNextBlockFromAudioFile (*reader); stopTimer(); - sendChangeMessage (this); + sendChangeMessage(); const bool justFinished = isFullyLoaded(); @@ -24123,7 +24123,7 @@ void AudioTransportSource::start() inputStreamEOF = false; } - sendChangeMessage (this); + sendChangeMessage(); } } @@ -24140,7 +24140,7 @@ void AudioTransportSource::stop() while (--n >= 0 && ! stopped) Thread::sleep (2); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -24260,7 +24260,7 @@ void AudioTransportSource::getNextAudioBlock (const AudioSourceChannelInfo& info { playing = false; inputStreamEOF = true; - sendChangeMessage (this); + sendChangeMessage(); } stopped = ! playing; @@ -25589,7 +25589,7 @@ void AudioDeviceManager::setCurrentAudioDeviceType (const String& type, setAudioDeviceSetup (s, treatAsChosenDevice); - sendChangeMessage (this); + sendChangeMessage(); break; } } @@ -25613,7 +25613,7 @@ const String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& ne return String::empty; if (! (newSetup == currentSetup)) - sendChangeMessage (this); + sendChangeMessage(); stopDevice(); @@ -25978,14 +25978,14 @@ void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device callbacks.getUnchecked(i)->audioDeviceAboutToStart (device); } - sendChangeMessage (this); + sendChangeMessage(); } void AudioDeviceManager::audioDeviceStoppedInt() { cpuUsageMs = 0; timeToCpuScale = 0; - sendChangeMessage (this); + sendChangeMessage(); const ScopedLock sl (audioCallbackLock); for (int i = callbacks.size(); --i >= 0;) @@ -26025,7 +26025,7 @@ void AudioDeviceManager::setMidiInputEnabled (const String& name, } updateXml(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -26134,7 +26134,7 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) } updateXml(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -30411,7 +30411,7 @@ void KnownPluginList::clear() if (types.size() > 0) { types.clear(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -30449,14 +30449,14 @@ bool KnownPluginList::addType (const PluginDescription& type) } types.add (new PluginDescription (type)); - sendChangeMessage (this); + sendChangeMessage(); return true; } void KnownPluginList::removeType (const int index) { types.remove (index); - sendChangeMessage (this); + sendChangeMessage(); } namespace @@ -30614,7 +30614,7 @@ void KnownPluginList::sort (const SortMethod method) sorter.method = method; types.sort (sorter, true); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -31062,7 +31062,7 @@ void PluginListComponent::resized() optionsButton.setTopLeftPosition (8, getHeight() - 28); } -void PluginListComponent::changeListenerCallback (void*) +void PluginListComponent::changeListenerCallback (ChangeBroadcaster*) { listBox.updateContent(); listBox.repaint(); @@ -38452,6 +38452,23 @@ END_JUCE_NAMESPACE /*** Start of inlined file: juce_ChangeBroadcaster.cpp ***/ BEGIN_JUCE_NAMESPACE +class ChangeBroadcaster::ChangeBroadcasterMessage : public CallbackMessage +{ +public: + ChangeBroadcasterMessage (ChangeBroadcaster* const owner_) + : owner (owner_) + { + } + + void messageCallback() + { + if (owner != 0 && owner->pendingMessage.value == this) + owner->sendSynchronousChangeMessage(); + } + + ChangeBroadcaster* owner; +}; + ChangeBroadcaster::ChangeBroadcaster() throw() { // are you trying to create this object before or after juce has been intialised?? @@ -38462,123 +38479,69 @@ ChangeBroadcaster::~ChangeBroadcaster() { // all event-based objects must be deleted BEFORE juce is shut down! jassert (MessageManager::instance != 0); + + invalidatePendingMessage(); } void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) { - changeListenerList.addChangeListener (listener); + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); + + changeListeners.add (listener); } void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) { - jassert (changeListenerList.isValidMessageListener()); + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - if (changeListenerList.isValidMessageListener()) - changeListenerList.removeChangeListener (listener); + changeListeners.remove (listener); } void ChangeBroadcaster::removeAllChangeListeners() { - changeListenerList.removeAllChangeListeners(); -} - -void ChangeBroadcaster::sendChangeMessage (void* objectThatHasChanged) -{ - changeListenerList.sendChangeMessage (objectThatHasChanged); -} - -void ChangeBroadcaster::sendSynchronousChangeMessage (void* objectThatHasChanged) -{ - changeListenerList.sendSynchronousChangeMessage (objectThatHasChanged); -} - -void ChangeBroadcaster::dispatchPendingMessages() -{ - changeListenerList.dispatchPendingMessages(); -} - -END_JUCE_NAMESPACE -/*** End of inlined file: juce_ChangeBroadcaster.cpp ***/ - - -/*** Start of inlined file: juce_ChangeListenerList.cpp ***/ -BEGIN_JUCE_NAMESPACE - -ChangeListenerList::ChangeListenerList() - : lastChangedObject (0), - messagePending (false) -{ -} - -ChangeListenerList::~ChangeListenerList() -{ -} - -void ChangeListenerList::addChangeListener (ChangeListener* const listener) -{ - const ScopedLock sl (lock); - - jassert (listener != 0); - - if (listener != 0) - listeners.add (listener); -} + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); -void ChangeListenerList::removeChangeListener (ChangeListener* const listener) -{ - const ScopedLock sl (lock); - listeners.removeValue (listener); + changeListeners.clear(); } -void ChangeListenerList::removeAllChangeListeners() +void ChangeBroadcaster::invalidatePendingMessage() { - const ScopedLock sl (lock); - listeners.clear(); + ChangeBroadcasterMessage* const oldMessage = pendingMessage.exchange (0); + if (oldMessage != 0) + oldMessage->owner = 0; } -void ChangeListenerList::sendChangeMessage (void* const objectThatHasChanged) +void ChangeBroadcaster::sendChangeMessage() { - const ScopedLock sl (lock); - - if ((! messagePending) && (listeners.size() > 0)) + if (pendingMessage.value == 0 && changeListeners.size() > 0) { - lastChangedObject = objectThatHasChanged; - postMessage (new Message (0, 0, 0, objectThatHasChanged)); - messagePending = true; - } -} + ScopedPointer pending (new ChangeBroadcasterMessage (this)); -void ChangeListenerList::handleMessage (const Message& message) -{ - sendSynchronousChangeMessage (message.pointerParameter); + if (pendingMessage.compareAndSetBool (pending, 0)) + pending.release()->post(); + } } -void ChangeListenerList::sendSynchronousChangeMessage (void* const objectThatHasChanged) +void ChangeBroadcaster::sendSynchronousChangeMessage() { - const ScopedLock sl (lock); - messagePending = false; - - for (int i = listeners.size(); --i >= 0;) - { - ChangeListener* const l = static_cast (listeners.getUnchecked (i)); - - { - const ScopedUnlock tempUnlocker (lock); - l->changeListenerCallback (objectThatHasChanged); - } + // This can only be called by the event thread. + jassert (MessageManager::getInstance()->isThisTheMessageThread()); - i = jmin (i, listeners.size()); - } + invalidatePendingMessage(); + changeListeners.call (&ChangeListener::changeListenerCallback, this); } -void ChangeListenerList::dispatchPendingMessages() +void ChangeBroadcaster::dispatchPendingMessages() { - if (messagePending) - sendSynchronousChangeMessage (lastChangedObject); + if (pendingMessage.get() != 0) + sendSynchronousChangeMessage(); } END_JUCE_NAMESPACE -/*** End of inlined file: juce_ChangeListenerList.cpp ***/ +/*** End of inlined file: juce_ChangeBroadcaster.cpp ***/ /*** Start of inlined file: juce_InterprocessConnection.cpp ***/ @@ -40033,6 +39996,178 @@ namespace } #endif +class Component::ComponentHelpers +{ +public: + + static void* runModalLoopCallback (void* userData) + { + return (void*) (pointer_sized_int) static_cast (userData)->runModalLoop(); + } + + static const Identifier getColourPropertyId (const int colourId) + { + String s; + s.preallocateStorage (18); + s << "jcclr_" << String::toHexString (colourId); + return s; + } + + static inline bool hitTest (Component& comp, const Point& localPoint) + { + return ((unsigned int) localPoint.getX()) < (unsigned int) comp.getWidth() + && ((unsigned int) localPoint.getY()) < (unsigned int) comp.getHeight() + && comp.hitTest (localPoint.getX(), localPoint.getY()); + } + + static const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) + { + return pointInParentSpace - comp.getPosition(); + } + + static const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) + { + return areaInParentSpace - comp.getPosition(); + } + + static const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) + { + return pointInLocalSpace + comp.getPosition(); + } + + static const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) + { + return areaInLocalSpace + comp.getPosition(); + } + + template + static const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) + { + const Component* const directParent = target.getParentComponent(); + jassert (directParent != 0); + + if (directParent == parent) + return convertFromParentSpace (target, coordInParent); + + return convertFromParentSpace (target, convertFromDistantParentSpace (parent, *directParent, coordInParent)); + } + + template + static const Type convertCoordinate (const Component* target, const Component* source, Type p) + { + while (source != 0) + { + if (source == target) + return p; + + if (source->isParentOf (target)) + return convertFromDistantParentSpace (source, *target, p); + + if (source->isOnDesktop()) + { + p = source->getPeer()->localToGlobal (p); + source = 0; + } + else + { + p = convertToParentSpace (*source, p); + source = source->getParentComponent(); + } + } + + jassert (source == 0); + if (target == 0) + return p; + + const Component* const topLevelComp = target->getTopLevelComponent(); + + if (topLevelComp->isOnDesktop()) + p = topLevelComp->getPeer()->globalToLocal (p); + else + p = convertFromParentSpace (*topLevelComp, p); + + if (topLevelComp == target) + return p; + + return convertFromDistantParentSpace (topLevelComp, *target, p); + } + + static const Rectangle getUnclippedArea (const Component& comp) + { + Rectangle r (comp.getLocalBounds()); + + Component* const p = comp.getParentComponent(); + + if (p != 0) + r = r.getIntersection (convertFromParentSpace (comp, getUnclippedArea (*p))); + + return r; + } + + static void clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, const Point& delta) + { + for (int i = comp.childComponentList_.size(); --i >= 0;) + { + const Component& child = *comp.childComponentList_.getUnchecked(i); + +//xxx if (child.isVisible() && ! child.isTransformed()) + if (child.isVisible()) + { + const Rectangle newClip (clipRect.getIntersection (child.bounds_)); + + if (! newClip.isEmpty()) + { + if (child.isOpaque()) + { + g.excludeClipRegion (newClip + delta); + } + else + { + const Point childPos (child.getPosition()); + clipObscuredRegions (child, g, newClip - childPos, childPos + delta); + } + } + } + } + } + + static void subtractObscuredRegions (const Component& comp, RectangleList& result, + const Point& delta, + const Rectangle& clipRect, + const Component* const compToAvoid) + { + for (int i = comp.childComponentList_.size(); --i >= 0;) + { + const Component* const c = comp.childComponentList_.getUnchecked(i); + + if (c != compToAvoid && c->isVisible()) + { + if (c->isOpaque()) + { + Rectangle childBounds (c->bounds_.getIntersection (clipRect)); + childBounds.translate (delta.getX(), delta.getY()); + + result.subtract (childBounds); + } + else + { + Rectangle newClip (clipRect.getIntersection (c->bounds_)); + newClip.translate (-c->getX(), -c->getY()); + + subtractObscuredRegions (*c, result, c->getPosition() + delta, + newClip, compToAvoid); + } + } + } + } + + static const Rectangle getParentOrMainMonitorBounds (const Component& comp) + { + return comp.getParentComponent() != 0 ? comp.getParentComponent()->getLocalBounds() + : Desktop::getInstance().getMainMonitorArea(); + } +}; + Component::Component() : parentComponent_ (0), lookAndFeel_ (0), @@ -40569,138 +40704,30 @@ int Component::getParentHeight() const throw() : getParentMonitorArea().getHeight(); } -int Component::getScreenX() const -{ - return getScreenPosition().getX(); -} - -int Component::getScreenY() const -{ - return getScreenPosition().getY(); -} - -const Point Component::getScreenPosition() const -{ - return localPointToGlobal (Point()); -} - -const Rectangle Component::getScreenBounds() const -{ - return bounds_.withPosition (getScreenPosition()); -} - -namespace CoordinateHelpers -{ - inline bool hitTest (Component& comp, const Point& localPoint) - { - return ((unsigned int) localPoint.getX()) < (unsigned int) comp.getWidth() - && ((unsigned int) localPoint.getY()) < (unsigned int) comp.getHeight() - && comp.hitTest (localPoint.getX(), localPoint.getY()); - } - - const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) - { - return pointInParentSpace - comp.getPosition(); - } - - const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) - { - return areaInParentSpace - comp.getPosition(); - } - - const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) - { - return pointInLocalSpace + comp.getPosition(); - } - - const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) - { - return areaInLocalSpace + comp.getPosition(); - } - - template - const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) - { - const Component* const directParent = target.getParentComponent(); - jassert (directParent != 0); - - if (directParent == parent) - return convertFromParentSpace (target, coordInParent); - - return convertFromParentSpace (target, convertFromDistantParentSpace (parent, *directParent, coordInParent)); - } +int Component::getScreenX() const { return getScreenPosition().getX(); } +int Component::getScreenY() const { return getScreenPosition().getY(); } - template - const Type convertCoordinate (const Component* target, const Component* source, Type p) - { - while (source != 0) - { - if (source == target) - return p; - - if (source->isParentOf (target)) - return convertFromDistantParentSpace (source, *target, p); - - if (source->isOnDesktop()) - { - p = source->getPeer()->localToGlobal (p); - source = 0; - } - else - { - p = convertToParentSpace (*source, p); - source = source->getParentComponent(); - } - } - - jassert (source == 0); - if (target == 0) - return p; - - const Component* const topLevelComp = target->getTopLevelComponent(); - - if (topLevelComp->isOnDesktop()) - p = topLevelComp->getPeer()->globalToLocal (p); - else - p = convertFromParentSpace (*topLevelComp, p); - - if (topLevelComp == target) - return p; - - return convertFromDistantParentSpace (topLevelComp, *target, p); - } - - const Rectangle getUnclippedArea (const Component& comp) - { - Rectangle r (comp.getLocalBounds()); - - Component* const p = comp.getParentComponent(); - - if (p != 0) - r = r.getIntersection (convertFromParentSpace (comp, getUnclippedArea (*p))); - - return r; - } -} +const Point Component::getScreenPosition() const { return localPointToGlobal (Point()); } +const Rectangle Component::getScreenBounds() const { return localAreaToGlobal (getLocalBounds()); } const Point Component::getLocalPoint (const Component* source, const Point& point) const { - return CoordinateHelpers::convertCoordinate (this, source, point); + return ComponentHelpers::convertCoordinate (this, source, point); } const Rectangle Component::getLocalArea (const Component* source, const Rectangle& area) const { - return CoordinateHelpers::convertCoordinate (this, source, area); + return ComponentHelpers::convertCoordinate (this, source, area); } const Point Component::localPointToGlobal (const Point& point) const { - return CoordinateHelpers::convertCoordinate (0, this, point); + return ComponentHelpers::convertCoordinate (0, this, point); } const Rectangle Component::localAreaToGlobal (const Rectangle& area) const { - return CoordinateHelpers::convertCoordinate (0, this, area); + return ComponentHelpers::convertCoordinate (0, this, area); } /* Deprecated methods... */ @@ -40854,7 +40881,7 @@ void Component::setCentreRelative (const float x, const float y) void Component::centreWithSize (const int width, const int height) { - const Rectangle parentArea (getParentOrMainMonitorBounds()); + const Rectangle parentArea (ComponentHelpers::getParentOrMainMonitorBounds (*this)); setBounds (parentArea.getCentreX() - width / 2, parentArea.getCentreY() - height / 2, @@ -40863,7 +40890,7 @@ void Component::centreWithSize (const int width, const int height) void Component::setBoundsInset (const BorderSize& borders) { - setBounds (borders.subtractedFrom (getParentOrMainMonitorBounds())); + setBounds (borders.subtractedFrom (ComponentHelpers::getParentOrMainMonitorBounds (*this))); } void Component::setBoundsToFit (int x, int y, int width, int height, @@ -40924,7 +40951,7 @@ bool Component::hitTest (int x, int y) Component& child = *getChildComponent (i); if (child.isVisible() - && CoordinateHelpers::hitTest (child, CoordinateHelpers::convertFromParentSpace (child, Point (x, y)))) + && ComponentHelpers::hitTest (child, ComponentHelpers::convertFromParentSpace (child, Point (x, y)))) return true; } } @@ -40948,11 +40975,11 @@ void Component::getInterceptsMouseClicks (bool& allowsClicksOnThisComponent, bool Component::contains (const Point& point) { - if (CoordinateHelpers::hitTest (*this, point)) + if (ComponentHelpers::hitTest (*this, point)) { if (parentComponent_ != 0) { - return parentComponent_->contains (CoordinateHelpers::convertToParentSpace (*this, point)); + return parentComponent_->contains (ComponentHelpers::convertToParentSpace (*this, point)); } else if (flags.hasHeavyweightPeerFlag) { @@ -40981,12 +41008,12 @@ bool Component::reallyContains (const int x, const int y, const bool returnTrueI Component* Component::getComponentAt (const Point& position) { - if (flags.visibleFlag && CoordinateHelpers::hitTest (*this, position)) + if (flags.visibleFlag && ComponentHelpers::hitTest (*this, position)) { for (int i = childComponentList_.size(); --i >= 0;) { Component* child = childComponentList_.getUnchecked(i); - child = child->getComponentAt (CoordinateHelpers::convertFromParentSpace (*child, position)); + child = child->getComponentAt (ComponentHelpers::convertFromParentSpace (*child, position)); if (child != 0) return child; @@ -41209,14 +41236,6 @@ void Component::internalHierarchyChanged() } } -namespace ComponentHelpers -{ - void* runModalLoopCallback (void* userData) - { - return (void*) (pointer_sized_int) static_cast (userData)->runModalLoop(); - } -} - int Component::runModalLoop() { if (! MessageManager::getInstance()->isThisTheMessageThread()) @@ -41479,7 +41498,7 @@ void Component::paintComponentAndChildren (Graphics& g) else { g.saveState(); - clipObscuredRegions (g, clipBounds, 0, 0); + ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point()); if (! g.isClipEmpty()) paintComponent (g); @@ -41666,17 +41685,6 @@ void Component::sendLookAndFeelChange() } } -namespace ComponentHelpers -{ - const Identifier getColourPropertyId (const int colourId) - { - String s; - s.preallocateStorage (18); - s << "jcclr_" << String::toHexString (colourId); - return s; - } -} - const Colour Component::findColour (const int colourId, const bool inheritFromParent) const { var* const v = properties.getVarPointer (ComponentHelpers::getColourPropertyId (colourId)); @@ -41733,44 +41741,10 @@ const Rectangle Component::getLocalBounds() const throw() return Rectangle (getWidth(), getHeight()); } -const Rectangle Component::getParentOrMainMonitorBounds() const -{ - return parentComponent_ != 0 ? parentComponent_->getLocalBounds() - : Desktop::getInstance().getMainMonitorArea(); -} - -void Component::clipObscuredRegions (Graphics& g, const Rectangle& clipRect, - const int deltaX, const int deltaY) const -{ - for (int i = childComponentList_.size(); --i >= 0;) - { - const Component* const c = childComponentList_.getUnchecked(i); - - if (c->isVisible()) - { - const Rectangle newClip (clipRect.getIntersection (c->bounds_)); - - if (! newClip.isEmpty()) - { - if (c->isOpaque()) - { - g.excludeClipRegion (newClip.translated (deltaX, deltaY)); - } - else - { - c->clipObscuredRegions (g, newClip.translated (-c->getX(), -c->getY()), - c->getX() + deltaX, - c->getY() + deltaY); - } - } - } - } -} - void Component::getVisibleArea (RectangleList& result, const bool includeSiblings) const { result.clear(); - const Rectangle unclipped (CoordinateHelpers::getUnclippedArea (*this)); + const Rectangle unclipped (ComponentHelpers::getUnclippedArea (*this)); if (! unclipped.isEmpty()) { @@ -41780,45 +41754,15 @@ void Component::getVisibleArea (RectangleList& result, const bool includeSibling { const Component* const c = getTopLevelComponent(); - c->subtractObscuredRegions (result, getLocalPoint (c, Point()), - c->getLocalBounds(), this); + ComponentHelpers::subtractObscuredRegions (*c, result, getLocalPoint (c, Point()), + c->getLocalBounds(), this); } - subtractObscuredRegions (result, Point(), unclipped, 0); + ComponentHelpers::subtractObscuredRegions (*this, result, Point(), unclipped, 0); result.consolidate(); } } -void Component::subtractObscuredRegions (RectangleList& result, - const Point& delta, - const Rectangle& clipRect, - const Component* const compToAvoid) const -{ - for (int i = childComponentList_.size(); --i >= 0;) - { - const Component* const c = childComponentList_.getUnchecked(i); - - if (c != compToAvoid && c->isVisible()) - { - if (c->isOpaque()) - { - Rectangle childBounds (c->bounds_.getIntersection (clipRect)); - childBounds.translate (delta.getX(), delta.getY()); - - result.subtract (childBounds); - } - else - { - Rectangle newClip (clipRect.getIntersection (c->bounds_)); - newClip.translate (-c->getX(), -c->getY()); - - c->subtractObscuredRegions (result, c->getPosition() + delta, - newClip, compToAvoid); - } - } - } -} - void Component::mouseEnter (const MouseEvent&) { // base class does nothing @@ -48929,6 +48873,7 @@ void ListBox::setModel (ListBoxModel* const newModel) if (model != newModel) { model = newModel; + repaint(); updateContent(); } } @@ -58001,7 +57946,7 @@ bool DirectoryContentsList::isStillLoading() const void DirectoryContentsList::changed() { - sendChangeMessage (this); + sendChangeMessage(); } bool DirectoryContentsList::useTimeSlice() @@ -58969,7 +58914,7 @@ void FileListComponent::scrollToTop() getVerticalScrollBar()->setCurrentRangeStart (0); } -void FileListComponent::changeListenerCallback (void*) +void FileListComponent::changeListenerCallback (ChangeBroadcaster*) { updateContent(); @@ -59722,7 +59667,7 @@ public: newList->addChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { clearSubItems(); @@ -60481,7 +60426,7 @@ public: bool mightContainSubItems() { return true; } const String getUniqueName() const { return "keys"; } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { const ScopedPointer oldOpenness (owner.tree.getOpennessState (true)); @@ -60904,7 +60849,7 @@ void KeyPressMappingSet::addKeyPress (const CommandID commandID, { mappings.getUnchecked(i)->keypresses.insert (insertIndex, newKeyPress); - sendChangeMessage (this); + sendChangeMessage(); return; } } @@ -60919,7 +60864,7 @@ void KeyPressMappingSet::addKeyPress (const CommandID commandID, cm->wantsKeyUpDownCallbacks = (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) != 0; mappings.add (cm); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -60940,7 +60885,7 @@ void KeyPressMappingSet::resetToDefaultMappings() } } - sendChangeMessage (this); + sendChangeMessage(); } void KeyPressMappingSet::resetToDefaultMapping (const CommandID commandID) @@ -60960,7 +60905,7 @@ void KeyPressMappingSet::clearAllKeyPresses() { if (mappings.size() > 0) { - sendChangeMessage (this); + sendChangeMessage(); mappings.clear(); } } @@ -60972,7 +60917,7 @@ void KeyPressMappingSet::clearAllKeyPresses (const CommandID commandID) if (mappings.getUnchecked(i)->commandID == commandID) { mappings.remove (i); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -60990,7 +60935,7 @@ void KeyPressMappingSet::removeKeyPress (const KeyPress& keypress) if (keypress == cm->keypresses [j]) { cm->keypresses.remove (j); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -61004,7 +60949,7 @@ void KeyPressMappingSet::removeKeyPress (const CommandID commandID, const int ke if (mappings.getUnchecked(i)->commandID == commandID) { mappings.getUnchecked(i)->keypresses.remove (keyPressIndex); - sendChangeMessage (this); + sendChangeMessage(); break; } } @@ -61494,7 +61439,7 @@ void ComponentAnimator::animateComponent (Component* const component, { at = new AnimationTask (component); tasks.add (at); - sendChangeMessage (this); + sendChangeMessage(); } at->reset (finalBounds, finalAlpha, millisecondsToSpendMoving, @@ -61538,7 +61483,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin tasks.getUnchecked(i)->moveToFinalDestination(); tasks.clear(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -61553,7 +61498,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, at->moveToFinalDestination(); tasks.removeObject (at); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -61587,7 +61532,7 @@ void ComponentAnimator::timerCallback() if (! tasks.getUnchecked(i)->useTimeslice (elapsed)) { tasks.remove (i); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -64006,7 +63951,7 @@ void TabbedButtonBar::setCurrentTabIndex (int newIndex, const bool sendChangeMes resized(); if (sendChangeMessage_) - sendChangeMessage (this); + sendChangeMessage(); currentTabChanged (newIndex, getCurrentTabName()); } @@ -67859,8 +67804,8 @@ void LookAndFeel::drawGlassLozenge (Graphics& g, } { - const float leftIndent = flatOnLeft ? 0.0f : cs * 0.4f; - const float rightIndent = flatOnRight ? 0.0f : cs * 0.4f; + const float leftIndent = flatOnTop || flatOnLeft ? 0.0f : cs * 0.4f; + const float rightIndent = flatOnTop || flatOnRight ? 0.0f : cs * 0.4f; Path highlight; LookAndFeelHelpers::createRoundedPath (highlight, @@ -73125,7 +73070,7 @@ public: resized(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice(); @@ -73762,7 +73707,7 @@ void AudioDeviceSelectorComponent::comboBoxChanged (ComboBox* comboBoxThatHasCha } } -void AudioDeviceSelectorComponent::changeListenerCallback (void*) +void AudioDeviceSelectorComponent::changeListenerCallback (ChangeBroadcaster*) { if (deviceTypeDropDown != 0) { @@ -74497,7 +74442,7 @@ void ColourSelector::update() if ((flags & showColourAtTop) != 0) repaint (previewArea); - sendChangeMessage (this); + sendChangeMessage(); } void ColourSelector::paint (Graphics& g) @@ -75394,7 +75339,7 @@ void MidiKeyboardComponent::setLowestVisibleKey (int noteNumber) if (noteNumber != firstKey) { firstKey = noteNumber; - sendChangeMessage (this); + sendChangeMessage(); resized(); } } @@ -75838,7 +75783,7 @@ void MidiKeyboardComponent::resized() if (kx2 - kx1 <= w) { firstKey = rangeStart; - sendChangeMessage (this); + sendChangeMessage(); repaint(); } } @@ -75881,7 +75826,7 @@ void MidiKeyboardComponent::resized() if (lastStartKey >= 0 && firstKey > lastStartKey) { firstKey = jlimit (rangeStart, rangeEnd, lastStartKey); - sendChangeMessage (this); + sendChangeMessage(); } int newOffset = 0; @@ -82132,6 +82077,11 @@ void Graphics::setOrigin (const int newOriginX, const int newOriginY) context->setOrigin (newOriginX, newOriginY); } +void Graphics::addTransform (const AffineTransform& transform) +{ + context->addTransform (transform); +} + bool Graphics::clipRegionIntersects (const Rectangle& area) const { return context->clipRegionIntersects (area); @@ -242341,6 +242291,7 @@ public: if (taskBarIcon == 0) { taskBarIcon = new NOTIFYICONDATA(); + zeromem (taskBarIcon, sizeof (NOTIFYICONDATA)); taskBarIcon->cbSize = sizeof (NOTIFYICONDATA); taskBarIcon->hWnd = (HWND) hwnd; taskBarIcon->uID = (int) (pointer_sized_int) hwnd; @@ -242361,8 +242312,6 @@ public: DestroyIcon (oldIcon); } - - DestroyIcon (hicon); } else if (taskBarIcon != 0) { @@ -242383,6 +242332,55 @@ public: } } + void handleTaskBarEvent (const LPARAM lParam, const WPARAM wParam) + { + if (component->isCurrentlyBlockedByAnotherModalComponent()) + { + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN + || lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + { + Component* const current = Component::getCurrentlyModalComponent(); + + if (current != 0) + current->inputAttemptWhenModal(); + } + } + else + { + ModifierKeys eventMods (ModifierKeys::getCurrentModifiersRealtime()); + + if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) + eventMods = eventMods.withFlags (ModifierKeys::leftButtonModifier); + else if (lParam == WM_RBUTTONDOWN || lParam == WM_RBUTTONDBLCLK) + eventMods = eventMods.withFlags (ModifierKeys::rightButtonModifier); + else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) + eventMods = eventMods.withoutMouseButtons(); + + const MouseEvent e (Desktop::getInstance().getMainMouseSource(), + Point(), eventMods, component, component, getMouseEventTime(), + Point(), getMouseEventTime(), 1, false); + + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) + { + SetFocus (hwnd); + SetForegroundWindow (hwnd); + component->mouseDown (e); + } + else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) + { + component->mouseUp (e); + } + else if (lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + { + component->mouseDoubleClick (e); + } + else if (lParam == WM_MOUSEMOVE) + { + component->mouseMove (e); + } + } + } + bool isInside (HWND h) const { return GetAncestor (hwnd, GA_ROOT) == h; @@ -243145,21 +243143,11 @@ private: switch (GET_APPCOMMAND_LPARAM (lParam)) { - case APPCOMMAND_MEDIA_PLAY_PAUSE: - key = KeyPress::playKey; - break; - - case APPCOMMAND_MEDIA_STOP: - key = KeyPress::stopKey; - break; - - case APPCOMMAND_MEDIA_NEXTTRACK: - key = KeyPress::fastForwardKey; - break; - - case APPCOMMAND_MEDIA_PREVIOUSTRACK: - key = KeyPress::rewindKey; - break; + case APPCOMMAND_MEDIA_PLAY_PAUSE: key = KeyPress::playKey; break; + case APPCOMMAND_MEDIA_STOP: key = KeyPress::stopKey; break; + case APPCOMMAND_MEDIA_NEXTTRACK: key = KeyPress::fastForwardKey; break; + case APPCOMMAND_MEDIA_PREVIOUSTRACK: key = KeyPress::rewindKey; break; + default: break; } if (key != 0) @@ -243176,6 +243164,83 @@ private: return false; } + LRESULT handleSizeConstraining (RECT* const r, const WPARAM wParam) + { + if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) + { + Rectangle pos (r->left, r->top, r->right - r->left, r->bottom - r->top); + + constrainer->checkBounds (pos, windowBorder.addedTo (component->getBounds()), + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT, + wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT, + wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT, + wParam == WMSZ_RIGHT || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_BOTTOMRIGHT); + r->left = pos.getX(); + r->top = pos.getY(); + r->right = pos.getRight(); + r->bottom = pos.getBottom(); + } + + return TRUE; + } + + LRESULT handlePositionChanging (WINDOWPOS* const wp) + { + if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) + { + if ((wp->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE) + && ! Component::isMouseButtonDownAnywhere()) + { + Rectangle pos (wp->x, wp->y, wp->cx, wp->cy); + const Rectangle current (windowBorder.addedTo (component->getBounds())); + + constrainer->checkBounds (pos, current, + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + pos.getY() != current.getY() && pos.getBottom() == current.getBottom(), + pos.getX() != current.getX() && pos.getRight() == current.getRight(), + pos.getY() == current.getY() && pos.getBottom() != current.getBottom(), + pos.getX() == current.getX() && pos.getRight() != current.getRight()); + wp->x = pos.getX(); + wp->y = pos.getY(); + wp->cx = pos.getWidth(); + wp->cy = pos.getHeight(); + } + } + + return 0; + } + + void handleAppActivation (const WPARAM wParam) + { + modifiersAtLastCallback = -1; + updateKeyModifiers(); + + if (isMinimised()) + { + component->repaint(); + handleMovedOrResized(); + + if (! ComponentPeer::isValidPeer (this)) + return; + } + + if (LOWORD (wParam) == WA_CLICKACTIVE && component->isCurrentlyBlockedByAnotherModalComponent()) + { + Component* const underMouse = component->getComponentAt (component->getMouseXYRelative()); + + if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) + Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); + } + else + { + handleBroughtToFront(); + + if (component->isCurrentlyBlockedByAnotherModalComponent()) + Component::getCurrentlyModalComponent()->toFront (true); + } + } + class JuceDropTarget : public ComBaseClassHelper { public: @@ -243334,11 +243399,10 @@ private: case WM_NCHITTEST: if ((styleFlags & windowIgnoresMouseClicks) != 0) return HTTRANSPARENT; + else if (! hasTitleBar()) + return HTCLIENT; - if (hasTitleBar()) - break; - - return HTCLIENT; + break; case WM_PAINT: handlePaintMessage(); @@ -243399,48 +243463,10 @@ private: return 0; case WM_SIZING: - if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) - { - RECT* const r = (RECT*) lParam; - Rectangle pos (r->left, r->top, r->right - r->left, r->bottom - r->top); - - constrainer->checkBounds (pos, windowBorder.addedTo (component->getBounds()), - Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), - wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT, - wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT, - wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT, - wParam == WMSZ_RIGHT || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_BOTTOMRIGHT); - r->left = pos.getX(); - r->top = pos.getY(); - r->right = pos.getRight(); - r->bottom = pos.getBottom(); - } - return TRUE; + return handleSizeConstraining ((RECT*) lParam, wParam); case WM_WINDOWPOSCHANGING: - if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) - { - WINDOWPOS* const wp = (WINDOWPOS*) lParam; - - if ((wp->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE) - && ! Component::isMouseButtonDownAnywhere()) - { - Rectangle pos (wp->x, wp->y, wp->cx, wp->cy); - const Rectangle current (windowBorder.addedTo (component->getBounds())); - - constrainer->checkBounds (pos, current, - Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), - pos.getY() != current.getY() && pos.getBottom() == current.getBottom(), - pos.getX() != current.getX() && pos.getRight() == current.getRight(), - pos.getY() == current.getY() && pos.getBottom() != current.getBottom(), - pos.getX() == current.getX() && pos.getRight() != current.getRight()); - wp->x = pos.getX(); - wp->y = pos.getY(); - wp->cx = pos.getWidth(); - wp->cy = pos.getHeight(); - } - } - return 0; + return handlePositionChanging ((WINDOWPOS*) lParam); case WM_WINDOWPOSCHANGED: { @@ -243512,35 +243538,7 @@ private: case WM_ACTIVATE: if (LOWORD (wParam) == WA_ACTIVE || LOWORD (wParam) == WA_CLICKACTIVE) { - modifiersAtLastCallback = -1; - updateKeyModifiers(); - - if (isMinimised()) - { - component->repaint(); - handleMovedOrResized(); - - if (! ComponentPeer::isValidPeer (this)) - return 0; - } - - if (LOWORD (wParam) == WA_CLICKACTIVE - && component->isCurrentlyBlockedByAnotherModalComponent()) - { - const Point mousePos (component->getMouseXYRelative()); - Component* const underMouse = component->getComponentAt (mousePos.getX(), mousePos.getY()); - - if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) - Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); - - return 0; - } - - handleBroughtToFront(); - - if (component->isCurrentlyBlockedByAnotherModalComponent()) - Component::getCurrentlyModalComponent()->toFront (true); - + handleAppActivation (wParam); return 0; } @@ -243581,52 +243579,7 @@ private: return TRUE; case WM_TRAYNOTIFY: - if (component->isCurrentlyBlockedByAnotherModalComponent()) - { - if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN - || lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) - { - Component* const current = Component::getCurrentlyModalComponent(); - - if (current != 0) - current->inputAttemptWhenModal(); - } - } - else - { - ModifierKeys eventMods (ModifierKeys::getCurrentModifiersRealtime()); - - if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) - eventMods = eventMods.withFlags (ModifierKeys::leftButtonModifier); - else if (lParam == WM_RBUTTONDOWN || lParam == WM_RBUTTONDBLCLK) - eventMods = eventMods.withFlags (ModifierKeys::rightButtonModifier); - else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) - eventMods = eventMods.withoutMouseButtons(); - - const MouseEvent e (Desktop::getInstance().getMainMouseSource(), - Point(), eventMods, component, component, getMouseEventTime(), - Point(), getMouseEventTime(), 1, false); - - if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) - { - SetFocus (hwnd); - SetForegroundWindow (hwnd); - component->mouseDown (e); - } - else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) - { - component->mouseUp (e); - } - else if (lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) - { - component->mouseDoubleClick (e); - } - else if (lParam == WM_MOUSEMOVE) - { - component->mouseMove (e); - } - } - + handleTaskBarEvent (lParam, wParam); break; case WM_SYNCPAINT: @@ -243674,10 +243627,8 @@ private: break; case SC_KEYMENU: - // (NB mustn't call sendInputAttemptWhenModalMessage() here because of very - // obscure situations that can arise if a modal loop is started from an alt-key - // keypress). - + // (NB mustn't call sendInputAttemptWhenModalMessage() here because of very obscure + // situations that can arise if a modal loop is started from an alt-key keypress). if (hasTitleBar() && h == GetCapture()) ReleaseCapture(); @@ -243741,6 +243692,17 @@ private: return DLGC_WANTALLKEYS; default: + if (taskBarIcon != 0) + { + static const DWORD taskbarCreatedMessage = RegisterWindowMessage (TEXT("TaskbarCreated")); + + if (message == taskbarCreatedMessage) + { + taskBarIcon->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + Shell_NotifyIcon (NIM_ADD, taskBarIcon); + } + } + break; } } @@ -248537,7 +248499,7 @@ public: if (state != lastState) { lastState = state; - owner.sendChangeMessage (&owner); + owner.sendChangeMessage(); } } @@ -253914,7 +253876,7 @@ public: if (listeners.size() > 0) callListeners (loadingImage); - sendChangeMessage (this); + sendChangeMessage(); } void drawCurrentImage (Graphics& g, int x, int y, int w, int h) @@ -254126,7 +254088,7 @@ public: g.fillAll (Colours::black); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { const int64 now = Time::currentTimeMillis(); @@ -276265,7 +276227,7 @@ public: if (state != lastState) { lastState = state; - owner.sendChangeMessage (&owner); + owner.sendChangeMessage(); } } diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 6ee4bb91e8..556c67e80d 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -64,7 +64,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 52 -#define JUCE_BUILDNUMBER 92 +#define JUCE_BUILDNUMBER 93 /** Current Juce version number. @@ -798,6 +798,13 @@ /** This macro is added to all juce public function declarations. */ #define JUCE_PUBLIC_FUNCTION JUCE_API JUCE_CALLTYPE +/** This turns on some non-essential bits of code that should prevent old code from compiling + in cases where method signatures have changed, etc. +*/ +#if (! defined (JUCE_CATCH_DEPRECATED_CODE_MISUSE)) && JUCE_DEBUG && ! DOXYGEN + #define JUCE_CATCH_DEPRECATED_CODE_MISUSE 1 +#endif + // Now include some basics that are needed by most of the Juce classes... BEGIN_JUCE_NAMESPACE @@ -12585,6 +12592,12 @@ public: return listeners.size() == 0; } + /** Clears the list. */ + void clear() + { + listeners.clear(); + } + /** Returns true if the specified listener has been added to the list. */ bool contains (ListenerClass* const listener) const throw() { @@ -12993,27 +13006,24 @@ typedef Value::Listener ValueListener; #define __JUCE_CHANGEBROADCASTER_JUCEHEADER__ -/*** Start of inlined file: juce_ChangeListenerList.h ***/ -#ifndef __JUCE_CHANGELISTENERLIST_JUCEHEADER__ -#define __JUCE_CHANGELISTENERLIST_JUCEHEADER__ - - /*** Start of inlined file: juce_ChangeListener.h ***/ #ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ #define __JUCE_CHANGELISTENER_JUCEHEADER__ +class ChangeBroadcaster; + /** - Receives callbacks about changes to some kind of object. + Receives change event callbacks that are sent out by a ChangeBroadcaster. - Many objects use a ChangeListenerList to keep a set of listeners which they - will inform when something changes. A subclass of ChangeListener - is used to receive these callbacks. + A ChangeBroadcaster keeps a set of listeners to which it broadcasts a message when + the ChangeBroadcaster::sendChangeMessage() method is called. A subclass of + ChangeListener is used to receive these callbacks. Note that the major difference between an ActionListener and a ChangeListener is that for a ChangeListener, multiple changes will be coalesced into fewer callbacks, but ActionListeners perform one callback for every event posted. - @see ChangeListenerList, ChangeBroadcaster, ActionListener + @see ChangeBroadcaster, ActionListener */ class JUCE_API ChangeListener { @@ -13021,238 +13031,24 @@ public: /** Destructor. */ virtual ~ChangeListener() {} - /** Overridden by your subclass to receive the callback. - - @param objectThatHasChanged the value that was passed to the - ChangeListenerList::sendChangeMessage() method + /** Your subclass should implement this method to receive the callback. + @param source the ChangeBroadcaster that triggered the callback. */ - virtual void changeListenerCallback (void* objectThatHasChanged) = 0; + virtual void changeListenerCallback (ChangeBroadcaster* source) = 0; + + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This method's signature has changed to take a ChangeBroadcaster parameter - please update your code! + private: virtual int changeListenerCallback (void*) { return 0; } + #endif }; #endif // __JUCE_CHANGELISTENER_JUCEHEADER__ /*** End of inlined file: juce_ChangeListener.h ***/ - -/*** Start of inlined file: juce_ScopedLock.h ***/ -#ifndef __JUCE_SCOPEDLOCK_JUCEHEADER__ -#define __JUCE_SCOPEDLOCK_JUCEHEADER__ - -/** - Automatically locks and unlocks a CriticalSection object. - - Use one of these as a local variable to control access to a CriticalSection. - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ...do some stuff... - - // myCriticalSection gets unlocked here. - } - @endcode - - @see CriticalSection, ScopedUnlock -*/ -class JUCE_API ScopedLock -{ -public: - - /** Creates a ScopedLock. - - As soon as it is created, this will lock the CriticalSection, and - when the ScopedLock object is deleted, the CriticalSection will - be unlocked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedLock (const CriticalSection& lock) throw() : lock_ (lock) { lock.enter(); } - - /** Destructor. - - The CriticalSection will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedLock() throw() { lock_.exit(); } - -private: - - const CriticalSection& lock_; - - ScopedLock (const ScopedLock&); - ScopedLock& operator= (const ScopedLock&); -}; - -/** - Automatically unlocks and re-locks a CriticalSection object. - - This is the reverse of a ScopedLock object - instead of locking the critical - section for the lifetime of this object, it unlocks it. - - Make sure you don't try to unlock critical sections that aren't actually locked! - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ... do some stuff with it locked .. - - while (xyz) - { - ... do some stuff with it locked .. - - const ScopedUnlock unlocker (myCriticalSection); - - // myCriticalSection is now unlocked for the remainder of this block, - // and re-locked at the end. - - ...do some stuff with it unlocked ... - } - - // myCriticalSection gets unlocked here. - } - @endcode - - @see CriticalSection, ScopedLock -*/ -class ScopedUnlock -{ -public: - - /** Creates a ScopedUnlock. - - As soon as it is created, this will unlock the CriticalSection, and - when the ScopedLock object is deleted, the CriticalSection will - be re-locked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedUnlock (const CriticalSection& lock) throw() : lock_ (lock) { lock.exit(); } - - /** Destructor. - - The CriticalSection will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedUnlock() throw() { lock_.enter(); } - -private: - - const CriticalSection& lock_; - - ScopedUnlock (const ScopedLock&); - ScopedUnlock& operator= (const ScopedUnlock&); -}; - -#endif // __JUCE_SCOPEDLOCK_JUCEHEADER__ -/*** End of inlined file: juce_ScopedLock.h ***/ - /** - A set of ChangeListeners. - - Listeners can be added and removed from the list, and change messages can be - broadcast to all the listeners. + Holds a list of ChangeListeners, and sends messages to them when instructed. - @see ChangeListener, ChangeBroadcaster -*/ -class JUCE_API ChangeListenerList : public MessageListener -{ -public: - - /** Creates an empty list. */ - ChangeListenerList(); - - /** Destructor. */ - ~ChangeListenerList(); - - /** Adds a listener to the list. - - (Trying to add a listener that's already on the list will have no effect). - */ - void addChangeListener (ChangeListener* listener); - - /** Removes a listener from the list. - - If the listener isn't on the list, this won't have any effect. - */ - void removeChangeListener (ChangeListener* listener); - - /** Removes all listeners from the list. */ - void removeAllChangeListeners(); - - /** Posts an asynchronous change message to all the listeners. - - If a message has already been sent and hasn't yet been delivered, this - method won't send another - in this way it coalesces multiple frequent - changes into fewer actual callbacks to the ChangeListeners. Contrast this - with the ActionListener, which posts a new event for every call to its - sendActionMessage() method. - - Only listeners which are on the list when the change event is delivered - will receive the event - and this may include listeners that weren't on - the list when the change message was sent. - - @param objectThatHasChanged this pointer is passed to the - ChangeListener::changeListenerCallback() method, - and can be any value the application needs - @see sendSynchronousChangeMessage - */ - void sendChangeMessage (void* objectThatHasChanged); - - /** This will synchronously callback all the ChangeListeners. - - Use this if you need to synchronously force a call to all the - listeners' ChangeListener::changeListenerCallback() methods. - */ - void sendSynchronousChangeMessage (void* objectThatHasChanged); - - /** If a change message has been sent but not yet dispatched, this will - use sendSynchronousChangeMessage() to make the callback immediately. - */ - void dispatchPendingMessages(); - - /** @internal */ - void handleMessage (const Message&); - - juce_UseDebuggingNewOperator - -private: - SortedSet listeners; - CriticalSection lock; - void* lastChangedObject; - bool messagePending; - - ChangeListenerList (const ChangeListenerList&); - ChangeListenerList& operator= (const ChangeListenerList&); -}; - -#endif // __JUCE_CHANGELISTENERLIST_JUCEHEADER__ -/*** End of inlined file: juce_ChangeListenerList.h ***/ - -/** Manages a list of ChangeListeners, and can send them messages. - - To quickly add methods to your class that can add/remove change - listeners and broadcast to them, you can derive from this. - - @see ChangeListenerList, ChangeListener + @see ChangeListener */ class JUCE_API ChangeBroadcaster { @@ -13264,14 +13060,12 @@ public: /** Destructor. */ virtual ~ChangeBroadcaster(); - /** Adds a listener to the list. - - (Trying to add a listener that's already on the list will have no effect). + /** Registers a listener to receive change callbacks from this broadcaster. + Trying to add a listener that's already on the list will have no effect. */ void addChangeListener (ChangeListener* listener); - /** Removes a listener from the list. - + /** Unregisters a listener from the list. If the listener isn't on the list, this won't have any effect. */ void removeChangeListener (ChangeListener* listener); @@ -13279,30 +13073,39 @@ public: /** Removes all listeners from the list. */ void removeAllChangeListeners(); - /** Broadcasts a change message to all the registered listeners. - - The message will be delivered asynchronously by the event thread, so this - method will not directly call any of the listeners. For a synchronous - message, use sendSynchronousChangeMessage(). + /** Causes an asynchronous change message to be sent to all the registered listeners. - @see ChangeListenerList::sendActionMessage + The message will be delivered asynchronously by the main message thread, so this + method will return immediately. To call the listeners synchronously use + sendSynchronousChangeMessage(). */ - void sendChangeMessage (void* objectThatHasChanged); + void sendChangeMessage(); /** Sends a synchronous change message to all the registered listeners. - @see ChangeListenerList::sendSynchronousChangeMessage + This will immediately call all the listeners that are registered. For thread-safety + reasons, you must only call this method on the main message thread. + + @see dispatchPendingMessages */ - void sendSynchronousChangeMessage (void* objectThatHasChanged); + void sendSynchronousChangeMessage(); + + /** If a change message has been sent but not yet dispatched, this will call + sendSynchronousChangeMessage() to make the callback immediately. - /** If a change message has been sent but not yet dispatched, this will - use sendSynchronousChangeMessage() to make the callback immediately. + For thread-safety reasons, you must only call this method on the main message thread. */ void dispatchPendingMessages(); private: - ChangeListenerList changeListenerList; + class ChangeBroadcasterMessage; + friend class ChangeBroadcasterMessage; + + Atomic pendingMessage; + ListenerList changeListeners; + + void invalidatePendingMessage(); ChangeBroadcaster (const ChangeBroadcaster&); ChangeBroadcaster& operator= (const ChangeBroadcaster&); @@ -14833,6 +14636,139 @@ private: #ifndef __JUCE_SINGLETON_JUCEHEADER__ #define __JUCE_SINGLETON_JUCEHEADER__ + +/*** Start of inlined file: juce_ScopedLock.h ***/ +#ifndef __JUCE_SCOPEDLOCK_JUCEHEADER__ +#define __JUCE_SCOPEDLOCK_JUCEHEADER__ + +/** + Automatically locks and unlocks a CriticalSection object. + + Use one of these as a local variable to control access to a CriticalSection. + + e.g. @code + + CriticalSection myCriticalSection; + + for (;;) + { + const ScopedLock myScopedLock (myCriticalSection); + // myCriticalSection is now locked + + ...do some stuff... + + // myCriticalSection gets unlocked here. + } + @endcode + + @see CriticalSection, ScopedUnlock +*/ +class JUCE_API ScopedLock +{ +public: + + /** Creates a ScopedLock. + + As soon as it is created, this will lock the CriticalSection, and + when the ScopedLock object is deleted, the CriticalSection will + be unlocked. + + Make sure this object is created and deleted by the same thread, + otherwise there are no guarantees what will happen! Best just to use it + as a local stack object, rather than creating one with the new() operator. + */ + inline explicit ScopedLock (const CriticalSection& lock) throw() : lock_ (lock) { lock.enter(); } + + /** Destructor. + + The CriticalSection will be unlocked when the destructor is called. + + Make sure this object is created and deleted by the same thread, + otherwise there are no guarantees what will happen! + */ + inline ~ScopedLock() throw() { lock_.exit(); } + +private: + + const CriticalSection& lock_; + + ScopedLock (const ScopedLock&); + ScopedLock& operator= (const ScopedLock&); +}; + +/** + Automatically unlocks and re-locks a CriticalSection object. + + This is the reverse of a ScopedLock object - instead of locking the critical + section for the lifetime of this object, it unlocks it. + + Make sure you don't try to unlock critical sections that aren't actually locked! + + e.g. @code + + CriticalSection myCriticalSection; + + for (;;) + { + const ScopedLock myScopedLock (myCriticalSection); + // myCriticalSection is now locked + + ... do some stuff with it locked .. + + while (xyz) + { + ... do some stuff with it locked .. + + const ScopedUnlock unlocker (myCriticalSection); + + // myCriticalSection is now unlocked for the remainder of this block, + // and re-locked at the end. + + ...do some stuff with it unlocked ... + } + + // myCriticalSection gets unlocked here. + } + @endcode + + @see CriticalSection, ScopedLock +*/ +class ScopedUnlock +{ +public: + + /** Creates a ScopedUnlock. + + As soon as it is created, this will unlock the CriticalSection, and + when the ScopedLock object is deleted, the CriticalSection will + be re-locked. + + Make sure this object is created and deleted by the same thread, + otherwise there are no guarantees what will happen! Best just to use it + as a local stack object, rather than creating one with the new() operator. + */ + inline explicit ScopedUnlock (const CriticalSection& lock) throw() : lock_ (lock) { lock.exit(); } + + /** Destructor. + + The CriticalSection will be unlocked when the destructor is called. + + Make sure this object is created and deleted by the same thread, + otherwise there are no guarantees what will happen! + */ + inline ~ScopedUnlock() throw() { lock_.enter(); } + +private: + + const CriticalSection& lock_; + + ScopedUnlock (const ScopedLock&); + ScopedUnlock& operator= (const ScopedUnlock&); +}; + +#endif // __JUCE_SCOPEDLOCK_JUCEHEADER__ +/*** End of inlined file: juce_ScopedLock.h ***/ + /** Macro to declare member variables and methods for a singleton class. @@ -25137,10 +25073,20 @@ public: So if you call setOrigin (100, 100), then the position that was previously referred to as (100, 100) will subsequently be considered to be (0, 0). - @see reduceClipRegion + @see reduceClipRegion, addTransform */ void setOrigin (int newOriginX, int newOriginY); + /** Adds a transformation which will be performed on all the graphics operations that + the context subsequently performs. + + After calling this, all the coordinates that are passed into the context will be + transformed by this matrix. + + @see setOrigin + */ + void addTransform (const AffineTransform& transform); + /** Resets the current colour, brush, and font to default settings. */ void resetToDefaultState(); @@ -28003,16 +27949,13 @@ public: }; #ifndef DOXYGEN - /** @internal - This method is deprecated - use localPointToGlobal instead. */ + /** This method is deprecated - use localPointToGlobal instead. */ const Point relativePositionToGlobal (const Point& relativePosition) const; - /** @internal - This method is deprecated - use getLocalPoint instead. */ + /** This method is deprecated - use getLocalPoint instead. */ const Point globalPositionToRelative (const Point& screenPosition) const; - /** @internal - This method is deprecated - use getLocalPoint instead. */ + /** This method is deprecated - use getLocalPoint instead. */ const Point relativePositionToOtherComponent (const Component* targetComponent, const Point& positionRelativeToThis) const; #endif @@ -28103,13 +28046,19 @@ private: void grabFocusInternal (const FocusChangeType cause, bool canTryParent = true); static void giveAwayFocus(); void sendEnablementChangeMessage(); - void subtractObscuredRegions (RectangleList& result, const Point& delta, - const Rectangle& clipRect, const Component* const compToAvoid) const; - void clipObscuredRegions (Graphics& g, const Rectangle& clipRect, int deltaX, int deltaY) const; - void sendVisibilityChangeMessage(); - const Rectangle getParentOrMainMonitorBounds() const; + class ComponentHelpers; + friend class ComponentHelpers; + + /* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies. + You might need to give your subclasses a private dummy constructor like this one to avoid + compiler warnings. + */ + Component (const Component&); + Component& operator= (const Component&); + + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE // This is included here just to cause a compile error if your code is still handling // drag-and-drop with this method. If so, just update it to use the new FileDragAndDropTarget // class, which is easy (just make your class inherit from FileDragAndDropTarget, and @@ -28119,15 +28068,10 @@ private: // This is included here to cause an error if you use or overload it - it has been deprecated in // favour of contains (const Point&) void contains (int, int); - - /* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies. - You might need to give your subclasses a private dummy constructor like this one to avoid - compiler warnings. - */ - Component (const Component&); - Component& operator= (const Component&); + #endif protected: + /** @internal */ virtual void internalRepaint (int x, int y, int w, int h); /** @internal */ @@ -29727,9 +29671,11 @@ private: void handleAsyncUpdate(); void globalFocusChanged (Component*); - // xxx this is just here to cause a compile error in old code that hasn't been changed to use the new + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This is just here to cause a compile error in old code that hasn't been changed to use the new // version of this method. virtual short getFirstCommandTarget() { return 0; } + #endif ApplicationCommandManager (const ApplicationCommandManager&); ApplicationCommandManager& operator= (const ApplicationCommandManager&); @@ -42087,7 +42033,7 @@ public: /** @internal */ void buttonClicked (Button* b); /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ void timerCallback(); @@ -43292,8 +43238,10 @@ protected: int midiNoteNumber, float velocity); - /** xxx Temporary method here to cause a compiler error - note the new parameters for this method. */ + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // Temporary method here to cause a compiler error - note the new parameters for this method. int findFreeVoice (const bool) const { return 0; } + #endif private: double sampleRate; @@ -43623,9 +43571,6 @@ private: #endif #ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ -#endif -#ifndef __JUCE_CHANGELISTENERLIST_JUCEHEADER__ - #endif #ifndef __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ @@ -51954,7 +51899,7 @@ public: void scrollToTop(); /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ int getNumRows(); /** @internal */ @@ -56186,9 +56131,9 @@ public: void changed (const bool synchronous = false) { if (synchronous) - sendSynchronousChangeMessage (this); + sendSynchronousChangeMessage(); else - sendChangeMessage (this); + sendChangeMessage(); } juce_UseDebuggingNewOperator @@ -56981,8 +56926,6 @@ public: /** @internal */ void refresh(); /** @internal */ - void changeListenerCallback (void*); - /** @internal */ void sliderValueChanged (Slider*); juce_UseDebuggingNewOperator @@ -57249,7 +57192,7 @@ public: /** @internal */ void buttonClicked (Button*); /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ void childBoundsChanged (Component*); @@ -57659,10 +57602,11 @@ private: ColourSelector (const ColourSelector&); ColourSelector& operator= (const ColourSelector&); - // this constructor is here temporarily to prevent old code compiling, because the parameters + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This constructor is here temporarily to prevent old code compiling, because the parameters // have changed - if you get an error here, update your code to use the new constructor instead.. - // (xxx - note to self: remember to remove this at some point in the future) ColourSelector (bool); + #endif }; #endif // __JUCE_COLOURSELECTOR_JUCEHEADER__ diff --git a/src/application/juce_ApplicationCommandManager.h b/src/application/juce_ApplicationCommandManager.h index 00fce1ace1..840419ad15 100644 --- a/src/application/juce_ApplicationCommandManager.h +++ b/src/application/juce_ApplicationCommandManager.h @@ -327,9 +327,11 @@ private: void handleAsyncUpdate(); void globalFocusChanged (Component*); - // xxx this is just here to cause a compile error in old code that hasn't been changed to use the new + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This is just here to cause a compile error in old code that hasn't been changed to use the new // version of this method. virtual short getFirstCommandTarget() { return 0; } + #endif ApplicationCommandManager (const ApplicationCommandManager&); ApplicationCommandManager& operator= (const ApplicationCommandManager&); diff --git a/src/audio/audio_file_formats/juce_AudioThumbnail.cpp b/src/audio/audio_file_formats/juce_AudioThumbnail.cpp index 618e727790..5176d05d9b 100644 --- a/src/audio/audio_file_formats/juce_AudioThumbnail.cpp +++ b/src/audio/audio_file_formats/juce_AudioThumbnail.cpp @@ -81,7 +81,7 @@ void AudioThumbnail::setSource (InputSource* const newSource) } } - sendChangeMessage (this); + sendChangeMessage(); } bool AudioThumbnail::useTimeSlice() @@ -105,7 +105,7 @@ bool AudioThumbnail::useTimeSlice() readNextBlockFromAudioFile (*reader); stopTimer(); - sendChangeMessage (this); + sendChangeMessage(); const bool justFinished = isFullyLoaded(); diff --git a/src/audio/audio_sources/juce_AudioTransportSource.cpp b/src/audio/audio_sources/juce_AudioTransportSource.cpp index c3c3f915c4..5481e47896 100644 --- a/src/audio/audio_sources/juce_AudioTransportSource.cpp +++ b/src/audio/audio_sources/juce_AudioTransportSource.cpp @@ -135,7 +135,7 @@ void AudioTransportSource::start() inputStreamEOF = false; } - sendChangeMessage (this); + sendChangeMessage(); } } @@ -152,7 +152,7 @@ void AudioTransportSource::stop() while (--n >= 0 && ! stopped) Thread::sleep (2); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -272,7 +272,7 @@ void AudioTransportSource::getNextAudioBlock (const AudioSourceChannelInfo& info { playing = false; inputStreamEOF = true; - sendChangeMessage (this); + sendChangeMessage(); } stopped = ! playing; diff --git a/src/audio/devices/juce_AudioDeviceManager.cpp b/src/audio/devices/juce_AudioDeviceManager.cpp index c935891872..6026cf9e13 100644 --- a/src/audio/devices/juce_AudioDeviceManager.cpp +++ b/src/audio/devices/juce_AudioDeviceManager.cpp @@ -339,7 +339,7 @@ void AudioDeviceManager::setCurrentAudioDeviceType (const String& type, setAudioDeviceSetup (s, treatAsChosenDevice); - sendChangeMessage (this); + sendChangeMessage(); break; } } @@ -363,7 +363,7 @@ const String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& ne return String::empty; if (! (newSetup == currentSetup)) - sendChangeMessage (this); + sendChangeMessage(); stopDevice(); @@ -729,14 +729,14 @@ void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device callbacks.getUnchecked(i)->audioDeviceAboutToStart (device); } - sendChangeMessage (this); + sendChangeMessage(); } void AudioDeviceManager::audioDeviceStoppedInt() { cpuUsageMs = 0; timeToCpuScale = 0; - sendChangeMessage (this); + sendChangeMessage(); const ScopedLock sl (audioCallbackLock); for (int i = callbacks.size(); --i >= 0;) @@ -777,7 +777,7 @@ void AudioDeviceManager::setMidiInputEnabled (const String& name, } updateXml(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -887,7 +887,7 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) } updateXml(); - sendChangeMessage (this); + sendChangeMessage(); } } diff --git a/src/audio/plugins/juce_KnownPluginList.cpp b/src/audio/plugins/juce_KnownPluginList.cpp index 6338e2f127..c0eb3c46e0 100644 --- a/src/audio/plugins/juce_KnownPluginList.cpp +++ b/src/audio/plugins/juce_KnownPluginList.cpp @@ -45,7 +45,7 @@ void KnownPluginList::clear() if (types.size() > 0) { types.clear(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -83,14 +83,14 @@ bool KnownPluginList::addType (const PluginDescription& type) } types.add (new PluginDescription (type)); - sendChangeMessage (this); + sendChangeMessage(); return true; } void KnownPluginList::removeType (const int index) { types.remove (index); - sendChangeMessage (this); + sendChangeMessage(); } namespace @@ -249,7 +249,7 @@ void KnownPluginList::sort (const SortMethod method) sorter.method = method; types.sort (sorter, true); - sendChangeMessage (this); + sendChangeMessage(); } } diff --git a/src/audio/plugins/juce_PluginListComponent.cpp b/src/audio/plugins/juce_PluginListComponent.cpp index 2a07f5d791..7671d12bd4 100644 --- a/src/audio/plugins/juce_PluginListComponent.cpp +++ b/src/audio/plugins/juce_PluginListComponent.cpp @@ -70,7 +70,7 @@ void PluginListComponent::resized() optionsButton.setTopLeftPosition (8, getHeight() - 28); } -void PluginListComponent::changeListenerCallback (void*) +void PluginListComponent::changeListenerCallback (ChangeBroadcaster*) { listBox.updateContent(); listBox.repaint(); diff --git a/src/audio/plugins/juce_PluginListComponent.h b/src/audio/plugins/juce_PluginListComponent.h index 3674231c65..f9ececa9a6 100644 --- a/src/audio/plugins/juce_PluginListComponent.h +++ b/src/audio/plugins/juce_PluginListComponent.h @@ -76,7 +76,7 @@ public: /** @internal */ void buttonClicked (Button* b); /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ void timerCallback(); diff --git a/src/audio/synthesisers/juce_Synthesiser.h b/src/audio/synthesisers/juce_Synthesiser.h index 777d4b8d62..f265b57aaf 100644 --- a/src/audio/synthesisers/juce_Synthesiser.h +++ b/src/audio/synthesisers/juce_Synthesiser.h @@ -468,8 +468,10 @@ protected: int midiNoteNumber, float velocity); - /** xxx Temporary method here to cause a compiler error - note the new parameters for this method. */ + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // Temporary method here to cause a compiler error - note the new parameters for this method. int findFreeVoice (const bool) const { return 0; } + #endif private: double sampleRate; diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index 97869a0d17..d6debc3325 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -33,7 +33,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 52 -#define JUCE_BUILDNUMBER 92 +#define JUCE_BUILDNUMBER 93 /** Current Juce version number. @@ -154,6 +154,12 @@ /** This macro is added to all juce public function declarations. */ #define JUCE_PUBLIC_FUNCTION JUCE_API JUCE_CALLTYPE +/** This turns on some non-essential bits of code that should prevent old code from compiling + in cases where method signatures have changed, etc. +*/ +#if (! defined (JUCE_CATCH_DEPRECATED_CODE_MISUSE)) && JUCE_DEBUG && ! DOXYGEN + #define JUCE_CATCH_DEPRECATED_CODE_MISUSE 1 +#endif //============================================================================== // Now include some basics that are needed by most of the Juce classes... diff --git a/src/events/juce_ChangeBroadcaster.cpp b/src/events/juce_ChangeBroadcaster.cpp index d99068c828..551919ac33 100644 --- a/src/events/juce_ChangeBroadcaster.cpp +++ b/src/events/juce_ChangeBroadcaster.cpp @@ -31,6 +31,24 @@ BEGIN_JUCE_NAMESPACE #include "juce_MessageManager.h" +//============================================================================== +class ChangeBroadcaster::ChangeBroadcasterMessage : public CallbackMessage +{ +public: + ChangeBroadcasterMessage (ChangeBroadcaster* const owner_) + : owner (owner_) + { + } + + void messageCallback() + { + if (owner != 0 && owner->pendingMessage.value == this) + owner->sendSynchronousChangeMessage(); + } + + ChangeBroadcaster* owner; +}; + //============================================================================== ChangeBroadcaster::ChangeBroadcaster() throw() { @@ -42,39 +60,65 @@ ChangeBroadcaster::~ChangeBroadcaster() { // all event-based objects must be deleted BEFORE juce is shut down! jassert (MessageManager::instance != 0); + + invalidatePendingMessage(); } void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) { - changeListenerList.addChangeListener (listener); + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); + + changeListeners.add (listener); } void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) { - jassert (changeListenerList.isValidMessageListener()); + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - if (changeListenerList.isValidMessageListener()) - changeListenerList.removeChangeListener (listener); + changeListeners.remove (listener); } void ChangeBroadcaster::removeAllChangeListeners() { - changeListenerList.removeAllChangeListeners(); + // Listeners can only be safely added when the event thread is locked... + jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); + + changeListeners.clear(); +} + +void ChangeBroadcaster::invalidatePendingMessage() +{ + ChangeBroadcasterMessage* const oldMessage = pendingMessage.exchange (0); + if (oldMessage != 0) + oldMessage->owner = 0; } -void ChangeBroadcaster::sendChangeMessage (void* objectThatHasChanged) +void ChangeBroadcaster::sendChangeMessage() { - changeListenerList.sendChangeMessage (objectThatHasChanged); + if (pendingMessage.value == 0 && changeListeners.size() > 0) + { + ScopedPointer pending (new ChangeBroadcasterMessage (this)); + + if (pendingMessage.compareAndSetBool (pending, 0)) + pending.release()->post(); + } } -void ChangeBroadcaster::sendSynchronousChangeMessage (void* objectThatHasChanged) +void ChangeBroadcaster::sendSynchronousChangeMessage() { - changeListenerList.sendSynchronousChangeMessage (objectThatHasChanged); + // This can only be called by the event thread. + jassert (MessageManager::getInstance()->isThisTheMessageThread()); + + invalidatePendingMessage(); + changeListeners.call (&ChangeListener::changeListenerCallback, this); } void ChangeBroadcaster::dispatchPendingMessages() { - changeListenerList.dispatchPendingMessages(); + if (pendingMessage.get() != 0) + sendSynchronousChangeMessage(); } diff --git a/src/events/juce_ChangeBroadcaster.h b/src/events/juce_ChangeBroadcaster.h index a12b856fd7..72333874d8 100644 --- a/src/events/juce_ChangeBroadcaster.h +++ b/src/events/juce_ChangeBroadcaster.h @@ -26,16 +26,16 @@ #ifndef __JUCE_CHANGEBROADCASTER_JUCEHEADER__ #define __JUCE_CHANGEBROADCASTER_JUCEHEADER__ -#include "juce_ChangeListenerList.h" +#include "juce_ChangeListener.h" +#include "juce_ListenerList.h" +#include "../core/juce_Atomic.h" //============================================================================== -/** Manages a list of ChangeListeners, and can send them messages. +/** + Holds a list of ChangeListeners, and sends messages to them when instructed. - To quickly add methods to your class that can add/remove change - listeners and broadcast to them, you can derive from this. - - @see ChangeListenerList, ChangeListener + @see ChangeListener */ class JUCE_API ChangeBroadcaster { @@ -48,14 +48,12 @@ public: virtual ~ChangeBroadcaster(); //============================================================================== - /** Adds a listener to the list. - - (Trying to add a listener that's already on the list will have no effect). + /** Registers a listener to receive change callbacks from this broadcaster. + Trying to add a listener that's already on the list will have no effect. */ void addChangeListener (ChangeListener* listener); - /** Removes a listener from the list. - + /** Unregisters a listener from the list. If the listener isn't on the list, this won't have any effect. */ void removeChangeListener (ChangeListener* listener); @@ -64,31 +62,39 @@ public: void removeAllChangeListeners(); //============================================================================== - /** Broadcasts a change message to all the registered listeners. + /** Causes an asynchronous change message to be sent to all the registered listeners. - The message will be delivered asynchronously by the event thread, so this - method will not directly call any of the listeners. For a synchronous - message, use sendSynchronousChangeMessage(). - - @see ChangeListenerList::sendActionMessage + The message will be delivered asynchronously by the main message thread, so this + method will return immediately. To call the listeners synchronously use + sendSynchronousChangeMessage(). */ - void sendChangeMessage (void* objectThatHasChanged); + void sendChangeMessage(); /** Sends a synchronous change message to all the registered listeners. - @see ChangeListenerList::sendSynchronousChangeMessage + This will immediately call all the listeners that are registered. For thread-safety + reasons, you must only call this method on the main message thread. + + @see dispatchPendingMessages */ - void sendSynchronousChangeMessage (void* objectThatHasChanged); + void sendSynchronousChangeMessage(); - /** If a change message has been sent but not yet dispatched, this will - use sendSynchronousChangeMessage() to make the callback immediately. + /** If a change message has been sent but not yet dispatched, this will call + sendSynchronousChangeMessage() to make the callback immediately. + + For thread-safety reasons, you must only call this method on the main message thread. */ void dispatchPendingMessages(); - private: //============================================================================== - ChangeListenerList changeListenerList; + class ChangeBroadcasterMessage; + friend class ChangeBroadcasterMessage; + + Atomic pendingMessage; + ListenerList changeListeners; + + void invalidatePendingMessage(); ChangeBroadcaster (const ChangeBroadcaster&); ChangeBroadcaster& operator= (const ChangeBroadcaster&); diff --git a/src/events/juce_ChangeListener.h b/src/events/juce_ChangeListener.h index 662d15bb96..b4ffaae577 100644 --- a/src/events/juce_ChangeListener.h +++ b/src/events/juce_ChangeListener.h @@ -26,20 +26,21 @@ #ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ #define __JUCE_CHANGELISTENER_JUCEHEADER__ +class ChangeBroadcaster; //============================================================================== /** - Receives callbacks about changes to some kind of object. + Receives change event callbacks that are sent out by a ChangeBroadcaster. - Many objects use a ChangeListenerList to keep a set of listeners which they - will inform when something changes. A subclass of ChangeListener - is used to receive these callbacks. + A ChangeBroadcaster keeps a set of listeners to which it broadcasts a message when + the ChangeBroadcaster::sendChangeMessage() method is called. A subclass of + ChangeListener is used to receive these callbacks. Note that the major difference between an ActionListener and a ChangeListener is that for a ChangeListener, multiple changes will be coalesced into fewer callbacks, but ActionListeners perform one callback for every event posted. - @see ChangeListenerList, ChangeBroadcaster, ActionListener + @see ChangeBroadcaster, ActionListener */ class JUCE_API ChangeListener { @@ -47,12 +48,17 @@ public: /** Destructor. */ virtual ~ChangeListener() {} - /** Overridden by your subclass to receive the callback. - - @param objectThatHasChanged the value that was passed to the - ChangeListenerList::sendChangeMessage() method + /** Your subclass should implement this method to receive the callback. + @param source the ChangeBroadcaster that triggered the callback. */ - virtual void changeListenerCallback (void* objectThatHasChanged) = 0; + virtual void changeListenerCallback (ChangeBroadcaster* source) = 0; + + + //============================================================================== + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This method's signature has changed to take a ChangeBroadcaster parameter - please update your code! + private: virtual int changeListenerCallback (void*) { return 0; } + #endif }; diff --git a/src/events/juce_ChangeListenerList.cpp b/src/events/juce_ChangeListenerList.cpp deleted file mode 100644 index ac61a2da43..0000000000 --- a/src/events/juce_ChangeListenerList.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-10 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_ChangeListenerList.h" - - -//============================================================================== -ChangeListenerList::ChangeListenerList() - : lastChangedObject (0), - messagePending (false) -{ -} - -ChangeListenerList::~ChangeListenerList() -{ -} - -void ChangeListenerList::addChangeListener (ChangeListener* const listener) -{ - const ScopedLock sl (lock); - - jassert (listener != 0); - - if (listener != 0) - listeners.add (listener); -} - -void ChangeListenerList::removeChangeListener (ChangeListener* const listener) -{ - const ScopedLock sl (lock); - listeners.removeValue (listener); -} - -void ChangeListenerList::removeAllChangeListeners() -{ - const ScopedLock sl (lock); - listeners.clear(); -} - -void ChangeListenerList::sendChangeMessage (void* const objectThatHasChanged) -{ - const ScopedLock sl (lock); - - if ((! messagePending) && (listeners.size() > 0)) - { - lastChangedObject = objectThatHasChanged; - postMessage (new Message (0, 0, 0, objectThatHasChanged)); - messagePending = true; - } -} - -void ChangeListenerList::handleMessage (const Message& message) -{ - sendSynchronousChangeMessage (message.pointerParameter); -} - -void ChangeListenerList::sendSynchronousChangeMessage (void* const objectThatHasChanged) -{ - const ScopedLock sl (lock); - messagePending = false; - - for (int i = listeners.size(); --i >= 0;) - { - ChangeListener* const l = static_cast (listeners.getUnchecked (i)); - - { - const ScopedUnlock tempUnlocker (lock); - l->changeListenerCallback (objectThatHasChanged); - } - - i = jmin (i, listeners.size()); - } -} - -void ChangeListenerList::dispatchPendingMessages() -{ - if (messagePending) - sendSynchronousChangeMessage (lastChangedObject); -} - -END_JUCE_NAMESPACE diff --git a/src/events/juce_ChangeListenerList.h b/src/events/juce_ChangeListenerList.h deleted file mode 100644 index 24ad8fb298..0000000000 --- a/src/events/juce_ChangeListenerList.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-10 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_CHANGELISTENERLIST_JUCEHEADER__ -#define __JUCE_CHANGELISTENERLIST_JUCEHEADER__ - -#include "juce_ChangeListener.h" -#include "juce_MessageListener.h" -#include "../containers/juce_SortedSet.h" -#include "../threads/juce_ScopedLock.h" - - -//============================================================================== -/** - A set of ChangeListeners. - - Listeners can be added and removed from the list, and change messages can be - broadcast to all the listeners. - - @see ChangeListener, ChangeBroadcaster -*/ -class JUCE_API ChangeListenerList : public MessageListener -{ -public: - //============================================================================== - /** Creates an empty list. */ - ChangeListenerList(); - - /** Destructor. */ - ~ChangeListenerList(); - - //============================================================================== - /** Adds a listener to the list. - - (Trying to add a listener that's already on the list will have no effect). - */ - void addChangeListener (ChangeListener* listener); - - /** Removes a listener from the list. - - If the listener isn't on the list, this won't have any effect. - */ - void removeChangeListener (ChangeListener* listener); - - /** Removes all listeners from the list. */ - void removeAllChangeListeners(); - - //============================================================================== - /** Posts an asynchronous change message to all the listeners. - - If a message has already been sent and hasn't yet been delivered, this - method won't send another - in this way it coalesces multiple frequent - changes into fewer actual callbacks to the ChangeListeners. Contrast this - with the ActionListener, which posts a new event for every call to its - sendActionMessage() method. - - Only listeners which are on the list when the change event is delivered - will receive the event - and this may include listeners that weren't on - the list when the change message was sent. - - @param objectThatHasChanged this pointer is passed to the - ChangeListener::changeListenerCallback() method, - and can be any value the application needs - @see sendSynchronousChangeMessage - */ - void sendChangeMessage (void* objectThatHasChanged); - - /** This will synchronously callback all the ChangeListeners. - - Use this if you need to synchronously force a call to all the - listeners' ChangeListener::changeListenerCallback() methods. - */ - void sendSynchronousChangeMessage (void* objectThatHasChanged); - - /** If a change message has been sent but not yet dispatched, this will - use sendSynchronousChangeMessage() to make the callback immediately. - */ - void dispatchPendingMessages(); - - //============================================================================== - /** @internal */ - void handleMessage (const Message&); - - juce_UseDebuggingNewOperator - -private: - SortedSet listeners; - CriticalSection lock; - void* lastChangedObject; - bool messagePending; - - ChangeListenerList (const ChangeListenerList&); - ChangeListenerList& operator= (const ChangeListenerList&); -}; - - -#endif // __JUCE_CHANGELISTENERLIST_JUCEHEADER__ diff --git a/src/events/juce_ListenerList.h b/src/events/juce_ListenerList.h index 659008007d..a8c32f4a93 100644 --- a/src/events/juce_ListenerList.h +++ b/src/events/juce_ListenerList.h @@ -130,6 +130,12 @@ public: return listeners.size() == 0; } + /** Clears the list. */ + void clear() + { + listeners.clear(); + } + /** Returns true if the specified listener has been added to the list. */ bool contains (ListenerClass* const listener) const throw() { diff --git a/src/gui/components/controls/juce_ListBox.cpp b/src/gui/components/controls/juce_ListBox.cpp index 67933a9be8..217b1b79b9 100644 --- a/src/gui/components/controls/juce_ListBox.cpp +++ b/src/gui/components/controls/juce_ListBox.cpp @@ -381,6 +381,7 @@ void ListBox::setModel (ListBoxModel* const newModel) if (model != newModel) { model = newModel; + repaint(); updateContent(); } } diff --git a/src/gui/components/filebrowser/juce_DirectoryContentsList.cpp b/src/gui/components/filebrowser/juce_DirectoryContentsList.cpp index 83c467b66e..e33cda78ee 100644 --- a/src/gui/components/filebrowser/juce_DirectoryContentsList.cpp +++ b/src/gui/components/filebrowser/juce_DirectoryContentsList.cpp @@ -29,6 +29,7 @@ BEGIN_JUCE_NAMESPACE #include "juce_DirectoryContentsList.h" #include "../../graphics/imaging/juce_ImageCache.h" +#include "../../../threads/juce_ScopedLock.h" //============================================================================== @@ -160,7 +161,7 @@ bool DirectoryContentsList::isStillLoading() const void DirectoryContentsList::changed() { - sendChangeMessage (this); + sendChangeMessage(); } //============================================================================== diff --git a/src/gui/components/filebrowser/juce_FileListComponent.cpp b/src/gui/components/filebrowser/juce_FileListComponent.cpp index 580710ece9..511fd42dfb 100644 --- a/src/gui/components/filebrowser/juce_FileListComponent.cpp +++ b/src/gui/components/filebrowser/juce_FileListComponent.cpp @@ -70,7 +70,7 @@ void FileListComponent::scrollToTop() } //============================================================================== -void FileListComponent::changeListenerCallback (void*) +void FileListComponent::changeListenerCallback (ChangeBroadcaster*) { updateContent(); diff --git a/src/gui/components/filebrowser/juce_FileListComponent.h b/src/gui/components/filebrowser/juce_FileListComponent.h index dd58e4c5e9..743ef86dda 100644 --- a/src/gui/components/filebrowser/juce_FileListComponent.h +++ b/src/gui/components/filebrowser/juce_FileListComponent.h @@ -78,7 +78,7 @@ public: //============================================================================== /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ int getNumRows(); /** @internal */ diff --git a/src/gui/components/filebrowser/juce_FileTreeComponent.cpp b/src/gui/components/filebrowser/juce_FileTreeComponent.cpp index 2202675dd2..9742c9b472 100644 --- a/src/gui/components/filebrowser/juce_FileTreeComponent.cpp +++ b/src/gui/components/filebrowser/juce_FileTreeComponent.cpp @@ -122,7 +122,7 @@ public: newList->addChangeListener (this); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { clearSubItems(); diff --git a/src/gui/components/juce_Component.cpp b/src/gui/components/juce_Component.cpp index b723d2fedf..de11d28ccc 100644 --- a/src/gui/components/juce_Component.cpp +++ b/src/gui/components/juce_Component.cpp @@ -221,6 +221,181 @@ namespace } #endif +//============================================================================== +class Component::ComponentHelpers +{ +public: + //============================================================================== + static void* runModalLoopCallback (void* userData) + { + return (void*) (pointer_sized_int) static_cast (userData)->runModalLoop(); + } + + static const Identifier getColourPropertyId (const int colourId) + { + String s; + s.preallocateStorage (18); + s << "jcclr_" << String::toHexString (colourId); + return s; + } + + //============================================================================== + static inline bool hitTest (Component& comp, const Point& localPoint) + { + return ((unsigned int) localPoint.getX()) < (unsigned int) comp.getWidth() + && ((unsigned int) localPoint.getY()) < (unsigned int) comp.getHeight() + && comp.hitTest (localPoint.getX(), localPoint.getY()); + } + + static const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) + { + return pointInParentSpace - comp.getPosition(); + } + + static const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) + { + return areaInParentSpace - comp.getPosition(); + } + + static const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) + { + return pointInLocalSpace + comp.getPosition(); + } + + static const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) + { + return areaInLocalSpace + comp.getPosition(); + } + + template + static const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) + { + const Component* const directParent = target.getParentComponent(); + jassert (directParent != 0); + + if (directParent == parent) + return convertFromParentSpace (target, coordInParent); + + return convertFromParentSpace (target, convertFromDistantParentSpace (parent, *directParent, coordInParent)); + } + + template + static const Type convertCoordinate (const Component* target, const Component* source, Type p) + { + while (source != 0) + { + if (source == target) + return p; + + if (source->isParentOf (target)) + return convertFromDistantParentSpace (source, *target, p); + + if (source->isOnDesktop()) + { + p = source->getPeer()->localToGlobal (p); + source = 0; + } + else + { + p = convertToParentSpace (*source, p); + source = source->getParentComponent(); + } + } + + jassert (source == 0); + if (target == 0) + return p; + + const Component* const topLevelComp = target->getTopLevelComponent(); + + if (topLevelComp->isOnDesktop()) + p = topLevelComp->getPeer()->globalToLocal (p); + else + p = convertFromParentSpace (*topLevelComp, p); + + if (topLevelComp == target) + return p; + + return convertFromDistantParentSpace (topLevelComp, *target, p); + } + + static const Rectangle getUnclippedArea (const Component& comp) + { + Rectangle r (comp.getLocalBounds()); + + Component* const p = comp.getParentComponent(); + + if (p != 0) + r = r.getIntersection (convertFromParentSpace (comp, getUnclippedArea (*p))); + + return r; + } + + static void clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, const Point& delta) + { + for (int i = comp.childComponentList_.size(); --i >= 0;) + { + const Component& child = *comp.childComponentList_.getUnchecked(i); + +//xxx if (child.isVisible() && ! child.isTransformed()) + if (child.isVisible()) + { + const Rectangle newClip (clipRect.getIntersection (child.bounds_)); + + if (! newClip.isEmpty()) + { + if (child.isOpaque()) + { + g.excludeClipRegion (newClip + delta); + } + else + { + const Point childPos (child.getPosition()); + clipObscuredRegions (child, g, newClip - childPos, childPos + delta); + } + } + } + } + } + + static void subtractObscuredRegions (const Component& comp, RectangleList& result, + const Point& delta, + const Rectangle& clipRect, + const Component* const compToAvoid) + { + for (int i = comp.childComponentList_.size(); --i >= 0;) + { + const Component* const c = comp.childComponentList_.getUnchecked(i); + + if (c != compToAvoid && c->isVisible()) + { + if (c->isOpaque()) + { + Rectangle childBounds (c->bounds_.getIntersection (clipRect)); + childBounds.translate (delta.getX(), delta.getY()); + + result.subtract (childBounds); + } + else + { + Rectangle newClip (clipRect.getIntersection (c->bounds_)); + newClip.translate (-c->getX(), -c->getY()); + + subtractObscuredRegions (*c, result, c->getPosition() + delta, + newClip, compToAvoid); + } + } + } + } + + static const Rectangle getParentOrMainMonitorBounds (const Component& comp) + { + return comp.getParentComponent() != 0 ? comp.getParentComponent()->getLocalBounds() + : Desktop::getInstance().getMainMonitorArea(); + } +}; + + //============================================================================== Component::Component() : parentComponent_ (0), @@ -766,138 +941,30 @@ int Component::getParentHeight() const throw() : getParentMonitorArea().getHeight(); } -int Component::getScreenX() const -{ - return getScreenPosition().getX(); -} - -int Component::getScreenY() const -{ - return getScreenPosition().getY(); -} - -const Point Component::getScreenPosition() const -{ - return localPointToGlobal (Point()); -} - -const Rectangle Component::getScreenBounds() const -{ - return bounds_.withPosition (getScreenPosition()); -} - -namespace CoordinateHelpers -{ - inline bool hitTest (Component& comp, const Point& localPoint) - { - return ((unsigned int) localPoint.getX()) < (unsigned int) comp.getWidth() - && ((unsigned int) localPoint.getY()) < (unsigned int) comp.getHeight() - && comp.hitTest (localPoint.getX(), localPoint.getY()); - } - - const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) - { - return pointInParentSpace - comp.getPosition(); - } - - const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) - { - return areaInParentSpace - comp.getPosition(); - } - - const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) - { - return pointInLocalSpace + comp.getPosition(); - } - - const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) - { - return areaInLocalSpace + comp.getPosition(); - } - - template - const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) - { - const Component* const directParent = target.getParentComponent(); - jassert (directParent != 0); - - if (directParent == parent) - return convertFromParentSpace (target, coordInParent); - - return convertFromParentSpace (target, convertFromDistantParentSpace (parent, *directParent, coordInParent)); - } - - template - const Type convertCoordinate (const Component* target, const Component* source, Type p) - { - while (source != 0) - { - if (source == target) - return p; - - if (source->isParentOf (target)) - return convertFromDistantParentSpace (source, *target, p); - - if (source->isOnDesktop()) - { - p = source->getPeer()->localToGlobal (p); - source = 0; - } - else - { - p = convertToParentSpace (*source, p); - source = source->getParentComponent(); - } - } - - jassert (source == 0); - if (target == 0) - return p; - - const Component* const topLevelComp = target->getTopLevelComponent(); - - if (topLevelComp->isOnDesktop()) - p = topLevelComp->getPeer()->globalToLocal (p); - else - p = convertFromParentSpace (*topLevelComp, p); - - if (topLevelComp == target) - return p; - - return convertFromDistantParentSpace (topLevelComp, *target, p); - } - - const Rectangle getUnclippedArea (const Component& comp) - { - Rectangle r (comp.getLocalBounds()); - - Component* const p = comp.getParentComponent(); +int Component::getScreenX() const { return getScreenPosition().getX(); } +int Component::getScreenY() const { return getScreenPosition().getY(); } - if (p != 0) - r = r.getIntersection (convertFromParentSpace (comp, getUnclippedArea (*p))); - - return r; - } -} +const Point Component::getScreenPosition() const { return localPointToGlobal (Point()); } +const Rectangle Component::getScreenBounds() const { return localAreaToGlobal (getLocalBounds()); } const Point Component::getLocalPoint (const Component* source, const Point& point) const { - return CoordinateHelpers::convertCoordinate (this, source, point); + return ComponentHelpers::convertCoordinate (this, source, point); } const Rectangle Component::getLocalArea (const Component* source, const Rectangle& area) const { - return CoordinateHelpers::convertCoordinate (this, source, area); + return ComponentHelpers::convertCoordinate (this, source, area); } const Point Component::localPointToGlobal (const Point& point) const { - return CoordinateHelpers::convertCoordinate (0, this, point); + return ComponentHelpers::convertCoordinate (0, this, point); } const Rectangle Component::localAreaToGlobal (const Rectangle& area) const { - return CoordinateHelpers::convertCoordinate (0, this, area); + return ComponentHelpers::convertCoordinate (0, this, area); } /* Deprecated methods... */ @@ -1053,7 +1120,7 @@ void Component::setCentreRelative (const float x, const float y) void Component::centreWithSize (const int width, const int height) { - const Rectangle parentArea (getParentOrMainMonitorBounds()); + const Rectangle parentArea (ComponentHelpers::getParentOrMainMonitorBounds (*this)); setBounds (parentArea.getCentreX() - width / 2, parentArea.getCentreY() - height / 2, @@ -1062,7 +1129,7 @@ void Component::centreWithSize (const int width, const int height) void Component::setBoundsInset (const BorderSize& borders) { - setBounds (borders.subtractedFrom (getParentOrMainMonitorBounds())); + setBounds (borders.subtractedFrom (ComponentHelpers::getParentOrMainMonitorBounds (*this))); } void Component::setBoundsToFit (int x, int y, int width, int height, @@ -1124,7 +1191,7 @@ bool Component::hitTest (int x, int y) Component& child = *getChildComponent (i); if (child.isVisible() - && CoordinateHelpers::hitTest (child, CoordinateHelpers::convertFromParentSpace (child, Point (x, y)))) + && ComponentHelpers::hitTest (child, ComponentHelpers::convertFromParentSpace (child, Point (x, y)))) return true; } } @@ -1148,11 +1215,11 @@ void Component::getInterceptsMouseClicks (bool& allowsClicksOnThisComponent, bool Component::contains (const Point& point) { - if (CoordinateHelpers::hitTest (*this, point)) + if (ComponentHelpers::hitTest (*this, point)) { if (parentComponent_ != 0) { - return parentComponent_->contains (CoordinateHelpers::convertToParentSpace (*this, point)); + return parentComponent_->contains (ComponentHelpers::convertToParentSpace (*this, point)); } else if (flags.hasHeavyweightPeerFlag) { @@ -1181,12 +1248,12 @@ bool Component::reallyContains (const int x, const int y, const bool returnTrueI Component* Component::getComponentAt (const Point& position) { - if (flags.visibleFlag && CoordinateHelpers::hitTest (*this, position)) + if (flags.visibleFlag && ComponentHelpers::hitTest (*this, position)) { for (int i = childComponentList_.size(); --i >= 0;) { Component* child = childComponentList_.getUnchecked(i); - child = child->getComponentAt (CoordinateHelpers::convertFromParentSpace (*child, position)); + child = child->getComponentAt (ComponentHelpers::convertFromParentSpace (*child, position)); if (child != 0) return child; @@ -1414,14 +1481,6 @@ void Component::internalHierarchyChanged() } //============================================================================== -namespace ComponentHelpers -{ - void* runModalLoopCallback (void* userData) - { - return (void*) (pointer_sized_int) static_cast (userData)->runModalLoop(); - } -} - int Component::runModalLoop() { if (! MessageManager::getInstance()->isThisTheMessageThread()) @@ -1689,7 +1748,7 @@ void Component::paintComponentAndChildren (Graphics& g) else { g.saveState(); - clipObscuredRegions (g, clipBounds, 0, 0); + ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point()); if (! g.isClipEmpty()) paintComponent (g); @@ -1878,17 +1937,6 @@ void Component::sendLookAndFeelChange() } } -namespace ComponentHelpers -{ - const Identifier getColourPropertyId (const int colourId) - { - String s; - s.preallocateStorage (18); - s << "jcclr_" << String::toHexString (colourId); - return s; - } -} - const Colour Component::findColour (const int colourId, const bool inheritFromParent) const { var* const v = properties.getVarPointer (ComponentHelpers::getColourPropertyId (colourId)); @@ -1946,44 +1994,10 @@ const Rectangle Component::getLocalBounds() const throw() return Rectangle (getWidth(), getHeight()); } -const Rectangle Component::getParentOrMainMonitorBounds() const -{ - return parentComponent_ != 0 ? parentComponent_->getLocalBounds() - : Desktop::getInstance().getMainMonitorArea(); -} - -void Component::clipObscuredRegions (Graphics& g, const Rectangle& clipRect, - const int deltaX, const int deltaY) const -{ - for (int i = childComponentList_.size(); --i >= 0;) - { - const Component* const c = childComponentList_.getUnchecked(i); - - if (c->isVisible()) - { - const Rectangle newClip (clipRect.getIntersection (c->bounds_)); - - if (! newClip.isEmpty()) - { - if (c->isOpaque()) - { - g.excludeClipRegion (newClip.translated (deltaX, deltaY)); - } - else - { - c->clipObscuredRegions (g, newClip.translated (-c->getX(), -c->getY()), - c->getX() + deltaX, - c->getY() + deltaY); - } - } - } - } -} - void Component::getVisibleArea (RectangleList& result, const bool includeSiblings) const { result.clear(); - const Rectangle unclipped (CoordinateHelpers::getUnclippedArea (*this)); + const Rectangle unclipped (ComponentHelpers::getUnclippedArea (*this)); if (! unclipped.isEmpty()) { @@ -1993,45 +2007,15 @@ void Component::getVisibleArea (RectangleList& result, const bool includeSibling { const Component* const c = getTopLevelComponent(); - c->subtractObscuredRegions (result, getLocalPoint (c, Point()), - c->getLocalBounds(), this); + ComponentHelpers::subtractObscuredRegions (*c, result, getLocalPoint (c, Point()), + c->getLocalBounds(), this); } - subtractObscuredRegions (result, Point(), unclipped, 0); + ComponentHelpers::subtractObscuredRegions (*this, result, Point(), unclipped, 0); result.consolidate(); } } -void Component::subtractObscuredRegions (RectangleList& result, - const Point& delta, - const Rectangle& clipRect, - const Component* const compToAvoid) const -{ - for (int i = childComponentList_.size(); --i >= 0;) - { - const Component* const c = childComponentList_.getUnchecked(i); - - if (c != compToAvoid && c->isVisible()) - { - if (c->isOpaque()) - { - Rectangle childBounds (c->bounds_.getIntersection (clipRect)); - childBounds.translate (delta.getX(), delta.getY()); - - result.subtract (childBounds); - } - else - { - Rectangle newClip (clipRect.getIntersection (c->bounds_)); - newClip.translate (-c->getX(), -c->getY()); - - c->subtractObscuredRegions (result, c->getPosition() + delta, - newClip, compToAvoid); - } - } - } -} - //============================================================================== void Component::mouseEnter (const MouseEvent&) { diff --git a/src/gui/components/juce_Component.h b/src/gui/components/juce_Component.h index 1e8a499b07..948cbcb025 100644 --- a/src/gui/components/juce_Component.h +++ b/src/gui/components/juce_Component.h @@ -2006,16 +2006,13 @@ public: //============================================================================== #ifndef DOXYGEN - /** @internal - This method is deprecated - use localPointToGlobal instead. */ + /** This method is deprecated - use localPointToGlobal instead. */ const Point relativePositionToGlobal (const Point& relativePosition) const; - /** @internal - This method is deprecated - use getLocalPoint instead. */ + /** This method is deprecated - use getLocalPoint instead. */ const Point globalPositionToRelative (const Point& screenPosition) const; - /** @internal - This method is deprecated - use getLocalPoint instead. */ + /** This method is deprecated - use getLocalPoint instead. */ const Point relativePositionToOtherComponent (const Component* targetComponent, const Point& positionRelativeToThis) const; #endif @@ -2109,14 +2106,20 @@ private: void grabFocusInternal (const FocusChangeType cause, bool canTryParent = true); static void giveAwayFocus(); void sendEnablementChangeMessage(); - void subtractObscuredRegions (RectangleList& result, const Point& delta, - const Rectangle& clipRect, const Component* const compToAvoid) const; - void clipObscuredRegions (Graphics& g, const Rectangle& clipRect, int deltaX, int deltaY) const; - void sendVisibilityChangeMessage(); - const Rectangle getParentOrMainMonitorBounds() const; + + class ComponentHelpers; + friend class ComponentHelpers; + + /* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies. + You might need to give your subclasses a private dummy constructor like this one to avoid + compiler warnings. + */ + Component (const Component&); + Component& operator= (const Component&); //============================================================================== + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE // This is included here just to cause a compile error if your code is still handling // drag-and-drop with this method. If so, just update it to use the new FileDragAndDropTarget // class, which is easy (just make your class inherit from FileDragAndDropTarget, and @@ -2126,15 +2129,10 @@ private: // This is included here to cause an error if you use or overload it - it has been deprecated in // favour of contains (const Point&) void contains (int, int); - - /* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies. - You might need to give your subclasses a private dummy constructor like this one to avoid - compiler warnings. - */ - Component (const Component&); - Component& operator= (const Component&); + #endif protected: + //============================================================================== /** @internal */ virtual void internalRepaint (int x, int y, int w, int h); /** @internal */ diff --git a/src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp b/src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp index 34644cf1b0..bcb76db4fc 100644 --- a/src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp +++ b/src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp @@ -364,7 +364,7 @@ public: bool mightContainSubItems() { return true; } const String getUniqueName() const { return "keys"; } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { const ScopedPointer oldOpenness (owner.tree.getOpennessState (true)); diff --git a/src/gui/components/keyboard/juce_KeyPressMappingSet.cpp b/src/gui/components/keyboard/juce_KeyPressMappingSet.cpp index 4a38696f4a..ac5cc168e2 100644 --- a/src/gui/components/keyboard/juce_KeyPressMappingSet.cpp +++ b/src/gui/components/keyboard/juce_KeyPressMappingSet.cpp @@ -86,7 +86,7 @@ void KeyPressMappingSet::addKeyPress (const CommandID commandID, { mappings.getUnchecked(i)->keypresses.insert (insertIndex, newKeyPress); - sendChangeMessage (this); + sendChangeMessage(); return; } } @@ -101,7 +101,7 @@ void KeyPressMappingSet::addKeyPress (const CommandID commandID, cm->wantsKeyUpDownCallbacks = (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) != 0; mappings.add (cm); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -122,7 +122,7 @@ void KeyPressMappingSet::resetToDefaultMappings() } } - sendChangeMessage (this); + sendChangeMessage(); } void KeyPressMappingSet::resetToDefaultMapping (const CommandID commandID) @@ -142,7 +142,7 @@ void KeyPressMappingSet::clearAllKeyPresses() { if (mappings.size() > 0) { - sendChangeMessage (this); + sendChangeMessage(); mappings.clear(); } } @@ -154,7 +154,7 @@ void KeyPressMappingSet::clearAllKeyPresses (const CommandID commandID) if (mappings.getUnchecked(i)->commandID == commandID) { mappings.remove (i); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -172,7 +172,7 @@ void KeyPressMappingSet::removeKeyPress (const KeyPress& keypress) if (keypress == cm->keypresses [j]) { cm->keypresses.remove (j); - sendChangeMessage (this); + sendChangeMessage(); } } } @@ -186,7 +186,7 @@ void KeyPressMappingSet::removeKeyPress (const CommandID commandID, const int ke if (mappings.getUnchecked(i)->commandID == commandID) { mappings.getUnchecked(i)->keypresses.remove (keyPressIndex); - sendChangeMessage (this); + sendChangeMessage(); break; } } diff --git a/src/gui/components/layout/juce_ComponentAnimator.cpp b/src/gui/components/layout/juce_ComponentAnimator.cpp index c39fc3c5b7..f22037d90f 100644 --- a/src/gui/components/layout/juce_ComponentAnimator.cpp +++ b/src/gui/components/layout/juce_ComponentAnimator.cpp @@ -240,7 +240,7 @@ void ComponentAnimator::animateComponent (Component* const component, { at = new AnimationTask (component); tasks.add (at); - sendChangeMessage (this); + sendChangeMessage(); } at->reset (finalBounds, finalAlpha, millisecondsToSpendMoving, @@ -284,7 +284,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin tasks.getUnchecked(i)->moveToFinalDestination(); tasks.clear(); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -299,7 +299,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, at->moveToFinalDestination(); tasks.removeObject (at); - sendChangeMessage (this); + sendChangeMessage(); } } @@ -333,7 +333,7 @@ void ComponentAnimator::timerCallback() if (! tasks.getUnchecked(i)->useTimeslice (elapsed)) { tasks.remove (i); - sendChangeMessage (this); + sendChangeMessage(); } } diff --git a/src/gui/components/layout/juce_TabbedButtonBar.cpp b/src/gui/components/layout/juce_TabbedButtonBar.cpp index a7c99915ad..b83ef28f4d 100644 --- a/src/gui/components/layout/juce_TabbedButtonBar.cpp +++ b/src/gui/components/layout/juce_TabbedButtonBar.cpp @@ -307,7 +307,7 @@ void TabbedButtonBar::setCurrentTabIndex (int newIndex, const bool sendChangeMes resized(); if (sendChangeMessage_) - sendChangeMessage (this); + sendChangeMessage(); currentTabChanged (newIndex, getCurrentTabName()); } diff --git a/src/gui/components/lookandfeel/juce_LookAndFeel.cpp b/src/gui/components/lookandfeel/juce_LookAndFeel.cpp index 73a1872f27..2fd6b0a16d 100644 --- a/src/gui/components/lookandfeel/juce_LookAndFeel.cpp +++ b/src/gui/components/lookandfeel/juce_LookAndFeel.cpp @@ -3097,8 +3097,8 @@ void LookAndFeel::drawGlassLozenge (Graphics& g, } { - const float leftIndent = flatOnLeft ? 0.0f : cs * 0.4f; - const float rightIndent = flatOnRight ? 0.0f : cs * 0.4f; + const float leftIndent = flatOnTop || flatOnLeft ? 0.0f : cs * 0.4f; + const float rightIndent = flatOnTop || flatOnRight ? 0.0f : cs * 0.4f; Path highlight; LookAndFeelHelpers::createRoundedPath (highlight, diff --git a/src/gui/components/properties/juce_SliderPropertyComponent.h b/src/gui/components/properties/juce_SliderPropertyComponent.h index 906e6e20c2..3b58a64612 100644 --- a/src/gui/components/properties/juce_SliderPropertyComponent.h +++ b/src/gui/components/properties/juce_SliderPropertyComponent.h @@ -90,8 +90,6 @@ public: /** @internal */ void refresh(); /** @internal */ - void changeListenerCallback (void*); - /** @internal */ void sliderValueChanged (Slider*); juce_UseDebuggingNewOperator diff --git a/src/gui/components/special/juce_AudioDeviceSelectorComponent.cpp b/src/gui/components/special/juce_AudioDeviceSelectorComponent.cpp index 05e88fb73f..b15252f8b0 100644 --- a/src/gui/components/special/juce_AudioDeviceSelectorComponent.cpp +++ b/src/gui/components/special/juce_AudioDeviceSelectorComponent.cpp @@ -418,7 +418,7 @@ public: resized(); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice(); @@ -1059,7 +1059,7 @@ void AudioDeviceSelectorComponent::comboBoxChanged (ComboBox* comboBoxThatHasCha } } -void AudioDeviceSelectorComponent::changeListenerCallback (void*) +void AudioDeviceSelectorComponent::changeListenerCallback (ChangeBroadcaster*) { if (deviceTypeDropDown != 0) { diff --git a/src/gui/components/special/juce_AudioDeviceSelectorComponent.h b/src/gui/components/special/juce_AudioDeviceSelectorComponent.h index 185a9f0cdd..ec89ee865f 100644 --- a/src/gui/components/special/juce_AudioDeviceSelectorComponent.h +++ b/src/gui/components/special/juce_AudioDeviceSelectorComponent.h @@ -86,7 +86,7 @@ public: /** @internal */ void buttonClicked (Button*); /** @internal */ - void changeListenerCallback (void*); + void changeListenerCallback (ChangeBroadcaster*); /** @internal */ void childBoundsChanged (Component*); diff --git a/src/gui/components/special/juce_ColourSelector.cpp b/src/gui/components/special/juce_ColourSelector.cpp index b8ac12adbe..725a10609c 100644 --- a/src/gui/components/special/juce_ColourSelector.cpp +++ b/src/gui/components/special/juce_ColourSelector.cpp @@ -430,7 +430,7 @@ void ColourSelector::update() if ((flags & showColourAtTop) != 0) repaint (previewArea); - sendChangeMessage (this); + sendChangeMessage(); } //============================================================================== diff --git a/src/gui/components/special/juce_ColourSelector.h b/src/gui/components/special/juce_ColourSelector.h index abc3ce84d0..fad4b446b7 100644 --- a/src/gui/components/special/juce_ColourSelector.h +++ b/src/gui/components/special/juce_ColourSelector.h @@ -165,10 +165,11 @@ private: ColourSelector (const ColourSelector&); ColourSelector& operator= (const ColourSelector&); - // this constructor is here temporarily to prevent old code compiling, because the parameters + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // This constructor is here temporarily to prevent old code compiling, because the parameters // have changed - if you get an error here, update your code to use the new constructor instead.. - // (xxx - note to self: remember to remove this at some point in the future) ColourSelector (bool); + #endif }; diff --git a/src/gui/components/special/juce_MidiKeyboardComponent.cpp b/src/gui/components/special/juce_MidiKeyboardComponent.cpp index 99b9e8bb31..8020fb2cd2 100644 --- a/src/gui/components/special/juce_MidiKeyboardComponent.cpp +++ b/src/gui/components/special/juce_MidiKeyboardComponent.cpp @@ -151,7 +151,7 @@ void MidiKeyboardComponent::setLowestVisibleKey (int noteNumber) if (noteNumber != firstKey) { firstKey = noteNumber; - sendChangeMessage (this); + sendChangeMessage(); resized(); } } @@ -598,7 +598,7 @@ void MidiKeyboardComponent::resized() if (kx2 - kx1 <= w) { firstKey = rangeStart; - sendChangeMessage (this); + sendChangeMessage(); repaint(); } } @@ -641,7 +641,7 @@ void MidiKeyboardComponent::resized() if (lastStartKey >= 0 && firstKey > lastStartKey) { firstKey = jlimit (rangeStart, rangeEnd, lastStartKey); - sendChangeMessage (this); + sendChangeMessage(); } int newOffset = 0; diff --git a/src/gui/graphics/contexts/juce_Graphics.cpp b/src/gui/graphics/contexts/juce_Graphics.cpp index 6b882a13f1..6af9706b81 100644 --- a/src/gui/graphics/contexts/juce_Graphics.cpp +++ b/src/gui/graphics/contexts/juce_Graphics.cpp @@ -165,6 +165,11 @@ void Graphics::setOrigin (const int newOriginX, const int newOriginY) context->setOrigin (newOriginX, newOriginY); } +void Graphics::addTransform (const AffineTransform& transform) +{ + context->addTransform (transform); +} + bool Graphics::clipRegionIntersects (const Rectangle& area) const { return context->clipRegionIntersects (area); diff --git a/src/gui/graphics/contexts/juce_Graphics.h b/src/gui/graphics/contexts/juce_Graphics.h index 9cf00bd4c9..d71fa6ad8a 100644 --- a/src/gui/graphics/contexts/juce_Graphics.h +++ b/src/gui/graphics/contexts/juce_Graphics.h @@ -621,10 +621,20 @@ public: So if you call setOrigin (100, 100), then the position that was previously referred to as (100, 100) will subsequently be considered to be (0, 0). - @see reduceClipRegion + @see reduceClipRegion, addTransform */ void setOrigin (int newOriginX, int newOriginY); + /** Adds a transformation which will be performed on all the graphics operations that + the context subsequently performs. + + After calling this, all the coordinates that are passed into the context will be + transformed by this matrix. + + @see setOrigin + */ + void addTransform (const AffineTransform& transform); + /** Resets the current colour, brush, and font to default settings. */ void resetToDefaultState(); diff --git a/src/juce_app_includes.h b/src/juce_app_includes.h index e7efe91341..0fa9760d7f 100644 --- a/src/juce_app_includes.h +++ b/src/juce_app_includes.h @@ -245,9 +245,6 @@ #ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ #include "events/juce_ChangeListener.h" #endif -#ifndef __JUCE_CHANGELISTENERLIST_JUCEHEADER__ - #include "events/juce_ChangeListenerList.h" -#endif #ifndef __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ #include "events/juce_InterprocessConnection.h" #endif diff --git a/src/native/mac/juce_mac_AudioCDBurner.mm b/src/native/mac/juce_mac_AudioCDBurner.mm index bf0be2b6ba..9587e1c99c 100644 --- a/src/native/mac/juce_mac_AudioCDBurner.mm +++ b/src/native/mac/juce_mac_AudioCDBurner.mm @@ -352,7 +352,7 @@ public: if (state != lastState) { lastState = state; - owner.sendChangeMessage (&owner); + owner.sendChangeMessage(); } } diff --git a/src/native/windows/juce_win32_AudioCDReader.cpp b/src/native/windows/juce_win32_AudioCDReader.cpp index 8b4df80e5a..652519b93a 100644 --- a/src/native/windows/juce_win32_AudioCDReader.cpp +++ b/src/native/windows/juce_win32_AudioCDReader.cpp @@ -2201,7 +2201,7 @@ public: if (state != lastState) { lastState = state; - owner.sendChangeMessage (&owner); + owner.sendChangeMessage(); } } diff --git a/src/native/windows/juce_win32_CameraDevice.cpp b/src/native/windows/juce_win32_CameraDevice.cpp index 2e66ff7264..cc0dc32a6c 100644 --- a/src/native/windows/juce_win32_CameraDevice.cpp +++ b/src/native/windows/juce_win32_CameraDevice.cpp @@ -226,7 +226,7 @@ public: if (listeners.size() > 0) callListeners (loadingImage); - sendChangeMessage (this); + sendChangeMessage(); } void drawCurrentImage (Graphics& g, int x, int y, int w, int h) @@ -441,7 +441,7 @@ public: g.fillAll (Colours::black); } - void changeListenerCallback (void*) + void changeListenerCallback (ChangeBroadcaster*) { const int64 now = Time::currentTimeMillis(); diff --git a/src/native/windows/juce_win32_Windowing.cpp b/src/native/windows/juce_win32_Windowing.cpp index cc5143cf8e..4c2ea2ea68 100644 --- a/src/native/windows/juce_win32_Windowing.cpp +++ b/src/native/windows/juce_win32_Windowing.cpp @@ -885,6 +885,7 @@ public: if (taskBarIcon == 0) { taskBarIcon = new NOTIFYICONDATA(); + zeromem (taskBarIcon, sizeof (NOTIFYICONDATA)); taskBarIcon->cbSize = sizeof (NOTIFYICONDATA); taskBarIcon->hWnd = (HWND) hwnd; taskBarIcon->uID = (int) (pointer_sized_int) hwnd; @@ -905,8 +906,6 @@ public: DestroyIcon (oldIcon); } - - DestroyIcon (hicon); } else if (taskBarIcon != 0) { @@ -927,6 +926,56 @@ public: } } + void handleTaskBarEvent (const LPARAM lParam, const WPARAM wParam) + { + if (component->isCurrentlyBlockedByAnotherModalComponent()) + { + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN + || lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + { + Component* const current = Component::getCurrentlyModalComponent(); + + if (current != 0) + current->inputAttemptWhenModal(); + } + } + else + { + ModifierKeys eventMods (ModifierKeys::getCurrentModifiersRealtime()); + + if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) + eventMods = eventMods.withFlags (ModifierKeys::leftButtonModifier); + else if (lParam == WM_RBUTTONDOWN || lParam == WM_RBUTTONDBLCLK) + eventMods = eventMods.withFlags (ModifierKeys::rightButtonModifier); + else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) + eventMods = eventMods.withoutMouseButtons(); + + const MouseEvent e (Desktop::getInstance().getMainMouseSource(), + Point(), eventMods, component, component, getMouseEventTime(), + Point(), getMouseEventTime(), 1, false); + + if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) + { + SetFocus (hwnd); + SetForegroundWindow (hwnd); + component->mouseDown (e); + } + else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) + { + component->mouseUp (e); + } + else if (lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) + { + component->mouseDoubleClick (e); + } + else if (lParam == WM_MOUSEMOVE) + { + component->mouseMove (e); + } + } + } + + //============================================================================== bool isInside (HWND h) const { return GetAncestor (hwnd, GA_ROOT) == h; @@ -1700,21 +1749,11 @@ private: switch (GET_APPCOMMAND_LPARAM (lParam)) { - case APPCOMMAND_MEDIA_PLAY_PAUSE: - key = KeyPress::playKey; - break; - - case APPCOMMAND_MEDIA_STOP: - key = KeyPress::stopKey; - break; - - case APPCOMMAND_MEDIA_NEXTTRACK: - key = KeyPress::fastForwardKey; - break; - - case APPCOMMAND_MEDIA_PREVIOUSTRACK: - key = KeyPress::rewindKey; - break; + case APPCOMMAND_MEDIA_PLAY_PAUSE: key = KeyPress::playKey; break; + case APPCOMMAND_MEDIA_STOP: key = KeyPress::stopKey; break; + case APPCOMMAND_MEDIA_NEXTTRACK: key = KeyPress::fastForwardKey; break; + case APPCOMMAND_MEDIA_PREVIOUSTRACK: key = KeyPress::rewindKey; break; + default: break; } if (key != 0) @@ -1731,6 +1770,83 @@ private: return false; } + LRESULT handleSizeConstraining (RECT* const r, const WPARAM wParam) + { + if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) + { + Rectangle pos (r->left, r->top, r->right - r->left, r->bottom - r->top); + + constrainer->checkBounds (pos, windowBorder.addedTo (component->getBounds()), + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT, + wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT, + wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT, + wParam == WMSZ_RIGHT || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_BOTTOMRIGHT); + r->left = pos.getX(); + r->top = pos.getY(); + r->right = pos.getRight(); + r->bottom = pos.getBottom(); + } + + return TRUE; + } + + LRESULT handlePositionChanging (WINDOWPOS* const wp) + { + if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) + { + if ((wp->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE) + && ! Component::isMouseButtonDownAnywhere()) + { + Rectangle pos (wp->x, wp->y, wp->cx, wp->cy); + const Rectangle current (windowBorder.addedTo (component->getBounds())); + + constrainer->checkBounds (pos, current, + Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), + pos.getY() != current.getY() && pos.getBottom() == current.getBottom(), + pos.getX() != current.getX() && pos.getRight() == current.getRight(), + pos.getY() == current.getY() && pos.getBottom() != current.getBottom(), + pos.getX() == current.getX() && pos.getRight() != current.getRight()); + wp->x = pos.getX(); + wp->y = pos.getY(); + wp->cx = pos.getWidth(); + wp->cy = pos.getHeight(); + } + } + + return 0; + } + + void handleAppActivation (const WPARAM wParam) + { + modifiersAtLastCallback = -1; + updateKeyModifiers(); + + if (isMinimised()) + { + component->repaint(); + handleMovedOrResized(); + + if (! ComponentPeer::isValidPeer (this)) + return; + } + + if (LOWORD (wParam) == WA_CLICKACTIVE && component->isCurrentlyBlockedByAnotherModalComponent()) + { + Component* const underMouse = component->getComponentAt (component->getMouseXYRelative()); + + if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) + Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); + } + else + { + handleBroughtToFront(); + + if (component->isCurrentlyBlockedByAnotherModalComponent()) + Component::getCurrentlyModalComponent()->toFront (true); + } + } + //============================================================================== class JuceDropTarget : public ComBaseClassHelper { @@ -1891,11 +2007,10 @@ private: case WM_NCHITTEST: if ((styleFlags & windowIgnoresMouseClicks) != 0) return HTTRANSPARENT; + else if (! hasTitleBar()) + return HTCLIENT; - if (hasTitleBar()) - break; - - return HTCLIENT; + break; //============================================================================== case WM_PAINT: @@ -1959,48 +2074,10 @@ private: //============================================================================== case WM_SIZING: - if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) - { - RECT* const r = (RECT*) lParam; - Rectangle pos (r->left, r->top, r->right - r->left, r->bottom - r->top); - - constrainer->checkBounds (pos, windowBorder.addedTo (component->getBounds()), - Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), - wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT, - wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT, - wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT, - wParam == WMSZ_RIGHT || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_BOTTOMRIGHT); - r->left = pos.getX(); - r->top = pos.getY(); - r->right = pos.getRight(); - r->bottom = pos.getBottom(); - } - return TRUE; + return handleSizeConstraining ((RECT*) lParam, wParam); case WM_WINDOWPOSCHANGING: - if (constrainer != 0 && (styleFlags & (windowHasTitleBar | windowIsResizable)) == (windowHasTitleBar | windowIsResizable)) - { - WINDOWPOS* const wp = (WINDOWPOS*) lParam; - - if ((wp->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE) - && ! Component::isMouseButtonDownAnywhere()) - { - Rectangle pos (wp->x, wp->y, wp->cx, wp->cy); - const Rectangle current (windowBorder.addedTo (component->getBounds())); - - constrainer->checkBounds (pos, current, - Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), - pos.getY() != current.getY() && pos.getBottom() == current.getBottom(), - pos.getX() != current.getX() && pos.getRight() == current.getRight(), - pos.getY() == current.getY() && pos.getBottom() != current.getBottom(), - pos.getX() == current.getX() && pos.getRight() != current.getRight()); - wp->x = pos.getX(); - wp->y = pos.getY(); - wp->cx = pos.getWidth(); - wp->cy = pos.getHeight(); - } - } - return 0; + return handlePositionChanging ((WINDOWPOS*) lParam); case WM_WINDOWPOSCHANGED: { @@ -2074,35 +2151,7 @@ private: case WM_ACTIVATE: if (LOWORD (wParam) == WA_ACTIVE || LOWORD (wParam) == WA_CLICKACTIVE) { - modifiersAtLastCallback = -1; - updateKeyModifiers(); - - if (isMinimised()) - { - component->repaint(); - handleMovedOrResized(); - - if (! ComponentPeer::isValidPeer (this)) - return 0; - } - - if (LOWORD (wParam) == WA_CLICKACTIVE - && component->isCurrentlyBlockedByAnotherModalComponent()) - { - const Point mousePos (component->getMouseXYRelative()); - Component* const underMouse = component->getComponentAt (mousePos.getX(), mousePos.getY()); - - if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) - Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); - - return 0; - } - - handleBroughtToFront(); - - if (component->isCurrentlyBlockedByAnotherModalComponent()) - Component::getCurrentlyModalComponent()->toFront (true); - + handleAppActivation (wParam); return 0; } @@ -2142,57 +2191,10 @@ private: } return TRUE; - //============================================================================== case WM_TRAYNOTIFY: - if (component->isCurrentlyBlockedByAnotherModalComponent()) - { - if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN - || lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) - { - Component* const current = Component::getCurrentlyModalComponent(); - - if (current != 0) - current->inputAttemptWhenModal(); - } - } - else - { - ModifierKeys eventMods (ModifierKeys::getCurrentModifiersRealtime()); - - if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) - eventMods = eventMods.withFlags (ModifierKeys::leftButtonModifier); - else if (lParam == WM_RBUTTONDOWN || lParam == WM_RBUTTONDBLCLK) - eventMods = eventMods.withFlags (ModifierKeys::rightButtonModifier); - else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) - eventMods = eventMods.withoutMouseButtons(); - - const MouseEvent e (Desktop::getInstance().getMainMouseSource(), - Point(), eventMods, component, component, getMouseEventTime(), - Point(), getMouseEventTime(), 1, false); - - if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) - { - SetFocus (hwnd); - SetForegroundWindow (hwnd); - component->mouseDown (e); - } - else if (lParam == WM_LBUTTONUP || lParam == WM_RBUTTONUP) - { - component->mouseUp (e); - } - else if (lParam == WM_LBUTTONDBLCLK || lParam == WM_LBUTTONDBLCLK) - { - component->mouseDoubleClick (e); - } - else if (lParam == WM_MOUSEMOVE) - { - component->mouseMove (e); - } - } - + handleTaskBarEvent (lParam, wParam); break; - //============================================================================== case WM_SYNCPAINT: return 0; @@ -2238,10 +2240,8 @@ private: break; case SC_KEYMENU: - // (NB mustn't call sendInputAttemptWhenModalMessage() here because of very - // obscure situations that can arise if a modal loop is started from an alt-key - // keypress). - + // (NB mustn't call sendInputAttemptWhenModalMessage() here because of very obscure + // situations that can arise if a modal loop is started from an alt-key keypress). if (hasTitleBar() && h == GetCapture()) ReleaseCapture(); @@ -2305,6 +2305,17 @@ private: return DLGC_WANTALLKEYS; default: + if (taskBarIcon != 0) + { + static const DWORD taskbarCreatedMessage = RegisterWindowMessage (TEXT("TaskbarCreated")); + + if (message == taskbarCreatedMessage) + { + taskBarIcon->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + Shell_NotifyIcon (NIM_ADD, taskBarIcon); + } + } + break; } } diff --git a/src/utilities/juce_FileBasedDocument.cpp b/src/utilities/juce_FileBasedDocument.cpp index 23b641d189..75c7cef080 100644 --- a/src/utilities/juce_FileBasedDocument.cpp +++ b/src/utilities/juce_FileBasedDocument.cpp @@ -57,14 +57,14 @@ void FileBasedDocument::setChangedFlag (const bool hasChanged) if (changedSinceSave != hasChanged) { changedSinceSave = hasChanged; - sendChangeMessage (this); + sendChangeMessage(); } } void FileBasedDocument::changed() { changedSinceSave = true; - sendChangeMessage (this); + sendChangeMessage(); } //============================================================================== diff --git a/src/utilities/juce_PropertiesFile.cpp b/src/utilities/juce_PropertiesFile.cpp index 29f914f2fb..1b31ebfb2e 100644 --- a/src/utilities/juce_PropertiesFile.cpp +++ b/src/utilities/juce_PropertiesFile.cpp @@ -38,6 +38,7 @@ BEGIN_JUCE_NAMESPACE #include "../containers/juce_ScopedPointer.h" #include "../core/juce_SystemStats.h" #include "../threads/juce_InterProcessLock.h" +#include "../threads/juce_ScopedLock.h" #include "../text/juce_XmlDocument.h" @@ -275,7 +276,7 @@ void PropertiesFile::timerCallback() void PropertiesFile::propertyChanged() { - sendChangeMessage (this); + sendChangeMessage(); needsWriting = true; diff --git a/src/utilities/juce_SelectedItemSet.h b/src/utilities/juce_SelectedItemSet.h index 771939b1c9..d4d4ca2e90 100644 --- a/src/utilities/juce_SelectedItemSet.h +++ b/src/utilities/juce_SelectedItemSet.h @@ -306,9 +306,9 @@ public: void changed (const bool synchronous = false) { if (synchronous) - sendSynchronousChangeMessage (this); + sendSynchronousChangeMessage(); else - sendChangeMessage (this); + sendChangeMessage(); } //============================================================================== diff --git a/src/utilities/juce_UndoManager.cpp b/src/utilities/juce_UndoManager.cpp index fa6f76c10a..294c12dc25 100644 --- a/src/utilities/juce_UndoManager.cpp +++ b/src/utilities/juce_UndoManager.cpp @@ -55,7 +55,7 @@ void UndoManager::clearUndoHistory() transactionNames.clear(); totalUnitsStored = 0; nextIndex = 0; - sendChangeMessage (this); + sendChangeMessage(); } int UndoManager::getNumberOfUnitsTakenUpByStoredCommands() const @@ -146,7 +146,7 @@ bool UndoManager::perform (UndoableAction* const command_, const String& actionN --nextIndex; } - sendChangeMessage (this); + sendChangeMessage(); return true; } @@ -216,7 +216,7 @@ bool UndoManager::undo() beginNewTransaction(); - sendChangeMessage (this); + sendChangeMessage(); return true; } @@ -249,7 +249,7 @@ bool UndoManager::redo() beginNewTransaction(); - sendChangeMessage (this); + sendChangeMessage(); return true; }