diff --git a/examples/Demo/Builds/Android/jni/Android.mk b/examples/Demo/Builds/Android/jni/Android.mk
index 8fc3dfabd5..cd868c810d 100644
--- a/examples/Demo/Builds/Android/jni/Android.mk
+++ b/examples/Demo/Builds/Android/jni/Android.mk
@@ -13,9 +13,13 @@ LOCAL_MODULE := juce_jni
LOCAL_SRC_FILES := \
../../../Source/Main.cpp\
../../../Source/MainWindow.cpp\
+ ../../../Source/MainWindow.h\
+ ../../../Source/DemoUtilities.h\
../../../Source/IntroScreen.cpp\
+ ../../../Source/JuceDemoHeader.h\
../../../Source/Demos/AnimationDemo.cpp\
../../../Source/Demos/AudioLatencyDemo.cpp\
+ ../../../Source/Demos/AudioLiveScrollingDisplay.h\
../../../Source/Demos/AudioPlaybackDemo.cpp\
../../../Source/Demos/AudioRecordingDemo.cpp\
../../../Source/Demos/AudioSettingsDemo.cpp\
@@ -47,11 +51,905 @@ LOCAL_SRC_FILES := \
../../../Source/Demos/UnitTestsDemo.cpp\
../../../Source/Demos/ValueTreesDemo.cpp\
../../../Source/Demos/VideoDemo.cpp\
+ ../../../Source/Demos/WavefrontObjParser.h\
../../../Source/Demos/WebBrowserDemo.cpp\
../../../Source/Demos/WidgetsDemo.cpp\
../../../Source/Demos/WindowsDemo.cpp\
../../../Source/Demos/XMLandJSONDemo.cpp\
+ ../../../Resources/tile_background.png\
+ ../../../Resources/cello.wav\
+ ../../../Resources/demo\ table\ data.xml\
+ ../../../Resources/icons.zip\
+ ../../../Resources/juce_icon.png\
+ ../../../Resources/juce_module_info\
+ ../../../Resources/portmeirion.jpg\
+ ../../../Resources/teapot.obj\
+ ../../../Resources/treedemo.xml\
+ ../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp\
+ ../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h\
+ ../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h\
+ ../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp\
+ ../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp\
+ ../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h\
+ ../../../../../modules/juce_audio_basics/effects/juce_Decibels.h\
+ ../../../../../modules/juce_audio_basics/effects/juce_FFT.cpp\
+ ../../../../../modules/juce_audio_basics/effects/juce_FFT.h\
+ ../../../../../modules/juce_audio_basics/effects/juce_IIRFilter.cpp\
+ ../../../../../modules/juce_audio_basics/effects/juce_IIRFilter.h\
+ ../../../../../modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp\
+ ../../../../../modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h\
+ ../../../../../modules/juce_audio_basics/effects/juce_Reverb.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h\
+ ../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp\
+ ../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h\
+ ../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp\
+ ../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h\
+ ../../../../../modules/juce_audio_basics/juce_module_info\
+ ../../../../../modules/juce_audio_basics/juce_audio_basics.h\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h\
+ ../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h\
+ ../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h\
+ ../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp\
+ ../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h\
+ ../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp\
+ ../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h\
+ ../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp\
+ ../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h\
+ ../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp\
+ ../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h\
+ ../../../../../modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h\
+ ../../../../../modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp\
+ ../../../../../modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h\
+ ../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm\
+ ../../../../../modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm\
+ ../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp\
+ ../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp\
+ ../../../../../modules/juce_audio_devices/juce_module_info\
+ ../../../../../modules/juce_audio_devices/juce_audio_devices.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h\
+ ../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp\
+ ../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h\
+ ../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp\
+ ../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h\
+ ../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp\
+ ../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h\
+ ../../../../../modules/juce_audio_formats/juce_module_info\
+ ../../../../../modules/juce_audio_formats/juce_audio_formats.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioPlayHead.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp\
+ ../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h\
+ ../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp\
+ ../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h\
+ ../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp\
+ ../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h\
+ ../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp\
+ ../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm\
+ ../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp\
+ ../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp\
+ ../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h\
+ ../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp\
+ ../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h\
+ ../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp\
+ ../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h\
+ ../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp\
+ ../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameters.cpp\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp\
+ ../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h\
+ ../../../../../modules/juce_audio_processors/juce_module_info\
+ ../../../../../modules/juce_audio_processors/juce_audio_processors.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h\
+ ../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp\
+ ../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h\
+ ../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp\
+ ../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h\
+ ../../../../../modules/juce_audio_utils/juce_module_info\
+ ../../../../../modules/juce_audio_utils/juce_audio_utils.h\
+ ../../../../../modules/juce_box2d/box2d/Box2D.h\
+ ../../../../../modules/juce_box2d/box2d/README.txt\
+ ../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.cpp\
+ ../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.h\
+ ../../../../../modules/juce_box2d/juce_module_info\
+ ../../../../../modules/juce_box2d/juce_box2d.h\
+ ../../../../../modules/juce_core/text/juce_Base64.cpp\
+ ../../../../../modules/juce_core/text/juce_Base64.h\
+ ../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp\
+ ../../../../../modules/juce_core/text/juce_CharacterFunctions.h\
+ ../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h\
+ ../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h\
+ ../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h\
+ ../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h\
+ ../../../../../modules/juce_core/text/juce_Identifier.cpp\
+ ../../../../../modules/juce_core/text/juce_Identifier.h\
+ ../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp\
+ ../../../../../modules/juce_core/text/juce_LocalisedStrings.h\
+ ../../../../../modules/juce_core/text/juce_NewLine.h\
+ ../../../../../modules/juce_core/text/juce_String.cpp\
+ ../../../../../modules/juce_core/text/juce_String.h\
+ ../../../../../modules/juce_core/text/juce_StringArray.cpp\
+ ../../../../../modules/juce_core/text/juce_StringArray.h\
+ ../../../../../modules/juce_core/text/juce_StringPairArray.cpp\
+ ../../../../../modules/juce_core/text/juce_StringPairArray.h\
+ ../../../../../modules/juce_core/text/juce_StringPool.cpp\
+ ../../../../../modules/juce_core/text/juce_StringPool.h\
+ ../../../../../modules/juce_core/text/juce_StringRef.h\
+ ../../../../../modules/juce_core/text/juce_TextDiff.cpp\
+ ../../../../../modules/juce_core/text/juce_TextDiff.h\
+ ../../../../../modules/juce_core/maths/juce_BigInteger.cpp\
+ ../../../../../modules/juce_core/maths/juce_BigInteger.h\
+ ../../../../../modules/juce_core/maths/juce_Expression.cpp\
+ ../../../../../modules/juce_core/maths/juce_Expression.h\
+ ../../../../../modules/juce_core/maths/juce_MathsFunctions.h\
+ ../../../../../modules/juce_core/maths/juce_NormalisableRange.h\
+ ../../../../../modules/juce_core/maths/juce_Random.cpp\
+ ../../../../../modules/juce_core/maths/juce_Random.h\
+ ../../../../../modules/juce_core/maths/juce_Range.h\
+ ../../../../../modules/juce_core/memory/juce_Atomic.h\
+ ../../../../../modules/juce_core/memory/juce_ByteOrder.h\
+ ../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h\
+ ../../../../../modules/juce_core/memory/juce_HeapBlock.h\
+ ../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h\
+ ../../../../../modules/juce_core/memory/juce_Memory.h\
+ ../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp\
+ ../../../../../modules/juce_core/memory/juce_MemoryBlock.h\
+ ../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h\
+ ../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h\
+ ../../../../../modules/juce_core/memory/juce_ScopedPointer.h\
+ ../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h\
+ ../../../../../modules/juce_core/memory/juce_Singleton.h\
+ ../../../../../modules/juce_core/memory/juce_WeakReference.h\
+ ../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp\
+ ../../../../../modules/juce_core/containers/juce_AbstractFifo.h\
+ ../../../../../modules/juce_core/containers/juce_Array.h\
+ ../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h\
+ ../../../../../modules/juce_core/containers/juce_DynamicObject.cpp\
+ ../../../../../modules/juce_core/containers/juce_DynamicObject.h\
+ ../../../../../modules/juce_core/containers/juce_ElementComparator.h\
+ ../../../../../modules/juce_core/containers/juce_HashMap.h\
+ ../../../../../modules/juce_core/containers/juce_LinkedListPointer.h\
+ ../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp\
+ ../../../../../modules/juce_core/containers/juce_NamedValueSet.h\
+ ../../../../../modules/juce_core/containers/juce_OwnedArray.h\
+ ../../../../../modules/juce_core/containers/juce_PropertySet.cpp\
+ ../../../../../modules/juce_core/containers/juce_PropertySet.h\
+ ../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h\
+ ../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h\
+ ../../../../../modules/juce_core/containers/juce_SortedSet.h\
+ ../../../../../modules/juce_core/containers/juce_SparseSet.h\
+ ../../../../../modules/juce_core/containers/juce_Variant.cpp\
+ ../../../../../modules/juce_core/containers/juce_Variant.h\
+ ../../../../../modules/juce_core/threads/juce_ChildProcess.cpp\
+ ../../../../../modules/juce_core/threads/juce_ChildProcess.h\
+ ../../../../../modules/juce_core/threads/juce_CriticalSection.h\
+ ../../../../../modules/juce_core/threads/juce_DynamicLibrary.h\
+ ../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp\
+ ../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h\
+ ../../../../../modules/juce_core/threads/juce_InterProcessLock.h\
+ ../../../../../modules/juce_core/threads/juce_Process.h\
+ ../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp\
+ ../../../../../modules/juce_core/threads/juce_ReadWriteLock.h\
+ ../../../../../modules/juce_core/threads/juce_ScopedLock.h\
+ ../../../../../modules/juce_core/threads/juce_ScopedReadLock.h\
+ ../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h\
+ ../../../../../modules/juce_core/threads/juce_SpinLock.h\
+ ../../../../../modules/juce_core/threads/juce_Thread.cpp\
+ ../../../../../modules/juce_core/threads/juce_Thread.h\
+ ../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h\
+ ../../../../../modules/juce_core/threads/juce_ThreadPool.cpp\
+ ../../../../../modules/juce_core/threads/juce_ThreadPool.h\
+ ../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp\
+ ../../../../../modules/juce_core/threads/juce_TimeSliceThread.h\
+ ../../../../../modules/juce_core/threads/juce_WaitableEvent.h\
+ ../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp\
+ ../../../../../modules/juce_core/time/juce_PerformanceCounter.h\
+ ../../../../../modules/juce_core/time/juce_RelativeTime.cpp\
+ ../../../../../modules/juce_core/time/juce_RelativeTime.h\
+ ../../../../../modules/juce_core/time/juce_Time.cpp\
+ ../../../../../modules/juce_core/time/juce_Time.h\
+ ../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp\
+ ../../../../../modules/juce_core/files/juce_DirectoryIterator.h\
+ ../../../../../modules/juce_core/files/juce_File.cpp\
+ ../../../../../modules/juce_core/files/juce_File.h\
+ ../../../../../modules/juce_core/files/juce_FileFilter.cpp\
+ ../../../../../modules/juce_core/files/juce_FileFilter.h\
+ ../../../../../modules/juce_core/files/juce_FileInputStream.cpp\
+ ../../../../../modules/juce_core/files/juce_FileInputStream.h\
+ ../../../../../modules/juce_core/files/juce_FileOutputStream.cpp\
+ ../../../../../modules/juce_core/files/juce_FileOutputStream.h\
+ ../../../../../modules/juce_core/files/juce_FileSearchPath.cpp\
+ ../../../../../modules/juce_core/files/juce_FileSearchPath.h\
+ ../../../../../modules/juce_core/files/juce_MemoryMappedFile.h\
+ ../../../../../modules/juce_core/files/juce_TemporaryFile.cpp\
+ ../../../../../modules/juce_core/files/juce_TemporaryFile.h\
+ ../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp\
+ ../../../../../modules/juce_core/files/juce_WildcardFileFilter.h\
+ ../../../../../modules/juce_core/network/juce_IPAddress.cpp\
+ ../../../../../modules/juce_core/network/juce_IPAddress.h\
+ ../../../../../modules/juce_core/network/juce_MACAddress.cpp\
+ ../../../../../modules/juce_core/network/juce_MACAddress.h\
+ ../../../../../modules/juce_core/network/juce_NamedPipe.cpp\
+ ../../../../../modules/juce_core/network/juce_NamedPipe.h\
+ ../../../../../modules/juce_core/network/juce_Socket.cpp\
+ ../../../../../modules/juce_core/network/juce_Socket.h\
+ ../../../../../modules/juce_core/network/juce_URL.cpp\
+ ../../../../../modules/juce_core/network/juce_URL.h\
+ ../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_BufferedInputStream.h\
+ ../../../../../modules/juce_core/streams/juce_FileInputSource.cpp\
+ ../../../../../modules/juce_core/streams/juce_FileInputSource.h\
+ ../../../../../modules/juce_core/streams/juce_InputSource.h\
+ ../../../../../modules/juce_core/streams/juce_InputStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_InputStream.h\
+ ../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_MemoryInputStream.h\
+ ../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h\
+ ../../../../../modules/juce_core/streams/juce_OutputStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_OutputStream.h\
+ ../../../../../modules/juce_core/streams/juce_SubregionStream.cpp\
+ ../../../../../modules/juce_core/streams/juce_SubregionStream.h\
+ ../../../../../modules/juce_core/logging/juce_FileLogger.cpp\
+ ../../../../../modules/juce_core/logging/juce_FileLogger.h\
+ ../../../../../modules/juce_core/logging/juce_Logger.cpp\
+ ../../../../../modules/juce_core/logging/juce_Logger.h\
+ ../../../../../modules/juce_core/system/juce_CompilerSupport.h\
+ ../../../../../modules/juce_core/system/juce_PlatformDefs.h\
+ ../../../../../modules/juce_core/system/juce_StandardHeader.h\
+ ../../../../../modules/juce_core/system/juce_SystemStats.cpp\
+ ../../../../../modules/juce_core/system/juce_SystemStats.h\
+ ../../../../../modules/juce_core/system/juce_TargetPlatform.h\
+ ../../../../../modules/juce_core/xml/juce_XmlDocument.cpp\
+ ../../../../../modules/juce_core/xml/juce_XmlDocument.h\
+ ../../../../../modules/juce_core/xml/juce_XmlElement.cpp\
+ ../../../../../modules/juce_core/xml/juce_XmlElement.h\
+ ../../../../../modules/juce_core/javascript/juce_Javascript.cpp\
+ ../../../../../modules/juce_core/javascript/juce_Javascript.h\
+ ../../../../../modules/juce_core/javascript/juce_JSON.cpp\
+ ../../../../../modules/juce_core/javascript/juce_JSON.h\
+ ../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp\
+ ../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h\
+ ../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp\
+ ../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h\
+ ../../../../../modules/juce_core/zip/juce_ZipFile.cpp\
+ ../../../../../modules/juce_core/zip/juce_ZipFile.h\
+ ../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp\
+ ../../../../../modules/juce_core/unit_tests/juce_UnitTest.h\
+ ../../../../../modules/juce_core/misc/juce_Result.cpp\
+ ../../../../../modules/juce_core/misc/juce_Result.h\
+ ../../../../../modules/juce_core/misc/juce_Uuid.cpp\
+ ../../../../../modules/juce_core/misc/juce_Uuid.h\
+ ../../../../../modules/juce_core/misc/juce_WindowsRegistry.h\
+ ../../../../../modules/juce_core/native/juce_android_Files.cpp\
+ ../../../../../modules/juce_core/native/juce_android_JNIHelpers.h\
+ ../../../../../modules/juce_core/native/juce_android_Misc.cpp\
+ ../../../../../modules/juce_core/native/juce_android_Network.cpp\
+ ../../../../../modules/juce_core/native/juce_android_SystemStats.cpp\
+ ../../../../../modules/juce_core/native/juce_android_Threads.cpp\
+ ../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h\
+ ../../../../../modules/juce_core/native/juce_curl_Network.cpp\
+ ../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp\
+ ../../../../../modules/juce_core/native/juce_linux_Files.cpp\
+ ../../../../../modules/juce_core/native/juce_linux_Network.cpp\
+ ../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp\
+ ../../../../../modules/juce_core/native/juce_linux_Threads.cpp\
+ ../../../../../modules/juce_core/native/juce_mac_Files.mm\
+ ../../../../../modules/juce_core/native/juce_mac_Network.mm\
+ ../../../../../modules/juce_core/native/juce_mac_Strings.mm\
+ ../../../../../modules/juce_core/native/juce_mac_SystemStats.mm\
+ ../../../../../modules/juce_core/native/juce_mac_Threads.mm\
+ ../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h\
+ ../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp\
+ ../../../../../modules/juce_core/native/juce_posix_SharedCode.h\
+ ../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h\
+ ../../../../../modules/juce_core/native/juce_win32_Files.cpp\
+ ../../../../../modules/juce_core/native/juce_win32_Network.cpp\
+ ../../../../../modules/juce_core/native/juce_win32_Registry.cpp\
+ ../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp\
+ ../../../../../modules/juce_core/native/juce_win32_Threads.cpp\
+ ../../../../../modules/juce_core/juce_module_info\
+ ../../../../../modules/juce_core/juce_core.h\
+ ../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp\
+ ../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h\
+ ../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp\
+ ../../../../../modules/juce_cryptography/encryption/juce_Primes.h\
+ ../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp\
+ ../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h\
+ ../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp\
+ ../../../../../modules/juce_cryptography/hashing/juce_MD5.h\
+ ../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp\
+ ../../../../../modules/juce_cryptography/hashing/juce_SHA256.h\
+ ../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp\
+ ../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h\
+ ../../../../../modules/juce_cryptography/juce_module_info\
+ ../../../../../modules/juce_cryptography/juce_cryptography.h\
+ ../../../../../modules/juce_data_structures/values/juce_Value.cpp\
+ ../../../../../modules/juce_data_structures/values/juce_Value.h\
+ ../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp\
+ ../../../../../modules/juce_data_structures/values/juce_ValueTree.h\
+ ../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp\
+ ../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h\
+ ../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h\
+ ../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp\
+ ../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h\
+ ../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp\
+ ../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h\
+ ../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp\
+ ../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h\
+ ../../../../../modules/juce_data_structures/juce_module_info\
+ ../../../../../modules/juce_data_structures/juce_data_structures.h\
+ ../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp\
+ ../../../../../modules/juce_events/messages/juce_ApplicationBase.h\
+ ../../../../../modules/juce_events/messages/juce_CallbackMessage.h\
+ ../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp\
+ ../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h\
+ ../../../../../modules/juce_events/messages/juce_Initialisation.h\
+ ../../../../../modules/juce_events/messages/juce_Message.h\
+ ../../../../../modules/juce_events/messages/juce_MessageListener.cpp\
+ ../../../../../modules/juce_events/messages/juce_MessageListener.h\
+ ../../../../../modules/juce_events/messages/juce_MessageManager.cpp\
+ ../../../../../modules/juce_events/messages/juce_MessageManager.h\
+ ../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h\
+ ../../../../../modules/juce_events/messages/juce_NotificationType.h\
+ ../../../../../modules/juce_events/timers/juce_MultiTimer.cpp\
+ ../../../../../modules/juce_events/timers/juce_MultiTimer.h\
+ ../../../../../modules/juce_events/timers/juce_Timer.cpp\
+ ../../../../../modules/juce_events/timers/juce_Timer.h\
+ ../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp\
+ ../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h\
+ ../../../../../modules/juce_events/broadcasters/juce_ActionListener.h\
+ ../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp\
+ ../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h\
+ ../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp\
+ ../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h\
+ ../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h\
+ ../../../../../modules/juce_events/broadcasters/juce_ListenerList.h\
+ ../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp\
+ ../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h\
+ ../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp\
+ ../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h\
+ ../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp\
+ ../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h\
+ ../../../../../modules/juce_events/native/juce_android_Messaging.cpp\
+ ../../../../../modules/juce_events/native/juce_ios_MessageManager.mm\
+ ../../../../../modules/juce_events/native/juce_linux_Messaging.cpp\
+ ../../../../../modules/juce_events/native/juce_mac_MessageManager.mm\
+ ../../../../../modules/juce_events/native/juce_osx_MessageQueue.h\
+ ../../../../../modules/juce_events/native/juce_ScopedXLock.h\
+ ../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h\
+ ../../../../../modules/juce_events/native/juce_win32_Messaging.cpp\
+ ../../../../../modules/juce_events/juce_module_info\
+ ../../../../../modules/juce_events/juce_events.h\
+ ../../../../../modules/juce_graphics/colour/juce_Colour.cpp\
+ ../../../../../modules/juce_graphics/colour/juce_Colour.h\
+ ../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp\
+ ../../../../../modules/juce_graphics/colour/juce_ColourGradient.h\
+ ../../../../../modules/juce_graphics/colour/juce_Colours.cpp\
+ ../../../../../modules/juce_graphics/colour/juce_Colours.h\
+ ../../../../../modules/juce_graphics/colour/juce_FillType.cpp\
+ ../../../../../modules/juce_graphics/colour/juce_FillType.h\
+ ../../../../../modules/juce_graphics/colour/juce_PixelFormats.h\
+ ../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp\
+ ../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h\
+ ../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h\
+ ../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp\
+ ../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h\
+ ../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp\
+ ../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h\
+ ../../../../../modules/juce_graphics/images/juce_Image.cpp\
+ ../../../../../modules/juce_graphics/images/juce_Image.h\
+ ../../../../../modules/juce_graphics/images/juce_ImageCache.cpp\
+ ../../../../../modules/juce_graphics/images/juce_ImageCache.h\
+ ../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp\
+ ../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h\
+ ../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp\
+ ../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h\
+ ../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp\
+ ../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp\
+ ../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h\
+ ../../../../../modules/juce_graphics/geometry/juce_BorderSize.h\
+ ../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h\
+ ../../../../../modules/juce_graphics/geometry/juce_Line.h\
+ ../../../../../modules/juce_graphics/geometry/juce_Path.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_Path.h\
+ ../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_PathIterator.h\
+ ../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp\
+ ../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h\
+ ../../../../../modules/juce_graphics/geometry/juce_Point.h\
+ ../../../../../modules/juce_graphics/geometry/juce_Rectangle.h\
+ ../../../../../modules/juce_graphics/geometry/juce_RectangleList.h\
+ ../../../../../modules/juce_graphics/placement/juce_Justification.h\
+ ../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp\
+ ../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h\
+ ../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_AttributedString.h\
+ ../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h\
+ ../../../../../modules/juce_graphics/fonts/juce_Font.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_Font.h\
+ ../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h\
+ ../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_TextLayout.h\
+ ../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp\
+ ../../../../../modules/juce_graphics/fonts/juce_Typeface.h\
+ ../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp\
+ ../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h\
+ ../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp\
+ ../../../../../modules/juce_graphics/effects/juce_GlowEffect.h\
+ ../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h\
+ ../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp\
+ ../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp\
+ ../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp\
+ ../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp\
+ ../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h\
+ ../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm\
+ ../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h\
+ ../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm\
+ ../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h\
+ ../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp\
+ ../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp\
+ ../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp\
+ ../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp\
+ ../../../../../modules/juce_graphics/juce_module_info\
+ ../../../../../modules/juce_graphics/juce_graphics.h\
+ ../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h\
+ ../../../../../modules/juce_gui_basics/components/juce_Component.cpp\
+ ../../../../../modules/juce_gui_basics/components/juce_Component.h\
+ ../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp\
+ ../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h\
+ ../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp\
+ ../../../../../modules/juce_gui_basics/components/juce_Desktop.h\
+ ../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp\
+ ../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp\
+ ../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h\
+ ../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h\
+ ../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Label.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Slider.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp\
+ ../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h\
+ ../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp\
+ ../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h\
+ ../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp\
+ ../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h\
+ ../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp\
+ ../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h\
+ ../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp\
+ ../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h\
+ ../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp\
+ ../../../../../modules/juce_gui_basics/layout/juce_Viewport.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_Button.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp\
+ ../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp\
+ ../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp\
+ ../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h\
+ ../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp\
+ ../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp\
+ ../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp\
+ ../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp\
+ ../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h\
+ ../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp\
+ ../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h\
+ ../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp\
+ ../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h\
+ ../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp\
+ ../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h\
+ ../../../../../modules/juce_gui_basics/application/juce_Application.cpp\
+ ../../../../../modules/juce_gui_basics/application/juce_Application.h\
+ ../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_linux_Clipboard.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm\
+ ../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h\
+ ../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp\
+ ../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp\
+ ../../../../../modules/juce_gui_basics/juce_module_info\
+ ../../../../../modules/juce_gui_basics/juce_gui_basics.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp\
+ ../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h\
+ ../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp\
+ ../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h\
+ ../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h\
+ ../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h\
+ ../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp\
+ ../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h\
+ ../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h\
+ ../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm\
+ ../../../../../modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm\
+ ../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h\
+ ../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm\
+ ../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm\
+ ../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp\
+ ../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp\
+ ../../../../../modules/juce_gui_extra/juce_module_info\
+ ../../../../../modules/juce_gui_extra/juce_gui_extra.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp\
+ ../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h\
+ ../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h\
+ ../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h\
+ ../../../../../modules/juce_opengl/geometry/juce_Quaternion.h\
+ ../../../../../modules/juce_opengl/geometry/juce_Vector3D.h\
+ ../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp\
+ ../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h\
+ ../../../../../modules/juce_opengl/native/juce_MissingGLDefinitions.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGL_android.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGL_linux.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h\
+ ../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h\
+ ../../../../../modules/juce_opengl/juce_module_info\
+ ../../../../../modules/juce_opengl/juce_opengl.h\
+ ../../../../../modules/juce_video/playback/juce_DirectShowComponent.h\
+ ../../../../../modules/juce_video/playback/juce_QuickTimeMovieComponent.h\
+ ../../../../../modules/juce_video/capture/juce_CameraDevice.cpp\
+ ../../../../../modules/juce_video/capture/juce_CameraDevice.h\
+ ../../../../../modules/juce_video/native/juce_android_CameraDevice.cpp\
+ ../../../../../modules/juce_video/native/juce_mac_CameraDevice.mm\
+ ../../../../../modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm\
+ ../../../../../modules/juce_video/native/juce_win32_CameraDevice.cpp\
+ ../../../../../modules/juce_video/native/juce_win32_DirectShowComponent.cpp\
+ ../../../../../modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp\
+ ../../../../../modules/juce_video/juce_module_info\
+ ../../../../../modules/juce_video/juce_video.h\
+ ../../../JuceLibraryCode/AppConfig.h\
../../../JuceLibraryCode/BinaryData.cpp\
+ ../../../JuceLibraryCode/BinaryData.h\
../../../../../modules/juce_audio_basics/juce_audio_basics.cpp\
../../../../../modules/juce_audio_devices/juce_audio_devices.cpp\
../../../../../modules/juce_audio_formats/juce_audio_formats.cpp\
@@ -67,6 +965,7 @@ LOCAL_SRC_FILES := \
../../../../../modules/juce_gui_extra/juce_gui_extra.cpp\
../../../../../modules/juce_opengl/juce_opengl.cpp\
../../../../../modules/juce_video/juce_video.cpp\
+ ../../../JuceLibraryCode/JuceHeader.h\
ifeq ($(NDK_DEBUG),1)
LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../JuceLibraryCode" -I "../../../../modules" -O0 -std=c++11 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=9" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000"
diff --git a/examples/Demo/Builds/Android/src/com/juce/jucedemo/JuceDemo.java b/examples/Demo/Builds/Android/src/com/juce/jucedemo/JuceDemo.java
index 801b600573..e387fc011e 100644
--- a/examples/Demo/Builds/Android/src/com/juce/jucedemo/JuceDemo.java
+++ b/examples/Demo/Builds/Android/src/com/juce/jucedemo/JuceDemo.java
@@ -43,6 +43,13 @@ import android.text.ClipboardManager;
import android.text.InputType;
import android.util.DisplayMetrics;
import android.util.Log;
+import java.lang.Runnable;
+import java.util.List;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.TimerTask;
import java.io.*;
import java.net.URL;
import java.net.HttpURLConnection;
@@ -234,7 +241,7 @@ public class JuceDemo extends Activity
if (keepAliveTimer != null)
{
- keepAliveTimer->cancel();
+ keepAliveTimer.cancel();
keepAliveTimer = null;
}
@@ -256,7 +263,14 @@ public class JuceDemo extends Activity
public void run()
{
android.app.Instrumentation instrumentation = new android.app.Instrumentation();
- instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_BREAK);
+
+ try
+ {
+ instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_BREAK);
+ }
+ catch (Exception e)
+ {
+ }
}
}, 2000, 2000);
}
diff --git a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
index 8fadeda09e..68e53d92dc 100644
--- a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
+++ b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
@@ -433,6 +433,10 @@
+
+
+
+
@@ -733,6 +737,10 @@
+
+
+
+
diff --git a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
index 0b1e30c5ca..6bd195c322 100644
--- a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
+++ b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
@@ -147,6 +147,7 @@
16017456A45F74C692A3AE45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
1614411A8699B82D1F7B0346 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryInputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
16203C6791259C9718A04C3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutinePanel.cpp"; path = "../../Source/ComponentEditor/ui/jucer_PaintRoutinePanel.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 16385D79A30C6E06EFB46B79 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_AndroidStudio.h"; path = "../../Source/Project Saving/jucer_ProjectExport_AndroidStudio.h"; sourceTree = "SOURCE_ROOT"; };
168F5F32F673036DDAEF1D8D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../../../modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; };
1729AEDC34001C31B8CC357C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_FileHelpers.cpp"; path = "../../Source/Utility/jucer_FileHelpers.cpp"; sourceTree = "SOURCE_ROOT"; };
1772B02BAF54F29AD99DF42E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../../../modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; };
@@ -723,6 +724,7 @@
BA5C7DE347A73A87F687703C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; };
BA95268EEE80F9509EC1F76F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; };
BAC43B20E14A340CCF14119C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Project.cpp"; path = "../../Source/Project/jucer_Project.cpp"; sourceTree = "SOURCE_ROOT"; };
+ BB9C1E6E54A16F795908C469 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "background_logo.svg"; path = "../../Source/BinaryData/background_logo.svg"; sourceTree = "SOURCE_ROOT"; };
BC17B02633EF1E31024051C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
BCAD13352CE76BA81629A6E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; };
BCCFDFB2C02C4AA436C0ECF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SliderHandler.h"; path = "../../Source/ComponentEditor/components/jucer_SliderHandler.h"; sourceTree = "SOURCE_ROOT"; };
@@ -756,7 +758,6 @@
C5D5D2FFB030BD43160167EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryIterator.cpp"; path = "../../../../modules/juce_core/files/juce_DirectoryIterator.cpp"; sourceTree = "SOURCE_ROOT"; };
C5FCECA838D4D12D03929139 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBrowserComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
C61E82D93918A611FAFD9E9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBoundsConstrainer.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"; sourceTree = "SOURCE_ROOT"; };
- C68355AA4D62939EECAD469E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../../../modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; };
C6861DB44A31CE7A3DEFA083 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../../../modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; };
C6E46DBD249D9426C95E2235 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChangeBroadcaster.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; };
C717D2384896547D1CD993F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; };
@@ -765,7 +766,6 @@
C7B47372A9D5970E3D9A5400 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupInformationComponent.h"; path = "../../Source/Project/jucer_GroupInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
C7E19F79947BEFC7DB7A9CE7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; };
C83992DA0BE30EA3CD06EA98 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; };
- C85B4D62B96F4A44890F20E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../../../modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; };
C8A229ACD244F402C57286CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_MSVC.h"; path = "../../Source/Project Saving/jucer_ProjectExport_MSVC.h"; sourceTree = "SOURCE_ROOT"; };
C90C66C5727759D5CBD5FB07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../../../modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; };
C9616830BB2474066AC8C910 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceFile.h"; path = "../../Source/Project Saving/jucer_ResourceFile.h"; sourceTree = "SOURCE_ROOT"; };
@@ -780,14 +780,13 @@
CD140A1C0161176682F6CA29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
CD3216F23C7B273B010A8D12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; };
CDCAF0EC777DA2884AEB2B59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; };
- CDDF5BDC75277F7B83A38885 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../../../modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; };
CDF8F65F9079B2C14A740F0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; };
CE1DFE4E3908943656E180AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
+ CF0615A1AF1A514A60322B50 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
CF21D9DB3AEC0A4DCAB36A99 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Icons.cpp"; path = "../../Source/Utility/jucer_Icons.cpp"; sourceTree = "SOURCE_ROOT"; };
CF6C8BD0DA3D8CD4E99EBADA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
CF8011B3C67B609032974DA5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewCppFileTemplate.cpp"; path = "../../Source/BinaryData/jucer_NewCppFileTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
D00F311BFC3C2625C457CB9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
- D041043D3B554B88F855C174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; };
D0D8B580D0689FFF4B9B823B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StrokeType.h"; path = "../../Source/ComponentEditor/paintelements/jucer_StrokeType.h"; sourceTree = "SOURCE_ROOT"; };
D0F1614CC861E8E0B59B7A06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../../../modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; };
D10D51A0A2D63F38B4D86A60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceFile.cpp"; path = "../../Source/Project Saving/jucer_ResourceFile.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -806,62 +805,61 @@
D5057D7B18ABD5E810A6F830 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
D526C38D581425949BA0E4AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePreviewComponent.h"; path = "../../Source/Application/jucer_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; };
D53B54D1786A1FFC024BF064 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_cryptography.mm"; path = "../../../../modules/juce_cryptography/juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
- D678882D133090214AF681BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../../../modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; };
+ D6C91E2BF537F75A80F5C1DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; };
D75EAC16FAECCC51E3669193 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; };
+ D780ED33573AED5AD383A036 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ D782DA091AD3ECE158FC6A5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ D800DE818BEDBF4579D15B1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; };
D87FC8F6834E9DC9C8E88B94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JustificationProperty.h"; path = "../../Source/ComponentEditor/properties/jucer_JustificationProperty.h"; sourceTree = "SOURCE_ROOT"; };
D926E13AB5AD647A7A00F486 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
D92A6E9404A30EED32DCE4ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePositionedRectangle.h"; path = "../../Source/ComponentEditor/ui/jucer_RelativePositionedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ D9342535EA61901A1AD816C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
DA345D5B9DABD049F90DC96F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; sourceTree = "SOURCE_ROOT"; };
- DC5E7FF30B01118F6DAEC38F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../../../modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DB876F7873F42DC685A58CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
DC922C6A65D260C18E888E49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTemplate.cpp"; path = "../../Source/BinaryData/jucer_ComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
DD00494140C86144306A9356 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../../../modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; };
- DE8DF5D263F40F65581CFDE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../../../modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; };
- DFC6364D81D9C60BD4CA9D12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../../../modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; };
E0F9CA57E44F7F7E7E217E47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentUndoableAction.h"; path = "../../Source/ComponentEditor/components/jucer_ComponentUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
- E19160CF7208320D128786CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../../../modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; };
E1D8CCD9F4ACBE1EC1D5BEA0 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioApp.svg"; path = "../../Source/BinaryData/wizard_AudioApp.svg"; sourceTree = "SOURCE_ROOT"; };
E2374E15D65425C4101237E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewComponentTemplate.h"; path = "../../Source/BinaryData/jucer_NewComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
- E2C1C995D554A3F0A363CE58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../../../modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; };
- E2DBA3307837B64AFCCD8F8D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../../../modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; };
E3B56C5718D87CA0EFCB2662 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioComponentTemplate.cpp"; path = "../../Source/BinaryData/jucer_AudioComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
E4BB22E27C5AA4B666F265BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextButtonHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TextButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
E4BD4C43370651B49F75855B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_SimpleWindow.cpp"; path = "../../Source/BinaryData/jucer_MainTemplate_SimpleWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
- E570E57CC1FCEF78B54A7084 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../../../modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
E5D6C36496F5BC84D7213BE8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
- E62D9BA6E92FE7BB6EF65699 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../../../modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; };
E65A820D34BF39478B7C5925 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/Application/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
- E6F5CEC32EDC917B054467EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; };
- E720FBCD836FF3AA466C31B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
E96597BBC6A98255B51B94DC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
25F52316D256B4534BED16D1 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Introjucer.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
- CF0615A1AF1A514A60322B50 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
+ C68355AA4D62939EECAD469E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../../../modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; };
+ C85B4D62B96F4A44890F20E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../../../modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; };
+ CDDF5BDC75277F7B83A38885 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../../../modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D041043D3B554B88F855C174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; };
D3E139185095C486DD3D61F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationTool.h"; path = "../../Source/Utility/jucer_TranslationTool.h"; sourceTree = "SOURCE_ROOT"; };
- D6C91E2BF537F75A80F5C1DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; };
- D780ED33573AED5AD383A036 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; };
- D782DA091AD3ECE158FC6A5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ D678882D133090214AF681BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../../../modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; };
D7A7F1AA9F313B0CCAAA73A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../../../modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; };
- D800DE818BEDBF4579D15B1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; };
- D9342535EA61901A1AD816C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D95D7B49EC6C6BDCB5A1B988 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
D9B077E2ECDDA94961E134D7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../../../modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; };
D9E59DE07A815AB303A297D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../../../modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
DAF84A553D264705FA6EB6FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TreeViewHandler.h"; sourceTree = "SOURCE_ROOT"; };
DB20268A566DABEAE3F2CBEE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; };
- DB876F7873F42DC685A58CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
DBE0CDE1B017190ABBFF557C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CodeBlocks.h"; path = "../../Source/Project Saving/jucer_ProjectExport_CodeBlocks.h"; sourceTree = "SOURCE_ROOT"; };
+ DC5E7FF30B01118F6DAEC38F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../../../modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; };
DCBB17488227A2CA7D3D3947 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DependencyPathPropertyComponent.cpp"; path = "../../Source/Project/jucer_DependencyPathPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
DCCB75165B7C73A589498E87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
DD2494D5F1C081898D616AF5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; };
DD985A60FB76E976AF91852D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../../../modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; };
DE40B42B57F29C650CB7F2AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; };
DE5F3C9EF6BFFDE73AF9E7FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DE8DF5D263F40F65581CFDE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../../../modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; };
DEF579B1433EB8DEE7AB50F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; };
DF725A596B7BCD7520CC0A9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceEditorPanel.cpp"; path = "../../Source/ComponentEditor/ui/jucer_ResourceEditorPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
DF7BB5B6B394EDEEF5F5B4B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; };
+ DFC6364D81D9C60BD4CA9D12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../../../modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; };
E07C56267CBB46FC44EF2026 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../../../modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E19160CF7208320D128786CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../../../modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; };
E1C16C872E34BCB144B469F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; };
E27F0860F27023BAA9798B46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../../../modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; };
E284B565DBD647DC0830D23B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E2C1C995D554A3F0A363CE58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../../../modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; };
+ E2DBA3307837B64AFCCD8F8D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../../../modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; };
E3869AC657E984565F1718AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConnectedChildProcess.h"; path = "../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"; sourceTree = "SOURCE_ROOT"; };
E3FF16862AA1B2F943DC616C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; };
E446FFE889CD490FDE3F0F2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -869,11 +867,15 @@
E4F9D1E097CC2C1D1291823C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V2.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"; sourceTree = "SOURCE_ROOT"; };
E530742870F07704E9616358 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
E54D0994D31E20A0A05EBA2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ E570E57CC1FCEF78B54A7084 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../../../modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
E60E28D1B7491047DEA236AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectContentComponent.h"; path = "../../Source/Project/jucer_ProjectContentComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ E62D9BA6E92FE7BB6EF65699 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../../../modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; };
E63F54CF8D5D922A319C6962 = {isa = PBXFileReference; lastKnownFileType = image.png; name = projectIconXcodeIOS.png; path = ../../Source/BinaryData/projectIconXcodeIOS.png; sourceTree = "SOURCE_ROOT"; };
E642193A9990C48CFB6479A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; };
E654E3A3CD45A888C5F773DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; };
+ E6F5CEC32EDC917B054467EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; };
E70CA21960A64CCB835725FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectType.cpp"; path = "../../Source/Project/jucer_ProjectType.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E720FBCD836FF3AA466C31B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
E73C7E17116F6085765622E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; };
E7A4604F766ABC8BE26C94A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; };
E7B6A0CBA0D27A095E83F5B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1072,6 +1074,7 @@
5432B7B9B2CF2EAEC8B66D5C, ); name = ComponentEditor; sourceTree = ""; };
E345840128627D533DF908AC = {isa = PBXGroup; children = (
6E7353DFEA8825B515049ABB,
+ 16385D79A30C6E06EFB46B79,
DBE0CDE1B017190ABBFF557C,
05076CDF1511A5F8A8E18F1D,
C8A229ACD244F402C57286CD,
@@ -1165,6 +1168,7 @@
88DFD62CB6545EE8CA5C485B = {isa = PBXGroup; children = (
955A73C474B8CD4FB0D9A96F,
5F4F4EAB042F2730F94A1CEA,
+ BB9C1E6E54A16F795908C469,
301592EBAC0FFF6F5B268E99,
41105E536155E394E54BDD35,
5F6584B675E30761521A9F42,
diff --git a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
index 39b84bd6e4..dc641bec36 100644
--- a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
@@ -249,6 +249,7 @@
+
@@ -544,6 +545,16 @@
+
+
+
+
+
+
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
index e186142418..b4b99a6ea8 100644
--- a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
@@ -249,6 +249,7 @@
+
@@ -544,6 +545,16 @@
+
+
+
+
+
+
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
index 8a47166a85..6539dd4c95 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
@@ -1135,6 +1135,7 @@
+
@@ -1541,6 +1542,7 @@
+
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
index 48af1cf863..fb113e24cb 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
@@ -1584,6 +1584,9 @@
The Introjucer\Project Saving
+
+ The Introjucer\Project Saving
+
The Introjucer\Project Saving
@@ -2798,6 +2801,9 @@
The Introjucer\BinaryData
+
+ The Introjucer\BinaryData
+
The Introjucer\BinaryData
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
index e17f2ab32d..03f69d4f1b 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
@@ -1141,6 +1141,7 @@
+
@@ -1547,6 +1548,7 @@
+
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
index 48af1cf863..fb113e24cb 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
@@ -1584,6 +1584,9 @@
The Introjucer\Project Saving
+
+ The Introjucer\Project Saving
+
The Introjucer\Project Saving
@@ -2798,6 +2801,9 @@
The Introjucer\BinaryData
+
+ The Introjucer\BinaryData
+
The Introjucer\BinaryData
diff --git a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
index 1839ab6bef..2a992abf62 100644
--- a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
@@ -1141,6 +1141,7 @@
+
@@ -1547,6 +1548,7 @@
+
diff --git a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
index 590ea0e323..436fc6889d 100644
--- a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
@@ -1584,6 +1584,9 @@
The Introjucer\Project Saving
+
+ The Introjucer\Project Saving
+
The Introjucer\Project Saving
@@ -2798,6 +2801,9 @@
The Introjucer\BinaryData
+
+ The Introjucer\BinaryData
+
The Introjucer\BinaryData
diff --git a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
index 6d970418e1..ac7e106934 100644
--- a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
@@ -1141,6 +1141,7 @@
+
@@ -1547,6 +1548,7 @@
+
diff --git a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
index eaa6061c0b..a454c6fba2 100644
--- a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
@@ -1584,6 +1584,9 @@
The Introjucer\Project Saving
+
+ The Introjucer\Project Saving
+
The Introjucer\Project Saving
@@ -2798,6 +2801,9 @@
The Introjucer\BinaryData
+
+ The Introjucer\BinaryData
+
The Introjucer\BinaryData
diff --git a/extras/Introjucer/Introjucer.jucer b/extras/Introjucer/Introjucer.jucer
index 596902aae8..18adabb51e 100644
--- a/extras/Introjucer/Introjucer.jucer
+++ b/extras/Introjucer/Introjucer.jucer
@@ -402,6 +402,8 @@
+
+
\r\n"
+"\r\n";
+
+const char* background_logo_svg = (const char*) temp_binary_data_22;
+
+//================== background_tile.png ==================
+static const unsigned char temp_binary_data_23[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,7,0,0,0,7,8,6,0,0,0,196,82,87,211,0,0,0,94,73,68,65,84,120,218,85,141,73,14,0,33,8,4,253,137,226,18,19,245,234,255,127,70,75,155,232,56,135,10,132,94,112,33,4,37,222,123,205,57,107,74,105,239,196,137,
8,72,239,29,99,12,204,57,209,90,227,237,19,45,113,161,209,12,234,172,18,49,70,88,229,134,34,103,173,245,159,60,134,82,10,238,79,166,223,106,238,91,100,229,73,191,80,92,47,179,68,223,148,158,98,226,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* background_tile_png = (const char*) temp_binary_data_22;
+const char* background_tile_png = (const char*) temp_binary_data_23;
//================== colourscheme_dark.xml ==================
-static const unsigned char temp_binary_data_23[] =
+static const unsigned char temp_binary_data_24[] =
"\r\n"
"\r\n"
"\r\n"
@@ -1503,10 +1545,10 @@ static const unsigned char temp_binary_data_23[] =
" \r\n"
"\r\n";
-const char* colourscheme_dark_xml = (const char*) temp_binary_data_23;
+const char* colourscheme_dark_xml = (const char*) temp_binary_data_24;
//================== colourscheme_light.xml ==================
-static const unsigned char temp_binary_data_24[] =
+static const unsigned char temp_binary_data_25[] =
"\r\n"
"\r\n"
"\r\n"
@@ -1531,10 +1573,10 @@ static const unsigned char temp_binary_data_24[] =
" \r\n"
"\r\n";
-const char* colourscheme_light_xml = (const char*) temp_binary_data_24;
+const char* colourscheme_light_xml = (const char*) temp_binary_data_25;
//================== juce_icon.png ==================
-static const unsigned char temp_binary_data_25[] =
+static const unsigned char temp_binary_data_26[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,67,120,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,
112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,10,60,120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,
97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,54,55,57,55,44,32,50,48,49,52,47,48,56,47,50,48,45,48,57,58,53,51,58,
@@ -2360,10 +2402,10 @@ static const unsigned char temp_binary_data_25[] =
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,255,255,88,234,20,149,130,13,78,186,0,0,0,0,73,69,78,68,
174,66,96,130,0,0 };
-const char* juce_icon_png = (const char*) temp_binary_data_25;
+const char* juce_icon_png = (const char*) temp_binary_data_26;
//================== projectIconAndroid.png ==================
-static const unsigned char temp_binary_data_26[] =
+static const unsigned char temp_binary_data_27[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,3,134,105,84,88,116,88,77,76,
58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -2480,10 +2522,10 @@ static const unsigned char temp_binary_data_26[] =
139,240,165,4,64,57,166,132,157,54,246,220,165,230,39,27,156,211,4,232,176,247,44,193,125,203,174,137,229,132,198,114,231,150,74,124,238,9,19,9,244,154,7,0,175,121,0,240,154,7,0,175,121,0,240,154,7,0,175,121,0,240,154,7,0,175,189,235,246,255,2,12,0,158,
137,39,54,252,6,9,64,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconAndroid_png = (const char*) temp_binary_data_26;
+const char* projectIconAndroid_png = (const char*) temp_binary_data_27;
//================== projectIconCodeblocks.png ==================
-static const unsigned char temp_binary_data_27[] =
+static const unsigned char temp_binary_data_28[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,3,134,105,84,88,116,88,77,76,
58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -2653,10 +2695,10 @@ static const unsigned char temp_binary_data_27[] =
202,84,15,91,2,120,13,161,41,237,191,111,130,252,4,17,176,224,208,111,140,253,56,221,147,207,16,11,238,233,234,37,192,250,248,241,59,248,122,10,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,
62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,126,28,143,255,39,192,0,238,147,31,89,162,25,31,21,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconCodeblocks_png = (const char*) temp_binary_data_27;
+const char* projectIconCodeblocks_png = (const char*) temp_binary_data_28;
//================== projectIconLinuxMakefile.png ==================
-static const unsigned char temp_binary_data_28[] =
+static const unsigned char temp_binary_data_29[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,110,0,0,0,128,8,6,0,0,0,234,21,92,9,0,0,10,65,105,67,67,80,73,67,67,32,80,114,111,102,105,108,101,0,0,72,13,157,150,119,84,83,217,22,135,207,189,55,189,208,18,34,32,37,244,26,122,9,32,210,59,72,21,4,
81,137,73,128,80,2,134,132,38,118,68,5,70,20,17,41,86,100,84,192,1,71,135,34,99,69,20,11,131,130,98,215,9,242,16,80,198,193,81,68,69,229,221,140,107,9,239,173,53,243,222,154,253,199,89,223,217,231,183,215,217,103,239,125,215,186,0,80,252,130,4,194,116,
88,1,128,52,161,88,20,238,235,193,92,18,19,203,196,247,2,24,16,1,14,88,1,192,225,102,102,4,71,248,68,2,212,252,189,61,153,153,168,72,198,179,246,238,46,128,100,187,219,44,191,80,38,115,214,255,127,145,34,55,67,36,6,0,10,69,213,54,60,126,38,23,229,2,148,
@@ -2892,10 +2934,10 @@ static const unsigned char temp_binary_data_28[] =
194,72,142,254,249,31,79,111,60,173,241,241,124,82,34,189,246,233,251,163,179,223,129,178,15,181,97,103,68,217,251,253,17,198,63,35,254,218,150,109,129,235,236,183,141,63,16,97,60,125,157,93,199,211,219,217,245,128,211,250,223,12,238,70,210,82,169,25,
10,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconLinuxMakefile_png = (const char*) temp_binary_data_28;
+const char* projectIconLinuxMakefile_png = (const char*) temp_binary_data_29;
//================== projectIconVisualStudio.png ==================
-static const unsigned char temp_binary_data_29[] =
+static const unsigned char temp_binary_data_30[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,4,166,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,120,58,120,109,112,109,101,
116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,88,77,80,32,67,111,114,101,32,53,46,52,46,48,34,62,10,32,32,32,60,114,100,102,58,82,68,70,32,120,109,108,110,115,58,114,
100,102,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,48,50,47,50,50,45,114,100,102,45,115,121,110,116,97,120,45,110,115,35,34,62,10,32,32,32,32,32,32,60,114,100,102,58,68,101,115,99,114,105,112,116,105,111,110,
@@ -2998,10 +3040,10 @@ static const unsigned char temp_binary_data_29[] =
60,9,167,156,184,49,164,154,223,25,2,227,183,193,73,245,49,24,79,213,175,147,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,192,129,64,
129,255,7,47,12,150,8,60,209,161,194,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconVisualStudio_png = (const char*) temp_binary_data_29;
+const char* projectIconVisualStudio_png = (const char*) temp_binary_data_30;
//================== projectIconXcode.png ==================
-static const unsigned char temp_binary_data_30[] =
+static const unsigned char temp_binary_data_31[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,3,40,105,84,88,116,88,77,76,58,
99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,120,
58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,54,
@@ -3261,10 +3303,10 @@ static const unsigned char temp_binary_data_30[] =
94,156,0,232,23,120,134,102,179,249,235,17,128,9,19,38,192,59,223,249,206,152,182,172,169,75,67,169,119,178,110,237,223,246,242,196,143,188,48,28,50,88,157,63,127,254,175,124,82,161,71,186,231,200,203,63,99,234,231,229,216,252,127,248,207,255,19,96,0,
221,83,18,25,240,8,112,38,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconXcode_png = (const char*) temp_binary_data_30;
+const char* projectIconXcode_png = (const char*) temp_binary_data_31;
//================== projectIconXcodeIOS.png ==================
-static const unsigned char temp_binary_data_31[] =
+static const unsigned char temp_binary_data_32[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,3,134,105,84,88,116,88,77,76,
58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -3522,10 +3564,10 @@ static const unsigned char temp_binary_data_31[] =
4,97,9,162,191,203,0,199,198,0,162,157,87,213,105,220,35,12,64,131,146,62,249,201,79,186,117,103,130,86,133,76,84,14,16,185,67,123,223,37,252,241,103,134,146,206,234,228,201,147,143,250,164,172,171,29,174,239,254,252,101,253,188,235,155,255,31,255,249,
255,2,12,0,235,154,52,248,249,240,115,28,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
-const char* projectIconXcodeIOS_png = (const char*) temp_binary_data_31;
+const char* projectIconXcodeIOS_png = (const char*) temp_binary_data_32;
//================== RecentFilesMenuTemplate.nib ==================
-static const unsigned char temp_binary_data_32[] =
+static const unsigned char temp_binary_data_33[] =
{ 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50,
0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226,
0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,
@@ -3562,10 +3604,10 @@ static const unsigned char temp_binary_data_32[] =
7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8,
41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 };
-const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_32;
+const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_33;
//================== wizard_AnimatedApp.svg ==================
-static const unsigned char temp_binary_data_33[] =
+static const unsigned char temp_binary_data_34[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3612,10 +3654,10 @@ static const unsigned char temp_binary_data_33[] =
"\r\n"
"\r\n";
-const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_33;
+const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_34;
//================== wizard_AudioApp.svg ==================
-static const unsigned char temp_binary_data_34[] =
+static const unsigned char temp_binary_data_35[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3689,10 +3731,10 @@ static const unsigned char temp_binary_data_34[] =
"\r\n"
"\r\n";
-const char* wizard_AudioApp_svg = (const char*) temp_binary_data_34;
+const char* wizard_AudioApp_svg = (const char*) temp_binary_data_35;
//================== wizard_AudioPlugin.svg ==================
-static const unsigned char temp_binary_data_35[] =
+static const unsigned char temp_binary_data_36[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3803,10 +3845,10 @@ static const unsigned char temp_binary_data_35[] =
"\r\n"
"\r\n";
-const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_35;
+const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_36;
//================== wizard_ConsoleApp.svg ==================
-static const unsigned char temp_binary_data_36[] =
+static const unsigned char temp_binary_data_37[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3829,10 +3871,10 @@ static const unsigned char temp_binary_data_36[] =
"\r\n"
"\r\n";
-const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_36;
+const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_37;
//================== wizard_DLL.svg ==================
-static const unsigned char temp_binary_data_37[] =
+static const unsigned char temp_binary_data_38[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3875,10 +3917,10 @@ static const unsigned char temp_binary_data_37[] =
"\tl-7.7,5.3c-0.7,0.5-1.7,0.3-2.2-0.4L70.1,31\"/>\r\n"
"\r\n";
-const char* wizard_DLL_svg = (const char*) temp_binary_data_37;
+const char* wizard_DLL_svg = (const char*) temp_binary_data_38;
//================== wizard_GUI.svg ==================
-static const unsigned char temp_binary_data_38[] =
+static const unsigned char temp_binary_data_39[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3929,10 +3971,10 @@ static const unsigned char temp_binary_data_38[] =
"\tC0,3.1,3.1,0,6.9,0H130c3.8,0,6.9,3.1,6.9,6.9v101.1C136.9,111.7,133.9,114.8,130,114.8z\"/>\r\n"
"\r\n";
-const char* wizard_GUI_svg = (const char*) temp_binary_data_38;
+const char* wizard_GUI_svg = (const char*) temp_binary_data_39;
//================== wizard_Highlight.svg ==================
-static const unsigned char temp_binary_data_39[] =
+static const unsigned char temp_binary_data_40[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3942,10 +3984,10 @@ static const unsigned char temp_binary_data_39[] =
"\tV108C136.9,111.8,133.9,114.8,130.1,114.8z\"/>\r\n"
"\r\n";
-const char* wizard_Highlight_svg = (const char*) temp_binary_data_39;
+const char* wizard_Highlight_svg = (const char*) temp_binary_data_40;
//================== wizard_Openfile.svg ==================
-static const unsigned char temp_binary_data_40[] =
+static const unsigned char temp_binary_data_41[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3955,10 +3997,10 @@ static const unsigned char temp_binary_data_40[] =
"\tc0-3.8,3.1-6.9,6.9-6.9h151.5c3.8,0,6.9,3.1,6.9,6.9v20.9C171.6,68.3,168.5,71.4,164.7,71.4z\"/>\r\n"
"\r\n";
-const char* wizard_Openfile_svg = (const char*) temp_binary_data_40;
+const char* wizard_Openfile_svg = (const char*) temp_binary_data_41;
//================== wizard_OpenGL.svg ==================
-static const unsigned char temp_binary_data_41[] =
+static const unsigned char temp_binary_data_42[] =
"\r\n"
"\r\n"
"\r\n"
@@ -3986,10 +4028,10 @@ static const unsigned char temp_binary_data_41[] =
"\ts-13.4-19.6-6.9-30\"/>\r\n"
"\r\n";
-const char* wizard_OpenGL_svg = (const char*) temp_binary_data_41;
+const char* wizard_OpenGL_svg = (const char*) temp_binary_data_42;
//================== wizard_StaticLibrary.svg ==================
-static const unsigned char temp_binary_data_42[] =
+static const unsigned char temp_binary_data_43[] =
"\r\n"
"\r\n"
"\r\n"
@@ -4032,7 +4074,7 @@ static const unsigned char temp_binary_data_42[] =
"\tc-1,0-1.8-0.8-1.8-1.8V20.8\"/>\r\n"
"\r\n";
-const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_42;
+const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_43;
const char* getNamedResource (const char*, int&) throw();
@@ -4067,6 +4109,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw
case 0x36e634a1: numBytes = 1626; return jucer_NewInlineComponentTemplate_h;
case 0x7fbac252: numBytes = 1827; return jucer_OpenGLComponentTemplate_cpp;
case 0x44be9398: numBytes = 2745; return AudioPluginXCodeScript_txt;
+ case 0x406db5c1: numBytes = 3117; return background_logo_svg;
case 0x4a0cfd09: numBytes = 151; return background_tile_png;
case 0x763d39dc: numBytes = 1050; return colourscheme_dark_xml;
case 0xe8b08520: numBytes = 1050; return colourscheme_light_xml;
@@ -4119,6 +4162,7 @@ const char* namedResourceList[] =
"jucer_NewInlineComponentTemplate_h",
"jucer_OpenGLComponentTemplate_cpp",
"AudioPluginXCodeScript_txt",
+ "background_logo_svg",
"background_tile_png",
"colourscheme_dark_xml",
"colourscheme_light_xml",
diff --git a/extras/Introjucer/JuceLibraryCode/BinaryData.h b/extras/Introjucer/JuceLibraryCode/BinaryData.h
index 8af762c6bb..b911e7aef8 100644
--- a/extras/Introjucer/JuceLibraryCode/BinaryData.h
+++ b/extras/Introjucer/JuceLibraryCode/BinaryData.h
@@ -75,6 +75,9 @@ namespace BinaryData
extern const char* AudioPluginXCodeScript_txt;
const int AudioPluginXCodeScript_txtSize = 2745;
+ extern const char* background_logo_svg;
+ const int background_logo_svgSize = 3117;
+
extern const char* background_tile_png;
const int background_tile_pngSize = 151;
@@ -142,7 +145,7 @@ namespace BinaryData
extern const char* namedResourceList[];
// Number of elements in the namedResourceList array.
- const int namedResourceListSize = 43;
+ const int namedResourceListSize = 44;
// If you provide the name of one of the binary resource variables above, this function will
// return the corresponding data and its size (or a null pointer if the name isn't found).
diff --git a/extras/Introjucer/Source/Application/jucer_CommandIDs.h b/extras/Introjucer/Source/Application/jucer_CommandIDs.h
index bfe5a89b12..396f942355 100644
--- a/extras/Introjucer/Source/Application/jucer_CommandIDs.h
+++ b/extras/Introjucer/Source/Application/jucer_CommandIDs.h
@@ -40,6 +40,7 @@ namespace CommandIDs
saveAll = 0x200080,
openInIDE = 0x200072,
saveAndOpenInIDE = 0x200073,
+ createNewExporter = 0x20007d,
showUTF8Tool = 0x200076,
showGlobalPreferences = 0x200077,
diff --git a/extras/Introjucer/Source/BinaryData/background_logo.svg b/extras/Introjucer/Source/BinaryData/background_logo.svg
new file mode 100644
index 0000000000..3330721702
--- /dev/null
+++ b/extras/Introjucer/Source/BinaryData/background_logo.svg
@@ -0,0 +1,37 @@
+
+
diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h
index 495f24b4bd..224477da1a 100644
--- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h
+++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h
@@ -22,30 +22,12 @@
==============================================================================
*/
-class AndroidProjectExporter : public ProjectExporter
+class AndroidProjectExporterBase : public ProjectExporter
{
public:
- //==============================================================================
- static const char* getNameAndroid() { return "Android Project"; }
- static const char* getValueTreeTypeName() { return "ANDROID"; }
-
- static AndroidProjectExporter* createForSettings (Project& project, const ValueTree& settings)
- {
- if (settings.hasType (getValueTreeTypeName()))
- return new AndroidProjectExporter (project, settings);
-
- return nullptr;
- }
-
- //==============================================================================
- AndroidProjectExporter (Project& p, const ValueTree& t)
+ AndroidProjectExporterBase (Project& p, const ValueTree& t)
: ProjectExporter (p, t)
{
- name = getNameAndroid();
-
- if (getTargetLocationString().isEmpty())
- getTargetLocationValue() = getDefaultBuildsRootFolder() + "Android";
-
if (getVersionCodeString().isEmpty())
getVersionCodeValue() = 1;
@@ -67,13 +49,21 @@ public:
initialiseDependencyPathValues();
}
- //==============================================================================
bool canLaunchProject() override { return false; }
bool launchProject() override { return false; }
bool isAndroid() const override { return true; }
bool usesMMFiles() const override { return false; }
bool canCopeWithDuplicateFiles() override { return false; }
+ void create (const OwnedArray& modules) const override
+ {
+ const String package (getActivityClassPackage());
+ const String path (package.replaceCharacter ('.', File::separator));
+ const File target (getTargetFolder().getChildFile ("src").getChildFile (path));
+
+ copyActivityJavaFiles (modules, target, package);
+ }
+
void createExporterProperties (PropertyListBuilder& props) override
{
props.add (new TextPropertyComponent (getActivityClassPathValue(), "Android Activity class name", 256, false),
@@ -172,6 +162,7 @@ public:
Value getCPP11EnabledValue() { return getSetting (Ids::androidCpp11); }
bool isCPP11Enabled() const { return settings [Ids::androidCpp11]; }
+ //==============================================================================
String createDefaultClassName() const
{
String s (project.getBundleIdentifier().toString().toLowerCase());
@@ -192,84 +183,168 @@ public:
return s + CodeHelpers::makeValidIdentifier (project.getProjectFilenameRoot(), false, true, false);
}
- //==============================================================================
- void create (const OwnedArray& modules) const override
+ void initialiseDependencyPathValues()
{
- const File target (getTargetFolder());
- const File jniFolder (target.getChildFile ("jni"));
+ sdkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidSDKPath),
+ Ids::androidSDKPath, TargetOS::getThisOS())));
- copyActivityJavaFiles (modules);
- createDirectoryOrThrow (jniFolder);
- createDirectoryOrThrow (target.getChildFile ("res").getChildFile ("values"));
- createDirectoryOrThrow (target.getChildFile ("libs"));
- createDirectoryOrThrow (target.getChildFile ("bin"));
+ ndkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidNDKPath),
+ Ids::androidNDKPath, TargetOS::getThisOS())));
+ }
+ void copyActivityJavaFiles (const OwnedArray& modules, const File& targetFolder, const String& package) const
+ {
+ const String className (getActivityName());
+
+ if (className.isEmpty())
+ throw SaveError ("Invalid Android Activity class name: " + getActivityClassPath());
+
+ createDirectoryOrThrow (targetFolder);
+
+ LibraryModule* const coreModule = getCoreModule (modules);
+
+ if (coreModule != nullptr)
{
- ScopedPointer manifest (createManifestXML());
- writeXmlOrThrow (*manifest, target.getChildFile ("AndroidManifest.xml"), "utf-8", 100, true);
+ File javaDestFile (targetFolder.getChildFile (className + ".java"));
+
+ File javaSourceFile (coreModule->getFolder().getChildFile ("native")
+ .getChildFile ("java")
+ .getChildFile ("JuceAppActivity.java"));
+
+ MemoryOutputStream newFile;
+ newFile << javaSourceFile.loadFileAsString()
+ .replace ("JuceAppActivity", className)
+ .replace ("package com.juce;", "package " + package + ";");
+
+ overwriteFileIfDifferentOrThrow (javaDestFile, newFile);
}
+ }
- writeApplicationMk (jniFolder.getChildFile ("Application.mk"));
- writeAndroidMk (jniFolder.getChildFile ("Android.mk"));
+ String getAppPlatform() const
+ {
+ int ndkVersion = getMinimumSDKVersionString().getIntValue();
+ if (ndkVersion == 9)
+ ndkVersion = 10; // (doesn't seem to be a version '9')
+ return "android-" + String (ndkVersion);
+ }
+
+ String getActivityName() const
+ {
+ return getActivityClassPath().fromLastOccurrenceOf (".", false, false);
+ }
+
+ String getActivitySubClassName() const
+ {
+ String activityPath = getActivitySubClassPath();
+
+ return (activityPath.isEmpty()) ? getActivityName() : activityPath.fromLastOccurrenceOf (".", false, false);
+ }
+
+ String getActivityClassPackage() const
+ {
+ return getActivityClassPath().upToLastOccurrenceOf (".", false, false);
+ }
+
+ String getJNIActivityClassName() const
+ {
+ return getActivityClassPath().replaceCharacter ('.', '/');
+ }
+
+ static LibraryModule* getCoreModule (const OwnedArray& modules)
+ {
+ for (int i = modules.size(); --i >= 0;)
+ if (modules.getUnchecked(i)->getID() == "juce_core")
+ return modules.getUnchecked(i);
+
+ return nullptr;
+ }
+
+ String getCppFlags() const
+ {
+ String flags ("-fsigned-char -fexceptions -frtti");
+
+ if (! getNDKToolchainVersionString().startsWithIgnoreCase ("clang"))
+ flags << " -Wno-psabi";
+
+ return flags;
+ }
+
+ StringArray getPermissionsRequired() const
+ {
+ StringArray s;
+ s.addTokens (getOtherPermissions(), ", ", "");
+
+ if (getInternetNeeded()) s.add ("android.permission.INTERNET");
+ if (getAudioRecordNeeded()) s.add ("android.permission.RECORD_AUDIO");
+
+ return getCleanedStringArray (s);
+ }
+
+ template
+ void findAllProjectItemsWithPredicate (const Project::Item& projectItem, Array& results, const PredicateT& predicate) const
+ {
+ if (projectItem.isGroup())
{
- ScopedPointer antBuildXml (createAntBuildXML());
- writeXmlOrThrow (*antBuildXml, target.getChildFile ("build.xml"), "UTF-8", 100);
+ for (int i = 0; i < projectItem.getNumChildren(); ++i)
+ findAllProjectItemsWithPredicate (projectItem.getChild(i), results, predicate);
}
+ else
+ {
+ if (predicate (projectItem))
+ results.add (RelativePath (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder));
+ }
+ }
- writeProjectPropertiesFile (target.getChildFile ("project.properties"));
- writeLocalPropertiesFile (target.getChildFile ("local.properties"));
- writeStringsFile (target.getChildFile ("res/values/strings.xml"));
+ void writeIcon (const File& file, const Image& im) const
+ {
+ if (im.isValid())
+ {
+ createDirectoryOrThrow (file.getParentDirectory());
+ PNGImageFormat png;
+ MemoryOutputStream mo;
+
+ if (! png.writeImageToStream (im, mo))
+ throw SaveError ("Can't generate Android icon file");
+
+ overwriteFileIfDifferentOrThrow (file, mo);
+ }
+ }
+
+ void writeIcons (const File& folder) const
+ {
ScopedPointer bigIcon (getBigIcon());
ScopedPointer smallIcon (getSmallIcon());
if (bigIcon != nullptr && smallIcon != nullptr)
{
const int step = jmax (bigIcon->getWidth(), bigIcon->getHeight()) / 8;
- writeIcon (target.getChildFile ("res/drawable-xhdpi/icon.png"), getBestIconForSize (step * 8, false));
- writeIcon (target.getChildFile ("res/drawable-hdpi/icon.png"), getBestIconForSize (step * 6, false));
- writeIcon (target.getChildFile ("res/drawable-mdpi/icon.png"), getBestIconForSize (step * 4, false));
- writeIcon (target.getChildFile ("res/drawable-ldpi/icon.png"), getBestIconForSize (step * 3, false));
+ writeIcon (folder.getChildFile ("drawable-xhdpi/icon.png"), getBestIconForSize (step * 8, false));
+ writeIcon (folder.getChildFile ("drawable-hdpi/icon.png"), getBestIconForSize (step * 6, false));
+ writeIcon (folder.getChildFile ("drawable-mdpi/icon.png"), getBestIconForSize (step * 4, false));
+ writeIcon (folder.getChildFile ("drawable-ldpi/icon.png"), getBestIconForSize (step * 3, false));
}
else if (Drawable* icon = bigIcon != nullptr ? bigIcon : smallIcon)
{
- writeIcon (target.getChildFile ("res/drawable-mdpi/icon.png"), rescaleImageForIcon (*icon, icon->getWidth()));
+ writeIcon (folder.getChildFile ("drawable-mdpi/icon.png"), rescaleImageForIcon (*icon, icon->getWidth()));
}
}
-protected:
- //==============================================================================
- class AndroidBuildConfiguration : public BuildConfiguration
+ template
+ String getABIs (bool forDebug) const
{
- public:
- AndroidBuildConfiguration (Project& p, const ValueTree& settings)
- : BuildConfiguration (p, settings)
+ for (ConstConfigIterator config (*this); config.next();)
{
- if (getArchitectures().isEmpty())
- getArchitecturesValue() = "armeabi armeabi-v7a";
+ const BuildConfigType& androidConfig = dynamic_cast (*config);
+
+ if (config->isDebug() == forDebug)
+ return androidConfig.getArchitectures();
}
- Value getArchitecturesValue() { return getValue (Ids::androidArchitectures); }
- String getArchitectures() const { return config [Ids::androidArchitectures]; }
-
- var getDefaultOptimisationLevel() const override { return var ((int) (isDebug() ? gccO0 : gccO3)); }
-
- void createConfigProperties (PropertyListBuilder& props) override
- {
- addGCCOptimisationProperty (props);
-
- props.add (new TextPropertyComponent (getArchitecturesValue(), "Architectures", 256, false),
- "A list of the ARM architectures to build (for a fat binary).");
- }
- };
-
- BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override
- {
- return new AndroidBuildConfiguration (project, v);
+ return String();
}
-private:
//==============================================================================
XmlElement* createManifestXML() const
{
@@ -334,119 +409,109 @@ private:
return manifest;
}
- StringArray getPermissionsRequired() const
- {
- StringArray s;
- s.addTokens (getOtherPermissions(), ", ", "");
-
- if (getInternetNeeded()) s.add ("android.permission.INTERNET");
- if (getAudioRecordNeeded()) s.add ("android.permission.RECORD_AUDIO");
-
- return getCleanedStringArray (s);
- }
-
//==============================================================================
- void findAllFilesToCompile (const Project::Item& projectItem, Array& results) const
- {
- if (projectItem.isGroup())
- {
- for (int i = 0; i < projectItem.getNumChildren(); ++i)
- findAllFilesToCompile (projectItem.getChild(i), results);
- }
- else
- {
- if (projectItem.shouldBeCompiled())
- results.add (RelativePath (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder));
- }
- }
+ Value sdkPath, ndkPath;
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidProjectExporterBase)
+};
+
+
+//==============================================================================
+//==============================================================================
+class AndroidAntProjectExporter : public AndroidProjectExporterBase
+{
+public:
//==============================================================================
- String getActivityName() const
- {
- return getActivityClassPath().fromLastOccurrenceOf (".", false, false);
- }
+ static const char* getName() { return "Android Project"; }
+ static const char* getValueTreeTypeName() { return "ANDROID"; }
- String getActivitySubClassName() const
+ static AndroidAntProjectExporter* createForSettings (Project& project, const ValueTree& settings)
{
- String activityPath = getActivitySubClassPath();
-
- return (activityPath.isEmpty()) ? getActivityName() : activityPath.fromLastOccurrenceOf (".", false, false);
- }
-
- String getActivityClassPackage() const
- {
- return getActivityClassPath().upToLastOccurrenceOf (".", false, false);
- }
-
- String getJNIActivityClassName() const
- {
- return getActivityClassPath().replaceCharacter ('.', '/');
- }
-
- static LibraryModule* getCoreModule (const OwnedArray& modules)
- {
- for (int i = modules.size(); --i >= 0;)
- if (modules.getUnchecked(i)->getID() == "juce_core")
- return modules.getUnchecked(i);
+ if (settings.hasType (getValueTreeTypeName()))
+ return new AndroidAntProjectExporter (project, settings);
return nullptr;
}
- void copyActivityJavaFiles (const OwnedArray& modules) const
+ //==============================================================================
+ AndroidAntProjectExporter (Project& p, const ValueTree& t)
+ : AndroidProjectExporterBase (p, t)
{
- const String className (getActivityName());
- const String package (getActivityClassPackage());
- String path (package.replaceCharacter ('.', File::separator));
+ name = getName();
- if (path.isEmpty() || className.isEmpty())
- throw SaveError ("Invalid Android Activity class name: " + getActivityClassPath());
-
- const File classFolder (getTargetFolder().getChildFile ("src")
- .getChildFile (path));
- createDirectoryOrThrow (classFolder);
-
- LibraryModule* const coreModule = getCoreModule (modules);
-
- if (coreModule != nullptr)
- {
- File javaDestFile (classFolder.getChildFile (className + ".java"));
-
- File javaSourceFile (coreModule->getFolder().getChildFile ("native")
- .getChildFile ("java")
- .getChildFile ("JuceAppActivity.java"));
-
- MemoryOutputStream newFile;
- newFile << javaSourceFile.loadFileAsString()
- .replace ("JuceAppActivity", className)
- .replace ("package com.juce;", "package " + package + ";");
-
- overwriteFileIfDifferentOrThrow (javaDestFile, newFile);
- }
+ if (getTargetLocationString().isEmpty())
+ getTargetLocationValue() = getDefaultBuildsRootFolder() + "Android";
}
- String getABIs (bool forDebug) const
+ //==============================================================================
+ void createExporterProperties (PropertyListBuilder& props) override
{
- for (ConstConfigIterator config (*this); config.next();)
- {
- const AndroidBuildConfiguration& androidConfig = dynamic_cast (*config);
+ AndroidProjectExporterBase::createExporterProperties (props);
+ }
- if (config->isDebug() == forDebug)
- return androidConfig.getArchitectures();
+ void create (const OwnedArray& modules) const override
+ {
+ AndroidProjectExporterBase::create (modules);
+
+ const File target (getTargetFolder());
+ const File jniFolder (target.getChildFile ("jni"));
+
+ createDirectoryOrThrow (jniFolder);
+ createDirectoryOrThrow (target.getChildFile ("res").getChildFile ("values"));
+ createDirectoryOrThrow (target.getChildFile ("libs"));
+ createDirectoryOrThrow (target.getChildFile ("bin"));
+
+ {
+ ScopedPointer manifest (createManifestXML());
+ writeXmlOrThrow (*manifest, target.getChildFile ("AndroidManifest.xml"), "utf-8", 100, true);
}
- return String();
+ writeApplicationMk (jniFolder.getChildFile ("Application.mk"));
+ writeAndroidMk (jniFolder.getChildFile ("Android.mk"));
+
+ {
+ ScopedPointer antBuildXml (createAntBuildXML());
+ writeXmlOrThrow (*antBuildXml, target.getChildFile ("build.xml"), "UTF-8", 100);
+ }
+
+ writeProjectPropertiesFile (target.getChildFile ("project.properties"));
+ writeLocalPropertiesFile (target.getChildFile ("local.properties"));
+ writeStringsFile (target.getChildFile ("res/values/strings.xml"));
+ writeIcons (target.getChildFile ("res"));
}
- String getCppFlags() const
+ //==============================================================================
+ class AndroidBuildConfiguration : public BuildConfiguration
{
- String flags ("-fsigned-char -fexceptions -frtti");
+ public:
+ AndroidBuildConfiguration (Project& p, const ValueTree& settings)
+ : BuildConfiguration (p, settings)
+ {
+ if (getArchitectures().isEmpty())
+ getArchitecturesValue() = "armeabi armeabi-v7a";
+ }
- if (! getNDKToolchainVersionString().startsWithIgnoreCase ("clang"))
- flags << " -Wno-psabi";
+ Value getArchitecturesValue() { return getValue (Ids::androidArchitectures); }
+ String getArchitectures() const { return config [Ids::androidArchitectures]; }
- return flags;
+ var getDefaultOptimisationLevel() const override { return var ((int) (isDebug() ? gccO0 : gccO3)); }
+
+ void createConfigProperties (PropertyListBuilder& props) override
+ {
+ addGCCOptimisationProperty (props);
+
+ props.add (new TextPropertyComponent (getArchitecturesValue(), "Architectures", 256, false),
+ "A list of the ARM architectures to build (for a fat binary).");
+ }
+ };
+
+ BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override
+ {
+ return new AndroidBuildConfiguration (project, v);
}
+private:
+ //==============================================================================
String getToolchainVersion() const
{
String v (getNDKToolchainVersionString());
@@ -466,9 +531,9 @@ private:
<< "NDK_TOOLCHAIN_VERSION := " << getToolchainVersion() << newLine
<< newLine
<< "ifeq ($(NDK_DEBUG),1)" << newLine
- << " APP_ABI := " << getABIs (true) << newLine
+ << " APP_ABI := " << getABIs (true) << newLine
<< "else" << newLine
- << " APP_ABI := " << getABIs (false) << newLine
+ << " APP_ABI := " << getABIs (false) << newLine
<< "endif" << newLine;
overwriteFileIfDifferentOrThrow (file, mo);
@@ -478,8 +543,13 @@ private:
{
Array files;
+ struct Predicate
+ {
+ bool operator() (const Project::Item& projectItem) const { return projectItem.shouldBeAddedToTargetProject(); }
+ };
+
for (int i = 0; i < getAllGroups().size(); ++i)
- findAllFilesToCompile (getAllGroups().getReference(i), files);
+ findAllProjectItemsWithPredicate (getAllGroups().getReference(i), files, Predicate());
MemoryOutputStream mo;
writeAndroidMk (mo, files);
@@ -687,15 +757,6 @@ private:
equals->setAttribute ("arg2", "debug");
}
- String getAppPlatform() const
- {
- int ndkVersion = getMinimumSDKVersionString().getIntValue();
- if (ndkVersion == 9)
- ndkVersion = 10; // (doesn't seem to be a version '9')
-
- return "android-" + String (ndkVersion);
- }
-
void writeProjectPropertiesFile (const File& file) const
{
MemoryOutputStream mo;
@@ -725,22 +786,6 @@ private:
overwriteFileIfDifferentOrThrow (file, mo);
}
- void writeIcon (const File& file, const Image& im) const
- {
- if (im.isValid())
- {
- createDirectoryOrThrow (file.getParentDirectory());
-
- PNGImageFormat png;
- MemoryOutputStream mo;
-
- if (! png.writeImageToStream (im, mo))
- throw SaveError ("Can't generate Android icon file");
-
- overwriteFileIfDifferentOrThrow (file, mo);
- }
- }
-
void writeStringsFile (const File& file) const
{
XmlElement strings ("resources");
@@ -751,19 +796,6 @@ private:
writeXmlOrThrow (strings, file, "utf-8", 100);
}
- void initialiseDependencyPathValues()
- {
- sdkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidSDKPath),
- Ids::androidSDKPath,
- TargetOS::getThisOS())));
-
- ndkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidNDKPath),
- Ids::androidNDKPath,
- TargetOS::getThisOS())));
- }
-
//==============================================================================
- Value sdkPath, ndkPath;
-
- JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter)
+ JUCE_DECLARE_NON_COPYABLE (AndroidAntProjectExporter)
};
diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_AndroidStudio.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_AndroidStudio.h
new file mode 100644
index 0000000000..22f5a39a23
--- /dev/null
+++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_AndroidStudio.h
@@ -0,0 +1,616 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2015 - ROLI Ltd.
+
+ Permission is granted to use this software under the terms of either:
+ a) the GPL v2 (or any later version)
+ b) the Affero GPL v3
+
+ Details of these licenses can be found 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.juce.com for more information.
+
+ ==============================================================================
+*/
+
+class AndroidStudioProjectExporter : public AndroidProjectExporterBase
+{
+public:
+ //==============================================================================
+ static const char* getName() { return "Android Studio"; }
+ static const char* getValueTreeTypeName() { return "ANDROIDSTUDIO"; }
+
+ static AndroidStudioProjectExporter* createForSettings (Project& project, const ValueTree& settings)
+ {
+ if (settings.hasType (getValueTreeTypeName()))
+ return new AndroidStudioProjectExporter (project, settings);
+
+ return nullptr;
+ }
+
+ //==============================================================================
+ AndroidStudioProjectExporter (Project& p, const ValueTree& t)
+ : AndroidProjectExporterBase (p, t),
+ androidStudioExecutable (findAndroidStudioExecutable())
+ {
+ name = getName();
+
+ if (getTargetLocationString().isEmpty())
+ getTargetLocationValue() = getDefaultBuildsRootFolder() + "AndroidStudio";
+ }
+
+ //==============================================================================
+ bool canLaunchProject() override
+ {
+ return androidStudioExecutable.exists();
+ }
+
+ bool launchProject() override
+ {
+ if (! androidStudioExecutable.exists())
+ {
+ jassertfalse;
+ return false;
+ }
+
+ const File targetFolder (getTargetFolder());
+
+ return androidStudioExecutable.startAsProcess (targetFolder.getFullPathName());
+ }
+
+ void createExporterProperties (PropertyListBuilder& props) override
+ {
+ AndroidProjectExporterBase::createExporterProperties (props);
+ }
+
+ void create (const OwnedArray& modules) const override
+ {
+ const File targetFolder (getTargetFolder());
+ targetFolder.deleteRecursively();
+
+ {
+ const String package (getActivityClassPackage());
+ const String path (package.replaceCharacter ('.', File::separator));
+ const File javaTarget (targetFolder.getChildFile ("app/src/main/java").getChildFile (path));
+
+ copyActivityJavaFiles (modules, javaTarget, package);
+ }
+
+ writeSettingsDotGradle (targetFolder);
+ writeLocalDotProperties (targetFolder);
+ writeBuildDotGradleRoot (targetFolder);
+ writeBuildDotGradleApp (targetFolder);
+ writeGradleWrapperProperties (targetFolder);
+ writeAndroidManifest (targetFolder);
+ writeStringsXML (targetFolder);
+ writeAppIcons (targetFolder);
+
+ createSourceSymlinks (targetFolder);
+ }
+
+ static File findAndroidStudioExecutable()
+ {
+ #if JUCE_WINDOWS
+ const File defaultInstallation ("C:\\Program Files\\Android\\Android Studio\\bin");
+
+ if (defaultInstallation.exists())
+ {
+ {
+ const File studio64 = defaultInstallation.getChildFile ("studio64.exe");
+
+ if (studio64.existsAsFile())
+ return studio64;
+ }
+
+ {
+ const File studio = defaultInstallation.getChildFile ("studio.exe");
+
+ if (studio.existsAsFile())
+ return studio;
+ }
+ }
+ #elif JUCE_MAC
+ const File defaultInstallation ("/Applications/Android Studio.app");
+
+ if (defaultInstallation.exists())
+ return defaultInstallation;
+ #endif
+
+ return File::nonexistent;
+ }
+
+protected:
+ //==============================================================================
+ class AndroidStudioBuildConfiguration : public BuildConfiguration
+ {
+ public:
+ AndroidStudioBuildConfiguration (Project& p, const ValueTree& settings)
+ : BuildConfiguration (p, settings)
+ {
+ if (getArchitectures().isEmpty())
+ getArchitecturesValue() = "armeabi armeabi-v7a";
+ }
+
+ Value getArchitecturesValue() { return getValue (Ids::androidArchitectures); }
+ String getArchitectures() const { return config [Ids::androidArchitectures]; }
+
+ var getDefaultOptimisationLevel() const override { return var ((int) (isDebug() ? gccO0 : gccO3)); }
+
+ void createConfigProperties (PropertyListBuilder& props) override
+ {
+ addGCCOptimisationProperty (props);
+
+ props.add (new TextPropertyComponent (getArchitecturesValue(), "Architectures", 256, false),
+ "A list of the ARM architectures to build (for a fat binary).");
+ }
+ };
+
+ BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override
+ {
+ return new AndroidStudioBuildConfiguration (project, v);
+ }
+
+private:
+ static void createSymboicLinkAndCreateParentFolders (const File& originalFile, const File& linkFile)
+ {
+ {
+ const File linkFileParentDirectory (linkFile.getParentDirectory());
+
+ // this will recursively creative the parent directories for the file
+ // without this, the symlink would fail because it doesn't automatically create
+ // the folders if they don't exist
+ if (! linkFileParentDirectory.createDirectory())
+ throw SaveError (String ("Could not create directory ") + linkFileParentDirectory.getFullPathName());
+ }
+
+ if (! originalFile.createSymbolicLink (linkFile, true))
+ throw SaveError (String ("Failed to create symlink from ")
+ + linkFile.getFullPathName() + " to "
+ + originalFile.getFullPathName() + "!");
+ }
+
+ void makeSymlinksForGroup (const Project::Item& group, const File& targetFolder) const
+ {
+ if (! group.isGroup())
+ {
+ throw SaveError ("makeSymlinksForGroup was called with something other than a group!");
+ }
+
+ for (int i = 0; i < group.getNumChildren(); ++i)
+ {
+ const Project::Item& projectItem = group.getChild (i);
+
+ if (projectItem.isGroup())
+ {
+ makeSymlinksForGroup (projectItem, targetFolder.getChildFile (projectItem.getName()));
+ }
+ else if (projectItem.shouldBeAddedToTargetProject()) // must be a file then
+ {
+ const File originalFile (projectItem.getFile());
+ const File targetFile (targetFolder.getChildFile (originalFile.getFileName()));
+
+ createSymboicLinkAndCreateParentFolders (originalFile, targetFile);
+ }
+ }
+ }
+
+ void createSourceSymlinks (const File& folder) const
+ {
+ const File targetFolder (folder.getChildFile ("app/src/main/jni"));
+
+ // here we make symlinks to only to files included in the groups inside the project
+ // this is because Android Studio does not have a concept of groups and just uses
+ // the file system layout to determine what's to be compiled
+ {
+ const Array& groups = getAllGroups();
+
+ for (int i = 0; i < groups.size(); ++i)
+ {
+ const Project::Item projectItem (groups.getReference (i));
+ const String projectItemName (projectItem.getName());
+
+ if (projectItem.isGroup())
+ makeSymlinksForGroup (projectItem, projectItemName == "Juce Modules" ? targetFolder.getChildFile ("JuceModules") : targetFolder);
+ }
+ }
+ }
+
+ void writeAppIcons (const File& folder) const
+ {
+ writeIcons (folder.getChildFile ("app/src/main/res/"));
+ }
+
+ void writeSettingsDotGradle (const File& folder) const
+ {
+ MemoryOutputStream memoryOutputStream;
+
+ memoryOutputStream << "include ':app'";
+
+ overwriteFileIfDifferentOrThrow (folder.getChildFile ("settings.gradle"), memoryOutputStream);
+ }
+
+ static String sanitisePath (String path)
+ {
+ if (path.startsWith ("~"))
+ {
+ const String homeFolder (File::getSpecialLocation (File::SpecialLocationType::userHomeDirectory).getFullPathName());
+
+ path = path.replaceSection (0, 1, homeFolder);
+ }
+
+ return path.replace ("\\", "\\\\");
+ }
+
+ void writeLocalDotProperties (const File& folder) const
+ {
+ MemoryOutputStream memoryOutputStream;
+
+ memoryOutputStream << "ndk.dir=" << sanitisePath (getNDKPathString()) << newLine
+ << "sdk.dir=" << sanitisePath (getSDKPathString());
+
+ overwriteFileIfDifferentOrThrow (folder.getChildFile ("local.properties"), memoryOutputStream);
+ }
+
+ void writeGradleWrapperProperties (const File& folder) const
+ {
+ MemoryOutputStream memoryOutputStream;
+
+ memoryOutputStream << "distributionUrl=https\\://services.gradle.org/distributions/gradle-2.6-all.zip";
+
+ overwriteFileIfDifferentOrThrow (folder.getChildFile ("gradle/wrapper/gradle-wrapper.properties"), memoryOutputStream);
+ }
+
+ void writeBuildDotGradleRoot (const File& folder) const
+ {
+ MemoryOutputStream memoryOutputStream;
+
+ const String indent = getIndentationString();
+
+ // this is needed to make sure the correct version of
+ // the gradle build tools is available
+ // otherwise, the user will get an error about
+ // com.android.tools.something not being available
+ memoryOutputStream << "buildscript {" << newLine
+ << indent << "repositories {" << newLine
+ << indent << indent << "jcenter()" << newLine
+ << indent << "}" << newLine
+ << indent << "dependencies {" << newLine
+ << indent << indent << "classpath 'com.android.tools.build:gradle-experimental:0.3.0-alpha7'" << newLine
+ << indent << "}" << newLine
+ << "}" << newLine
+ << newLine
+ << "allprojects {" << newLine
+ << indent << "repositories {" << newLine
+ << indent << indent << "jcenter()" << newLine
+ << indent << "}" << newLine
+ << "}";
+
+ overwriteFileIfDifferentOrThrow (folder.getChildFile ("build.gradle"), memoryOutputStream);
+ }
+
+ void writeStringsXML (const File& folder) const
+ {
+ XmlElement strings ("resources");
+ XmlElement* resourceName = strings.createNewChildElement ("string");
+
+ resourceName->setAttribute ("name", "app_name");
+ resourceName->addTextElement (projectName);
+
+ writeXmlOrThrow (strings, folder.getChildFile ("app/src/main/res/values/string.xml"), "utf-8", 100, true);
+ }
+
+ void writeAndroidManifest (const File& folder) const
+ {
+ ScopedPointer manifest (createManifestXML());
+
+ writeXmlOrThrow (*manifest, folder.getChildFile ("app/src/main/AndroidManifest.xml"), "utf-8", 100, true);
+ }
+
+ String createModelDotAndroid (const String& indent, const String& minimumSDKVersion, const String& bundleIdentifier) const
+ {
+ String result;
+
+ result << "android {" << newLine
+ << indent << "compileSdkVersion = " << minimumSDKVersion << newLine
+ << indent << "buildToolsVersion = \"" << "23.0.1" << "\"" << newLine
+ << indent << "defaultConfig.with {" << newLine
+ << indent << indent << "applicationId = \"" << bundleIdentifier.toLowerCase() << "\"" << newLine
+ << indent << indent << "minSdkVersion.apiLevel = 11" << newLine
+ << indent << indent << "targetSdkVersion.apiLevel = " << minimumSDKVersion << newLine
+ << indent << "}" << newLine
+ << "}" << newLine;
+
+ return result;
+ }
+
+ String createModelDotCompileOptions (const String& indent) const
+ {
+ String result;
+
+ result << "compileOptions.with {" << newLine
+ << indent << "sourceCompatibility = JavaVersion.VERSION_1_7" << newLine
+ << indent << indent << "targetCompatibility = JavaVersion.VERSION_1_7" << newLine
+ << "}" << newLine;
+
+ return result;
+ }
+
+ String createModelDotAndroidSources (const String& indent) const
+ {
+ String result;
+
+ result << "android.sources {" << newLine
+ << indent << "main {" << newLine
+ << indent << indent << "jni {" << newLine
+ << indent << indent << indent << "source {" << newLine
+ << indent << indent << indent << indent << "exclude \"**/JuceModules/\"" << newLine
+ << indent << indent << indent << "}" << newLine
+ << indent << indent << "}" << newLine
+ << indent << "}" << newLine
+ << "}" << newLine;
+
+ return result;
+ }
+
+ StringArray getCPPFlags() const
+ {
+ StringArray result;
+
+ result.add ("\"-fsigned-char\"");
+ result.add ("\"-fexceptions\"");
+ result.add ("\"-frtti\"");
+
+ if (isCPP11Enabled())
+ result.add ("\"-std=gnu++11\"");
+
+ // preprocessor definitions
+
+ {
+ StringPairArray preprocessorDefinitions = getAllPreprocessorDefs();
+ preprocessorDefinitions.set ("JUCE_ANDROID", "1");
+ preprocessorDefinitions.set ("JUCE_ANDROID_ACTIVITY_CLASSNAME", getJNIActivityClassName().replaceCharacter ('/', '_'));
+ preprocessorDefinitions.set ("JUCE_ANDROID_ACTIVITY_CLASSPATH", "\\\"" + getActivityClassPath().replaceCharacter('.', '/') + "\\\"");
+
+ const StringArray& keys = preprocessorDefinitions.getAllKeys();
+
+ for (int i = 0; i < keys.size(); ++i)
+ result.add (String ("\"-D") + keys[i] + String ("=") + preprocessorDefinitions[keys[i]] + "\"");
+ }
+
+ // include paths
+
+ result.add ("\"-I${project.rootDir}/app\".toString()");
+ result.add ("\"-I${ext.juceRootDir}\".toString()");
+ result.add ("\"-I${ext.juceModuleDir}\".toString()");
+
+ {
+ Array cppFiles;
+ const Array& groups = getAllGroups();
+
+ struct Predicate
+ {
+ bool operator() (const Project::Item& projectItem) const { return projectItem.shouldBeAddedToTargetProject(); }
+ };
+
+ for (int i = 0; i < groups.size(); ++i)
+ findAllProjectItemsWithPredicate (groups.getReference (i), cppFiles, Predicate());
+
+ for (int i = 0; i < cppFiles.size(); ++i)
+ {
+ const RelativePath absoluteSourceFile (cppFiles.getReference (i).rebased (getTargetFolder(),
+ project.getProjectFolder(),
+ RelativePath::projectFolder));
+
+ const String absoluteIncludeFolder (sanitisePath (project.getProjectFolder().getFullPathName() + "/"
+ + absoluteSourceFile.toUnixStyle().upToLastOccurrenceOf ("/", false, false)));
+
+ result.addIfNotAlreadyThere ("\"-I" + absoluteIncludeFolder + "\".toString()");
+ }
+ }
+
+ return result;
+ }
+
+ StringArray getLDLibs() const
+ {
+ StringArray result;
+
+ result.add ("android");
+ result.add ("EGL");
+ result.add ("GLESv2");
+ result.add ("log");
+
+ result.addArray (StringArray::fromTokens(getExternalLibrariesString(), ";", ""));
+
+ return result;
+ }
+
+ String createModelDotAndroidNDK (const String& indent) const
+ {
+ String result;
+
+ result << "android.ndk {" << newLine
+ << indent << "moduleName = \"juce_jni\"" << newLine
+ << indent << "stl = \"gnustl_static\"" << newLine
+ << indent << "toolchainVersion = 4.9" << newLine
+ << indent << "ext {" << newLine
+ << indent << indent << "juceRootDir = \"" << "${project.rootDir}/../../../../" << "\".toString()" << newLine
+ << indent << indent << "juceModuleDir = \"" << "${juceRootDir}/modules" << "\".toString()" << newLine
+ << indent << "}" << newLine;
+
+ // CPP flags
+
+ {
+ StringArray cppFlags (getCPPFlags());
+
+ for (int i = 0; i < cppFlags.size(); ++i)
+ result << indent << "cppFlags += " << cppFlags[i] << newLine;
+ }
+
+ // libraries
+
+ {
+ StringArray libraries (getLDLibs());
+
+ result << indent << "ldLibs += [";
+
+ for (int i = 0; i < libraries.size(); ++i)
+ {
+ result << "\"" << libraries[i] << "\"";
+
+ if (i + 1 != libraries.size())
+ result << ", ";
+ }
+
+ result << "]" << newLine;
+ }
+
+ result << "}" << newLine;
+
+ return result;
+ }
+
+ String getGradleCPPFlags (const String& indent, const ConstConfigIterator& config) const
+ {
+ String result;
+ StringArray rootFlags;
+ StringArray ndkFlags;
+
+ if (config->isDebug())
+ {
+ ndkFlags.add ("debuggable = true");
+ ndkFlags.add ("cppFlags += \"-g\"");
+ ndkFlags.add ("cppFlags += \"-DDEBUG=1\"");
+ ndkFlags.add ("cppFlags += \"-D_DEBUG=1\"");
+ }
+ else
+ {
+ rootFlags.add ("minifyEnabled = true");
+ rootFlags.add ("proguardFiles += 'proguard-android-optimize.txt'");
+
+ ndkFlags.add ("cppFlags += \"-DNDEBUG=1\"");
+ }
+
+ {
+ StringArray extraFlags (StringArray::fromTokens (getExtraCompilerFlagsString(), " ", ""));
+
+ for (int i = 0; extraFlags.size(); ++i)
+ ndkFlags.add (String ("cppFlags += \"") + extraFlags[i] + "\"");
+ }
+
+ // there appears to be an issue with build types that have a name other than
+ // "debug" or "release". Apparently this is hard coded in Android Studio ...
+ {
+ const String configName (config->getName());
+
+ if (configName != "Debug" && configName != "Release")
+ throw SaveError ("Build configurations other than Debug and Release are not yet support for Android Studio");
+
+ result << configName.toLowerCase() << " {" << newLine;
+ }
+
+ for (int i = 0; i < rootFlags.size(); ++i)
+ result << indent << rootFlags[i] << newLine;
+
+ result << indent << "ndk.with {" << newLine;
+
+ for (int i = 0; i < ndkFlags.size(); ++i)
+ result << indent << indent << ndkFlags[i] << newLine;
+
+ result << indent << "}" << newLine
+ << "}" << newLine;
+
+ return result;
+ }
+
+ String createModelDotAndroidDotBuildTypes (const String& indent) const
+ {
+ String result;
+
+ result << "android.buildTypes {" << newLine;
+
+ for (ConstConfigIterator config (*this); config.next();)
+ result << CodeHelpers::indent (getGradleCPPFlags (indent, config), indent.length(), true);
+
+ result << "}";
+
+ return result;
+ }
+
+ String createModelDotAndroidDotProductFlavors (const String& indent) const
+ {
+ String result;
+
+ result << "android.productFlavors {" << newLine;
+
+ // TODO! - this needs to be changed so that it generates seperate flags for debug and release ...
+ // at present, it just generates all ABIs for all build types
+
+ StringArray architectures (StringArray::fromTokens (getABIs (true), " ", ""));
+ architectures.mergeArray (StringArray::fromTokens (getABIs (false), " ", ""));
+
+ if (architectures.size() == 0)
+ throw SaveError ("Can't build for no architectures!");
+
+ for (int i = 0; i < architectures.size(); ++i)
+ {
+ String architecture (architectures[i].trim());
+
+ if (architecture.isEmpty())
+ continue;
+
+ result << indent << "create(\"" << architecture << "\") {" << newLine
+ << indent << indent << "ndk.abiFilters += \"" << architecture << "\"" << newLine
+ << indent << "}" << newLine;
+ }
+
+ result << "}" << newLine;
+
+ return result;
+ }
+
+ void writeBuildDotGradleApp (const File& folder) const
+ {
+ MemoryOutputStream memoryOutputStream;
+
+ const String indent = getIndentationString();
+ const String minimumSDKVersion = getMinimumSDKVersionString();
+ const String bundleIdentifier = project.getBundleIdentifier().toString();
+
+ memoryOutputStream << "apply plugin: 'com.android.model.application'" << newLine
+ << newLine
+ << "model {" << newLine
+ << CodeHelpers::indent (createModelDotAndroid (indent, minimumSDKVersion, bundleIdentifier), indent.length(), true)
+ << newLine
+ << CodeHelpers::indent (createModelDotCompileOptions (indent), indent.length(), true)
+ << newLine
+ << CodeHelpers::indent (createModelDotAndroidSources (indent), indent.length(), true)
+ << newLine
+ << CodeHelpers::indent (createModelDotAndroidNDK (indent), indent.length(), true)
+ << newLine
+ << CodeHelpers::indent (createModelDotAndroidDotBuildTypes (indent), indent.length(), true)
+ << newLine
+ << CodeHelpers::indent (createModelDotAndroidDotProductFlavors (indent), indent.length(), true)
+ << "}";
+
+ overwriteFileIfDifferentOrThrow (folder.getChildFile ("app/build.gradle"), memoryOutputStream);
+ }
+
+ static const char* getIndentationString() noexcept
+ {
+ return " ";
+ }
+
+ const File androidStudioExecutable;
+
+ JUCE_DECLARE_NON_COPYABLE (AndroidStudioProjectExporter)
+};
diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp
index a1dacf8b03..0cab1de7f7 100644
--- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp
+++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp
@@ -29,6 +29,7 @@
#include "jucer_ProjectExport_MSVC.h"
#include "jucer_ProjectExport_XCode.h"
#include "jucer_ProjectExport_Android.h"
+#include "jucer_ProjectExport_AndroidStudio.h"
#include "jucer_ProjectExport_CodeBlocks.h"
//==============================================================================
@@ -52,7 +53,8 @@ Array ProjectExporter::getExporterTypes()
addType (types, MSVCProjectExporterVC2008::getName(), BinaryData::projectIconVisualStudio_png, BinaryData::projectIconVisualStudio_pngSize);
addType (types, MSVCProjectExporterVC2005::getName(), BinaryData::projectIconVisualStudio_png, BinaryData::projectIconVisualStudio_pngSize);
addType (types, MakefileProjectExporter::getNameLinux(), BinaryData::projectIconLinuxMakefile_png, BinaryData::projectIconLinuxMakefile_pngSize);
- addType (types, AndroidProjectExporter::getNameAndroid(), BinaryData::projectIconAndroid_png, BinaryData::projectIconAndroid_pngSize);
+ addType (types, AndroidStudioProjectExporter::getName(), BinaryData::projectIconAndroid_png, BinaryData::projectIconAndroid_pngSize);
+ addType (types, AndroidAntProjectExporter::getName(), BinaryData::projectIconAndroid_png, BinaryData::projectIconAndroid_pngSize);
addType (types, CodeBlocksProjectExporter::getNameWindows(), BinaryData::projectIconCodeblocks_png, BinaryData::projectIconCodeblocks_pngSize);
addType (types, CodeBlocksProjectExporter::getNameLinux(), BinaryData::projectIconCodeblocks_png, BinaryData::projectIconCodeblocks_pngSize);
@@ -65,18 +67,19 @@ ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int
switch (index)
{
- case 0: exp = new XCodeProjectExporter (project, ValueTree (XCodeProjectExporter ::getValueTreeTypeName (false)), false); break;
- case 1: exp = new XCodeProjectExporter (project, ValueTree (XCodeProjectExporter ::getValueTreeTypeName (true)), true); break;
- case 2: exp = new MSVCProjectExporterVC2015 (project, ValueTree (MSVCProjectExporterVC2015::getValueTreeTypeName())); break;
- case 3: exp = new MSVCProjectExporterVC2013 (project, ValueTree (MSVCProjectExporterVC2013::getValueTreeTypeName())); break;
- case 4: exp = new MSVCProjectExporterVC2012 (project, ValueTree (MSVCProjectExporterVC2012::getValueTreeTypeName())); break;
- case 5: exp = new MSVCProjectExporterVC2010 (project, ValueTree (MSVCProjectExporterVC2010::getValueTreeTypeName())); break;
- case 6: exp = new MSVCProjectExporterVC2008 (project, ValueTree (MSVCProjectExporterVC2008::getValueTreeTypeName())); break;
- case 7: exp = new MSVCProjectExporterVC2005 (project, ValueTree (MSVCProjectExporterVC2005::getValueTreeTypeName())); break;
- case 8: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter ::getValueTreeTypeName())); break;
- case 9: exp = new AndroidProjectExporter (project, ValueTree (AndroidProjectExporter ::getValueTreeTypeName())); break;
- case 10: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter::getValueTreeTypeName (CodeBlocksProjectExporter::windowsTarget)), CodeBlocksProjectExporter::windowsTarget); break;
- case 11: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter::getValueTreeTypeName (CodeBlocksProjectExporter::linuxTarget)), CodeBlocksProjectExporter::linuxTarget); break;
+ case 0: exp = new XCodeProjectExporter (project, ValueTree (XCodeProjectExporter ::getValueTreeTypeName (false)), false); break;
+ case 1: exp = new XCodeProjectExporter (project, ValueTree (XCodeProjectExporter ::getValueTreeTypeName (true)), true); break;
+ case 2: exp = new MSVCProjectExporterVC2015 (project, ValueTree (MSVCProjectExporterVC2015 ::getValueTreeTypeName())); break;
+ case 3: exp = new MSVCProjectExporterVC2013 (project, ValueTree (MSVCProjectExporterVC2013 ::getValueTreeTypeName())); break;
+ case 4: exp = new MSVCProjectExporterVC2012 (project, ValueTree (MSVCProjectExporterVC2012 ::getValueTreeTypeName())); break;
+ case 5: exp = new MSVCProjectExporterVC2010 (project, ValueTree (MSVCProjectExporterVC2010 ::getValueTreeTypeName())); break;
+ case 6: exp = new MSVCProjectExporterVC2008 (project, ValueTree (MSVCProjectExporterVC2008 ::getValueTreeTypeName())); break;
+ case 7: exp = new MSVCProjectExporterVC2005 (project, ValueTree (MSVCProjectExporterVC2005 ::getValueTreeTypeName())); break;
+ case 8: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter ::getValueTreeTypeName())); break;
+ case 9: exp = new AndroidStudioProjectExporter (project, ValueTree (AndroidStudioProjectExporter ::getValueTreeTypeName())); break;
+ case 10: exp = new AndroidAntProjectExporter (project, ValueTree (AndroidAntProjectExporter ::getValueTreeTypeName())); break;
+ case 11: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::windowsTarget)), CodeBlocksProjectExporter::windowsTarget); break;
+ case 12: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::linuxTarget)), CodeBlocksProjectExporter::linuxTarget); break;
default: jassertfalse; return 0;
}
@@ -117,16 +120,17 @@ ProjectExporter* ProjectExporter::createNewExporter (Project& project, const Str
ProjectExporter* ProjectExporter::createExporter (Project& project, const ValueTree& settings)
{
- ProjectExporter* exp = MSVCProjectExporterVC2005::createForSettings (project, settings);
- if (exp == nullptr) exp = MSVCProjectExporterVC2008::createForSettings (project, settings);
- if (exp == nullptr) exp = MSVCProjectExporterVC2010::createForSettings (project, settings);
- if (exp == nullptr) exp = MSVCProjectExporterVC2012::createForSettings (project, settings);
- if (exp == nullptr) exp = MSVCProjectExporterVC2013::createForSettings (project, settings);
- if (exp == nullptr) exp = MSVCProjectExporterVC2015::createForSettings (project, settings);
- if (exp == nullptr) exp = XCodeProjectExporter ::createForSettings (project, settings);
- if (exp == nullptr) exp = MakefileProjectExporter ::createForSettings (project, settings);
- if (exp == nullptr) exp = AndroidProjectExporter ::createForSettings (project, settings);
- if (exp == nullptr) exp = CodeBlocksProjectExporter::createForSettings (project, settings);
+ ProjectExporter* exp = MSVCProjectExporterVC2005 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MSVCProjectExporterVC2008 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MSVCProjectExporterVC2010 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MSVCProjectExporterVC2012 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MSVCProjectExporterVC2013 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MSVCProjectExporterVC2015 ::createForSettings (project, settings);
+ if (exp == nullptr) exp = XCodeProjectExporter ::createForSettings (project, settings);
+ if (exp == nullptr) exp = MakefileProjectExporter ::createForSettings (project, settings);
+ if (exp == nullptr) exp = AndroidStudioProjectExporter ::createForSettings (project, settings);
+ if (exp == nullptr) exp = AndroidAntProjectExporter ::createForSettings (project, settings);
+ if (exp == nullptr) exp = CodeBlocksProjectExporter ::createForSettings (project, settings);
jassert (exp != nullptr);
return exp;
@@ -152,6 +156,7 @@ bool ProjectExporter::canProjectBeLaunched (Project* project)
// (this doesn't currently launch.. not really sure what it would do on linux)
//MakefileProjectExporter::getValueTreeTypeName(),
#endif
+ AndroidStudioProjectExporter::getValueTreeTypeName(),
nullptr
};
diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h
index b53ee53c8e..8b9d213a13 100644
--- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h
+++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h
@@ -44,6 +44,8 @@ public:
String name;
const void* iconData;
int iconDataSize;
+
+ Image getIcon() const { return ImageCache::getFromMemory (iconData, iconDataSize); }
};
static StringArray getExporterNames();
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
index 684169e9ae..4822bf0bdb 100644
--- a/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
@@ -174,6 +174,7 @@ public:
exportersTree.addListener (this);
}
+ bool isRoot() const override { return true; }
bool isProjectSettings() const override { return true; }
String getRenamingName() const override { return getDisplayName(); }
String getDisplayName() const override { return project.getTitle(); }
@@ -197,25 +198,8 @@ public:
void showPopupMenu() override
{
- PopupMenu menu;
-
- const StringArray exporters (ProjectExporter::getExporterNames());
-
- for (int i = 0; i < exporters.size(); ++i)
- menu.addItem (i + 1, "Create a new " + exporters[i] + " target");
-
- launchPopupMenu (menu);
- }
-
- void handlePopupMenuResult (int resultCode) override
- {
- if (resultCode > 0)
- {
- String exporterName (ProjectExporter::getExporterNames() [resultCode - 1]);
-
- if (exporterName.isNotEmpty())
- project.addNewExporter (exporterName);
- }
+ if (ProjectContentComponent* pcc = getProjectContentComponent())
+ pcc->showNewExporterMenu();
}
bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h
index 916d715dca..03cf750c2f 100644
--- a/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h
@@ -27,12 +27,12 @@ class ExporterItem : public ConfigTreeItemBase
public:
ExporterItem (Project& p, ProjectExporter* e, int index)
: project (p), exporter (e), configListTree (exporter->getConfigurations()),
- exporterIndex (index)
+ exporterIndex (index), icon (createIcon (exporter->getName()))
{
configListTree.addListener (this);
- jassert (exporter != nullptr);
}
+ int getItemHeight() const override { return 22; }
bool canBeSelected() const override { return true; }
bool mightContainSubItems() override { return exporter->getNumConfigurations() > 0; }
String getUniqueName() const override { return "exporter_" + String (exporterIndex); }
@@ -40,9 +40,18 @@ public:
String getDisplayName() const override { return exporter->getName(); }
void setName (const String&) override {}
bool isMissing() override { return false; }
- Icon getIcon() const override { return Icon (getIcons().exporter, getContrastingColour (0.5f)); }
+ Icon getIcon() const override { return Icon(); }
void showDocument() override { showSettingsPage (new SettingsComp (exporter)); }
+ void paintIcon (Graphics& g, Rectangle area) override
+ {
+ g.setColour (Colours::black);
+
+ g.drawImageWithin (icon, area.getX(), area.getY(),
+ area.getWidth(), area.getHeight(),
+ RectanglePlacement::centred, false);
+ }
+
void deleteItem() override
{
if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Exporter",
@@ -122,6 +131,22 @@ private:
ScopedPointer exporter;
ValueTree configListTree;
int exporterIndex;
+ Image icon;
+
+ static Image createIcon (const String& exporterName)
+ {
+ Array types (ProjectExporter::getExporterTypes());
+
+ for (int i = 0; i < types.size(); ++i)
+ {
+ const ProjectExporter::ExporterTypeInfo& type = types.getReference (i);
+
+ if (type.name == exporterName)
+ return type.getIcon();
+ }
+
+ return Image();
+ }
//==============================================================================
class SettingsComp : public Component
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h
index 1a9071b1c0..aa2bacdcd7 100644
--- a/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h
@@ -300,6 +300,7 @@ public:
moduleListTree.addListener (this);
}
+ int getItemHeight() const override { return 22; }
bool isModulesList() const override { return true; }
bool canBeSelected() const override { return true; }
bool mightContainSubItems() override { return true; }
diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h
index c089166a06..04306dbc61 100644
--- a/extras/Introjucer/Source/Project/jucer_Project.h
+++ b/extras/Introjucer/Source/Project/jucer_Project.h
@@ -105,6 +105,7 @@ public:
//==============================================================================
File getGeneratedCodeFolder() const { return getFile().getSiblingFile ("JuceLibraryCode"); }
+ File getSourceFilesFolder() const { return getProjectFolder().getChildFile ("Source"); }
File getLocalModulesFolder() const { return getGeneratedCodeFolder().getChildFile ("modules"); }
File getLocalModuleFolder (const String& moduleID) const { return getLocalModulesFolder().getChildFile (moduleID); }
File getAppIncludeFile() const { return getGeneratedCodeFolder().getChildFile (getJuceSourceHFilename()); }
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
index 37493d6654..fea26157ac 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
+++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
@@ -64,6 +64,11 @@ public:
#if JUCE_MAC || JUCE_WINDOWS
ApplicationCommandManager& commandManager = IntrojucerApp::getCommandManager();
+ addAndMakeVisible (createExporterButton);
+ createExporterButton.setCommandToTrigger (&commandManager, CommandIDs::createNewExporter, true);
+ createExporterButton.setButtonText (commandManager.getNameOfCommand (CommandIDs::createNewExporter));
+ createExporterButton.setColour (TextButton::buttonColourId, Colours::white.withAlpha (0.5f));
+
addAndMakeVisible (openProjectButton);
openProjectButton.setCommandToTrigger (&commandManager, CommandIDs::openInIDE, true);
openProjectButton.setButtonText (commandManager.getNameOfCommand (CommandIDs::openInIDE));
@@ -87,20 +92,32 @@ public:
if (openProjectButton.isVisible())
openProjectButton.setBounds (r.removeFromBottom (30).reduced (16, 4));
+ if (createExporterButton.isVisible())
+ {
+ r.removeFromBottom (10);
+ createExporterButton.setBounds (r.removeFromBottom (30).reduced (16, 4));
+ }
+
tree.setBounds (r);
}
+ static void reselect (TreeViewItem& item)
+ {
+ item.setSelected (false, true);
+ item.setSelected (true, true);
+ }
+
void showProjectSettings()
{
if (ConfigTreeItemTypes::ConfigTreeItemBase* root = dynamic_cast (rootItem.get()))
if (root->isProjectSettings())
- root->setSelected (true, true);
+ reselect (*root);
}
void showModules()
{
if (ConfigTreeItemTypes::ConfigTreeItemBase* mods = getModulesItem())
- mods->setSelected (true, true);
+ reselect (*mods);
}
void showModule (const String& moduleID)
@@ -112,11 +129,11 @@ public:
for (int i = mods->getNumSubItems(); --i >= 0;)
if (ConfigTreeItemTypes::ModuleItem* m = dynamic_cast (mods->getSubItem (i)))
if (m->moduleID == moduleID)
- m->setSelected (true, true);
+ reselect (*m);
}
}
- TextButton openProjectButton, saveAndOpenButton;
+ TextButton createExporterButton, openProjectButton, saveAndOpenButton;
private:
ConfigTreeItemTypes::ConfigTreeItemBase* getModulesItem()
@@ -134,6 +151,12 @@ private:
//==============================================================================
struct LogoComponent : public Component
{
+ LogoComponent()
+ {
+ ScopedPointer svg (XmlDocument::parse (BinaryData::background_logo_svg));
+ logo = Drawable::createFromSVG (*svg);
+ }
+
void paint (Graphics& g)
{
g.setColour (findColour (mainBackgroundColourId).contrasting (0.3f));
@@ -141,11 +164,10 @@ struct LogoComponent : public Component
Rectangle r (getLocalBounds());
g.setFont (15.0f);
- g.drawFittedText (getVersionInfo(), r.removeFromBottom (50), Justification::centred, 3);
+ g.drawFittedText (getVersionInfo(), r.removeFromBottom (50), Justification::centredBottom, 3);
- const Path& logo = getIcons().mainJuceLogo;
- g.fillPath (logo, RectanglePlacement (RectanglePlacement::centred)
- .getTransformToFit (logo.getBounds(), r.toFloat()));
+ logo->drawWithin (g, r.withTrimmedBottom (r.getHeight() / 4).toFloat(),
+ RectanglePlacement (RectanglePlacement::centred), 1.0f);
}
static String getVersionInfo()
@@ -154,6 +176,8 @@ struct LogoComponent : public Component
+ newLine
+ IntrojucerApp::getApp().getVersionDescription();
}
+
+ ScopedPointer logo;
};
//==============================================================================
@@ -618,6 +642,42 @@ void ProjectContentComponent::openInIDE (bool saveFirst)
}
}
+static void newExporterMenuCallback (int result, ProjectContentComponent* comp)
+{
+ if (comp != nullptr && result > 0)
+ {
+ if (Project* p = comp->getProject())
+ {
+ String exporterName (ProjectExporter::getExporterNames() [result - 1]);
+
+ if (exporterName.isNotEmpty())
+ p->addNewExporter (exporterName);
+ }
+ }
+}
+
+void ProjectContentComponent::showNewExporterMenu()
+{
+ if (project != nullptr)
+ {
+ PopupMenu menu;
+
+ menu.addSectionHeader ("Create a new export target:");
+
+ Array exporters (ProjectExporter::getExporterTypes());
+
+ for (int i = 0; i < exporters.size(); ++i)
+ {
+ const ProjectExporter::ExporterTypeInfo& type = exporters.getReference(i);
+
+ menu.addItem (i + 1, type.name, true, false, type.getIcon());
+ }
+
+ menu.showMenuAsync (PopupMenu::Options(),
+ ModalCallbackFunction::forComponent (newExporterMenuCallback, this));
+ }
+}
+
void ProjectContentComponent::deleteSelectedTreeItems()
{
if (TreePanelBase* const tree = dynamic_cast (treeViewTabs.getCurrentContentComponent()))
@@ -695,6 +755,7 @@ void ProjectContentComponent::getAllCommands (Array & commands)
CommandIDs::closeProject,
CommandIDs::openInIDE,
CommandIDs::saveAndOpenInIDE,
+ CommandIDs::createNewExporter,
CommandIDs::showFilePanel,
CommandIDs::showConfigPanel,
CommandIDs::showProjectSettings,
@@ -779,32 +840,29 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica
break;
case CommandIDs::openInIDE:
- #if JUCE_MAC
- result.setInfo ("Open in Xcode...",
- #elif JUCE_WINDOWS
- result.setInfo ("Open in Visual Studio...",
- #else
- result.setInfo ("Open as a Makefile...",
- #endif
+ result.setInfo ("Open in IDE...",
+
"Launches the project in an external IDE",
CommandCategories::general, 0);
result.setActive (ProjectExporter::canProjectBeLaunched (project));
break;
case CommandIDs::saveAndOpenInIDE:
- #if JUCE_MAC
- result.setInfo ("Save Project and Open in Xcode...",
- #elif JUCE_WINDOWS
- result.setInfo ("Save Project and Open in Visual Studio...",
- #else
- result.setInfo ("Save Project and Open as a Makefile...",
- #endif
+ result.setInfo ("Save Project and Open in IDE...",
+
"Saves the project and launches it in an external IDE",
CommandCategories::general, 0);
result.setActive (ProjectExporter::canProjectBeLaunched (project));
result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0));
break;
+ case CommandIDs::createNewExporter:
+ result.setInfo ("Create New Exporter...",
+ "Creates a new exporter for a compiler type",
+ CommandCategories::general, 0);
+ result.setActive (project != nullptr);
+ break;
+
case CommandIDs::showFilePanel:
result.setInfo ("Show File Panel",
"Shows the tree of files for this project",
@@ -901,6 +959,8 @@ bool ProjectContentComponent::perform (const InvocationInfo& info)
case CommandIDs::openInIDE: openInIDE (false); break;
case CommandIDs::saveAndOpenInIDE: openInIDE (true); break;
+ case CommandIDs::createNewExporter: showNewExporterMenu(); break;
+
case CommandIDs::deleteSelectedItem: deleteSelectedTreeItems(); break;
case CommandIDs::showTranslationTool: showTranslationTool(); break;
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
index 2436248480..2d836ae9fb 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
+++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
@@ -73,6 +73,7 @@ public:
void closeProject();
void openInIDE (bool saveFirst);
void openInIDE (int exporterIndex, bool saveFirst);
+ void showNewExporterMenu();
void showFilesTab();
void showConfigTab();
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h
index 9e656985d6..0ac31bf242 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h
+++ b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h
@@ -38,14 +38,12 @@ public:
}
//==============================================================================
- virtual bool isRoot() const { return false; }
-
virtual bool acceptsFileDrop (const StringArray& files) const = 0;
virtual bool acceptsDragItems (const OwnedArray& selectedNodes) = 0;
//==============================================================================
- String getDisplayName() const override { return item.getName(); }
- String getRenamingName() const override { return getDisplayName(); }
+ String getDisplayName() const override { return item.getName(); }
+ String getRenamingName() const override { return getDisplayName(); }
void setName (const String& newName) override
{
@@ -55,10 +53,10 @@ public:
item.getNameValue() = newName;
}
- bool isMissing() override { return isFileMissing; }
- virtual File getFile() const { return item.getFile(); }
+ bool isMissing() override { return isFileMissing; }
+ virtual File getFile() const { return item.getFile(); }
- void deleteItem() override { item.removeItemFromProject(); }
+ void deleteItem() override { item.removeItemFromProject(); }
virtual void deleteAllSelectedItems() override
{
diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp
index a49351f6af..c4bf726b41 100644
--- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp
+++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp
@@ -84,11 +84,6 @@ Font JucerTreeViewBase::getFont() const
return Font (getItemHeight() * 0.6f);
}
-float JucerTreeViewBase::getIconSize() const
-{
- return jmin (getItemHeight() - 4.0f, 18.0f);
-}
-
void JucerTreeViewBase::paintOpenCloseButton (Graphics& g, const Rectangle& area, Colour /*backgroundColour*/, bool isMouseOver)
{
TreeViewItem::paintOpenCloseButton (g, area, getOwnerView()->findColour (mainBackgroundColourId), isMouseOver);
diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h
index 74e2ceb6f5..938e8db1d3 100644
--- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h
+++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h
@@ -37,7 +37,7 @@ public:
~JucerTreeViewBase();
int getItemWidth() const override { return -1; }
- int getItemHeight() const override { return 20; }
+ int getItemHeight() const override { return isRoot() ? 23 : 20; }
void paintOpenCloseButton (Graphics&, const Rectangle& area, Colour backgroundColour, bool isMouseOver) override;
Component* createItemComponent() override;
@@ -48,17 +48,18 @@ public:
void cancelDelayedSelectionTimer();
//==============================================================================
+ virtual bool isRoot() const { return false; }
virtual Font getFont() const;
virtual String getRenamingName() const = 0;
virtual String getDisplayName() const = 0;
virtual void setName (const String& newName) = 0;
virtual bool isMissing() = 0;
virtual Icon getIcon() const = 0;
- virtual float getIconSize() const;
- virtual bool isIconCrossedOut() const { return false; }
+ virtual bool isIconCrossedOut() const { return false; }
+ virtual void paintIcon (Graphics& g, Rectangle area) { getIcon().draw (g, area.reduced (2).toFloat(), isIconCrossedOut()); }
virtual void paintContent (Graphics& g, const Rectangle& area);
- virtual int getMillisecsAllowedForDragGesture() { return 120; };
- virtual File getDraggableFile() const { return File::nonexistent; }
+ virtual int getMillisecsAllowedForDragGesture() { return 120; };
+ virtual File getDraggableFile() const { return File(); }
void refreshSubItems();
virtual void deleteItem();
@@ -206,13 +207,12 @@ public:
void paintIcon (Graphics& g)
{
- item.getIcon().draw (g, Rectangle (4.0f, 2.0f, item.getIconSize(), getHeight() - 4.0f),
- item.isIconCrossedOut());
+ item.paintIcon (g, Rectangle (getHeight(), getHeight()));
}
void resized() override
{
- item.textX = (int) item.getIconSize() + 8;
+ item.textX = getHeight() + 4;
Rectangle r (getLocalBounds());
diff --git a/extras/Introjucer/Source/Wizards/jucer_NewProjectWizardComponent.h b/extras/Introjucer/Source/Wizards/jucer_NewProjectWizardComponent.h
index baf54684f9..98797ed81f 100644
--- a/extras/Introjucer/Source/Wizards/jucer_NewProjectWizardComponent.h
+++ b/extras/Introjucer/Source/Wizards/jucer_NewProjectWizardComponent.h
@@ -139,7 +139,7 @@ public:
for (int i = 0; i < types.size(); ++i)
{
const ProjectExporter::ExporterTypeInfo& type = types.getReference (i);
- platforms.add (new PlatformType (ImageCache::getFromMemory (type.iconData, type.iconDataSize), type.name));
+ platforms.add (new PlatformType (type.getIcon(), type.name));
}
listBox.setRowHeight (35);
diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp
index 87b9fb46f5..de6790e9cb 100644
--- a/modules/juce_core/files/juce_File.cpp
+++ b/modules/juce_core/files/juce_File.cpp
@@ -886,6 +886,41 @@ File File::createTempFile (StringRef fileNameEnding)
return tempFile;
}
+bool File::createSymbolicLink (const File& linkFileToCreate, bool overwriteExisting) const
+{
+ if (linkFileToCreate.exists())
+ {
+ if (! linkFileToCreate.isSymbolicLink())
+ {
+ // user has specified an existing file / directory as the link
+ // this is bad! the user could end up unintentionally destroying data
+ jassertfalse;
+ return false;
+ }
+
+ if (overwriteExisting)
+ linkFileToCreate.deleteFile();
+ }
+
+ #if JUCE_MAC || JUCE_LINUX
+ // one common reason for getting an error here is that the file already exists
+ if (symlink (fullPath.toRawUTF8(), linkFileToCreate.getFullPathName().toRawUTF8()) == -1)
+ {
+ jassertfalse;
+ return false;
+ }
+
+ return true;
+ #elif JUCE_WINDOWS
+ return CreateSymbolicLink (linkFileToCreate.getFullPathName().toWideCharPointer(),
+ fullPath.toWideCharPointer(),
+ isDirectory() ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) != FALSE;
+ #else
+ jassertfalse; // symbolic links not supported on this platform!
+ return false;
+ #endif
+}
+
//==============================================================================
MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode)
: address (nullptr), range (0, file.getSize()), fileHandle (0)
diff --git a/modules/juce_core/files/juce_File.h b/modules/juce_core/files/juce_File.h
index c8e3bbcaab..f54096cc99 100644
--- a/modules/juce_core/files/juce_File.h
+++ b/modules/juce_core/files/juce_File.h
@@ -360,14 +360,6 @@ public:
*/
bool isHidden() const;
- /** Returns true if this file is a link or alias that can be followed using getLinkedTarget(). */
- bool isLink() const;
-
- /** If this file is a link or alias, this returns the file that it points to.
- If the file isn't actually link, it'll just return itself.
- */
- File getLinkedTarget() const;
-
/** Returns a unique identifier for the file, if one is available.
Depending on the OS and file-system, this may be a unix inode number or
@@ -880,7 +872,6 @@ public:
*/
static File createTempFile (StringRef fileNameEnding);
-
//==============================================================================
/** Returns the current working directory.
@see setAsCurrentWorkingDirectory
@@ -946,8 +937,28 @@ public:
/** Adds a separator character to the end of a path if it doesn't already have one. */
static String addTrailingSeparator (const String& path);
- #if JUCE_MAC || JUCE_IOS || DOXYGEN
//==============================================================================
+ /** Tries to create a symbolic link and returns a boolean to indicate success */
+ bool createSymbolicLink (const File& linkFileToCreate, bool overwriteExisting) const;
+
+ /** Returns true if this file is a link or alias that can be followed using getLinkedTarget(). */
+ bool isSymbolicLink() const;
+
+ /** If this file is a link or alias, this returns the file that it points to.
+ If the file isn't actually link, it'll just return itself.
+ */
+ File getLinkedTarget() const;
+
+ #if JUCE_WINDOWS
+ /** Windows ONLY - Creates a win32 .LNK shortcut file that links to this file. */
+ bool createShortcut (const String& description, const File& linkFileToCreate) const;
+
+ /** Windows ONLY - Returns true if this is a win32 .LNK file. */
+ bool isShortcut() const;
+ #endif
+
+ //==============================================================================
+ #if JUCE_MAC || JUCE_IOS || DOXYGEN
/** OSX ONLY - Finds the OSType of a file from the its resources. */
OSType getMacOSType() const;
@@ -960,11 +971,6 @@ public:
void addToDock() const;
#endif
- #if JUCE_WINDOWS
- /** Windows ONLY - Creates a win32 .LNK shortcut file that links to this file. */
- bool createLink (const String& description, const File& linkFileToCreate) const;
- #endif
-
private:
//==============================================================================
String fullPath;
diff --git a/modules/juce_core/native/juce_linux_CommonFile.cpp b/modules/juce_core/native/juce_linux_CommonFile.cpp
index 5f6c93b72c..9f2d3e938d 100644
--- a/modules/juce_core/native/juce_linux_CommonFile.cpp
+++ b/modules/juce_core/native/juce_linux_CommonFile.cpp
@@ -65,7 +65,7 @@ static String getLinkedFile (const String& file)
return String::fromUTF8 (buffer, jmax (0, numBytes));
};
-bool File::isLink() const
+bool File::isSymbolicLink() const
{
return getLinkedFile (getFullPathName()).isNotEmpty();
}
diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm
index dbfcd680fc..3eaa223766 100644
--- a/modules/juce_core/native/juce_mac_Files.mm
+++ b/modules/juce_core/native/juce_mac_Files.mm
@@ -285,7 +285,7 @@ static NSString* getFileLink (const String& path)
#endif
}
-bool File::isLink() const
+bool File::isSymbolicLink() const
{
return getFileLink (fullPath) != nil;
}
@@ -401,7 +401,12 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
{
JUCE_AUTORELEASEPOOL
{
- NSURL* filenameAsURL = [NSURL URLWithString: juceStringToNS (fileName)];
+ NSString* fileNameAsNS (juceStringToNS (fileName));
+
+ NSURL* filenameAsURL ([NSURL URLWithString: fileNameAsNS]);
+
+ if (filenameAsURL == nil)
+ filenameAsURL = [NSURL fileURLWithPath: fileNameAsNS];
#if JUCE_IOS
(void) parameters;
diff --git a/modules/juce_core/native/juce_win32_Files.cpp b/modules/juce_core/native/juce_win32_Files.cpp
index 5408efaeaa..18a1999f5e 100644
--- a/modules/juce_core/native/juce_win32_Files.cpp
+++ b/modules/juce_core/native/juce_win32_Files.cpp
@@ -631,13 +631,45 @@ String File::getVersion() const
}
//==============================================================================
-bool File::isLink() const
+bool File::isSymbolicLink() const
+{
+ return (GetFileAttributes (fullPath.toWideCharPointer()) & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
+}
+
+bool File::isShortcut() const
{
return hasFileExtension (".lnk");
}
File File::getLinkedTarget() const
{
+ {
+ HANDLE h = CreateFile (getFullPathName().toWideCharPointer(),
+ GENERIC_READ, FILE_SHARE_READ, nullptr,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ DWORD requiredSize = ::GetFinalPathNameByHandleW (h, nullptr, 0, FILE_NAME_NORMALIZED);
+
+ if (requiredSize > 0)
+ {
+ HeapBlock buffer (requiredSize + 2);
+ buffer.clear (requiredSize + 2);
+
+ requiredSize = ::GetFinalPathNameByHandleW (h, buffer, requiredSize, FILE_NAME_NORMALIZED);
+
+ if (requiredSize > 0)
+ {
+ CloseHandle (h);
+ return File (String (buffer));
+ }
+ }
+
+ CloseHandle (h);
+ }
+ }
+
File result (*this);
String p (getFullPathName());
@@ -664,7 +696,7 @@ File File::getLinkedTarget() const
return result;
}
-bool File::createLink (const String& description, const File& linkFileToCreate) const
+bool File::createShortcut (const String& description, const File& linkFileToCreate) const
{
linkFileToCreate.deleteFile();
diff --git a/modules/juce_core/text/juce_StringArray.cpp b/modules/juce_core/text/juce_StringArray.cpp
index de6ac3e873..7ccdcb8631 100644
--- a/modules/juce_core/text/juce_StringArray.cpp
+++ b/modules/juce_core/text/juce_StringArray.cpp
@@ -173,6 +173,12 @@ void StringArray::addArray (const StringArray& otherArray, int startIndex, int n
strings.add (otherArray.strings.getReference (startIndex++));
}
+void StringArray::mergeArray (const StringArray& otherArray, const bool ignoreCase)
+{
+ for (int i = 0; i < otherArray.size(); ++i)
+ addIfNotAlreadyThere (otherArray[i], ignoreCase);
+}
+
void StringArray::set (const int index, const String& newString)
{
strings.set (index, newString);
diff --git a/modules/juce_core/text/juce_StringArray.h b/modules/juce_core/text/juce_StringArray.h
index 6136575a1d..a36d64e2c7 100644
--- a/modules/juce_core/text/juce_StringArray.h
+++ b/modules/juce_core/text/juce_StringArray.h
@@ -209,6 +209,15 @@ public:
int startIndex = 0,
int numElementsToAdd = -1);
+ /** Merges the strings from another array into this one.
+ This will not add a string that already exists.
+
+ @param other the array to add
+ @param ignoreCase ignore case when merging
+ */
+ void mergeArray (const StringArray& other,
+ bool ignoreCase = false);
+
/** Breaks up a string into tokens and adds them to this array.
This will tokenise the given string using whitespace characters as the