From 1407f1ddd9aaeff10d973cf9853edf07732922a1 Mon Sep 17 00:00:00 2001 From: jsiegle <jsiegle@mit.edu> Date: Tue, 14 Feb 2012 18:12:42 -0500 Subject: [PATCH] Added Jucer files to the repository --- JuceLibraryCode/jucer/Builds/Linux/Makefile | 224 +++ .../jucer/Builds/MacOSX/Info.plist | 38 + .../The Jucer.xcodeproj/project.pbxproj | 358 ++++ .../Builds/VisualStudio2005/The Jucer.sln | 19 + .../Builds/VisualStudio2005/The Jucer.vcproj | 339 ++++ .../Builds/VisualStudio2008/The Jucer.sln | 19 + .../Builds/VisualStudio2008/The Jucer.vcproj | 339 ++++ .../Builds/VisualStudio2010/The Jucer.sln | 18 + .../Builds/VisualStudio2010/The Jucer.vcxproj | 197 +++ .../The Jucer.vcxproj.filters | 259 +++ .../VisualStudio2010/The Jucer.vcxproj.user | 3 + .../jucer/JuceLibraryCode/AppConfig.h | 39 + .../jucer/JuceLibraryCode/BinaryData.cpp | 1147 ++++++++++++ .../jucer/JuceLibraryCode/BinaryData.h | 52 + .../jucer/JuceLibraryCode/JuceHeader.h | 27 + .../JuceLibraryCode/JuceLibraryCode1.cpp | 15 + .../jucer/JuceLibraryCode/JuceLibraryCode1.mm | 15 + .../JuceLibraryCode/JuceLibraryCode2.cpp | 15 + .../jucer/JuceLibraryCode/JuceLibraryCode2.mm | 15 + .../JuceLibraryCode/JuceLibraryCode3.cpp | 15 + .../jucer/JuceLibraryCode/JuceLibraryCode3.mm | 15 + .../JuceLibraryCode/JuceLibraryCode4.cpp | 15 + .../jucer/JuceLibraryCode/JuceLibraryCode4.mm | 15 + JuceLibraryCode/jucer/Jucer.jucer | 186 ++ .../Source/Application/jucer_Application.h | 506 ++++++ .../Source/Application/jucer_CommandIDs.h | 102 ++ .../Source/Application/jucer_CommonHeaders.h | 52 + .../jucer_DocumentEditorComponent.cpp | 131 ++ .../jucer_DocumentEditorComponent.h | 61 + .../jucer_FilePreviewComponent.cpp | 85 + .../Application/jucer_FilePreviewComponent.h | 56 + .../Source/Application/jucer_JuceUpdater.cpp | 402 +++++ .../Source/Application/jucer_JuceUpdater.h | 77 + .../jucer/Source/Application/jucer_Main.cpp | 28 + .../Source/Application/jucer_MainWindow.cpp | 276 +++ .../Source/Application/jucer_MainWindow.h | 90 + .../Application/jucer_OpenDocumentManager.cpp | 387 ++++ .../Application/jucer_OpenDocumentManager.h | 120 ++ .../BinaryData/AudioPluginXCodeScript.txt | 44 + .../Source/BinaryData/brushed_aluminium.png | Bin 0 -> 14724 bytes .../jucer/Source/BinaryData/juce_icon.png | Bin 0 -> 19826 bytes .../jucer_AudioPluginEditorTemplate.cpp | 35 + .../jucer_AudioPluginEditorTemplate.h | 32 + .../jucer_AudioPluginFilterTemplate.cpp | 177 ++ .../jucer_AudioPluginFilterTemplate.h | 72 + .../jucer_MainConsoleAppTemplate.cpp | 27 + .../Source/BinaryData/jucer_MainTemplate.cpp | 73 + .../BinaryData/jucer_NewCppFileTemplate.cpp | 10 + .../BinaryData/jucer_NewCppFileTemplate.h | 18 + .../BinaryData/jucer_WindowTemplate.cpp | 31 + .../Source/BinaryData/jucer_WindowTemplate.h | 41 + .../Code Editor/jucer_SourceCodeEditor.cpp | 66 + .../Code Editor/jucer_SourceCodeEditor.h | 58 + .../jucer_GroupInformationComponent.cpp | 146 ++ .../Project/jucer_GroupInformationComponent.h | 63 + .../Source/Project/jucer_NewFileWizard.cpp | 184 ++ .../Source/Project/jucer_NewFileWizard.h | 73 + .../Source/Project/jucer_NewProjectWizard.cpp | 495 ++++++ .../Source/Project/jucer_NewProjectWizard.h | 68 + .../jucer/Source/Project/jucer_Project.cpp | 1104 ++++++++++++ .../jucer/Source/Project/jucer_Project.h | 331 ++++ .../Project/jucer_ProjectContentComponent.cpp | 344 ++++ .../Project/jucer_ProjectContentComponent.h | 82 + .../Source/Project/jucer_ProjectExport_MSVC.h | 1556 +++++++++++++++++ .../Source/Project/jucer_ProjectExport_Make.h | 356 ++++ .../Project/jucer_ProjectExport_XCode.h | 1194 +++++++++++++ .../Source/Project/jucer_ProjectExporter.cpp | 214 +++ .../Source/Project/jucer_ProjectExporter.h | 126 ++ .../jucer_ProjectInformationComponent.cpp | 391 +++++ .../jucer_ProjectInformationComponent.h | 77 + .../jucer/Source/Project/jucer_ProjectSaver.h | 543 ++++++ .../Project/jucer_ProjectTreeViewBase.cpp | 482 +++++ .../Project/jucer_ProjectTreeViewBase.h | 116 ++ .../Source/Project/jucer_ResourceFile.cpp | 217 +++ .../jucer/Source/Project/jucer_ResourceFile.h | 68 + .../Source/Project/jucer_TreeViewTypes.cpp | 282 +++ .../Source/Project/jucer_TreeViewTypes.h | 74 + .../Source/Utility/jucer_CodeHelpers.cpp | 487 ++++++ .../jucer/Source/Utility/jucer_CodeHelpers.h | 59 + .../jucer/Source/Utility/jucer_Colours.h | 162 ++ .../Source/Utility/jucer_FileHelpers.cpp | 177 ++ .../jucer/Source/Utility/jucer_FileHelpers.h | 86 + .../Utility/jucer_JucerTreeViewBase.cpp | 153 ++ .../Source/Utility/jucer_JucerTreeViewBase.h | 78 + .../Source/Utility/jucer_MiscUtilities.cpp | 478 +++++ .../Source/Utility/jucer_MiscUtilities.h | 259 +++ .../jucer/Source/Utility/jucer_PresetIDs.h | 118 ++ .../jucer/Source/Utility/jucer_RelativePath.h | 126 ++ .../Source/Utility/jucer_StoredSettings.cpp | 205 +++ .../Source/Utility/jucer_StoredSettings.h | 88 + .../Source/Utility/jucer_ValueSourceHelpers.h | 63 + JuceLibraryCode/jucer/Source/jucer_Headers.h | 38 + 92 files changed, 17604 insertions(+) create mode 100644 JuceLibraryCode/jucer/Builds/Linux/Makefile create mode 100755 JuceLibraryCode/jucer/Builds/MacOSX/Info.plist create mode 100755 JuceLibraryCode/jucer/Builds/MacOSX/The Jucer.xcodeproj/project.pbxproj create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.sln create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.vcproj create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.sln create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.vcproj create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.sln create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.filters create mode 100755 JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.user create mode 100755 JuceLibraryCode/jucer/JuceLibraryCode/AppConfig.h create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.cpp create mode 100755 JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.h create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceHeader.h create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.cpp create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.mm create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.cpp create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.mm create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.cpp create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.mm create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.cpp create mode 100644 JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.mm create mode 100644 JuceLibraryCode/jucer/Jucer.jucer create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_Application.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_CommandIDs.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_CommonHeaders.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_Main.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.h create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.cpp create mode 100755 JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.h create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/AudioPluginXCodeScript.txt create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/brushed_aluminium.png create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/juce_icon.png create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.h create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_MainConsoleAppTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_MainTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.h create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.cpp create mode 100755 JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.h create mode 100755 JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.cpp create mode 100755 JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_Project.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_Project.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_MSVC.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_Make.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_XCode.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectSaver.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.h create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.cpp create mode 100755 JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.cpp create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_Colours.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.cpp create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.cpp create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.cpp create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_PresetIDs.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_RelativePath.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.cpp create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.h create mode 100755 JuceLibraryCode/jucer/Source/Utility/jucer_ValueSourceHelpers.h create mode 100755 JuceLibraryCode/jucer/Source/jucer_Headers.h diff --git a/JuceLibraryCode/jucer/Builds/Linux/Makefile b/JuceLibraryCode/jucer/Builds/Linux/Makefile new file mode 100644 index 000000000..6eff4675f --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/Linux/Makefile @@ -0,0 +1,224 @@ +# Automatically generated makefile, created by the Jucer +# Don't edit this file! Your changes will be overwritten when you re-save the Jucer project! + +ifndef CONFIG + CONFIG=Debug +endif + +ifeq ($(TARGET_ARCH),) + TARGET_ARCH := -march=native +endif + +# (this disables dependency generation if multiple architectures are set) +DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) + +ifeq ($(CONFIG),Debug) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Debug + OUTDIR := build + CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" + CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 + CXXFLAGS += $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L"/usr/X11R6/lib/" -L"../../../../JuceLibraryCode/bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound + LDDEPS := + RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" + TARGET := Jucer + BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) +endif + +ifeq ($(CONFIG),Release) + BINDIR := build + LIBDIR := build + OBJDIR := build/intermediate/Release + OUTDIR := build + CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" + CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 + CXXFLAGS += $(CFLAGS) + LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L"/usr/X11R6/lib/" -L"../../../../JuceLibraryCode/bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound + LDDEPS := + RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" + TARGET := Jucer + BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) +endif + +OBJECTS := \ + $(OBJDIR)/jucer_DocumentEditorComponent_695dff1d.o \ + $(OBJDIR)/jucer_FilePreviewComponent_55512f53.o \ + $(OBJDIR)/jucer_JuceUpdater_cf7865c4.o \ + $(OBJDIR)/jucer_Main_f8488f5b.o \ + $(OBJDIR)/jucer_MainWindow_1e163aeb.o \ + $(OBJDIR)/jucer_OpenDocumentManager_4c72d210.o \ + $(OBJDIR)/jucer_SourceCodeEditor_461f5487.o \ + $(OBJDIR)/jucer_GroupInformationComponent_631ccf01.o \ + $(OBJDIR)/jucer_NewFileWizard_b8a19ef8.o \ + $(OBJDIR)/jucer_NewProjectWizard_7a15bf5d.o \ + $(OBJDIR)/jucer_Project_c131864a.o \ + $(OBJDIR)/jucer_ProjectContentComponent_60de0eee.o \ + $(OBJDIR)/jucer_ProjectExporter_eed6e04b.o \ + $(OBJDIR)/jucer_ProjectInformationComponent_4746e69b.o \ + $(OBJDIR)/jucer_ProjectTreeViewBase_63c2bdbe.o \ + $(OBJDIR)/jucer_ResourceFile_7e7734e3.o \ + $(OBJDIR)/jucer_TreeViewTypes_4a765287.o \ + $(OBJDIR)/jucer_CodeHelpers_c317179c.o \ + $(OBJDIR)/jucer_FileHelpers_f98ed0ad.o \ + $(OBJDIR)/jucer_JucerTreeViewBase_d043309d.o \ + $(OBJDIR)/jucer_MiscUtilities_25b68c82.o \ + $(OBJDIR)/jucer_StoredSettings_26078d2c.o \ + $(OBJDIR)/BinaryData_ce4232d4.o \ + $(OBJDIR)/JuceLibraryCode1_682c927f.o \ + $(OBJDIR)/JuceLibraryCode2_683aaa00.o \ + $(OBJDIR)/JuceLibraryCode3_6848c181.o \ + $(OBJDIR)/JuceLibraryCode4_6856d902.o \ + +.PHONY: clean + +$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) + @echo Linking The Jucer + -@mkdir -p $(BINDIR) + -@mkdir -p $(LIBDIR) + -@mkdir -p $(OUTDIR) + @$(BLDCMD) + +clean: + @echo Cleaning The Jucer + -@rm -f $(OUTDIR)/$(TARGET) + -@rm -rf $(OBJDIR)/* + -@rm -rf $(OBJDIR) + +$(OBJDIR)/jucer_DocumentEditorComponent_695dff1d.o: ../../Source/Application/jucer_DocumentEditorComponent.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_DocumentEditorComponent.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_FilePreviewComponent_55512f53.o: ../../Source/Application/jucer_FilePreviewComponent.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_FilePreviewComponent.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_JuceUpdater_cf7865c4.o: ../../Source/Application/jucer_JuceUpdater.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_JuceUpdater.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_Main_f8488f5b.o: ../../Source/Application/jucer_Main.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_Main.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_MainWindow_1e163aeb.o: ../../Source/Application/jucer_MainWindow.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_MainWindow.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_OpenDocumentManager_4c72d210.o: ../../Source/Application/jucer_OpenDocumentManager.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_OpenDocumentManager.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_SourceCodeEditor_461f5487.o: ../../Source/Code\ Editor/jucer_SourceCodeEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_SourceCodeEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_GroupInformationComponent_631ccf01.o: ../../Source/Project/jucer_GroupInformationComponent.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_GroupInformationComponent.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_NewFileWizard_b8a19ef8.o: ../../Source/Project/jucer_NewFileWizard.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_NewFileWizard.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_NewProjectWizard_7a15bf5d.o: ../../Source/Project/jucer_NewProjectWizard.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_NewProjectWizard.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_Project_c131864a.o: ../../Source/Project/jucer_Project.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_Project.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_ProjectContentComponent_60de0eee.o: ../../Source/Project/jucer_ProjectContentComponent.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_ProjectContentComponent.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_ProjectExporter_eed6e04b.o: ../../Source/Project/jucer_ProjectExporter.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_ProjectExporter.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_ProjectInformationComponent_4746e69b.o: ../../Source/Project/jucer_ProjectInformationComponent.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_ProjectInformationComponent.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_ProjectTreeViewBase_63c2bdbe.o: ../../Source/Project/jucer_ProjectTreeViewBase.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_ProjectTreeViewBase.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_ResourceFile_7e7734e3.o: ../../Source/Project/jucer_ResourceFile.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_ResourceFile.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_TreeViewTypes_4a765287.o: ../../Source/Project/jucer_TreeViewTypes.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_TreeViewTypes.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_CodeHelpers_c317179c.o: ../../Source/Utility/jucer_CodeHelpers.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_CodeHelpers.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_FileHelpers_f98ed0ad.o: ../../Source/Utility/jucer_FileHelpers.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_FileHelpers.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_JucerTreeViewBase_d043309d.o: ../../Source/Utility/jucer_JucerTreeViewBase.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_JucerTreeViewBase.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_MiscUtilities_25b68c82.o: ../../Source/Utility/jucer_MiscUtilities.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_MiscUtilities.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/jucer_StoredSettings_26078d2c.o: ../../Source/Utility/jucer_StoredSettings.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_StoredSettings.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/BinaryData_ce4232d4.o: ../../JuceLibraryCode/BinaryData.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling BinaryData.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/JuceLibraryCode1_682c927f.o: ../../JuceLibraryCode/JuceLibraryCode1.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling JuceLibraryCode1.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/JuceLibraryCode2_683aaa00.o: ../../JuceLibraryCode/JuceLibraryCode2.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling JuceLibraryCode2.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/JuceLibraryCode3_6848c181.o: ../../JuceLibraryCode/JuceLibraryCode3.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling JuceLibraryCode3.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/JuceLibraryCode4_6856d902.o: ../../JuceLibraryCode/JuceLibraryCode4.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling JuceLibraryCode4.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +-include $(OBJECTS:%.o=%.d) diff --git a/JuceLibraryCode/jucer/Builds/MacOSX/Info.plist b/JuceLibraryCode/jucer/Builds/MacOSX/Info.plist new file mode 100755 index 000000000..ca981917c --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/MacOSX/Info.plist @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist> + <dict> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.rawmaterialsoftware.thejucer</string> + <key>CFBundleName</key> + <string>The Jucer</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleShortVersionString</key> + <string>3.0.0</string> + <key>CFBundleVersion</key> + <string>3.0.0</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>jucer</string> + </array> + <key>CFBundleTypeName</key> + <string>jucer</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>NSPersistentStoreTypeKey</key> + <string>XML</string> + </dict> + </array> + </dict> +</plist> diff --git a/JuceLibraryCode/jucer/Builds/MacOSX/The Jucer.xcodeproj/project.pbxproj b/JuceLibraryCode/jucer/Builds/MacOSX/The Jucer.xcodeproj/project.pbxproj new file mode 100755 index 000000000..7ad0cca98 --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/MacOSX/The Jucer.xcodeproj/project.pbxproj @@ -0,0 +1,358 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + + 7BDFF9F0E16DF33A980F46DC = { isa = PBXBuildFile; fileRef = 046FA2877C08618339161EE2; }; + B703C44375C75E5AB099E74A = { isa = PBXBuildFile; fileRef = 43A5218D223AA21E0A55D986; }; + 022036CBB0FBE47C417A6222 = { isa = PBXBuildFile; fileRef = 151135F18422E2B1368D7BC2; }; + 52A4EFC1F732A9D5BBB61AF5 = { isa = PBXBuildFile; fileRef = B36C44190E6AEEBFA3DB3046; }; + C65112B26E0BB0BB8DBD3F3C = { isa = PBXBuildFile; fileRef = FB3773F08466794F949B0AFF; }; + E63745F5956C698352A2ACA0 = { isa = PBXBuildFile; fileRef = 74125C6A6DE28C538A518C3C; }; + 2C3270317859BA6DF8EC1458 = { isa = PBXBuildFile; fileRef = A5A4B15B9F5C3D32C82DFDC6; }; + AA7B50F22523465B07D4A25B = { isa = PBXBuildFile; fileRef = 6E1144678BD61868D73EF1FB; }; + DBE3CE9482B19CF1AE700805 = { isa = PBXBuildFile; fileRef = 23CF69B4C644D1E6E61E5C82; }; + 93C9F3F27602A33DDC9C2250 = { isa = PBXBuildFile; fileRef = 2767E1D082874D301D5D5F43; }; + 2E6836738CE7EB452FDC7E9A = { isa = PBXBuildFile; fileRef = D9FB1A5365FEEB854A0FF7BF; }; + D6D0659F3F3504012246F13D = { isa = PBXBuildFile; fileRef = AA3CBE4A2AC3E9411426F630; }; + 8BAE4D8EA7F247DA0A4D3A5C = { isa = PBXBuildFile; fileRef = F617CE0630ADB0628A34D6BF; }; + 280FE650B3F02AD9E821EA37 = { isa = PBXBuildFile; fileRef = 832701705EC0EC9484F9D9C2; }; + 9950893AA82F86F1EEE55BED = { isa = PBXBuildFile; fileRef = D77EAC704C96F798B1C69A0D; }; + C2F198C7058FC1A88A600645 = { isa = PBXBuildFile; fileRef = B06694E3C7EB89E3DDEFCBD0; }; + A7C05B907BBCB4288FBC6428 = { isa = PBXBuildFile; fileRef = 194F6B951CBC3E8F897FB646; }; + 6B48E4B12BB56C2254F293DF = { isa = PBXBuildFile; fileRef = ABDE2EC87B925F50BA071DB2; }; + 7A7859C8F2DFDC8D80FE0F0E = { isa = PBXBuildFile; fileRef = 1B88189689F13B2A9FAEC6C8; }; + 5BD727176204D71F2E0F42CC = { isa = PBXBuildFile; fileRef = 5789E1F7A30240B839EF936D; }; + DA3D1949878344EAE971E9CF = { isa = PBXBuildFile; fileRef = 7FF9D1A9157D58AEC555D558; }; + 086FC650CA4A39161F5DC34A = { isa = PBXBuildFile; fileRef = 1D7AE967F4874BD12DFB964D; }; + 7192D99BD62492851CC34B39 = { isa = PBXBuildFile; fileRef = 8E44AB32AEDABC7E1D3FC49F; }; + 379C4FA4F9F4F856A245D8F1 = { isa = PBXBuildFile; fileRef = 296E0498784BF03FA18B164B; }; + A70571C45ECEB18061181367 = { isa = PBXBuildFile; fileRef = 6746790735D492AB157E5F26; }; + 7B65A9D3D6D5798649D90FA0 = { isa = PBXBuildFile; fileRef = EB49FFAB3424D162D2105B2D; }; + 85572197E35546BB69861758 = { isa = PBXBuildFile; fileRef = 41C18D8743BCACB15D27EE21; }; + 0E22757B983B4F600F1B7916 = { isa = PBXBuildFile; fileRef = 7D678D4FD5505D7FCE7DCC7F; }; + 1501CEE9D0FD3C1185F6413B = { isa = PBXBuildFile; fileRef = 169DB589B861F57CDF896A02; }; + FF1962A57973208A90330B3C = { isa = PBXBuildFile; fileRef = F3EFF63CFFCCA76AF4968B4C; }; + E2DFFAAE26E2D87AE3CE3136 = { isa = PBXBuildFile; fileRef = 70EEB7CC13CCB14848F9058D; }; + 0F780301B225C3022C346CD4 = { isa = PBXBuildFile; fileRef = 95587D99F55802DE5AA2EE5D; }; + 59B173809CEC75EC0C74D1CF = { isa = PBXBuildFile; fileRef = 62DCA8C33F575DDA296DC682; }; + 69CA42E334E4BA09E4FE8B65 = { isa = PBXBuildFile; fileRef = D02830A908A07FD46F7387DA; }; + 0C3A85F58C34FA91D16664EB = { isa = PBXBuildFile; fileRef = 933DADF4F3906510EA714CC0; }; + 08C0959668FFC1A90B4BA8E6 = { isa = PBXBuildFile; fileRef = DD6476FF0F8BE833CD54C01F; }; + 1457A52734BA97A13610ECF1 = { isa = PBXBuildFile; fileRef = 268B4FFB1C675B679138545F; }; + 20EDB5C810855EB960F520FC = { isa = PBXBuildFile; fileRef = 60A217F62952DE8A752BD79F; }; + 046FA2877C08618339161EE2 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 43A5218D223AA21E0A55D986 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 151135F18422E2B1368D7BC2 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + B36C44190E6AEEBFA3DB3046 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + FB3773F08466794F949B0AFF = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; + 74125C6A6DE28C538A518C3C = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + A5A4B15B9F5C3D32C82DFDC6 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; + 6E1144678BD61868D73EF1FB = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 23CF69B4C644D1E6E61E5C82 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 2767E1D082874D301D5D5F43 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; + D9FB1A5365FEEB854A0FF7BF = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 12E1601866B3489844AFD645 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Jucer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F4C5CF1AA7EB9298043D89D3 = { isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = SOURCE_ROOT; }; + 2CB488FB81118B62A06AA82B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Application.h; path = ../../Source/Application/jucer_Application.h; sourceTree = SOURCE_ROOT; }; + 6B373B89AA84EBE5964C7452 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommandIDs.h; path = ../../Source/Application/jucer_CommandIDs.h; sourceTree = SOURCE_ROOT; }; + D759DE26060A86B38AECF753 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommonHeaders.h; path = ../../Source/Application/jucer_CommonHeaders.h; sourceTree = SOURCE_ROOT; }; + AA3CBE4A2AC3E9411426F630 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_DocumentEditorComponent.cpp; path = ../../Source/Application/jucer_DocumentEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; + 16551C20AF0BE36C0BFC6E96 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_DocumentEditorComponent.h; path = ../../Source/Application/jucer_DocumentEditorComponent.h; sourceTree = SOURCE_ROOT; }; + F617CE0630ADB0628A34D6BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_FilePreviewComponent.cpp; path = ../../Source/Application/jucer_FilePreviewComponent.cpp; sourceTree = SOURCE_ROOT; }; + 330CB15608DEAF19D28C18DD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FilePreviewComponent.h; path = ../../Source/Application/jucer_FilePreviewComponent.h; sourceTree = SOURCE_ROOT; }; + 0CA0CCCEBFA0AC8C577FC915 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Headers.h; path = ../../Source/jucer_Headers.h; sourceTree = SOURCE_ROOT; }; + 832701705EC0EC9484F9D9C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_JuceUpdater.cpp; path = ../../Source/Application/jucer_JuceUpdater.cpp; sourceTree = SOURCE_ROOT; }; + AFC2F9A887CDBF7A0051CD09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_JuceUpdater.h; path = ../../Source/Application/jucer_JuceUpdater.h; sourceTree = SOURCE_ROOT; }; + D77EAC704C96F798B1C69A0D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_Main.cpp; path = ../../Source/Application/jucer_Main.cpp; sourceTree = SOURCE_ROOT; }; + B06694E3C7EB89E3DDEFCBD0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MainWindow.cpp; path = ../../Source/Application/jucer_MainWindow.cpp; sourceTree = SOURCE_ROOT; }; + 24378294003DC2D038D0534D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MainWindow.h; path = ../../Source/Application/jucer_MainWindow.h; sourceTree = SOURCE_ROOT; }; + 194F6B951CBC3E8F897FB646 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_OpenDocumentManager.cpp; path = ../../Source/Application/jucer_OpenDocumentManager.cpp; sourceTree = SOURCE_ROOT; }; + CC2337E5F0207DA53F021F9F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_OpenDocumentManager.h; path = ../../Source/Application/jucer_OpenDocumentManager.h; sourceTree = SOURCE_ROOT; }; + ABDE2EC87B925F50BA071DB2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_SourceCodeEditor.cpp; path = "../../Source/Code Editor/jucer_SourceCodeEditor.cpp"; sourceTree = SOURCE_ROOT; }; + DDBF5BEEBBD9314DDF866F29 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_SourceCodeEditor.h; path = "../../Source/Code Editor/jucer_SourceCodeEditor.h"; sourceTree = SOURCE_ROOT; }; + 1B88189689F13B2A9FAEC6C8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_GroupInformationComponent.cpp; path = ../../Source/Project/jucer_GroupInformationComponent.cpp; sourceTree = SOURCE_ROOT; }; + 9B3084628EA1494464E99F5C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_GroupInformationComponent.h; path = ../../Source/Project/jucer_GroupInformationComponent.h; sourceTree = SOURCE_ROOT; }; + 5789E1F7A30240B839EF936D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_NewFileWizard.cpp; path = ../../Source/Project/jucer_NewFileWizard.cpp; sourceTree = SOURCE_ROOT; }; + 0685E1C942E1D2447CADB783 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_NewFileWizard.h; path = ../../Source/Project/jucer_NewFileWizard.h; sourceTree = SOURCE_ROOT; }; + 7FF9D1A9157D58AEC555D558 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_NewProjectWizard.cpp; path = ../../Source/Project/jucer_NewProjectWizard.cpp; sourceTree = SOURCE_ROOT; }; + 7ACDFA50C230966293626A74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_NewProjectWizard.h; path = ../../Source/Project/jucer_NewProjectWizard.h; sourceTree = SOURCE_ROOT; }; + 1D7AE967F4874BD12DFB964D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_Project.cpp; path = ../../Source/Project/jucer_Project.cpp; sourceTree = SOURCE_ROOT; }; + 8CD4ABA478205AA127FB9BE1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Project.h; path = ../../Source/Project/jucer_Project.h; sourceTree = SOURCE_ROOT; }; + 8E44AB32AEDABC7E1D3FC49F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectContentComponent.cpp; path = ../../Source/Project/jucer_ProjectContentComponent.cpp; sourceTree = SOURCE_ROOT; }; + F2F98DA41146390D05A44EAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectContentComponent.h; path = ../../Source/Project/jucer_ProjectContentComponent.h; sourceTree = SOURCE_ROOT; }; + 296E0498784BF03FA18B164B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectExporter.cpp; path = ../../Source/Project/jucer_ProjectExporter.cpp; sourceTree = SOURCE_ROOT; }; + 5DE419991013E7C0F203E99F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExporter.h; path = ../../Source/Project/jucer_ProjectExporter.h; sourceTree = SOURCE_ROOT; }; + 889715B0152919B2EAA1F5F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_Make.h; path = ../../Source/Project/jucer_ProjectExport_Make.h; sourceTree = SOURCE_ROOT; }; + 907F302BB89308CDB2C5FD0E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_MSVC.h; path = ../../Source/Project/jucer_ProjectExport_MSVC.h; sourceTree = SOURCE_ROOT; }; + D250274734D729D2E0389A20 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_XCode.h; path = ../../Source/Project/jucer_ProjectExport_XCode.h; sourceTree = SOURCE_ROOT; }; + 6746790735D492AB157E5F26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectInformationComponent.cpp; path = ../../Source/Project/jucer_ProjectInformationComponent.cpp; sourceTree = SOURCE_ROOT; }; + 4727C2C16D17BE642A3F5838 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectInformationComponent.h; path = ../../Source/Project/jucer_ProjectInformationComponent.h; sourceTree = SOURCE_ROOT; }; + ADF962F14A1FCBB05B499E6C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectSaver.h; path = ../../Source/Project/jucer_ProjectSaver.h; sourceTree = SOURCE_ROOT; }; + EB49FFAB3424D162D2105B2D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectTreeViewBase.cpp; path = ../../Source/Project/jucer_ProjectTreeViewBase.cpp; sourceTree = SOURCE_ROOT; }; + 27D0B6991943D6AD88E42FE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectTreeViewBase.h; path = ../../Source/Project/jucer_ProjectTreeViewBase.h; sourceTree = SOURCE_ROOT; }; + 41C18D8743BCACB15D27EE21 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ResourceFile.cpp; path = ../../Source/Project/jucer_ResourceFile.cpp; sourceTree = SOURCE_ROOT; }; + 05564317BD19EBC8416976DD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ResourceFile.h; path = ../../Source/Project/jucer_ResourceFile.h; sourceTree = SOURCE_ROOT; }; + 7D678D4FD5505D7FCE7DCC7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_TreeViewTypes.cpp; path = ../../Source/Project/jucer_TreeViewTypes.cpp; sourceTree = SOURCE_ROOT; }; + 9B52E45930E312EAEB0BD7EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_TreeViewTypes.h; path = ../../Source/Project/jucer_TreeViewTypes.h; sourceTree = SOURCE_ROOT; }; + 169DB589B861F57CDF896A02 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_CodeHelpers.cpp; path = ../../Source/Utility/jucer_CodeHelpers.cpp; sourceTree = SOURCE_ROOT; }; + 39F23D96AE478A6415104D1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CodeHelpers.h; path = ../../Source/Utility/jucer_CodeHelpers.h; sourceTree = SOURCE_ROOT; }; + 54BAA8A58EF125AEF05BC8F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Colours.h; path = ../../Source/Utility/jucer_Colours.h; sourceTree = SOURCE_ROOT; }; + F3EFF63CFFCCA76AF4968B4C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_FileHelpers.cpp; path = ../../Source/Utility/jucer_FileHelpers.cpp; sourceTree = SOURCE_ROOT; }; + D5825A552212550315F68745 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FileHelpers.h; path = ../../Source/Utility/jucer_FileHelpers.h; sourceTree = SOURCE_ROOT; }; + 70EEB7CC13CCB14848F9058D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_JucerTreeViewBase.cpp; path = ../../Source/Utility/jucer_JucerTreeViewBase.cpp; sourceTree = SOURCE_ROOT; }; + F09282899E26D5AECB15FCD1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_JucerTreeViewBase.h; path = ../../Source/Utility/jucer_JucerTreeViewBase.h; sourceTree = SOURCE_ROOT; }; + 95587D99F55802DE5AA2EE5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MiscUtilities.cpp; path = ../../Source/Utility/jucer_MiscUtilities.cpp; sourceTree = SOURCE_ROOT; }; + C9D7F4B7778274154DB6F172 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MiscUtilities.h; path = ../../Source/Utility/jucer_MiscUtilities.h; sourceTree = SOURCE_ROOT; }; + 6B90D9A6BD4332FB3F2F642B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_PresetIDs.h; path = ../../Source/Utility/jucer_PresetIDs.h; sourceTree = SOURCE_ROOT; }; + D8A7CD36545F7361B078939D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_RelativePath.h; path = ../../Source/Utility/jucer_RelativePath.h; sourceTree = SOURCE_ROOT; }; + 62DCA8C33F575DDA296DC682 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_StoredSettings.cpp; path = ../../Source/Utility/jucer_StoredSettings.cpp; sourceTree = SOURCE_ROOT; }; + 66AB2C4A43AC1C473C3694D0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_StoredSettings.h; path = ../../Source/Utility/jucer_StoredSettings.h; sourceTree = SOURCE_ROOT; }; + EAFDFAC2EE4670D18E0D35FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ValueSourceHelpers.h; path = ../../Source/Utility/jucer_ValueSourceHelpers.h; sourceTree = SOURCE_ROOT; }; + 8EDEE4F2A25D08F06768BAB3 = { isa = PBXFileReference; lastKnownFileType = text.txt; name = AudioPluginXCodeScript.txt; path = ../../Source/BinaryData/AudioPluginXCodeScript.txt; sourceTree = SOURCE_ROOT; }; + 4872570002B53A0B1B1152A2 = { isa = PBXFileReference; lastKnownFileType = image.png; name = brushed_aluminium.png; path = ../../Source/BinaryData/brushed_aluminium.png; sourceTree = SOURCE_ROOT; }; + 5927BCB4F87ABEAF17A4C81A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginEditorTemplate.cpp; path = ../../Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp; sourceTree = SOURCE_ROOT; }; + C48BBF375EA50F69E0CFE858 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginEditorTemplate.h; path = ../../Source/BinaryData/jucer_AudioPluginEditorTemplate.h; sourceTree = SOURCE_ROOT; }; + 76FF5CCA95D7A1EE97B3A44F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginFilterTemplate.cpp; path = ../../Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp; sourceTree = SOURCE_ROOT; }; + 20C0F2CB6B03852C1141DAED = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginFilterTemplate.h; path = ../../Source/BinaryData/jucer_AudioPluginFilterTemplate.h; sourceTree = SOURCE_ROOT; }; + 3B6D17F807BC5134D6A1867A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MainConsoleAppTemplate.cpp; path = ../../Source/BinaryData/jucer_MainConsoleAppTemplate.cpp; sourceTree = SOURCE_ROOT; }; + 573797C31A561745B6CD1833 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MainTemplate.cpp; path = ../../Source/BinaryData/jucer_MainTemplate.cpp; sourceTree = SOURCE_ROOT; }; + 80F03F2D4AB3387283A65A0B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_NewCppFileTemplate.cpp; path = ../../Source/BinaryData/jucer_NewCppFileTemplate.cpp; sourceTree = SOURCE_ROOT; }; + FC705812CC19B07DEDA6EBF2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_NewCppFileTemplate.h; path = ../../Source/BinaryData/jucer_NewCppFileTemplate.h; sourceTree = SOURCE_ROOT; }; + B4F88060202011416CB3278B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_WindowTemplate.cpp; path = ../../Source/BinaryData/jucer_WindowTemplate.cpp; sourceTree = SOURCE_ROOT; }; + 1C26D9DA0B2D0FF8F2CEC721 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_WindowTemplate.h; path = ../../Source/BinaryData/jucer_WindowTemplate.h; sourceTree = SOURCE_ROOT; }; + 31B5EB3CEA43BE4B473DCC85 = { isa = PBXFileReference; lastKnownFileType = image.png; name = juce_icon.png; path = ../../Source/BinaryData/juce_icon.png; sourceTree = SOURCE_ROOT; }; + C86084A495B96EA215958914 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = SOURCE_ROOT; }; + 8FEC5B519774920289A1FD73 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; + D02830A908A07FD46F7387DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; + A6A79D303B85B7C9D673ECD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = SOURCE_ROOT; }; + 933DADF4F3906510EA714CC0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = JuceLibraryCode1.mm; path = ../../JuceLibraryCode/JuceLibraryCode1.mm; sourceTree = SOURCE_ROOT; }; + DD6476FF0F8BE833CD54C01F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = JuceLibraryCode2.mm; path = ../../JuceLibraryCode/JuceLibraryCode2.mm; sourceTree = SOURCE_ROOT; }; + 268B4FFB1C675B679138545F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = JuceLibraryCode3.mm; path = ../../JuceLibraryCode/JuceLibraryCode3.mm; sourceTree = SOURCE_ROOT; }; + 60A217F62952DE8A752BD79F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = JuceLibraryCode4.mm; path = ../../JuceLibraryCode/JuceLibraryCode4.mm; sourceTree = SOURCE_ROOT; }; + 65EDE353CFC4C222043C80AB = { isa = PBXGroup; children = ( + 2CB488FB81118B62A06AA82B, + 6B373B89AA84EBE5964C7452, + D759DE26060A86B38AECF753, + AA3CBE4A2AC3E9411426F630, + 16551C20AF0BE36C0BFC6E96, + F617CE0630ADB0628A34D6BF, + 330CB15608DEAF19D28C18DD, + 0CA0CCCEBFA0AC8C577FC915, + 832701705EC0EC9484F9D9C2, + AFC2F9A887CDBF7A0051CD09, + D77EAC704C96F798B1C69A0D, + B06694E3C7EB89E3DDEFCBD0, + 24378294003DC2D038D0534D, + 194F6B951CBC3E8F897FB646, + CC2337E5F0207DA53F021F9F ); name = Application; sourceTree = "<group>"; }; + 644797EB12AAB2529ED6786E = { isa = PBXGroup; children = ( + ABDE2EC87B925F50BA071DB2, + DDBF5BEEBBD9314DDF866F29 ); name = "Code Editor"; sourceTree = "<group>"; }; + 38883F6AABCF4D47FC02B11F = { isa = PBXGroup; children = ( + 1B88189689F13B2A9FAEC6C8, + 9B3084628EA1494464E99F5C, + 5789E1F7A30240B839EF936D, + 0685E1C942E1D2447CADB783, + 7FF9D1A9157D58AEC555D558, + 7ACDFA50C230966293626A74, + 1D7AE967F4874BD12DFB964D, + 8CD4ABA478205AA127FB9BE1, + 8E44AB32AEDABC7E1D3FC49F, + F2F98DA41146390D05A44EAD, + 296E0498784BF03FA18B164B, + 5DE419991013E7C0F203E99F, + 889715B0152919B2EAA1F5F9, + 907F302BB89308CDB2C5FD0E, + D250274734D729D2E0389A20, + 6746790735D492AB157E5F26, + 4727C2C16D17BE642A3F5838, + ADF962F14A1FCBB05B499E6C, + EB49FFAB3424D162D2105B2D, + 27D0B6991943D6AD88E42FE5, + 41C18D8743BCACB15D27EE21, + 05564317BD19EBC8416976DD, + 7D678D4FD5505D7FCE7DCC7F, + 9B52E45930E312EAEB0BD7EC ); name = Project; sourceTree = "<group>"; }; + EB77B261C62447EE22D136DD = { isa = PBXGroup; children = ( + 169DB589B861F57CDF896A02, + 39F23D96AE478A6415104D1E, + 54BAA8A58EF125AEF05BC8F4, + F3EFF63CFFCCA76AF4968B4C, + D5825A552212550315F68745, + 70EEB7CC13CCB14848F9058D, + F09282899E26D5AECB15FCD1, + 95587D99F55802DE5AA2EE5D, + C9D7F4B7778274154DB6F172, + 6B90D9A6BD4332FB3F2F642B, + D8A7CD36545F7361B078939D, + 62DCA8C33F575DDA296DC682, + 66AB2C4A43AC1C473C3694D0, + EAFDFAC2EE4670D18E0D35FA ); name = Utility; sourceTree = "<group>"; }; + 2436CB32D02E7E3293665601 = { isa = PBXGroup; children = ( + 8EDEE4F2A25D08F06768BAB3, + 4872570002B53A0B1B1152A2, + 5927BCB4F87ABEAF17A4C81A, + C48BBF375EA50F69E0CFE858, + 76FF5CCA95D7A1EE97B3A44F, + 20C0F2CB6B03852C1141DAED, + 3B6D17F807BC5134D6A1867A, + 573797C31A561745B6CD1833, + 80F03F2D4AB3387283A65A0B, + FC705812CC19B07DEDA6EBF2, + B4F88060202011416CB3278B, + 1C26D9DA0B2D0FF8F2CEC721, + 31B5EB3CEA43BE4B473DCC85 ); name = BinaryData; sourceTree = "<group>"; }; + 265749F75DBA86EC3F19FE34 = { isa = PBXGroup; children = ( + C86084A495B96EA215958914, + 8FEC5B519774920289A1FD73, + D02830A908A07FD46F7387DA, + A6A79D303B85B7C9D673ECD5, + 933DADF4F3906510EA714CC0, + DD6476FF0F8BE833CD54C01F, + 268B4FFB1C675B679138545F, + 60A217F62952DE8A752BD79F ); name = "Juce Library Code"; sourceTree = "<group>"; }; + EAC5B9DBB227CB2A002EF355 = { isa = PBXGroup; children = ( + F4C5CF1AA7EB9298043D89D3 ); name = Resources; sourceTree = "<group>"; }; + 0D737FA088906E13707BAEB7 = { isa = PBXGroup; children = ( + 046FA2877C08618339161EE2, + 43A5218D223AA21E0A55D986, + 151135F18422E2B1368D7BC2, + B36C44190E6AEEBFA3DB3046, + FB3773F08466794F949B0AFF, + 74125C6A6DE28C538A518C3C, + A5A4B15B9F5C3D32C82DFDC6, + 6E1144678BD61868D73EF1FB, + 23CF69B4C644D1E6E61E5C82, + 2767E1D082874D301D5D5F43, + D9FB1A5365FEEB854A0FF7BF ); name = Frameworks; sourceTree = "<group>"; }; + 18794C3CE7D0C95A5A70F213 = { isa = PBXGroup; children = ( + 12E1601866B3489844AFD645 ); name = Products; sourceTree = "<group>"; }; + B01AA6CC1327A5DBCB35B7BF = { isa = PBXGroup; children = ( + 65EDE353CFC4C222043C80AB, + 644797EB12AAB2529ED6786E, + 38883F6AABCF4D47FC02B11F, + EB77B261C62447EE22D136DD, + 2436CB32D02E7E3293665601, + 265749F75DBA86EC3F19FE34, + EAC5B9DBB227CB2A002EF355, + 0D737FA088906E13707BAEB7, + 18794C3CE7D0C95A5A70F213 ); name = Source; sourceTree = "<group>"; }; + DD9313457B3248E7646270A4 = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + PREBINDING = NO; + HEADER_SEARCH_PATHS = " $(inherited)"; + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + ONLY_ACTIVE_ARCH = YES; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_DEBUG=1", + "DEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1"); }; name = Debug; }; + 673FACB8969ADED17ACEFF7C = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + PREBINDING = NO; + HEADER_SEARCH_PATHS = " $(inherited)"; + GCC_OPTIMIZATION_LEVEL = 3; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1"); }; name = Release; }; + 69D26A715A354ED1735D8438 = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + WARNING_CFLAGS = -Wreorder; + GCC_MODEL_TUNING = G5; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + ZERO_LINK = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + PRODUCT_NAME = "Jucer"; }; name = Debug; }; + 4C681DED23FC5056A83C964C = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + WARNING_CFLAGS = -Wreorder; + GCC_MODEL_TUNING = G5; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + ZERO_LINK = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + PRODUCT_NAME = "Jucer"; }; name = Release; }; + 045AC698C60073CCF5CC6116 = { isa = XCConfigurationList; buildConfigurations = ( + 69D26A715A354ED1735D8438, + 4C681DED23FC5056A83C964C ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + AC9DE3D3A6632D0494CC8609 = { isa = XCConfigurationList; buildConfigurations = ( + DD9313457B3248E7646270A4, + 673FACB8969ADED17ACEFF7C ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 87CCE4CB1FAB40B6F21DEACE = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + 5362E03ADF975A126C1F2F7B = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D6D0659F3F3504012246F13D, + 8BAE4D8EA7F247DA0A4D3A5C, + 280FE650B3F02AD9E821EA37, + 9950893AA82F86F1EEE55BED, + C2F198C7058FC1A88A600645, + A7C05B907BBCB4288FBC6428, + 6B48E4B12BB56C2254F293DF, + 7A7859C8F2DFDC8D80FE0F0E, + 5BD727176204D71F2E0F42CC, + DA3D1949878344EAE971E9CF, + 086FC650CA4A39161F5DC34A, + 7192D99BD62492851CC34B39, + 379C4FA4F9F4F856A245D8F1, + A70571C45ECEB18061181367, + 7B65A9D3D6D5798649D90FA0, + 85572197E35546BB69861758, + 0E22757B983B4F600F1B7916, + 1501CEE9D0FD3C1185F6413B, + FF1962A57973208A90330B3C, + E2DFFAAE26E2D87AE3CE3136, + 0F780301B225C3022C346CD4, + 59B173809CEC75EC0C74D1CF, + 69CA42E334E4BA09E4FE8B65, + 0C3A85F58C34FA91D16664EB, + 08C0959668FFC1A90B4BA8E6, + 1457A52734BA97A13610ECF1, + 20EDB5C810855EB960F520FC ); runOnlyForDeploymentPostprocessing = 0; }; + 08881173C882953BE5F11D6C = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7BDFF9F0E16DF33A980F46DC, + B703C44375C75E5AB099E74A, + 022036CBB0FBE47C417A6222, + 52A4EFC1F732A9D5BBB61AF5, + C65112B26E0BB0BB8DBD3F3C, + E63745F5956C698352A2ACA0, + 2C3270317859BA6DF8EC1458, + AA7B50F22523465B07D4A25B, + DBE3CE9482B19CF1AE700805, + 93C9F3F27602A33DDC9C2250, + 2E6836738CE7EB452FDC7E9A ); runOnlyForDeploymentPostprocessing = 0; }; + EB946A866C16B958168C9A39 = { isa = PBXNativeTarget; buildConfigurationList = AC9DE3D3A6632D0494CC8609; buildPhases = ( + 87CCE4CB1FAB40B6F21DEACE, + 5362E03ADF975A126C1F2F7B, + 08881173C882953BE5F11D6C ); buildRules = ( ); dependencies = ( ); name = "The Jucer"; productName = "The Jucer"; productReference = 12E1601866B3489844AFD645; productInstallPath = "$(HOME)/Applications"; productType = "com.apple.product-type.application"; }; + D64DFDDF5D2CD74A8171CF81 = { isa = PBXProject; buildConfigurationList = 045AC698C60073CCF5CC6116; compatibilityVersion = "Xcode 3.0"; hasScannedForEncodings = 0; mainGroup = B01AA6CC1327A5DBCB35B7BF; projectDirPath = ""; projectRoot = ""; targets = ( EB946A866C16B958168C9A39 ); }; + }; + rootObject = D64DFDDF5D2CD74A8171CF81; +} diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.sln b/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.sln new file mode 100755 index 000000000..3c2375329 --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +# Visual C++ Express 2005 +Project("{4E9D0CBA-BFAB-E5E4-0A60-A20FD97F37CA}") = "The Jucer", "The Jucer.vcproj", "{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.ActiveCfg = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.Build.0 = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.ActiveCfg = Release|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.vcproj b/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.vcproj new file mode 100755 index 000000000..b81b00629 --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2005/The Jucer.vcproj @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<VisualStudioProject ProjectType="Visual C++" + Version="8.00" + Name="The Jucer" + ProjectGUID="{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}" + TargetFrameworkVersion="131072"> + <Platforms> + <Platform Name="Win32"/> + </Platforms> + <ToolFiles/> + <Configurations> + <Configuration Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2"> + <Tool Name="VCPreBuildEventTool"/> + <Tool Name="VCCustomBuildTool"/> + <Tool Name="VCXMLDataGeneratorTool"/> + <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Debug\Jucer.tlb" + HeaderFileName=""/> + <Tool Name="VCCLCompilerTool" + Optimization="0" + BufferSecurityCheck="" + DebugInformationFormat="4" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2005_78A5003=1" + RuntimeLibrary="1" + RuntimeTypeInfo="true" + UsePrecompiledHeader="0" + PrecompiledHeaderFile=".\Debug\Jucer.pch" + AssemblerListingLocation=".\Debug\" + ObjectFile=".\Debug\" + ProgramDataBaseFileName=".\Debug\" + WarningLevel="4" + SuppressStartupBanner="true"/> + <Tool Name="VCManagedResourceCompilerTool"/> + <Tool Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG"/> + <Tool Name="VCPreLinkEventTool"/> + <Tool Name="VCLinkerTool" + OutputFile=".\Debug\Jucer.exe" + SuppressStartupBanner="true" + IgnoreDefaultLibraryNames="libcmt.lib, msvcrt.lib" + GenerateDebugInformation="true" + ProgramDatabaseFile=".\Debug\Jucer.pdb" + SubSystem="2" + TargetMachine="1"/> + <Tool Name="VCALinkTool"/> + <Tool Name="VCManifestTool"/> + <Tool Name="VCXDCMakeTool"/> + <Tool Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Debug\Jucer.bsc"/> + <Tool Name="VCFxCopTool"/> + <Tool Name="VCAppVerifierTool"/> + <Tool Name="VCPostBuildEventTool"/> + </Configuration> + <Configuration Name="Release|Win32" + OutputDirectory=".\Release" + IntermediateDirectory=".\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + WholeProgramOptimization="1"> + <Tool Name="VCPreBuildEventTool"/> + <Tool Name="VCCustomBuildTool"/> + <Tool Name="VCXMLDataGeneratorTool"/> + <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Release\Jucer.tlb" + HeaderFileName=""/> + <Tool Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="1" + StringPooling="true" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;JUCER_VS2005_78A5003=1" + RuntimeLibrary="0" + RuntimeTypeInfo="true" + UsePrecompiledHeader="0" + PrecompiledHeaderFile=".\Release\Jucer.pch" + AssemblerListingLocation=".\Release\" + ObjectFile=".\Release\" + ProgramDataBaseFileName=".\Release\" + WarningLevel="4" + SuppressStartupBanner="true"/> + <Tool Name="VCManagedResourceCompilerTool"/> + <Tool Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG"/> + <Tool Name="VCPreLinkEventTool"/> + <Tool Name="VCLinkerTool" + OutputFile=".\Release\Jucer.exe" + SuppressStartupBanner="true" + IgnoreDefaultLibraryNames="" + GenerateDebugInformation="false" + ProgramDatabaseFile=".\Release\Jucer.pdb" + SubSystem="2" + GenerateManifest="false" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool Name="VCALinkTool"/> + <Tool Name="VCManifestTool"/> + <Tool Name="VCXDCMakeTool"/> + <Tool Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Release\Jucer.bsc"/> + <Tool Name="VCFxCopTool"/> + <Tool Name="VCAppVerifierTool"/> + <Tool Name="VCPostBuildEventTool"/> + </Configuration> + </Configurations> + <References/> + <Files> + <Filter Name="The Jucer"> + <Filter Name="Application"> + <File RelativePath="..\..\Source\Application\jucer_Application.h"/> + <File RelativePath="..\..\Source\Application\jucer_CommandIDs.h"/> + <File RelativePath="..\..\Source\Application\jucer_CommonHeaders.h"/> + <File RelativePath="..\..\Source\Application\jucer_DocumentEditorComponent.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_DocumentEditorComponent.h"/> + <File RelativePath="..\..\Source\Application\jucer_FilePreviewComponent.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_FilePreviewComponent.h"/> + <File RelativePath="..\..\Source\jucer_Headers.h"/> + <File RelativePath="..\..\Source\Application\jucer_JuceUpdater.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_JuceUpdater.h"/> + <File RelativePath="..\..\Source\Application\jucer_Main.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_MainWindow.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_MainWindow.h"/> + <File RelativePath="..\..\Source\Application\jucer_OpenDocumentManager.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_OpenDocumentManager.h"/> + </Filter> + <Filter Name="Code Editor"> + <File RelativePath="..\..\Source\Code Editor\jucer_SourceCodeEditor.cpp"/> + <File RelativePath="..\..\Source\Code Editor\jucer_SourceCodeEditor.h"/> + </Filter> + <Filter Name="Project"> + <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_NewFileWizard.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_NewFileWizard.h"/> + <File RelativePath="..\..\Source\Project\jucer_NewProjectWizard.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_NewProjectWizard.h"/> + <File RelativePath="..\..\Source\Project\jucer_Project.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_Project.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExporter.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExporter.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_Make.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_MSVC.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_XCode.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectInformationComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectInformationComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectSaver.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> + <File RelativePath="..\..\Source\Project\jucer_ResourceFile.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ResourceFile.h"/> + <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.h"/> + </Filter> + <Filter Name="Utility"> + <File RelativePath="..\..\Source\Utility\jucer_CodeHelpers.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_CodeHelpers.h"/> + <File RelativePath="..\..\Source\Utility\jucer_Colours.h"/> + <File RelativePath="..\..\Source\Utility\jucer_FileHelpers.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_FileHelpers.h"/> + <File RelativePath="..\..\Source\Utility\jucer_JucerTreeViewBase.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_JucerTreeViewBase.h"/> + <File RelativePath="..\..\Source\Utility\jucer_MiscUtilities.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_MiscUtilities.h"/> + <File RelativePath="..\..\Source\Utility\jucer_PresetIDs.h"/> + <File RelativePath="..\..\Source\Utility\jucer_RelativePath.h"/> + <File RelativePath="..\..\Source\Utility\jucer_StoredSettings.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_StoredSettings.h"/> + <File RelativePath="..\..\Source\Utility\jucer_ValueSourceHelpers.h"/> + </Filter> + <Filter Name="BinaryData"> + <File RelativePath="..\..\Source\BinaryData\AudioPluginXCodeScript.txt"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\brushed_aluminium.png"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_MainConsoleAppTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_MainTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_NewCppFileTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_NewCppFileTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_WindowTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_WindowTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\juce_icon.png"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + </Filter> + </Filter> + <Filter Name="Juce Library Code"> + <File RelativePath="..\..\JuceLibraryCode\AppConfig.h"/> + <File RelativePath="..\..\JuceLibraryCode\JuceHeader.h"/> + <File RelativePath="..\..\JuceLibraryCode\BinaryData.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\BinaryData.h"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode1.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode2.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode3.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode4.cpp"/> + </Filter> + </Files> + <Globals/> +</VisualStudioProject> diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.sln b/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.sln new file mode 100755 index 000000000..f5a31a8b6 --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{4E9D0CBA-BFAB-E5E4-0A60-A20FD97F37CA}") = "The Jucer", "The Jucer.vcproj", "{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.ActiveCfg = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.Build.0 = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.ActiveCfg = Release|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.vcproj b/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.vcproj new file mode 100755 index 000000000..dfcfa551f --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2008/The Jucer.vcproj @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<VisualStudioProject ProjectType="Visual C++" + Version="9.00" + Name="The Jucer" + ProjectGUID="{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}" + TargetFrameworkVersion="131072"> + <Platforms> + <Platform Name="Win32"/> + </Platforms> + <ToolFiles/> + <Configurations> + <Configuration Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2"> + <Tool Name="VCPreBuildEventTool"/> + <Tool Name="VCCustomBuildTool"/> + <Tool Name="VCXMLDataGeneratorTool"/> + <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Debug\Jucer.tlb" + HeaderFileName=""/> + <Tool Name="VCCLCompilerTool" + Optimization="0" + BufferSecurityCheck="" + DebugInformationFormat="4" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2008_78A5006=1" + RuntimeLibrary="1" + RuntimeTypeInfo="true" + UsePrecompiledHeader="0" + PrecompiledHeaderFile=".\Debug\Jucer.pch" + AssemblerListingLocation=".\Debug\" + ObjectFile=".\Debug\" + ProgramDataBaseFileName=".\Debug\" + WarningLevel="4" + SuppressStartupBanner="true"/> + <Tool Name="VCManagedResourceCompilerTool"/> + <Tool Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG"/> + <Tool Name="VCPreLinkEventTool"/> + <Tool Name="VCLinkerTool" + OutputFile=".\Debug\Jucer.exe" + SuppressStartupBanner="true" + IgnoreDefaultLibraryNames="libcmt.lib, msvcrt.lib" + GenerateDebugInformation="true" + ProgramDatabaseFile=".\Debug\Jucer.pdb" + SubSystem="2" + TargetMachine="1"/> + <Tool Name="VCALinkTool"/> + <Tool Name="VCManifestTool"/> + <Tool Name="VCXDCMakeTool"/> + <Tool Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Debug\Jucer.bsc"/> + <Tool Name="VCFxCopTool"/> + <Tool Name="VCAppVerifierTool"/> + <Tool Name="VCPostBuildEventTool"/> + </Configuration> + <Configuration Name="Release|Win32" + OutputDirectory=".\Release" + IntermediateDirectory=".\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + WholeProgramOptimization="1"> + <Tool Name="VCPreBuildEventTool"/> + <Tool Name="VCCustomBuildTool"/> + <Tool Name="VCXMLDataGeneratorTool"/> + <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\Release\Jucer.tlb" + HeaderFileName=""/> + <Tool Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="1" + StringPooling="true" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;JUCER_VS2008_78A5006=1" + RuntimeLibrary="0" + RuntimeTypeInfo="true" + UsePrecompiledHeader="0" + PrecompiledHeaderFile=".\Release\Jucer.pch" + AssemblerListingLocation=".\Release\" + ObjectFile=".\Release\" + ProgramDataBaseFileName=".\Release\" + WarningLevel="4" + SuppressStartupBanner="true"/> + <Tool Name="VCManagedResourceCompilerTool"/> + <Tool Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG"/> + <Tool Name="VCPreLinkEventTool"/> + <Tool Name="VCLinkerTool" + OutputFile=".\Release\Jucer.exe" + SuppressStartupBanner="true" + IgnoreDefaultLibraryNames="" + GenerateDebugInformation="false" + ProgramDatabaseFile=".\Release\Jucer.pdb" + SubSystem="2" + GenerateManifest="false" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool Name="VCALinkTool"/> + <Tool Name="VCManifestTool"/> + <Tool Name="VCXDCMakeTool"/> + <Tool Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Release\Jucer.bsc"/> + <Tool Name="VCFxCopTool"/> + <Tool Name="VCAppVerifierTool"/> + <Tool Name="VCPostBuildEventTool"/> + </Configuration> + </Configurations> + <References/> + <Files> + <Filter Name="The Jucer"> + <Filter Name="Application"> + <File RelativePath="..\..\Source\Application\jucer_Application.h"/> + <File RelativePath="..\..\Source\Application\jucer_CommandIDs.h"/> + <File RelativePath="..\..\Source\Application\jucer_CommonHeaders.h"/> + <File RelativePath="..\..\Source\Application\jucer_DocumentEditorComponent.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_DocumentEditorComponent.h"/> + <File RelativePath="..\..\Source\Application\jucer_FilePreviewComponent.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_FilePreviewComponent.h"/> + <File RelativePath="..\..\Source\jucer_Headers.h"/> + <File RelativePath="..\..\Source\Application\jucer_JuceUpdater.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_JuceUpdater.h"/> + <File RelativePath="..\..\Source\Application\jucer_Main.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_MainWindow.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_MainWindow.h"/> + <File RelativePath="..\..\Source\Application\jucer_OpenDocumentManager.cpp"/> + <File RelativePath="..\..\Source\Application\jucer_OpenDocumentManager.h"/> + </Filter> + <Filter Name="Code Editor"> + <File RelativePath="..\..\Source\Code Editor\jucer_SourceCodeEditor.cpp"/> + <File RelativePath="..\..\Source\Code Editor\jucer_SourceCodeEditor.h"/> + </Filter> + <Filter Name="Project"> + <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_NewFileWizard.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_NewFileWizard.h"/> + <File RelativePath="..\..\Source\Project\jucer_NewProjectWizard.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_NewProjectWizard.h"/> + <File RelativePath="..\..\Source\Project\jucer_Project.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_Project.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExporter.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExporter.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_Make.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_MSVC.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectExport_XCode.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectInformationComponent.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectInformationComponent.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectSaver.h"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> + <File RelativePath="..\..\Source\Project\jucer_ResourceFile.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_ResourceFile.h"/> + <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> + <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.h"/> + </Filter> + <Filter Name="Utility"> + <File RelativePath="..\..\Source\Utility\jucer_CodeHelpers.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_CodeHelpers.h"/> + <File RelativePath="..\..\Source\Utility\jucer_Colours.h"/> + <File RelativePath="..\..\Source\Utility\jucer_FileHelpers.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_FileHelpers.h"/> + <File RelativePath="..\..\Source\Utility\jucer_JucerTreeViewBase.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_JucerTreeViewBase.h"/> + <File RelativePath="..\..\Source\Utility\jucer_MiscUtilities.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_MiscUtilities.h"/> + <File RelativePath="..\..\Source\Utility\jucer_PresetIDs.h"/> + <File RelativePath="..\..\Source\Utility\jucer_RelativePath.h"/> + <File RelativePath="..\..\Source\Utility\jucer_StoredSettings.cpp"/> + <File RelativePath="..\..\Source\Utility\jucer_StoredSettings.h"/> + <File RelativePath="..\..\Source\Utility\jucer_ValueSourceHelpers.h"/> + </Filter> + <Filter Name="BinaryData"> + <File RelativePath="..\..\Source\BinaryData\AudioPluginXCodeScript.txt"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\brushed_aluminium.png"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_MainConsoleAppTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_MainTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_NewCppFileTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_NewCppFileTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_WindowTemplate.cpp"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\jucer_WindowTemplate.h"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + <File RelativePath="..\..\Source\BinaryData\juce_icon.png"> + <FileConfiguration Name="Debug|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + <FileConfiguration Name="Release|Win32" + ExcludedFromBuild="true"> + <Tool Name="VCCLCompilerTool"/> + </FileConfiguration> + </File> + </Filter> + </Filter> + <Filter Name="Juce Library Code"> + <File RelativePath="..\..\JuceLibraryCode\AppConfig.h"/> + <File RelativePath="..\..\JuceLibraryCode\JuceHeader.h"/> + <File RelativePath="..\..\JuceLibraryCode\BinaryData.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\BinaryData.h"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode1.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode2.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode3.cpp"/> + <File RelativePath="..\..\JuceLibraryCode\JuceLibraryCode4.cpp"/> + </Filter> + </Files> + <Globals/> +</VisualStudioProject> diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.sln b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.sln new file mode 100755 index 000000000..c7f3fec7c --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.sln @@ -0,0 +1,18 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +Project("{4E9D0CBA-BFAB-E5E4-0A60-A20FD97F37CA}") = "The Jucer", "The Jucer.vcxproj", "{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.ActiveCfg = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Debug|Win32.Build.0 = Debug|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.ActiveCfg = Release|Win32 + {C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj new file mode 100755 index 000000000..6971cec82 --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="utf-8"?> + +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{C9C4A72E-8CC9-D57E-C0D0-2E6109E48884}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/> + <ImportGroup Label="ExtensionSettings"/> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" + Label="LocalAppDataPlatform"/> + </ImportGroup> + <PropertyGroup Label="UserMacros"/> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Jucer</TargetName> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Jucer</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Midl> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>Win32</TargetEnvironment> + <HeaderFileName/> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2010_78A501D=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <RuntimeTypeInfo>true</RuntimeTypeInfo> + <PrecompiledHeader/> + <AssemblerListingLocation>.\Debug\</AssemblerListingLocation> + <ObjectFileName>.\Debug\</ObjectFileName> + <ProgramDataBaseFileName>.\Debug\</ProgramDataBaseFileName> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <OutputFile>.\Debug\Jucer.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <IgnoreSpecificDefaultLibraries>libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>.\Debug\Jucer.pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>.\Debug\Jucer.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Midl> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>Win32</TargetEnvironment> + <HeaderFileName/> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;JUCER_VS2010_78A501D=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <RuntimeTypeInfo>true</RuntimeTypeInfo> + <PrecompiledHeader/> + <AssemblerListingLocation>.\Release\</AssemblerListingLocation> + <ObjectFileName>.\Release\</ObjectFileName> + <ProgramDataBaseFileName>.\Release\</ProgramDataBaseFileName> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ResourceCompile> + <Link> + <OutputFile>.\Release\Jucer.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> + <GenerateDebugInformation>false</GenerateDebugInformation> + <ProgramDatabaseFile>.\Release\Jucer.pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <TargetMachine>MachineX86</TargetMachine> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>.\Release\Jucer.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\Source\Application\jucer_DocumentEditorComponent.cpp"/> + <ClCompile Include="..\..\Source\Application\jucer_FilePreviewComponent.cpp"/> + <ClCompile Include="..\..\Source\Application\jucer_JuceUpdater.cpp"/> + <ClCompile Include="..\..\Source\Application\jucer_Main.cpp"/> + <ClCompile Include="..\..\Source\Application\jucer_MainWindow.cpp"/> + <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"/> + <ClCompile Include="..\..\Source\Code Editor\jucer_SourceCodeEditor.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_GroupInformationComponent.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_NewFileWizard.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_NewProjectWizard.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_Project.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_ProjectExporter.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_ProjectInformationComponent.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_ResourceFile.cpp"/> + <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> + <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"/> + <ClCompile Include="..\..\Source\Utility\jucer_FileHelpers.cpp"/> + <ClCompile Include="..\..\Source\Utility\jucer_JucerTreeViewBase.cpp"/> + <ClCompile Include="..\..\Source\Utility\jucer_MiscUtilities.cpp"/> + <ClCompile Include="..\..\Source\Utility\jucer_StoredSettings.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode1.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode2.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode3.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode4.cpp"/> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\Source\Application\jucer_Application.h"/> + <ClInclude Include="..\..\Source\Application\jucer_CommandIDs.h"/> + <ClInclude Include="..\..\Source\Application\jucer_CommonHeaders.h"/> + <ClInclude Include="..\..\Source\Application\jucer_DocumentEditorComponent.h"/> + <ClInclude Include="..\..\Source\Application\jucer_FilePreviewComponent.h"/> + <ClInclude Include="..\..\Source\jucer_Headers.h"/> + <ClInclude Include="..\..\Source\Application\jucer_JuceUpdater.h"/> + <ClInclude Include="..\..\Source\Application\jucer_MainWindow.h"/> + <ClInclude Include="..\..\Source\Application\jucer_OpenDocumentManager.h"/> + <ClInclude Include="..\..\Source\Code Editor\jucer_SourceCodeEditor.h"/> + <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"/> + <ClInclude Include="..\..\Source\Project\jucer_NewFileWizard.h"/> + <ClInclude Include="..\..\Source\Project\jucer_NewProjectWizard.h"/> + <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExporter.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_Make.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_MSVC.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_XCode.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectInformationComponent.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectSaver.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> + <ClInclude Include="..\..\Source\Project\jucer_ResourceFile.h"/> + <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_Colours.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_FileHelpers.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_JucerTreeViewBase.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_MiscUtilities.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_PresetIDs.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_RelativePath.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_StoredSettings.h"/> + <ClInclude Include="..\..\Source\Utility\jucer_ValueSourceHelpers.h"/> + <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"/> + <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"/> + <ClInclude Include="..\..\Source\BinaryData\jucer_NewCppFileTemplate.h"/> + <ClInclude Include="..\..\Source\BinaryData\jucer_WindowTemplate.h"/> + <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h"/> + <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/> + <ImportGroup Label="ExtensionTargets"/> +</Project> diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.filters b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.filters new file mode 100755 index 000000000..e077948cb --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.filters @@ -0,0 +1,259 @@ +<?xml version="1.0" encoding="utf-8"?> + +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="The Jucer"> + <UniqueIdentifier>{251378DC-2EBB-4B5D-54B9-F55AC57A478F}</UniqueIdentifier> + </Filter> + <Filter Include="The Jucer\Application"> + <UniqueIdentifier>{31EDBA88-31A5-997C-9F07-EE6B43F914D0}</UniqueIdentifier> + </Filter> + <Filter Include="The Jucer\Code Editor"> + <UniqueIdentifier>{F41CE18D-09FC-818B-809B-287ED61EC70C}</UniqueIdentifier> + </Filter> + <Filter Include="The Jucer\Project"> + <UniqueIdentifier>{0F8BE833-CD54-C01F-F820-48DFE266AE32}</UniqueIdentifier> + </Filter> + <Filter Include="The Jucer\Utility"> + <UniqueIdentifier>{E870C076-EBCA-BE3D-D4EB-5D91F2FF6C9F}</UniqueIdentifier> + </Filter> + <Filter Include="The Jucer\BinaryData"> + <UniqueIdentifier>{FC97072F-FF15-52B0-B523-A4C3265DA556}</UniqueIdentifier> + </Filter> + <Filter Include="Juce Library Code"> + <UniqueIdentifier>{F7048EA6-F4B2-F31B-E402-E05D678A1111}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\Source\Application\jucer_DocumentEditorComponent.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Application\jucer_FilePreviewComponent.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Application\jucer_JuceUpdater.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Application\jucer_Main.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Application\jucer_MainWindow.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"> + <Filter>The Jucer\Application</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Code Editor\jucer_SourceCodeEditor.cpp"> + <Filter>The Jucer\Code Editor</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_GroupInformationComponent.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_NewFileWizard.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_NewProjectWizard.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_Project.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_ProjectExporter.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_ProjectInformationComponent.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_ResourceFile.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"> + <Filter>The Jucer\Project</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"> + <Filter>The Jucer\Utility</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Utility\jucer_FileHelpers.cpp"> + <Filter>The Jucer\Utility</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Utility\jucer_JucerTreeViewBase.cpp"> + <Filter>The Jucer\Utility</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Utility\jucer_MiscUtilities.cpp"> + <Filter>The Jucer\Utility</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Utility\jucer_StoredSettings.cpp"> + <Filter>The Jucer\Utility</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\AudioPluginXCodeScript.txt"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\brushed_aluminium.png"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_MainConsoleAppTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_MainTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_NewCppFileTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\jucer_WindowTemplate.cpp"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\BinaryData\juce_icon.png"> + <Filter>The Jucer\BinaryData</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"> + <Filter>Juce Library Code</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode1.cpp"> + <Filter>Juce Library Code</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode2.cpp"> + <Filter>Juce Library Code</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode3.cpp"> + <Filter>Juce Library Code</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\JuceLibraryCode4.cpp"> + <Filter>Juce Library Code</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\Source\Application\jucer_Application.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_CommandIDs.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_CommonHeaders.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_DocumentEditorComponent.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_FilePreviewComponent.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\jucer_Headers.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_JuceUpdater.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_MainWindow.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Application\jucer_OpenDocumentManager.h"> + <Filter>The Jucer\Application</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Code Editor\jucer_SourceCodeEditor.h"> + <Filter>The Jucer\Code Editor</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_NewFileWizard.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_NewProjectWizard.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_Project.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExporter.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_Make.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_MSVC.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectExport_XCode.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectInformationComponent.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectSaver.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_ResourceFile.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"> + <Filter>The Jucer\Project</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_Colours.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_FileHelpers.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_JucerTreeViewBase.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_MiscUtilities.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_PresetIDs.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_RelativePath.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_StoredSettings.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Utility\jucer_ValueSourceHelpers.h"> + <Filter>The Jucer\Utility</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"> + <Filter>The Jucer\BinaryData</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"> + <Filter>The Jucer\BinaryData</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\BinaryData\jucer_NewCppFileTemplate.h"> + <Filter>The Jucer\BinaryData</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\BinaryData\jucer_WindowTemplate.h"> + <Filter>The Jucer\BinaryData</Filter> + </ClInclude> + <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h"> + <Filter>Juce Library Code</Filter> + </ClInclude> + <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"> + <Filter>Juce Library Code</Filter> + </ClInclude> + <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"> + <Filter>Juce Library Code</Filter> + </ClInclude> + </ItemGroup> +</Project> diff --git a/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.user b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.user new file mode 100755 index 000000000..695b5c78b --- /dev/null +++ b/JuceLibraryCode/jucer/Builds/VisualStudio2010/The Jucer.vcxproj.user @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +</Project> \ No newline at end of file diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/AppConfig.h b/JuceLibraryCode/jucer/JuceLibraryCode/AppConfig.h new file mode 100755 index 000000000..0dc80c495 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/AppConfig.h @@ -0,0 +1,39 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + If you want to change any of these values, use the Jucer to do so, rather than + editing this file directly! + + Any commented-out settings will fall back to using the default values that + they are given in juce_Config.h + +*/ + +//#define JUCE_FORCE_DEBUG +//#define JUCE_LOG_ASSERTIONS +#define JUCE_ASIO 0 +#define JUCE_WASAPI 0 +#define JUCE_DIRECTSOUND 0 +#define JUCE_ALSA 0 +#define JUCE_QUICKTIME 0 +#define JUCE_OPENGL 0 +//#define JUCE_DIRECT2D +#define JUCE_USE_FLAC 0 +#define JUCE_USE_OGGVORBIS 0 +#define JUCE_USE_CDBURNER 0 +#define JUCE_USE_CDREADER 0 +#define JUCE_USE_CAMERA 0 +//#define JUCE_ENABLE_REPAINT_DEBUGGING +//#define JUCE_USE_XINERAMA +//#define JUCE_USE_XSHM +//#define JUCE_USE_XRENDER +//#define JUCE_USE_XCURSOR +#define JUCE_PLUGINHOST_VST 0 +#define JUCE_PLUGINHOST_AU 0 +//#define JUCE_ONLY_BUILD_CORE_LIBRARY +//#define JUCE_WEB_BROWSER +//#define JUCE_SUPPORT_CARBON +//#define JUCE_CHECK_MEMORY_LEAKS +//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.cpp b/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.cpp new file mode 100644 index 000000000..b61a02325 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.cpp @@ -0,0 +1,1147 @@ +/* ==================================== JUCER_BINARY_RESOURCE ==================================== + + This is an auto-generated file, created by The Jucer V3.0.0 + Do not edit anything in this file! + +*/ + +#include "BinaryData.h" + + +const char* BinaryData::getNamedResource (const char* resourceNameUTF8, int& numBytes) throw() +{ + int hash = 0; + if (resourceNameUTF8 != 0) + while (*resourceNameUTF8 != 0) + hash = 31 * hash + *resourceNameUTF8++; + + switch (hash) + { + case 0x44be9398: numBytes = BinaryData::AudioPluginXCodeScript_txtSize; return BinaryData::AudioPluginXCodeScript_txt; + case 0x950fd7dd: numBytes = BinaryData::brushed_aluminium_pngSize; return BinaryData::brushed_aluminium_png; + case 0x27c5a93a: numBytes = BinaryData::jucer_AudioPluginEditorTemplate_cppSize; return BinaryData::jucer_AudioPluginEditorTemplate_cpp; + case 0x4d0721bf: numBytes = BinaryData::jucer_AudioPluginEditorTemplate_hSize; return BinaryData::jucer_AudioPluginEditorTemplate_h; + case 0x51b49ac5: numBytes = BinaryData::jucer_AudioPluginFilterTemplate_cppSize; return BinaryData::jucer_AudioPluginFilterTemplate_cpp; + case 0x488afa0a: numBytes = BinaryData::jucer_AudioPluginFilterTemplate_hSize; return BinaryData::jucer_AudioPluginFilterTemplate_h; + case 0x8905395b: numBytes = BinaryData::jucer_MainConsoleAppTemplate_cppSize; return BinaryData::jucer_MainConsoleAppTemplate_cpp; + case 0x7a0186b1: numBytes = BinaryData::jucer_MainTemplate_cppSize; return BinaryData::jucer_MainTemplate_cpp; + case 0x02a2a077: numBytes = BinaryData::jucer_NewCppFileTemplate_cppSize; return BinaryData::jucer_NewCppFileTemplate_cpp; + case 0x0842c43c: numBytes = BinaryData::jucer_NewCppFileTemplate_hSize; return BinaryData::jucer_NewCppFileTemplate_h; + case 0x3f052be8: numBytes = BinaryData::jucer_WindowTemplate_cppSize; return BinaryData::jucer_WindowTemplate_cpp; + case 0xb20377ed: numBytes = BinaryData::jucer_WindowTemplate_hSize; return BinaryData::jucer_WindowTemplate_h; + case 0x154a7275: numBytes = BinaryData::juce_icon_pngSize; return BinaryData::juce_icon_png; + default: break; + } + + numBytes = 0; + return 0; +} + + +//================== AudioPluginXCodeScript.txt ================== +static const unsigned char temp_4f9ed45b[] = +"\r\n" +"# This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on \r\n" +"# which plugin types you've built\r\n" +"\r\n" +"original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\r\n" +"\r\n" +"# this looks inside the binary to detect which platforms are needed.. \r\n" +"copyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\r\n" +"copyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\r\n" +"copyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\r\n" +"\r\n" +"if [ $copyAU -gt 0 ]; then\r\n" +" echo \"Copying to AudioUnit folder...\"\r\n" +" AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component\r\n" +" if [ -d \"$AU\" ]; then \r\n" +" rm -r \"$AU\"\r\n" +" fi\r\n" +"\r\n" +" cp -r \"$original\" \"$AU\"\r\n" +" sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$AU/Contents/PkgInfo\"\r\n" +" sed -i \"\" -e 's/TDMw/BNDL/g' \"$AU/Contents/$INFOPLIST_FILE\"\r\n" +"fi\r\n" +"\r\n" +"if [ $copyVST -gt 0 ]; then\r\n" +" echo \"Copying to VST folder...\"\r\n" +" VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst\r\n" +" if [ -d \"$VST\" ]; then \r\n" +" rm -r \"$VST\"\r\n" +" fi\r\n" +"\r\n" +" cp -r \"$original\" \"$VST\"\r\n" +" sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST/Contents/PkgInfo\"\r\n" +" sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST/Contents/$INFOPLIST_FILE\"\r\n" +"fi\r\n" +"\r\n" +"if [ $copyRTAS -gt 0 ]; then\r\n" +" echo \"Copying to RTAS folder...\"\r\n" +" RTAS=/Library/Application\\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm\r\n" +" if [ -d \"$RTAS\" ]; then\r\n" +" rm -r \"$RTAS\"\r\n" +" fi\r\n" +"\r\n" +" cp -r \"$original\" \"$RTAS\"\r\n" +"fi\r\n"; + +const char* BinaryData::AudioPluginXCodeScript_txt = (const char*) temp_4f9ed45b; + +//================== brushed_aluminium.png ================== +static const unsigned char temp_1402fb7c[] = +{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,84,0,0,0,110,8,2,0,0,0,247,102,124,157,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,4,103,65,77,65,0,0,177,142,124,251,81,147,0,0,0,32,99,72,82,77,0,0,122,37,0,0,128,131,0,0,249,255, +0,0,128,233,0,0,117,48,0,0,234,96,0,0,58,152,0,0,23,111,146,95,197,70,0,0,56,250,73,68,65,84,120,218,172,83,71,14,192,32,12,75,248,255,153,231,66,17,81,45,203,97,244,80,31,16,114,246,242,90,171,153,185,187,189,224,127,239,221,8,33,10,178,79,240,135,245, +197,48,152,48,247,137,80,64,44,72,51,66,196,230,87,125,206,22,177,6,74,41,98,216,90,147,4,144,24,107,242,7,10,97,203,140,148,47,53,230,90,196,231,1,185,88,97,174,221,56,48,255,226,139,127,214,217,181,98,12,75,218,190,172,37,147,60,71,225,151,185,241, +94,241,155,163,200,43,171,40,219,178,187,41,56,228,162,120,115,176,87,187,161,35,226,104,209,161,153,249,30,229,0,31,1,40,43,163,21,10,97,24,134,34,235,255,255,241,192,65,184,33,36,93,229,250,48,100,98,77,179,211,88,40,196,25,32,154,159,208,152,239,84, +147,162,117,194,237,93,75,147,214,68,125,202,21,109,91,136,168,30,29,81,238,239,189,159,223,133,157,181,214,0,40,15,169,253,68,234,52,70,51,167,110,108,41,232,230,51,142,38,19,118,200,217,33,38,90,1,115,136,252,21,22,45,241,106,56,201,51,198,120,127, +250,165,141,184,142,57,48,129,217,141,77,98,48,136,73,104,147,73,16,114,107,51,19,156,83,199,190,80,129,125,105,241,193,61,29,114,162,114,42,87,213,77,6,86,244,174,98,108,10,244,7,147,248,145,234,87,0,82,171,32,5,96,24,132,93,246,255,23,123,88,65,8,33, +137,210,177,157,134,108,218,168,73,250,0,198,52,197,200,201,200,129,14,162,149,62,90,145,31,145,27,62,150,228,140,165,89,35,165,22,114,98,105,152,69,71,2,226,130,162,150,60,139,77,49,52,238,36,239,183,59,155,160,115,86,243,11,246,251,198,88,150,235,192, +66,248,63,30,254,53,27,166,230,60,92,228,169,251,6,142,157,72,85,77,192,157,9,209,171,248,95,22,145,104,185,88,33,40,145,104,119,148,137,41,30,205,117,25,16,23,93,134,226,151,86,96,17,80,253,205,43,0,229,229,146,2,48,16,194,208,77,239,127,230,22,132, +16,242,17,187,233,206,14,227,196,151,248,240,77,28,201,226,183,34,119,97,185,68,128,38,35,167,201,18,90,64,86,96,37,122,187,63,63,119,28,133,12,23,184,135,135,183,56,156,203,118,227,128,88,72,220,198,85,36,120,148,197,125,86,99,118,189,212,54,232,252, +165,137,148,199,128,19,13,147,91,55,73,109,63,218,213,184,232,112,206,146,228,219,178,219,247,157,240,200,229,120,53,14,38,252,55,70,64,204,249,173,219,144,34,219,85,220,184,121,143,104,196,119,168,189,2,112,98,6,41,0,131,64,12,188,244,255,111,110,65, +8,33,19,89,235,205,130,61,168,201,238,108,30,54,150,145,124,104,179,133,106,241,150,231,180,25,23,225,236,192,250,29,35,70,212,108,186,49,112,189,170,220,123,81,92,116,213,86,181,238,46,110,32,11,184,248,92,118,127,123,233,197,47,20,214,97,166,112,97, +239,17,70,116,246,111,161,249,171,214,83,166,60,220,48,122,158,78,150,121,68,206,174,186,218,204,98,161,207,5,5,81,197,42,228,239,14,85,27,198,24,102,213,100,202,39,101,141,81,20,192,43,0,41,102,140,3,80,8,131,208,229,223,255,204,14,38,228,5,104,29,190, +155,139,162,210,10,124,53,223,154,242,146,60,146,222,76,2,187,30,190,254,54,234,17,134,94,107,178,176,77,43,18,182,185,12,74,29,222,2,25,95,45,92,149,79,79,251,87,163,71,50,38,85,162,77,173,81,154,60,177,191,174,182,158,159,189,96,2,182,100,13,211,131, +46,225,83,106,201,197,200,212,245,41,253,50,253,205,236,182,150,98,245,158,194,147,46,152,137,3,139,252,142,235,62,140,162,36,94,149,162,207,206,40,36,53,144,182,45,56,77,34,25,157,152,83,28,1,24,51,183,21,128,65,24,134,194,88,255,255,151,133,9,18,146, +211,186,61,236,221,154,91,227,171,40,63,84,220,39,212,109,22,179,144,13,215,76,44,101,41,185,87,85,184,219,236,255,96,194,72,6,92,150,48,86,153,72,161,216,39,178,51,215,253,116,182,206,160,146,3,93,223,134,86,48,219,245,48,153,249,129,38,137,215,61,124, +92,59,133,46,228,91,183,151,238,100,33,46,25,107,112,239,186,113,220,164,208,228,52,154,161,192,29,52,158,107,125,190,239,170,170,218,20,160,59,162,217,32,248,181,22,181,3,90,173,166,5,86,55,255,37,0,103,86,142,3,48,8,195,150,254,255,205,84,66,178,44, +219,49,136,141,41,37,52,135,143,15,2,184,52,195,254,54,40,135,151,184,60,58,118,84,223,123,146,201,31,249,184,43,58,115,139,188,145,7,191,215,159,88,0,69,149,229,28,5,195,247,191,206,241,89,113,40,67,74,110,27,221,208,7,27,47,42,234,15,146,158,48,47, +199,65,83,168,50,20,216,227,40,72,120,26,58,147,17,27,21,62,62,139,206,117,3,117,221,202,241,254,228,94,144,188,0,16,64,105,227,157,39,174,225,77,228,243,75,10,210,169,13,35,133,125,94,2,176,106,229,56,0,64,64,80,225,255,111,86,72,54,50,151,141,80,40, +20,18,199,216,57,76,201,60,185,92,103,155,231,196,249,126,219,170,135,5,184,68,167,175,111,185,114,194,120,112,40,114,250,34,139,176,244,59,203,121,206,175,155,219,195,135,0,252,139,224,103,191,182,57,201,53,184,126,86,28,192,96,1,183,210,196,146,192, +118,126,179,227,41,174,50,73,165,233,238,152,139,105,152,127,5,193,40,213,74,62,5,96,43,67,253,49,9,136,168,182,4,32,213,76,110,0,136,65,24,248,73,255,53,239,35,146,101,249,64,172,210,0,31,48,135,135,35,62,68,100,233,113,57,228,88,220,2,175,42,160,255, +200,8,238,228,228,95,133,185,152,34,204,111,56,176,181,164,25,183,182,107,51,38,155,197,224,142,99,204,68,236,176,27,155,109,222,198,255,58,130,143,126,193,230,142,104,215,132,36,75,102,151,39,136,209,119,20,0,34,184,146,103,33,9,238,133,8,157,5,250, +206,140,90,245,238,227,156,40,206,42,169,16,176,0,249,192,105,27,193,230,47,46,130,42,175,156,79,0,74,205,37,5,64,24,6,162,93,148,220,255,200,22,4,25,230,147,212,238,92,40,130,105,157,207,219,85,101,79,86,202,12,212,125,81,52,98,133,138,58,28,123,26, +89,140,135,156,136,254,132,241,101,40,249,211,123,111,166,57,245,118,182,8,164,143,157,246,103,226,43,172,247,182,28,219,47,32,103,212,56,99,7,214,75,188,123,155,144,212,62,69,188,180,163,108,174,190,28,75,242,77,215,187,86,198,239,212,158,160,46,32, +90,174,137,39,241,81,77,170,141,3,73,44,80,170,238,241,210,182,140,9,212,107,192,164,177,125,63,235,17,128,85,51,88,1,32,4,129,232,101,253,255,95,222,5,65,100,158,169,196,118,234,148,20,141,217,115,158,147,35,85,122,152,35,47,241,201,247,183,137,195, +98,114,237,237,95,140,101,102,25,174,230,2,73,218,248,146,80,243,107,79,248,241,215,32,181,22,51,70,153,89,130,167,46,5,60,218,37,175,245,217,203,245,194,92,208,112,147,82,231,25,157,208,130,229,19,118,115,54,54,4,97,82,229,59,204,234,111,172,192,79, +77,53,17,24,111,59,85,22,187,107,62,176,188,87,75,147,69,185,84,102,254,30,241,21,128,117,51,70,2,32,4,97,160,133,255,127,179,29,195,100,67,134,194,254,26,207,136,36,139,87,18,203,188,126,86,20,42,198,146,207,12,63,44,209,173,250,218,239,115,130,13,123, +60,10,79,136,115,33,35,9,26,226,131,130,156,6,157,249,165,0,127,93,73,60,79,215,108,16,236,151,42,182,135,8,108,109,166,145,138,80,44,234,75,222,16,83,189,182,164,237,184,233,32,134,246,214,45,115,187,133,106,137,114,104,236,73,245,2,223,233,62,66,34, +250,48,167,40,173,129,149,174,245,164,210,59,216,60,235,9,64,186,25,228,0,16,130,48,240,255,191,86,47,164,105,97,52,187,30,185,169,8,56,148,147,249,77,41,249,66,140,236,197,106,88,106,219,72,208,49,98,226,149,207,207,74,196,137,217,192,15,144,5,146,173, +60,19,70,74,210,201,38,224,215,150,57,249,123,178,192,49,201,4,128,102,127,6,132,215,219,249,169,11,210,228,195,184,52,237,229,250,169,206,86,39,209,97,13,147,196,194,96,79,94,10,163,162,170,20,174,45,173,116,81,179,240,81,107,42,221,91,179,64,51,209, +208,202,232,160,37,223,107,9,192,184,185,227,0,8,195,48,52,3,247,63,51,67,37,43,248,87,214,10,81,32,164,81,158,157,135,202,11,40,125,79,39,250,10,231,177,52,237,129,184,202,27,150,192,32,216,240,26,168,133,67,27,173,206,87,230,107,13,42,26,59,9,150,246, +63,160,62,141,22,11,128,133,122,186,201,104,97,69,215,66,253,147,228,37,111,226,220,166,208,18,195,179,18,90,186,94,15,74,29,94,72,6,85,59,169,162,91,20,111,72,33,100,212,125,32,130,41,171,201,222,87,54,178,135,136,213,240,108,172,183,226,62,226,130, +75,55,41,69,104,175,188,2,112,110,46,41,0,131,64,12,189,255,173,93,8,67,200,207,193,101,161,116,90,21,235,36,47,220,243,223,98,84,114,46,237,251,21,172,189,56,159,58,121,41,54,103,131,119,56,154,118,195,66,116,148,202,37,162,86,49,9,148,232,103,85,41, +254,133,152,227,64,199,164,66,161,65,152,112,29,117,4,21,82,218,252,36,247,146,225,190,141,255,176,9,210,209,192,166,48,38,218,168,178,110,233,29,74,163,177,73,166,150,49,236,159,214,61,66,186,147,214,234,243,128,80,30,110,181,9,34,127,172,221,104,39, +244,8,192,202,25,163,0,20,194,48,212,193,251,159,249,15,130,148,164,47,118,248,155,8,46,90,107,77,158,238,26,223,217,114,119,155,138,176,231,138,52,73,220,231,0,13,2,166,160,29,34,248,181,135,176,232,255,121,215,13,221,108,41,112,46,137,40,134,45,217, +4,153,138,19,46,232,140,37,72,241,95,4,128,102,99,146,32,178,55,57,79,46,55,20,91,175,116,241,131,159,118,153,158,137,96,40,91,58,237,191,248,31,129,22,217,172,197,8,21,38,212,47,175,93,92,194,240,75,177,235,47,212,254,4,96,229,204,109,0,0,97,24,72,193, +254,51,211,161,200,57,27,36,88,128,42,128,206,79,166,227,85,103,155,227,69,237,48,38,96,150,9,95,196,188,225,3,228,24,224,31,177,178,46,249,197,250,244,98,147,207,217,60,216,145,16,17,177,11,31,57,225,131,115,38,14,48,146,197,71,16,112,254,60,150,41, +94,228,198,99,124,248,102,37,6,170,72,149,46,243,135,143,190,55,146,8,46,155,185,169,66,58,88,192,212,189,219,239,16,64,12,115,80,125,206,131,43,183,79,88,2,80,114,6,57,0,132,32,12,228,176,255,127,179,7,147,13,161,157,170,31,240,100,64,166,131,95,95, +137,183,8,241,191,250,59,198,11,236,231,158,0,133,21,17,125,246,147,247,210,235,133,202,88,161,171,19,243,63,54,88,26,168,70,214,56,24,181,229,11,227,40,130,35,199,249,159,136,38,125,231,80,236,207,214,197,98,239,83,11,181,39,116,41,221,250,148,150,162, +87,147,88,109,170,111,185,128,46,110,135,97,216,26,92,74,91,109,112,48,110,151,122,59,26,212,147,246,23,106,247,232,40,52,54,82,149,212,215,202,18,128,145,51,90,1,40,6,65,104,255,255,213,99,12,134,152,90,239,187,131,46,17,75,79,93,182,63,204,171,160, +85,30,118,90,245,236,119,229,220,69,184,220,78,35,137,192,48,147,35,19,189,71,74,80,67,119,134,229,34,131,165,76,229,140,177,50,152,170,219,86,54,58,252,185,181,174,70,88,109,52,188,17,55,216,148,123,188,144,20,28,154,165,15,116,22,161,92,125,112,179, +60,255,47,235,184,212,134,199,160,228,91,3,107,214,75,78,74,60,210,116,157,125,142,93,207,251,36,191,73,115,219,130,63,10,105,250,127,242,8,64,201,21,27,1,16,131,32,139,175,220,127,224,116,158,7,136,254,0,41,82,72,8,32,95,102,26,49,67,34,43,27,230,38, +243,108,12,48,32,198,236,76,134,202,129,198,176,251,89,103,187,29,42,19,151,114,116,251,243,43,51,136,221,47,157,80,192,35,250,4,79,204,72,127,9,126,171,28,117,212,113,204,216,92,184,244,229,43,33,113,25,204,206,142,14,53,72,177,213,254,221,35,79,204, +206,226,208,91,201,40,195,95,110,25,61,174,11,246,69,117,163,209,66,74,109,109,61,3,242,8,13,119,94,198,122,2,144,114,198,56,0,131,48,12,204,208,255,127,56,75,135,72,85,107,39,23,164,238,8,146,1,176,141,241,149,153,128,52,228,74,108,245,3,23,105,214, +200,154,85,249,172,102,128,59,57,72,123,10,16,99,95,116,201,74,188,103,252,163,136,156,125,30,4,58,85,8,121,103,85,179,191,101,252,212,234,121,115,50,135,63,87,22,14,13,112,43,52,227,150,167,220,183,248,198,230,181,51,180,254,25,120,126,2,174,17,230, +237,241,64,158,137,108,58,150,121,187,96,101,93,97,139,240,61,220,109,203,98,111,101,180,88,131,111,1,24,57,119,28,128,97,16,134,50,244,254,103,238,208,165,194,126,54,91,198,72,145,9,248,195,163,11,70,168,71,10,15,67,142,241,129,189,69,150,60,203,130, +179,77,59,208,120,182,238,179,200,210,105,254,77,205,237,106,81,95,196,33,157,115,219,127,244,204,100,164,93,84,253,90,23,200,127,57,231,40,81,229,128,194,56,106,233,104,21,116,106,228,196,226,156,36,24,11,245,186,105,111,17,162,182,232,107,235,26,34, +58,244,177,43,139,164,136,251,55,134,22,231,52,218,124,122,220,43,0,37,103,140,3,80,8,194,80,135,127,255,51,59,144,252,52,45,45,184,186,25,136,32,165,239,43,84,104,64,139,5,122,169,75,80,116,245,58,62,12,225,205,40,24,154,40,191,132,78,125,105,235,3, +81,69,116,249,149,117,119,39,79,30,165,157,194,78,48,222,181,1,53,14,120,158,250,234,179,91,164,223,207,228,130,64,48,90,199,54,3,240,19,141,110,10,98,117,232,27,213,143,148,173,48,58,35,91,104,45,86,93,167,171,183,10,156,27,84,171,30,228,164,159,208, +113,104,233,85,55,109,176,0,33,77,27,223,139,58,185,2,144,114,46,39,0,128,48,12,245,224,254,27,11,130,135,34,205,179,31,116,2,21,76,107,210,100,58,186,69,171,22,122,24,131,94,206,220,145,24,212,129,25,3,24,57,128,164,128,98,152,205,38,99,38,111,247,199, +59,178,97,68,204,32,112,137,224,106,136,198,32,96,20,186,82,17,187,91,228,211,222,164,171,123,87,110,175,133,65,120,252,64,111,86,195,232,139,147,194,135,157,110,105,157,21,128,215,77,227,33,220,127,78,88,12,50,14,6,249,101,117,212,115,34,215,22,128, +180,51,216,1,0,130,97,168,131,255,255,102,78,34,107,95,51,113,23,7,134,173,237,106,218,61,32,230,64,213,87,148,246,119,130,160,191,82,229,27,131,27,34,86,30,43,195,63,100,43,22,218,209,169,160,160,190,189,193,214,17,148,155,5,80,253,73,148,214,12,178, +207,97,153,243,127,194,255,236,45,22,80,198,115,44,247,165,79,109,102,229,181,176,218,51,5,89,85,105,94,38,87,228,203,250,97,43,199,20,196,32,182,56,191,227,220,98,147,217,251,144,236,103,134,216,67,46,1,56,59,119,28,128,65,24,134,50,244,254,103,166, +82,36,84,197,246,163,192,212,137,14,81,139,63,137,121,146,213,100,11,243,21,8,234,184,75,30,97,10,75,183,56,167,185,56,128,30,91,20,225,79,235,11,250,91,86,247,37,128,192,210,228,154,26,191,98,14,237,189,43,169,198,16,25,192,76,228,238,75,6,116,118,250, +59,96,14,114,116,47,200,216,5,22,89,208,187,29,51,213,38,49,221,77,19,34,152,245,0,30,73,4,217,190,194,210,123,237,204,213,103,149,6,117,12,207,90,215,173,220,42,25,188,107,10,192,217,149,220,0,0,130,48,30,238,63,179,63,66,122,0,97,3,67,136,213,30,240, +114,61,136,243,93,201,60,240,114,111,132,196,49,39,192,114,14,73,10,1,16,165,114,56,35,159,73,142,230,141,221,104,218,17,199,26,145,12,10,91,97,164,193,171,165,104,119,54,222,141,51,212,206,108,95,243,89,224,216,226,120,140,209,28,205,140,15,7,213,101, +192,46,148,37,54,89,122,25,175,132,14,132,214,170,80,209,160,142,171,115,149,229,151,23,40,32,188,155,100,205,10,194,23,128,178,51,70,2,24,6,97,88,135,254,255,205,205,212,1,203,42,205,156,37,151,59,8,70,49,247,184,149,44,138,80,172,254,180,163,22,152, +161,205,8,194,126,204,213,33,95,225,67,93,204,207,0,52,192,169,54,94,2,13,82,61,55,122,132,194,82,194,53,127,233,204,239,67,64,51,162,89,18,172,127,51,121,30,103,67,188,164,132,158,47,219,102,121,240,106,64,141,91,245,63,240,200,2,12,77,161,61,147,81, +156,115,74,10,173,80,219,128,44,220,143,117,129,247,188,207,122,4,224,236,76,110,0,0,129,16,232,195,254,107,246,207,0,174,118,96,140,123,6,135,205,172,156,72,82,246,247,107,50,201,120,45,77,140,183,226,100,66,146,71,121,184,148,36,149,232,74,74,88,194, +130,236,114,36,17,74,228,181,177,43,147,108,221,179,76,239,252,139,66,222,74,167,230,229,229,67,140,48,1,141,137,96,100,221,184,236,82,150,89,153,196,129,131,7,182,80,192,117,179,15,160,170,77,182,232,147,139,234,67,83,242,197,179,52,205,52,198,38,86, +2,187,167,35,0,99,103,140,3,80,8,131,208,197,251,159,249,155,252,133,148,7,118,55,213,193,88,40,149,30,220,62,137,213,155,222,239,148,142,156,234,140,200,101,18,171,198,71,125,117,95,46,118,212,87,172,181,125,14,95,98,13,207,79,41,40,219,36,202,170,57, +173,219,197,237,9,191,119,82,63,131,236,31,157,100,211,82,70,229,118,98,239,206,182,168,102,247,30,251,31,132,59,42,28,21,31,236,47,208,3,171,156,174,151,86,137,0,78,136,65,238,137,255,240,134,96,153,196,69,196,26,106,147,235,217,62,153,190,220,53,159, +0,164,157,193,13,192,48,8,3,121,116,255,153,251,139,42,99,46,70,29,33,40,17,196,192,249,57,68,241,107,198,182,71,173,1,204,80,1,96,112,170,169,120,197,37,212,156,167,87,39,84,163,156,57,149,168,175,224,175,212,161,14,50,83,252,181,157,237,105,106,69, +203,79,34,243,211,29,108,43,233,115,195,223,234,85,192,125,146,239,167,173,225,97,80,133,59,208,82,54,91,169,92,174,4,120,61,87,219,225,179,63,2,176,156,180,134,145,60,243,91,205,204,203,70,245,21,128,180,243,184,1,0,132,97,32,15,246,159,153,31,66,57, +219,68,192,6,160,160,52,151,201,54,94,122,0,12,131,190,14,194,224,78,199,206,145,121,164,199,86,150,43,227,204,204,233,22,49,214,79,128,68,25,67,4,60,6,19,29,117,123,202,82,192,117,134,37,212,36,141,236,250,15,223,22,203,77,175,132,159,243,80,136,5,38, +162,11,0,105,9,63,20,104,133,42,242,121,154,40,159,203,241,220,155,166,102,78,249,142,233,100,223,43,136,5,177,2,146,16,216,0,91,94,2,112,118,198,54,0,132,48,12,164,248,253,103,166,67,145,125,182,30,58,26,132,80,8,16,18,206,159,128,193,196,72,253,51, +185,11,149,162,45,125,167,23,221,82,12,140,11,38,244,124,120,74,89,67,9,255,48,183,159,106,75,146,110,148,91,23,113,93,8,102,199,20,116,186,193,58,40,250,214,81,31,82,128,43,19,105,223,6,253,223,183,203,111,160,228,113,242,76,172,61,89,198,246,75,103, +195,124,71,232,124,36,89,156,232,165,24,228,166,35,90,38,85,74,247,18,81,110,94,88,74,129,252,108,111,1,56,59,151,20,0,64,16,136,182,232,254,103,46,8,66,230,99,67,23,104,97,152,163,166,111,74,121,89,157,167,225,141,176,198,112,229,247,38,2,187,66,235, +48,139,116,207,57,251,46,147,249,57,57,128,0,249,146,83,43,205,231,133,106,110,48,168,155,48,185,121,35,0,17,193,92,144,188,185,222,245,200,118,233,36,30,235,232,110,33,144,59,100,117,72,151,8,57,229,61,172,82,186,214,19,232,34,155,142,46,228,124,3,78, +56,212,73,77,193,176,60,249,237,5,176,212,176,167,0,32,156,44,7,248,61,93,2,144,118,70,41,0,128,48,8,221,253,79,221,79,68,204,167,13,186,64,16,140,205,116,230,118,245,41,50,15,75,151,154,105,27,46,230,232,244,155,71,81,109,15,5,133,50,38,144,172,136, +84,76,50,13,201,16,1,236,160,255,79,203,26,11,8,21,93,85,191,158,142,244,225,3,251,103,122,231,7,194,240,87,79,28,80,195,246,228,182,194,144,36,66,98,12,181,27,68,194,237,168,195,5,186,20,13,244,104,42,1,233,28,162,40,203,57,4,218,194,118,85,20,211,46, +134,43,176,173,155,44,1,24,187,147,28,0,66,16,136,162,44,250,254,103,118,71,58,177,120,232,5,52,193,32,50,212,255,34,115,234,241,218,173,143,15,202,164,208,222,143,189,177,107,230,9,165,84,104,173,78,147,27,197,65,32,32,55,98,204,137,242,76,247,132,68, +125,161,53,49,137,168,103,237,182,90,99,90,200,28,121,193,100,96,40,182,69,238,77,239,194,94,205,152,109,28,6,109,38,19,113,44,186,9,128,0,226,184,39,126,19,149,112,154,214,164,249,131,128,38,58,72,123,46,80,79,143,0,156,157,49,14,128,48,12,3,59,240, +255,55,119,64,138,34,159,99,181,101,5,49,64,68,168,115,181,63,89,190,214,125,101,232,106,91,25,235,53,88,163,216,198,43,201,28,22,84,228,147,234,252,19,35,138,153,175,244,111,49,154,200,121,162,212,50,173,153,204,222,150,203,114,188,101,141,15,163,80, +223,14,171,167,4,219,149,160,107,134,17,102,230,115,237,219,225,90,201,10,215,25,124,182,27,79,248,21,174,121,86,175,183,28,4,28,200,25,57,37,191,244,93,86,100,29,178,11,46,151,50,214,77,129,168,85,81,234,154,28,116,38,218,173,174,220,2,80,118,46,57, +0,132,48,8,221,204,253,207,236,206,152,194,131,206,21,154,168,148,159,159,21,72,130,203,117,67,20,107,18,222,174,115,170,91,4,104,116,199,122,223,106,106,28,36,64,168,226,71,46,47,165,177,210,150,174,253,13,35,170,76,190,0,173,54,222,56,64,54,234,108, +208,252,44,226,219,95,37,127,233,198,241,197,163,10,96,54,49,73,103,134,44,76,22,183,210,134,88,9,249,234,230,24,58,194,203,4,231,194,232,138,172,169,132,175,202,174,53,154,253,78,239,8,192,217,181,227,0,20,130,176,55,200,253,175,236,102,76,127,54,111, +115,53,33,64,105,41,107,102,36,166,133,84,212,159,64,253,204,158,86,198,219,16,16,238,66,51,128,159,128,36,217,179,197,173,109,241,184,56,252,130,25,123,103,97,230,202,224,221,179,241,14,182,203,235,191,121,123,103,246,216,188,27,178,173,148,0,114,239, +253,4,119,0,205,26,245,49,92,115,105,180,33,129,255,115,35,73,8,185,195,35,112,150,151,70,250,165,2,66,22,206,76,60,203,240,14,124,214,22,128,180,51,198,1,0,4,97,224,226,255,223,236,198,192,245,208,232,7,76,76,16,44,180,101,113,37,8,139,170,45,9,172, +57,31,187,29,69,126,56,222,156,50,225,214,3,143,228,31,246,255,110,252,143,163,125,154,13,78,153,233,184,68,36,102,162,99,241,180,223,83,68,248,159,40,96,142,105,155,134,60,216,123,93,34,2,179,232,164,222,214,128,113,140,132,214,20,48,214,77,180,138, +103,81,109,0,59,178,146,6,121,130,129,187,57,177,114,163,12,1,166,61,126,211,237,199,121,124,29,178,5,96,237,140,113,0,10,65,24,218,193,251,159,249,15,46,10,125,85,147,191,25,39,7,18,176,192,235,40,185,52,115,181,8,203,219,115,181,22,0,14,253,91,180, +155,97,245,197,172,163,98,89,238,201,236,37,12,47,11,88,168,217,10,70,128,94,203,124,56,170,204,9,252,162,157,3,253,203,104,141,125,246,189,170,119,175,104,60,217,117,190,90,21,91,173,215,118,118,169,60,36,139,36,219,250,177,34,162,29,185,11,49,22,168, +205,61,252,10,80,59,56,53,103,161,141,80,148,243,240,9,192,217,25,221,0,16,194,32,244,246,159,218,191,139,82,120,181,46,160,137,169,198,2,133,99,164,87,94,95,33,180,210,84,47,11,251,172,160,69,182,216,211,90,65,36,127,35,126,6,138,139,15,162,5,222,108, +82,184,180,42,22,131,145,154,171,89,206,22,146,96,168,230,1,129,31,181,238,163,149,71,98,190,100,40,80,61,176,147,230,66,210,214,192,169,181,226,181,109,54,244,215,169,158,146,173,59,119,46,150,168,230,47,97,181,147,1,72,216,94,195,63,177,51,17,159,75, +0,214,206,24,7,0,16,132,129,14,254,255,205,58,18,218,94,212,184,58,25,13,104,75,161,211,118,80,212,225,115,80,126,215,83,104,172,161,109,42,76,242,97,72,132,135,168,53,213,72,85,62,100,101,100,22,56,212,60,101,233,40,29,177,168,198,187,154,41,216,79, +242,48,144,222,30,94,192,20,64,20,125,172,65,36,174,164,129,100,125,117,108,148,130,90,14,254,179,246,222,111,45,18,212,156,43,237,167,233,8,45,111,98,71,235,3,235,52,194,76,212,170,163,1,35,163,189,178,4,160,236,220,109,0,8,97,24,74,113,251,207,124, +29,178,98,63,3,11,32,10,148,16,255,242,69,61,89,212,57,105,179,29,187,7,163,197,170,227,168,132,171,21,31,152,227,130,101,134,36,182,63,90,250,199,138,241,72,218,123,213,215,154,234,236,244,112,1,147,90,153,184,128,163,188,151,32,168,215,146,113,31,194, +217,163,217,215,123,172,96,79,212,163,185,172,164,39,81,186,28,193,207,59,151,149,28,71,254,60,226,31,109,213,245,80,5,147,210,206,161,106,218,155,58,190,47,175,33,119,46,211,28,34,93,61,237,23,128,179,107,89,1,0,4,97,30,250,255,111,238,16,136,184,71, +214,57,8,10,89,83,215,92,181,11,122,13,14,122,209,39,238,113,134,137,119,212,136,23,59,93,213,149,85,229,86,63,231,131,138,46,232,112,72,42,221,53,193,151,112,48,28,200,217,96,34,6,30,234,134,189,127,91,247,206,187,54,158,124,78,178,146,212,104,52,128, +83,172,205,168,98,140,18,132,38,161,84,253,138,109,66,4,26,243,192,134,254,255,95,79,138,24,129,213,251,36,234,170,180,20,66,242,72,141,3,115,169,37,212,117,195,45,0,103,103,112,3,0,8,194,64,30,236,63,179,223,6,174,64,220,64,141,26,168,181,151,152,160, +128,174,134,46,107,15,214,78,71,203,193,174,44,40,229,226,168,72,99,248,215,28,233,131,123,20,185,148,97,8,80,238,115,69,121,58,41,151,2,18,84,21,204,180,86,61,31,89,253,107,97,245,173,228,173,133,0,14,56,51,7,180,105,49,125,205,194,94,220,40,105,250, +195,18,17,192,248,32,162,34,57,250,118,81,23,212,41,168,119,51,154,49,60,26,219,15,59,23,183,170,14,100,128,61,166,59,8,79,0,206,206,29,7,96,24,132,161,30,42,238,127,228,14,149,170,10,127,160,89,51,101,128,16,131,252,184,170,202,109,152,253,70,100,19, +36,210,136,198,87,124,51,179,57,141,92,151,69,170,253,108,180,10,127,99,54,123,141,184,33,169,45,67,14,56,174,185,44,8,146,2,44,75,19,38,200,52,214,52,238,131,166,224,1,162,115,243,42,57,203,38,252,90,199,192,137,10,152,166,176,69,135,133,173,52,158, +178,49,46,108,115,230,96,110,19,238,13,213,251,239,128,9,19,15,30,209,8,243,28,222,2,112,118,37,55,0,128,48,168,15,247,159,217,175,41,103,156,161,138,10,2,135,222,61,134,185,113,80,45,140,21,93,102,23,189,176,164,168,142,197,247,162,226,138,46,104,69, +16,170,22,221,169,77,129,102,108,20,113,71,87,187,99,209,138,89,94,125,195,207,199,185,29,95,152,198,80,216,87,137,120,174,167,177,238,199,24,98,53,211,8,166,49,6,150,254,221,86,248,210,164,36,161,82,182,152,57,170,106,33,205,73,51,66,40,177,173,160, +249,10,64,218,153,28,1,12,2,49,204,143,244,95,115,126,25,102,45,27,146,180,192,189,96,164,107,168,53,68,25,38,108,56,196,123,165,20,93,95,14,214,82,25,75,104,247,165,171,254,20,70,36,38,154,146,135,138,7,147,54,221,165,83,80,42,10,66,37,237,208,113,165, +210,254,121,213,255,193,249,171,151,64,113,29,208,105,203,131,203,216,229,124,108,164,139,39,239,196,33,183,41,129,194,115,141,82,122,90,243,57,178,18,126,157,197,140,199,192,39,186,142,12,200,237,33,87,249,131,131,200,104,114,11,192,217,25,172,0,0,130, +48,180,67,255,255,205,157,18,217,214,76,239,18,68,32,230,244,109,103,48,6,156,14,38,74,30,95,151,135,183,101,86,102,215,65,185,71,32,245,51,214,54,60,186,223,128,77,249,133,128,235,236,105,159,229,70,10,220,49,204,124,124,161,43,29,172,90,40,212,129, +64,104,2,186,218,234,64,155,252,41,131,95,188,115,217,24,146,4,39,248,138,71,76,228,2,182,244,144,190,111,101,166,131,137,248,117,215,201,192,228,194,20,143,178,153,93,14,35,173,111,196,43,79,220,28,1,24,59,131,27,128,97,24,4,250,145,253,103,206,207, +138,194,129,189,64,251,105,104,132,241,113,116,224,236,96,128,33,111,244,189,64,139,165,81,38,177,193,70,37,60,176,220,156,241,230,12,200,220,0,243,253,118,240,66,136,117,8,8,75,121,161,35,203,79,95,213,182,214,36,159,49,162,27,50,39,1,224,177,233,50, +28,125,7,231,219,149,20,87,188,3,212,140,111,198,13,104,244,167,81,211,251,33,189,132,211,180,111,23,193,112,243,32,189,102,35,3,218,169,121,153,37,23,60,71,106,207,111,50,29,14,150,117,5,96,236,140,113,0,128,65,16,232,255,95,221,177,6,15,194,222,85, +115,21,148,239,240,115,140,23,110,137,237,110,23,0,120,40,72,219,221,51,44,181,223,64,107,65,221,117,250,133,19,29,69,16,158,98,175,94,156,130,205,4,17,13,88,219,64,218,35,64,179,93,59,209,13,217,123,209,67,247,201,76,33,122,24,34,36,118,124,151,195, +209,128,198,53,104,98,141,185,219,237,161,19,185,207,20,190,185,161,26,142,101,176,200,69,23,192,24,18,140,123,193,49,199,19,128,179,107,217,1,0,130,97,14,254,255,155,221,154,165,15,27,119,49,33,161,155,118,221,169,145,8,129,97,109,162,76,224,100,168, +243,107,141,104,172,128,225,201,116,209,234,67,170,203,10,6,220,185,89,132,101,170,86,132,140,131,236,74,90,153,218,10,214,78,218,163,242,163,176,55,135,244,79,183,70,91,2,24,126,4,172,192,25,211,20,172,174,68,223,100,64,235,86,199,129,112,214,108,7, +167,76,250,92,157,141,50,83,170,49,107,189,204,146,202,18,14,181,20,221,203,6,234,131,4,218,78,178,48,172,177,142,0,164,93,203,10,0,32,8,243,208,255,127,115,135,64,98,115,83,176,99,116,19,67,230,30,39,179,110,125,196,165,41,48,91,151,168,84,31,198,111, +21,241,176,4,135,224,163,1,8,71,149,36,239,243,125,185,50,28,66,250,204,69,85,144,108,58,136,112,47,25,21,61,16,46,247,221,110,124,208,77,136,93,88,245,81,43,173,85,78,16,49,51,23,219,196,221,182,48,42,179,218,126,32,64,9,198,91,143,208,146,44,168,140, +201,97,20,5,121,248,112,217,236,39,50,191,221,120,231,10,64,217,21,35,1,0,130,160,255,255,186,193,41,64,192,198,70,243,204,0,233,27,233,5,230,176,84,152,65,52,183,169,3,89,2,61,242,44,77,203,165,127,94,147,13,160,180,105,16,111,104,195,128,146,137,169, +12,71,43,91,18,216,228,90,30,39,231,99,45,240,250,194,18,171,55,68,90,52,144,40,145,26,15,173,249,129,223,43,235,193,168,138,252,150,79,130,35,236,230,54,107,172,49,224,89,33,175,195,237,67,122,25,73,3,52,156,122,52,22,29,63,1,56,59,119,28,0,66,16,136, +82,120,255,51,111,103,144,153,7,186,165,149,49,209,128,243,99,217,178,54,166,56,111,183,80,64,84,176,182,247,58,80,61,43,147,45,5,93,72,254,172,150,143,83,171,111,255,216,86,188,64,182,156,177,184,5,251,201,40,174,167,52,171,249,32,205,43,29,137,198, +167,123,223,207,65,26,151,151,9,34,63,82,250,85,72,102,65,1,219,184,82,28,251,77,85,108,36,170,10,244,20,166,57,64,51,155,49,227,112,137,131,4,27,55,189,146,250,68,201,42,66,36,63,129,41,123,139,79,0,230,206,29,5,0,16,134,161,29,188,255,153,29,10,82, +242,169,117,211,201,77,65,68,147,198,231,106,200,121,206,14,96,83,138,55,85,149,103,57,215,84,22,210,132,31,102,200,171,234,6,187,225,137,42,39,35,140,87,166,56,56,183,147,19,47,76,206,79,102,48,195,160,65,160,190,53,25,244,171,38,151,102,66,76,149,160, +238,48,113,61,169,162,83,232,193,23,15,236,58,51,66,6,100,151,252,103,69,190,245,0,123,184,183,229,161,248,237,64,230,205,229,223,21,80,122,21,121,58,91,0,222,206,24,11,0,16,4,161,222,255,212,13,53,248,80,126,185,180,181,57,85,10,2,7,237,175,79,75,110, +179,221,94,29,111,131,49,199,14,195,109,107,197,9,208,113,171,129,23,25,179,52,11,251,0,41,75,188,161,20,19,35,10,199,6,183,174,117,181,180,240,127,215,9,235,243,101,158,54,222,47,206,156,140,56,140,74,131,51,165,67,4,3,69,159,249,174,10,177,45,233,61, +206,21,54,186,68,236,170,112,145,15,134,211,174,156,25,185,128,232,50,221,47,1,40,59,131,27,128,65,24,6,230,209,253,103,230,129,84,161,248,108,194,2,32,74,11,53,38,231,79,177,65,120,158,95,134,91,62,84,191,142,139,140,33,109,117,187,68,93,99,148,245, +127,126,219,58,197,251,85,78,38,101,211,91,137,128,37,89,29,90,182,164,76,37,116,170,157,138,115,33,75,57,131,248,181,200,215,85,55,230,31,180,57,11,96,207,206,233,191,168,90,196,52,14,28,166,139,111,70,163,123,242,118,225,39,125,213,74,205,23,119,143, +5,87,183,70,112,58,55,54,180,21,50,159,51,56,223,187,229,37,0,101,103,112,3,0,8,194,64,30,238,63,179,190,140,161,244,64,55,208,104,98,161,92,151,234,88,184,151,154,87,235,236,253,48,75,228,8,63,101,109,60,177,144,157,161,40,49,97,239,59,124,75,238,144, +112,48,148,57,110,188,84,155,148,74,161,113,62,8,48,53,65,43,4,212,108,59,141,255,133,247,13,15,62,154,240,66,24,43,170,121,155,12,116,230,18,131,107,209,195,183,130,183,207,233,137,109,8,237,60,162,210,237,180,100,225,68,53,179,168,186,59,169,75,61, +147,179,182,0,164,157,49,14,192,32,12,3,25,248,255,135,179,116,168,20,149,96,31,65,221,216,145,136,147,152,243,76,11,218,49,141,107,24,115,149,123,201,128,192,207,142,40,25,198,176,95,216,123,136,8,87,7,118,62,20,131,6,74,98,119,115,216,206,48,214,35, +191,201,25,108,82,243,59,108,235,31,249,221,153,231,245,199,10,87,130,2,204,231,37,33,71,238,89,29,27,71,246,104,223,212,29,206,222,234,211,181,185,66,20,16,158,219,155,20,226,19,164,12,141,213,240,47,139,144,20,104,208,210,230,39,229,71,0,206,206,29, +7,0,16,132,161,12,222,255,204,14,38,134,216,87,32,174,78,26,81,62,45,101,185,242,18,142,70,127,220,148,34,34,46,113,117,241,115,78,209,29,217,75,69,90,115,95,253,57,228,220,254,16,101,9,146,232,112,188,221,32,206,22,134,18,245,151,81,128,157,58,219,123, +14,233,181,117,199,161,35,109,227,225,191,175,71,133,15,241,41,58,52,17,231,91,61,131,91,208,157,230,107,69,26,8,26,9,110,236,18,129,21,76,113,90,201,154,141,22,148,121,108,27,83,157,184,32,78,17,38,164,110,101,11,192,217,181,172,0,0,194,160,29,250,255, +111,46,8,34,230,35,233,210,125,193,134,76,167,163,152,66,72,17,69,20,39,63,227,220,104,217,173,224,253,155,244,234,22,1,243,77,251,37,89,168,222,46,146,90,238,249,147,44,69,65,171,236,244,86,194,45,221,45,48,50,65,198,43,108,182,164,51,191,25,196,68, +151,17,130,136,243,237,138,237,71,74,31,199,7,6,99,208,189,111,131,238,72,197,209,37,57,221,173,80,237,153,241,65,86,46,227,165,19,56,188,19,1,78,34,3,1,158,43,152,245,78,1,56,59,99,36,0,66,16,6,82,220,255,31,76,117,173,195,146,76,180,183,194,81,32,36, +228,235,238,80,82,58,8,97,12,253,186,204,140,235,199,149,244,122,60,152,193,229,228,228,92,165,89,214,201,148,226,16,104,29,36,130,83,233,236,147,182,170,104,214,117,230,5,111,111,31,246,178,142,61,21,155,231,94,65,241,207,228,25,213,93,231,116,148,100, +162,65,83,109,26,189,172,14,8,202,162,39,100,212,169,27,103,177,237,17,25,3,194,25,196,206,48,11,125,111,53,126,186,243,252,47,0,101,103,140,3,0,8,131,64,7,255,255,102,55,67,4,78,93,29,220,170,64,75,153,110,108,142,169,21,87,96,163,132,205,227,16,116, +20,183,249,19,119,89,70,6,24,55,142,12,89,170,5,119,250,152,64,147,208,14,3,79,76,80,131,122,115,95,103,139,27,209,201,40,168,25,8,219,251,173,216,23,2,15,39,176,103,254,171,47,232,125,242,246,180,113,152,154,210,215,134,155,98,159,143,199,150,35,141, +133,204,133,38,163,70,80,195,65,93,215,63,56,10,19,176,203,56,42,202,10,22,150,0,164,156,49,14,0,32,8,3,25,252,255,155,29,76,12,41,109,193,56,59,26,42,212,114,203,7,221,232,136,174,28,20,83,24,199,86,52,177,153,43,222,170,147,1,85,130,109,71,72,215,83, +45,207,64,69,163,160,10,103,76,121,196,144,232,174,23,6,12,95,152,228,115,204,193,44,50,135,166,42,180,200,211,182,230,255,87,128,158,100,136,114,19,38,115,4,77,173,133,198,61,154,15,157,218,177,43,39,120,18,60,87,172,46,149,52,5,52,30,28,13,125,19,15, +237,54,18,147,223,212,45,0,103,87,146,3,0,4,196,252,255,213,14,68,154,233,50,120,129,68,194,148,110,187,171,47,119,122,5,245,75,17,240,186,66,53,188,35,207,121,96,208,129,250,121,71,218,183,124,149,171,97,231,105,227,154,88,217,179,132,174,175,0,32,131, +119,69,202,34,248,181,223,114,111,89,55,154,227,34,254,4,60,79,134,191,113,157,228,149,43,183,157,0,22,81,131,203,92,185,71,37,37,118,157,187,234,228,38,200,103,32,127,9,201,176,150,16,209,19,40,243,66,142,226,100,146,152,183,173,18,89,107,77,1,40,187, +98,36,0,64,16,196,208,255,63,236,210,234,41,34,254,160,178,227,48,3,94,68,192,75,104,45,102,160,215,219,83,150,78,211,178,181,35,0,117,242,155,112,58,15,144,215,209,139,96,86,104,121,236,147,242,183,119,89,148,121,102,95,42,125,224,215,254,115,5,5,71, +67,10,25,211,230,192,193,105,95,221,42,18,118,22,40,165,132,244,169,216,212,23,78,77,138,0,148,92,235,46,244,40,21,199,229,171,21,54,43,135,124,98,61,41,152,114,141,194,182,190,0,156,157,193,13,0,32,8,3,121,184,255,204,126,129,150,195,232,2,26,131,6, +11,246,142,13,104,174,156,67,226,1,180,176,168,189,244,90,195,0,251,237,188,146,166,246,217,51,60,41,249,54,83,178,60,89,0,138,194,21,208,196,133,233,35,99,158,2,250,160,20,7,252,81,201,143,205,111,147,129,188,204,144,249,24,150,131,98,105,232,49,51, +237,172,227,187,170,235,47,24,136,149,147,19,21,172,220,210,251,108,212,219,126,181,216,231,55,123,7,170,30,164,151,242,68,49,179,123,203,241,115,5,224,236,92,110,0,0,65,24,202,193,253,103,246,74,232,107,53,184,130,49,197,210,207,113,66,148,1,209,14, +153,245,206,156,57,185,76,100,74,191,179,49,116,97,243,175,3,37,151,253,28,12,127,89,12,231,138,12,48,239,240,103,203,152,137,198,50,209,17,59,98,239,249,242,17,78,115,196,232,238,104,119,107,145,228,30,243,51,112,209,141,101,126,106,215,233,67,34,186, +241,243,207,92,163,239,209,171,211,25,71,204,167,127,150,106,235,194,162,196,26,164,163,74,87,10,252,240,59,200,223,95,1,72,59,99,28,0,64,16,6,254,255,215,198,197,16,184,22,130,155,171,209,80,40,165,220,193,158,185,86,116,232,123,223,26,140,25,194,15, +191,102,140,68,200,20,120,199,107,188,145,106,156,98,174,56,28,227,81,207,108,150,171,155,233,233,157,55,246,90,11,176,48,252,252,225,17,234,58,51,92,155,157,220,123,159,154,219,23,152,190,61,134,41,61,146,133,21,81,90,247,247,132,106,74,107,84,17,49, +133,42,108,78,69,176,81,218,92,95,3,198,243,17,128,180,115,185,1,0,132,65,232,197,253,103,246,214,152,242,192,223,0,30,140,105,85,40,48,50,76,133,58,231,86,180,213,243,182,100,91,214,135,96,30,131,243,54,196,203,19,45,113,179,153,113,152,139,8,12,159, +123,68,184,114,109,51,11,25,101,112,217,207,255,100,222,131,200,231,4,48,187,234,80,14,126,215,80,35,205,62,70,160,20,19,172,234,153,173,71,140,243,105,250,155,83,139,209,64,205,174,178,185,182,35,164,210,176,197,92,153,53,170,177,141,139,21,211,158, +85,171,166,0,172,157,81,10,192,32,12,67,253,216,253,207,236,199,96,132,188,180,42,243,0,115,104,33,52,181,125,62,113,108,168,199,152,235,225,190,59,100,141,180,162,47,196,86,135,202,242,69,61,230,220,117,37,192,180,115,140,162,218,111,91,45,230,135,167, +247,219,61,129,111,9,50,57,74,185,119,72,100,127,140,250,149,175,180,53,219,56,133,177,4,160,121,19,183,96,247,172,28,57,167,238,47,121,65,84,183,216,74,28,227,56,132,239,248,245,158,239,252,203,224,133,166,41,12,37,193,190,177,150,105,143,217,154,149, +152,2,176,118,5,57,0,128,32,168,67,255,127,115,183,102,32,168,91,63,112,171,97,161,192,46,173,251,58,10,45,238,99,37,203,10,184,168,40,198,245,230,147,43,145,143,41,9,154,131,81,113,131,35,34,59,61,168,13,136,148,131,137,240,7,166,212,233,255,37,194, +238,29,198,194,241,79,103,108,62,78,247,75,230,79,147,172,238,107,99,96,81,127,228,86,162,34,100,56,226,42,62,13,22,101,85,152,84,101,53,155,224,26,212,173,78,153,127,229,70,169,160,13,238,158,241,234,50,6,249,71,0,206,206,32,7,96,16,4,130,61,248,255, +55,247,64,66,8,204,46,182,87,15,198,104,16,36,235,206,193,34,103,54,93,48,222,176,17,82,175,37,243,223,160,249,153,77,157,70,6,140,106,185,225,217,32,206,189,133,186,201,72,129,145,188,81,155,248,29,127,8,221,149,228,134,88,94,186,39,162,177,132,135, +11,255,75,188,74,37,233,111,144,79,245,194,58,167,255,22,173,60,29,240,225,141,209,98,0,74,138,249,59,151,93,95,31,168,58,51,62,238,19,194,181,158,5,154,56,215,2,118,69,134,41,90,145,210,20,199,248,43,0,103,103,148,3,0,8,130,208,238,127,234,126,155,242, +16,59,64,91,31,97,162,12,68,92,215,88,182,189,163,192,219,194,201,229,217,152,85,46,41,147,161,6,249,116,157,68,10,178,184,22,118,227,49,230,73,19,61,83,35,118,216,186,238,229,176,255,195,240,214,8,36,231,14,221,18,183,52,122,62,135,211,124,143,225,37, +41,171,231,128,218,93,142,223,40,148,137,186,155,176,249,162,21,120,225,74,116,246,213,155,119,192,94,1,72,59,131,27,0,64,24,4,126,220,127,102,227,207,32,135,65,119,168,166,4,202,13,1,9,219,222,168,28,167,123,155,140,80,242,27,200,228,54,198,32,140,176, +92,108,118,197,111,10,95,101,73,163,141,107,66,184,24,242,8,172,145,30,32,147,150,44,210,26,248,85,4,171,149,235,159,159,11,181,197,237,154,72,90,107,78,18,28,209,31,229,208,51,24,43,217,144,162,105,145,123,48,155,254,182,239,86,252,66,90,64,168,141, +167,21,92,180,79,201,63,59,5,96,237,140,113,0,0,65,24,232,224,255,223,236,102,8,244,176,33,206,234,160,49,161,148,82,118,45,44,63,229,147,102,26,38,197,179,18,26,52,85,125,114,47,163,224,185,192,125,152,106,185,178,21,223,180,172,37,249,132,20,2,209, +29,35,41,208,243,225,206,131,15,150,190,108,243,83,131,8,191,229,248,70,98,142,73,198,39,63,134,12,206,18,154,197,6,13,95,231,154,128,67,181,232,72,228,197,108,32,85,21,231,53,246,173,126,31,231,61,117,4,224,236,220,82,0,6,129,24,184,31,189,255,153,91, +40,20,73,38,177,237,5,68,97,209,125,36,227,33,252,105,239,108,111,21,96,197,17,189,205,183,95,54,111,18,129,3,127,242,195,33,48,58,49,82,180,57,28,66,130,105,229,195,248,219,238,162,78,236,105,173,139,223,66,49,132,127,245,219,173,92,202,197,172,145, +106,168,242,67,233,84,112,240,215,233,224,117,94,4,84,118,217,207,100,148,101,17,207,99,172,74,6,46,115,101,228,68,76,118,221,186,185,240,119,149,228,58,92,87,181,99,227,166,100,58,207,246,228,20,167,0,148,157,49,14,192,32,12,3,25,250,255,55,119,96,65, +57,251,74,119,36,36,20,25,97,39,199,67,198,120,60,62,7,18,137,103,35,160,18,146,219,168,217,220,69,16,197,171,227,86,89,55,159,100,117,178,125,22,104,16,228,165,141,2,138,6,36,81,168,103,241,53,245,241,110,191,230,117,93,62,1,252,106,250,43,220,247,113, +163,143,114,70,225,16,18,81,3,221,55,127,206,253,48,255,93,254,204,41,219,120,242,104,48,141,210,28,123,195,153,2,250,17,141,17,131,145,164,210,215,219,139,95,1,56,59,115,28,0,66,24,6,54,252,255,205,116,209,10,143,71,209,82,209,208,68,57,145,237,156, +37,73,35,69,130,145,138,148,127,129,40,185,57,86,19,45,180,204,17,168,35,44,69,30,237,229,219,212,30,153,52,196,153,201,206,227,231,180,89,183,197,21,54,168,13,197,185,108,242,151,28,59,47,230,255,198,1,231,237,101,134,21,80,83,162,89,113,110,207,120, +155,70,3,221,64,248,236,56,62,52,241,226,246,176,45,231,20,224,108,227,143,44,125,233,219,91,53,22,192,220,175,0,164,157,89,14,0,33,8,67,189,255,169,157,196,68,77,151,231,199,156,192,13,17,105,41,71,183,31,20,59,156,44,237,127,215,120,222,64,161,139, +89,141,216,44,193,241,112,87,98,147,73,50,85,65,246,194,153,54,177,70,170,169,41,200,18,62,47,219,2,126,78,161,11,168,121,51,70,184,204,131,177,0,14,1,158,183,250,15,214,232,54,215,148,72,182,171,221,74,56,98,45,11,37,133,254,46,242,14,143,212,18,58, +150,21,136,109,136,196,253,120,105,213,193,62,251,187,210,88,176,16,201,187,233,70,191,211,132,94,60,151,124,143,62,5,224,236,12,82,0,8,97,24,232,97,255,255,225,94,188,45,165,201,68,244,3,130,162,213,134,56,249,70,210,94,248,113,73,72,15,27,56,115,148, +175,40,15,171,15,162,22,23,171,246,235,234,216,202,29,180,147,208,235,134,45,107,85,101,10,141,182,175,199,62,223,170,26,4,145,117,226,26,95,29,75,34,112,231,2,65,226,249,91,231,79,92,230,223,166,62,74,33,245,32,193,243,23,48,237,26,167,49,20,34,130, +205,118,90,20,97,179,116,155,81,34,131,125,150,142,198,132,174,76,245,227,244,133,202,30,243,37,84,159,45,0,101,87,114,3,0,8,131,124,184,255,204,254,26,194,149,58,3,90,161,66,123,75,4,34,13,30,63,97,172,202,128,161,123,50,10,113,234,175,116,218,139,216, +91,122,221,179,104,215,155,105,67,69,1,176,90,253,200,20,122,18,177,27,95,48,230,35,232,254,47,169,184,149,181,93,240,171,157,38,153,255,55,109,160,95,18,177,47,22,74,191,113,42,28,125,9,17,115,214,144,207,28,15,69,220,218,132,58,109,76,65,210,82,70, +83,59,51,233,47,155,239,78,128,90,20,144,138,226,209,122,2,112,118,238,88,0,130,64,12,220,194,251,159,217,206,135,201,36,40,61,221,2,251,9,67,174,181,76,197,93,142,19,245,179,10,16,137,8,23,246,139,75,169,235,249,120,89,164,17,142,156,144,21,168,74,233, +186,48,97,243,182,0,74,190,90,242,64,29,125,227,18,248,245,189,86,199,22,169,144,60,219,179,90,126,64,57,214,249,38,80,88,147,25,109,9,40,102,123,228,243,189,171,23,94,160,111,96,188,119,126,169,84,197,88,105,235,155,44,58,52,142,186,61,226,110,132,139, +78,144,207,202,91,0,210,206,32,5,96,16,136,129,30,250,255,55,247,38,75,102,76,133,158,61,40,8,186,102,99,230,9,7,203,92,214,246,255,132,103,104,213,80,68,189,55,84,77,81,100,0,219,164,197,96,199,161,104,152,199,241,223,73,6,138,205,163,16,165,74,33,37, +37,126,97,208,134,223,222,140,153,17,86,220,144,189,246,46,48,207,75,2,218,201,199,253,51,48,75,75,229,130,223,101,215,141,161,76,219,50,48,141,210,203,190,81,51,111,231,164,119,126,90,182,227,65,90,34,122,184,212,123,228,113,212,146,250,118,8,6,169, +22,17,228,11,207,25,95,1,56,59,99,20,0,64,24,6,58,248,255,55,59,8,34,77,114,69,71,69,112,211,54,189,166,179,5,200,84,51,176,154,68,194,129,216,141,52,21,180,19,92,172,70,128,128,58,91,19,53,128,34,213,219,211,210,132,133,201,177,253,142,108,234,88,38, +85,105,18,248,205,210,181,221,217,140,6,164,192,199,114,175,31,225,0,48,99,96,77,81,244,188,164,68,190,222,216,190,83,112,236,24,248,232,127,107,135,103,142,48,69,7,66,128,84,22,189,151,39,213,183,109,181,144,122,239,205,37,0,105,215,150,3,0,8,130,186, +255,169,251,233,131,201,67,182,46,208,86,203,18,17,124,6,158,92,75,116,77,14,43,127,208,168,71,100,167,80,121,40,35,138,240,54,52,45,22,188,17,7,104,157,98,31,65,163,100,161,131,113,210,58,166,66,2,206,254,199,40,243,237,188,126,182,30,253,49,2,200,51, +17,3,208,96,17,36,150,87,93,162,206,156,255,1,205,24,151,3,74,243,172,241,253,72,98,75,190,71,60,23,115,136,118,28,80,231,144,14,128,2,221,62,78,148,135,95,1,72,59,99,28,0,64,24,4,58,248,255,55,187,25,34,61,218,68,103,55,77,165,20,97,223,136,30,218,49, +116,107,105,205,106,189,40,184,154,173,196,186,196,126,5,52,171,210,128,86,198,83,150,109,250,179,113,15,38,91,134,145,51,34,221,111,53,126,35,37,194,255,154,123,120,124,230,112,231,199,223,3,246,8,238,181,156,171,186,164,148,67,245,5,209,119,33,16,85, +249,136,71,169,21,218,177,57,56,114,157,178,135,214,249,176,67,73,165,48,74,40,121,119,138,6,61,2,144,118,230,54,0,128,48,12,108,216,127,102,90,43,23,142,111,1,138,8,144,227,196,246,200,198,94,228,241,146,178,232,179,74,105,245,87,198,195,62,77,117,135, +243,212,249,20,25,70,27,31,148,192,91,228,12,133,65,40,23,119,171,87,59,223,168,105,125,236,158,159,223,97,123,41,32,252,231,167,240,105,142,236,213,48,212,124,229,164,192,10,95,209,120,100,184,72,39,37,184,96,178,59,187,87,191,57,180,226,166,229,70, +218,129,56,30,108,205,17,189,116,121,200,20,128,180,115,185,1,0,4,97,232,197,253,103,246,102,8,165,175,81,71,48,65,160,159,148,21,119,57,54,36,69,194,185,246,69,77,41,25,21,245,113,234,42,154,85,245,130,175,6,84,23,109,205,204,112,214,11,64,92,99,152, +167,107,231,87,203,84,188,181,248,51,141,129,11,128,73,18,191,113,212,107,157,48,193,89,76,14,3,115,186,25,240,20,250,186,227,123,29,125,83,111,10,37,88,131,129,140,208,67,117,45,250,205,213,164,238,191,16,24,217,160,238,22,128,178,51,198,2,24,132,65, +168,67,239,127,230,14,46,45,31,48,238,125,190,186,68,18,8,60,195,23,204,202,78,56,23,216,98,44,158,86,204,15,68,221,157,40,55,182,232,197,77,56,13,111,45,206,76,11,63,114,107,161,133,9,233,201,30,89,193,188,112,81,157,224,61,210,126,107,150,129,81,166, +101,183,137,61,243,143,237,15,51,209,116,136,29,146,165,186,237,240,215,223,226,61,1,7,49,89,103,189,96,104,53,105,38,219,99,30,139,200,213,122,95,103,100,41,111,41,101,241,187,66,242,10,32,80,159,31,255,37,161,68,110,171,134,247,105,49,143,100,96,192, +118,77,45,154,155,224,171,140,145,15,66,199,149,56,112,117,212,209,166,33,177,22,231,184,234,34,60,231,130,34,79,53,227,186,68,24,243,170,66,82,231,189,201,206,129,4,7,71,9,86,212,84,201,255,196,155,143,54,99,130,117,92,26,255,89,175,196,143,119,226, +25,247,193,51,32,7,87,137,57,166,128,220,106,192,90,195,227,185,96,18,215,164,0,158,165,171,184,246,17,18,172,164,49,189,143,124,162,20,68,4,32,0,107,231,130,2,48,8,195,80,239,127,106,25,130,148,228,165,43,108,30,192,15,22,162,77,218,60,217,126,84,68, +8,177,95,151,20,118,209,233,0,55,234,88,102,155,151,118,44,171,92,67,238,149,11,63,17,28,208,53,216,245,136,19,66,14,101,11,24,91,146,237,123,149,232,160,24,9,219,215,124,236,183,55,39,180,154,138,201,191,6,182,75,117,84,72,168,43,243,8,240,34,31,158, +146,136,120,227,85,201,91,63,17,201,42,174,105,190,46,17,91,195,216,93,228,92,164,136,17,43,80,212,84,34,53,207,195,115,156,45,0,103,87,142,3,0,8,194,24,252,255,123,25,29,76,12,161,71,208,23,104,140,220,45,93,153,25,22,37,98,8,21,241,37,204,70,37,40, +135,195,185,214,48,175,110,72,209,132,148,247,85,129,26,247,70,224,85,41,126,25,159,254,66,214,141,192,187,201,20,104,5,20,47,64,90,53,16,153,216,179,1,135,124,164,9,106,71,11,109,242,55,9,170,102,219,84,175,141,50,53,144,205,129,99,35,12,218,119,33, +117,21,23,192,223,251,196,174,167,248,69,90,135,211,69,131,38,230,157,166,96,77,198,253,83,215,19,183,0,156,157,193,13,0,32,8,3,221,127,106,63,106,8,28,5,156,193,32,210,150,243,116,126,108,68,217,103,146,214,41,45,213,169,120,30,157,127,160,49,63,15, +4,194,59,44,44,66,23,148,80,151,76,119,212,114,128,110,161,46,106,170,5,42,43,61,198,241,68,131,159,75,97,79,15,138,83,163,110,132,9,250,75,4,227,10,26,222,227,207,246,119,96,133,104,178,218,2,112,47,214,69,123,232,89,160,187,179,160,129,149,223,39,47, +11,148,142,88,94,138,76,110,36,118,97,82,96,11,192,218,25,227,0,0,130,48,144,193,255,191,89,39,99,202,81,49,113,115,38,49,34,189,210,129,75,227,240,54,250,133,231,215,233,171,168,50,21,182,97,70,68,89,215,193,23,120,127,105,124,2,111,118,122,127,233, +102,43,15,105,36,184,80,42,32,180,82,60,198,117,245,239,219,117,207,135,137,102,238,12,23,154,133,234,236,53,88,7,9,146,21,218,218,155,100,81,184,69,97,168,194,219,42,147,155,17,252,209,71,140,45,3,166,18,27,146,61,18,98,20,22,81,67,30,247,108,39,167, +0,164,157,219,13,192,32,12,3,217,127,106,62,90,85,81,238,140,130,186,0,72,188,98,3,182,95,97,143,158,190,169,38,107,208,53,127,77,53,40,69,180,243,93,153,232,253,167,102,30,183,193,165,227,141,90,9,215,13,198,55,91,166,178,41,234,57,219,173,43,39,76, +37,72,107,81,85,170,253,167,247,19,45,224,36,201,119,190,177,111,143,0,245,41,32,161,229,12,46,75,58,63,184,238,240,243,79,146,96,213,30,19,134,111,16,189,41,8,18,87,74,26,237,133,252,79,46,131,164,110,38,124,83,50,171,19,250,180,182,5,160,236,92,142, +0,8,65,24,106,255,85,239,141,201,202,75,132,6,56,200,32,34,249,252,136,61,61,37,186,151,114,188,218,213,64,136,28,126,69,191,5,107,205,64,192,68,171,198,58,71,45,176,227,1,188,154,131,76,31,174,55,39,42,37,101,189,48,212,243,90,193,120,243,122,121,85, +168,79,175,36,55,247,185,221,213,80,107,160,223,248,151,143,3,118,154,185,36,14,14,219,65,117,170,55,0,135,224,196,224,218,150,149,157,229,60,252,66,87,119,200,113,252,20,239,194,89,19,21,182,138,246,9,64,218,185,220,0,16,2,33,244,98,255,53,123,243,0, +15,38,106,3,38,198,117,130,44,159,117,110,72,18,207,97,59,154,71,229,185,68,39,245,162,141,160,177,235,76,176,74,197,77,96,40,13,26,35,73,113,203,24,180,32,223,122,170,9,73,213,189,197,62,132,60,211,15,217,118,53,154,11,53,133,216,242,25,35,140,77,155, +72,125,251,196,151,67,233,139,23,213,182,184,173,202,179,60,57,220,113,94,72,89,240,248,239,169,67,185,148,136,209,153,227,68,198,109,1,72,59,151,20,0,129,24,134,102,33,189,255,145,93,8,162,54,47,29,245,2,179,41,12,77,154,207,86,85,97,157,200,228,4,249, +177,198,112,88,98,200,44,232,160,113,134,90,1,219,20,36,8,246,29,143,142,15,100,222,139,217,236,87,101,197,136,225,42,161,166,5,58,30,255,185,141,139,3,158,63,104,7,95,153,249,236,119,223,165,245,132,55,9,147,143,183,216,92,200,187,146,165,213,215,82, +221,125,178,99,144,241,117,118,129,21,210,66,229,20,49,104,98,67,65,118,145,159,83,216,5,160,236,220,113,0,0,65,24,234,224,253,207,236,102,8,175,173,184,58,26,33,72,127,251,78,194,76,38,186,76,99,154,73,146,220,94,255,177,196,63,92,22,50,7,36,178,208, +184,9,11,47,178,162,107,129,245,49,33,138,78,162,157,194,148,36,105,8,193,162,135,157,52,8,123,190,32,192,103,55,207,152,255,112,101,205,203,148,45,56,167,107,183,98,115,46,58,65,55,233,128,3,30,82,6,35,55,86,13,78,150,234,189,42,48,119,147,69,48,173, +92,158,217,201,246,209,56,50,46,192,174,149,143,180,0,62,2,112,118,230,72,0,195,32,12,164,240,255,31,76,149,148,12,104,101,146,214,37,54,195,161,195,39,51,131,109,176,43,224,185,223,24,183,112,19,119,32,148,192,118,214,207,230,207,65,224,156,236,42,137, +146,236,105,8,1,78,59,134,152,32,217,190,114,26,164,30,123,6,205,164,220,114,243,255,163,206,203,156,249,244,1,22,9,93,67,89,107,215,73,71,214,140,90,87,166,16,96,41,202,184,178,21,38,136,208,110,170,249,115,19,178,232,223,57,57,133,80,203,41,55,154, +178,159,34,69,163,161,18,189,231,143,0,148,157,49,14,64,33,12,66,59,120,255,51,187,153,230,1,85,151,31,183,159,24,212,134,2,93,131,175,203,178,89,201,90,80,34,230,135,33,57,41,106,236,169,131,219,79,185,144,190,72,122,126,219,204,239,47,76,255,218,127, +105,196,152,13,255,172,48,49,62,181,33,108,49,127,60,152,131,184,224,125,86,210,75,27,255,151,29,156,21,248,195,24,5,244,95,20,175,54,200,4,200,70,177,109,213,168,233,17,2,137,107,157,249,184,217,19,0,146,170,7,76,185,98,242,154,182,172,192,67,161,157, +74,155,186,69,167,156,29,198,30,110,1,88,59,99,28,0,64,16,6,50,248,255,55,59,152,16,66,143,234,224,23,52,72,161,181,93,230,179,100,181,61,55,88,122,122,141,244,188,144,171,15,242,54,172,195,200,20,248,217,152,194,172,243,44,102,21,117,52,10,240,252,35, +72,190,163,13,105,122,1,147,132,27,99,197,174,112,52,230,84,159,23,116,237,235,243,75,198,198,47,237,131,65,37,42,245,197,190,167,253,89,75,203,187,229,250,165,9,98,117,92,45,155,252,136,198,88,225,123,129,166,169,73,49,86,136,161,10,55,116,233,70,55, +90,101,157,80,25,185,5,224,236,92,110,0,6,97,24,234,3,251,207,220,27,162,241,139,73,187,1,32,36,240,47,94,25,73,226,103,76,212,103,20,20,157,31,254,80,244,207,163,225,207,143,120,215,21,148,14,82,189,199,120,118,72,12,131,9,162,46,48,71,92,120,213,16, +37,106,80,91,188,183,51,33,111,59,173,126,98,197,249,228,231,159,203,16,87,108,18,52,215,174,72,42,68,30,2,183,26,84,58,252,195,59,15,127,174,167,16,94,158,88,195,10,6,221,38,101,157,211,1,59,77,212,31,167,16,147,41,92,155,187,114,31,1,40,59,131,28,0, +66,16,6,122,240,255,111,214,35,113,218,130,55,143,27,179,145,6,58,116,75,246,78,42,243,42,197,135,9,4,180,28,229,82,32,7,146,57,140,197,77,113,156,178,10,112,30,93,37,220,6,237,126,226,122,117,178,69,188,96,189,172,101,95,194,84,15,173,57,108,58,206, +91,122,147,153,252,111,92,111,251,85,50,214,133,47,84,139,253,56,117,221,206,92,36,202,33,215,227,200,90,26,148,2,31,41,238,240,160,185,131,29,80,162,116,15,78,82,205,252,203,195,41,57,120,254,30,142,0,164,157,49,14,0,32,8,3,25,248,255,155,93,28,72,75, +1,229,1,78,38,166,180,229,244,194,10,6,96,56,215,102,97,132,80,16,53,149,115,212,27,136,45,159,19,86,175,148,83,0,189,43,118,149,141,190,199,171,97,62,166,23,248,111,124,234,174,238,32,157,252,149,92,143,51,234,107,135,255,59,246,223,100,138,195,240, +44,34,122,185,163,210,70,12,224,140,20,173,144,73,241,73,189,209,41,147,122,136,87,216,240,63,82,57,6,45,6,70,69,243,169,84,34,129,92,58,2,112,118,198,72,0,128,32,12,115,240,255,111,214,209,163,105,69,103,103,42,71,67,153,195,164,244,151,16,101,60,44, +141,20,180,27,72,224,103,149,105,220,112,255,4,89,131,64,4,23,42,115,215,231,245,156,43,234,151,42,11,138,116,121,82,135,79,3,255,178,101,152,75,177,57,53,232,244,11,46,246,251,67,98,174,121,193,110,222,30,8,28,132,216,112,88,219,73,10,62,169,115,60, +233,137,16,177,58,98,69,178,95,87,93,157,5,174,93,143,182,244,186,210,167,70,131,11,5,88,2,12,0,52,103,80,26,178,200,170,15,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; + +const char* BinaryData::brushed_aluminium_png = (const char*) temp_1402fb7c; + +//================== jucer_AudioPluginEditorTemplate.cpp ================== +static const unsigned char temp_701c8c59[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"EDITORCPPHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"EDITORCLASSNAME::EDITORCLASSNAME (FILTERCLASSNAME* ownerFilter)\r\n" +" : AudioProcessorEditor (ownerFilter)\r\n" +"{\r\n" +" // This is where our plugin's editor size is set.\r\n" +" setSize (400, 300);\r\n" +"}\r\n" +"\r\n" +"EDITORCLASSNAME::~EDITORCLASSNAME()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"void EDITORCLASSNAME::paint (Graphics& g)\r\n" +"{\r\n" +" g.fillAll (Colours::white);\r\n" +" g.setColour (Colours::black);\r\n" +" g.setFont (15.0f);\r\n" +" g.drawFittedText (\"Hello World!\",\r\n" +" 0, 0, getWidth(), getHeight(),\r\n" +" Justification::centred, 1);\r\n" +"}\r\n"; + +const char* BinaryData::jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_701c8c59; + +//================== jucer_AudioPluginEditorTemplate.h ================== +static const unsigned char temp_31aa409e[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#ifndef HEADERGUARD\r\n" +"#define HEADERGUARD\r\n" +"\r\n" +"EDITORHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class EDITORCLASSNAME : public AudioProcessorEditor\r\n" +"{\r\n" +"public:\r\n" +" EDITORCLASSNAME (FILTERCLASSNAME* ownerFilter);\r\n" +" ~EDITORCLASSNAME();\r\n" +"\r\n" +" //==============================================================================\r\n" +" // This is just a standard Juce paint method...\r\n" +" void paint (Graphics& g);\r\n" +"};\r\n" +"\r\n" +"\r\n" +"#endif // HEADERGUARD\r\n"; + +const char* BinaryData::jucer_AudioPluginEditorTemplate_h = (const char*) temp_31aa409e; + +//================== jucer_AudioPluginFilterTemplate.cpp ================== +static const unsigned char temp_9a0b7de4[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"FILTERHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"FILTERCLASSNAME::FILTERCLASSNAME()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"FILTERCLASSNAME::~FILTERCLASSNAME()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"const String FILTERCLASSNAME::getName() const\r\n" +"{\r\n" +" return JucePlugin_Name;\r\n" +"}\r\n" +"\r\n" +"int FILTERCLASSNAME::getNumParameters()\r\n" +"{\r\n" +" return 0;\r\n" +"}\r\n" +"\r\n" +"float FILTERCLASSNAME::getParameter (int index)\r\n" +"{\r\n" +" return 0.0f;\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::setParameter (int index, float newValue)\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"const String FILTERCLASSNAME::getParameterName (int index)\r\n" +"{\r\n" +" return String::empty;\r\n" +"}\r\n" +"\r\n" +"const String FILTERCLASSNAME::getParameterText (int index)\r\n" +"{\r\n" +" return String::empty;\r\n" +"}\r\n" +"\r\n" +"const String FILTERCLASSNAME::getInputChannelName (int channelIndex) const\r\n" +"{\r\n" +" return String (channelIndex + 1);\r\n" +"}\r\n" +"\r\n" +"const String FILTERCLASSNAME::getOutputChannelName (int channelIndex) const\r\n" +"{\r\n" +" return String (channelIndex + 1);\r\n" +"}\r\n" +"\r\n" +"bool FILTERCLASSNAME::isInputChannelStereoPair (int index) const\r\n" +"{\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"bool FILTERCLASSNAME::isOutputChannelStereoPair (int index) const\r\n" +"{\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"bool FILTERCLASSNAME::acceptsMidi() const\r\n" +"{\r\n" +"#if JucePlugin_WantsMidiInput\r\n" +" return true;\r\n" +"#else\r\n" +" return false;\r\n" +"#endif\r\n" +"}\r\n" +"\r\n" +"bool FILTERCLASSNAME::producesMidi() const\r\n" +"{\r\n" +"#if JucePlugin_ProducesMidiOutput\r\n" +" return true;\r\n" +"#else\r\n" +" return false;\r\n" +"#endif\r\n" +"}\r\n" +"\r\n" +"int FILTERCLASSNAME::getNumPrograms()\r\n" +"{\r\n" +" return 0;\r\n" +"}\r\n" +"\r\n" +"int FILTERCLASSNAME::getCurrentProgram()\r\n" +"{\r\n" +" return 0;\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::setCurrentProgram (int index)\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"const String FILTERCLASSNAME::getProgramName (int index)\r\n" +"{\r\n" +" return String::empty;\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::changeProgramName (int index, const String& newName)\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"void FILTERCLASSNAME::prepareToPlay (double sampleRate, int samplesPerBlock)\r\n" +"{\r\n" +" // Use this method as the place to do any pre-playback\r\n" +" // initialisation that you need..\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::releaseResources()\r\n" +"{\r\n" +" // When playback stops, you can use this as an opportunity to free up any\r\n" +" // spare memory, etc.\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)\r\n" +"{\r\n" +" // This is the place where you'd normally do the guts of your plugin's\r\n" +" // audio processing...\r\n" +" for (int channel = 0; channel < getNumInputChannels(); ++channel)\r\n" +" {\r\n" +" float* channelData = buffer.getSampleData (channel);\r\n" +"\r\n" +" // ..do something to the data...\r\n" +" }\r\n" +"\r\n" +" // In case we have more outputs than inputs, we'll clear any output\r\n" +" // channels that didn't contain input data, (because these aren't\r\n" +" // guaranteed to be empty - they may contain garbage).\r\n" +" for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i)\r\n" +" {\r\n" +" buffer.clear (i, 0, buffer.getNumSamples());\r\n" +" }\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"bool FILTERCLASSNAME::hasEditor() const\r\n" +"{\r\n" +" return true; // (change this to false if you choose to not supply an editor)\r\n" +"}\r\n" +"\r\n" +"AudioProcessorEditor* FILTERCLASSNAME::createEditor()\r\n" +"{\r\n" +" return new EDITORCLASSNAME (this);\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"void FILTERCLASSNAME::getStateInformation (MemoryBlock& destData)\r\n" +"{\r\n" +" // You should use this method to store your parameters in the memory block.\r\n" +" // You could do that either as raw data, or use the XML or ValueTree classes\r\n" +" // as intermediaries to make it easy to save and load complex data.\r\n" +"}\r\n" +"\r\n" +"void FILTERCLASSNAME::setStateInformation (const void* data, int sizeInBytes)\r\n" +"{\r\n" +" // You should use this method to restore your parameters from this memory block,\r\n" +" // whose contents will have been created by the getStateInformation() call.\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"// This creates new instances of the plugin..\r\n" +"AudioProcessor* JUCE_CALLTYPE createPluginFilter()\r\n" +"{\r\n" +" return new FILTERCLASSNAME();\r\n" +"}\r\n"; + +const char* BinaryData::jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_9a0b7de4; + +//================== jucer_AudioPluginFilterTemplate.h ================== +static const unsigned char temp_2d2e18e9[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#ifndef HEADERGUARD\r\n" +"#define HEADERGUARD\r\n" +"\r\n" +"APPHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class FILTERCLASSNAME : public AudioProcessor\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" FILTERCLASSNAME();\r\n" +" ~FILTERCLASSNAME();\r\n" +"\r\n" +" //==============================================================================\r\n" +" void prepareToPlay (double sampleRate, int samplesPerBlock);\r\n" +" void releaseResources();\r\n" +"\r\n" +" void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);\r\n" +"\r\n" +" //==============================================================================\r\n" +" AudioProcessorEditor* createEditor();\r\n" +" bool hasEditor() const;\r\n" +"\r\n" +" //==============================================================================\r\n" +" const String getName() const;\r\n" +"\r\n" +" int getNumParameters();\r\n" +"\r\n" +" float getParameter (int index);\r\n" +" void setParameter (int index, float newValue);\r\n" +"\r\n" +" const String getParameterName (int index);\r\n" +" const String getParameterText (int index);\r\n" +"\r\n" +" const String getInputChannelName (int channelIndex) const;\r\n" +" const String getOutputChannelName (int channelIndex) const;\r\n" +" bool isInputChannelStereoPair (int index) const;\r\n" +" bool isOutputChannelStereoPair (int index) const;\r\n" +"\r\n" +" bool acceptsMidi() const;\r\n" +" bool producesMidi() const;\r\n" +"\r\n" +" //==============================================================================\r\n" +" int getNumPrograms();\r\n" +" int getCurrentProgram();\r\n" +" void setCurrentProgram (int index);\r\n" +" const String getProgramName (int index);\r\n" +" void changeProgramName (int index, const String& newName);\r\n" +"\r\n" +" //==============================================================================\r\n" +" void getStateInformation (MemoryBlock& destData);\r\n" +" void setStateInformation (const void* data, int sizeInBytes);\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FILTERCLASSNAME);\r\n" +"};\r\n" +"\r\n" +"#endif // HEADERGUARD\r\n"; + +const char* BinaryData::jucer_AudioPluginFilterTemplate_h = (const char*) temp_2d2e18e9; + +//================== jucer_MainConsoleAppTemplate.cpp ================== +static const unsigned char temp_880cfc9e[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"APPHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"int main (int argc, char* argv[])\r\n" +"{\r\n" +" // This object makes sure that Juce is initialised and shut down correctly\r\n" +" // for the scope of this function call. Make sure this declaration is the\r\n" +" // first statement of this function.\r\n" +" const ScopedJuceInitialiser_NonGUI juceSystemInitialiser;\r\n" +"\r\n" +"\r\n" +" // ..your code goes here!\r\n" +"\r\n" +"\r\n" +" return 0;\r\n" +"}\r\n"; + +const char* BinaryData::jucer_MainConsoleAppTemplate_cpp = (const char*) temp_880cfc9e; + +//================== jucer_MainTemplate.cpp ================== +static const unsigned char temp_dc0f1074[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic startup code for a Juce application.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"APPHEADERS\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"class APPCLASSNAME : public JUCEApplication\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" APPCLASSNAME()MEMBERINITIALISERS\r\n" +" {\r\n" +" }\r\n" +"\r\n" +" ~APPCLASSNAME()\r\n" +" {\r\n" +" }\r\n" +"\r\n" +" //==============================================================================\r\n" +" void initialise (const String& commandLine)\r\n" +" {\r\n" +" // Do your application's initialisation code here..\r\n" +" APPINITCODE\r\n" +" }\r\n" +"\r\n" +" void shutdown()\r\n" +" {\r\n" +" // Do your application's shutdown code here..\r\n" +" APPSHUTDOWNCODE\r\n" +" }\r\n" +"\r\n" +" //==============================================================================\r\n" +" void systemRequestedQuit()\r\n" +" {\r\n" +" quit();\r\n" +" }\r\n" +"\r\n" +" //==============================================================================\r\n" +" const String getApplicationName()\r\n" +" {\r\n" +" return \"APPNAME\";\r\n" +" }\r\n" +"\r\n" +" const String getApplicationVersion()\r\n" +" {\r\n" +" return ProjectInfo::versionString;\r\n" +" }\r\n" +"\r\n" +" bool moreThanOneInstanceAllowed()\r\n" +" {\r\n" +" return ALLOWMORETHANONEINSTANCE;\r\n" +" }\r\n" +"\r\n" +" void anotherInstanceStarted (const String& commandLine)\r\n" +" {\r\n" +" ANOTHERINSTANCECODE\r\n" +" }\r\n" +"\r\n" +"private:\r\n" +" PRIVATEMEMBERS\r\n" +"};\r\n" +"\r\n" +"//==============================================================================\r\n" +"// This macro generates the main() routine that starts the app.\r\n" +"START_JUCE_APPLICATION(APPCLASSNAME)\r\n"; + +const char* BinaryData::jucer_MainTemplate_cpp = (const char*) temp_dc0f1074; + +//================== jucer_NewCppFileTemplate.cpp ================== +static const unsigned char temp_29fcecba[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" FILENAME\r\n" +" Created: DATE\r\n" +" Author: AUTHOR\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n"; + +const char* BinaryData::jucer_NewCppFileTemplate_cpp = (const char*) temp_29fcecba; + +//================== jucer_NewCppFileTemplate.h ================== +static const unsigned char temp_1339453f[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" FILENAME\r\n" +" Created: DATE\r\n" +" Author: AUTHOR\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#ifndef HEADERGUARD\r\n" +"#define HEADERGUARD\r\n" +"\r\n" +"\r\n" +"\r\n" +"\r\n" +"\r\n" +"#endif // HEADERGUARD\r\n"; + +const char* BinaryData::jucer_NewCppFileTemplate_h = (const char*) temp_1339453f; + +//================== jucer_WindowTemplate.cpp ================== +static const unsigned char temp_a75e812b[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic outline for a simple desktop window.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"INCLUDES\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"WINDOWCLASS::WINDOWCLASS()\r\n" +" : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(),\r\n" +" Colours::lightgrey,\r\n" +" DocumentWindow::allButtons)\r\n" +"{\r\n" +" centreWithSize (500, 400);\r\n" +" setVisible (true);\r\n" +"}\r\n" +"\r\n" +"WINDOWCLASS::~WINDOWCLASS()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"void WINDOWCLASS::closeButtonPressed()\r\n" +"{\r\n" +" JUCEApplication::getInstance()->systemRequestedQuit();\r\n" +"}\r\n"; + +const char* BinaryData::jucer_WindowTemplate_cpp = (const char*) temp_a75e812b; + +//================== jucer_WindowTemplate.h ================== +static const unsigned char temp_142741f0[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated by the Jucer!\r\n" +"\r\n" +" It contains the basic outline for a simple desktop window.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#ifndef HEADERGUARD\r\n" +"#define HEADERGUARD\r\n" +"\r\n" +"INCLUDES\r\n" +"\r\n" +"\r\n" +"//==============================================================================\r\n" +"class WINDOWCLASS : public DocumentWindow\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" WINDOWCLASS();\r\n" +" ~WINDOWCLASS();\r\n" +"\r\n" +" void closeButtonPressed();\r\n" +"\r\n" +"\r\n" +" /* Note: Be careful when overriding DocumentWindow methods - the base class\r\n" +" uses a lot of them, so by overriding you might break its functionality.\r\n" +" It's best to do all your work in you content component instead, but if\r\n" +" you really have to override any DocumentWindow methods, make sure your\r\n" +" implementation calls the superclass's method.\r\n" +" */\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WINDOWCLASS)\r\n" +"};\r\n" +"\r\n" +"\r\n" +"#endif // HEADERGUARD\r\n"; + +const char* BinaryData::jucer_WindowTemplate_h = (const char*) temp_142741f0; + +//================== juce_icon.png ================== +static const unsigned char temp_8e334414[] = +{ 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,0,4,103,65,77,65,0,0,177,142,124,251,81,147,0,0,0,32,99,72,82,77,0,0,122,37,0,0,128,131,0,0,249,255, +0,0,128,233,0,0,117,48,0,0,234,96,0,0,58,152,0,0,23,111,146,95,197,70,0,0,76,232,73,68,65,84,120,218,98,252,255,255,63,3,35,35,35,195,16,4,140,88,216,76,72,124,70,36,113,70,52,113,108,102,192,192,127,52,246,127,52,241,255,104,226,255,112,232,27,18,0, +32,128,88,134,120,164,35,99,38,44,52,54,117,216,18,2,182,68,128,45,194,209,241,63,52,250,63,150,200,31,212,137,1,32,128,88,134,88,196,163,71,56,19,82,132,51,99,17,99,194,146,0,112,149,12,248,114,58,174,72,135,225,191,88,196,254,15,133,82,1,32,128,88, +134,80,196,51,97,137,120,102,52,140,44,198,136,150,24,144,205,64,174,46,208,19,0,122,177,254,15,45,242,97,252,191,80,252,15,137,141,44,246,15,45,177,12,202,132,0,16,64,44,67,40,226,209,35,152,5,137,70,102,51,179,50,51,177,176,48,252,103,102,97,102,102, +230,102,99,101,17,103,252,197,161,173,169,201,111,174,169,170,192,119,253,168,164,0,31,191,176,160,158,41,31,235,183,79,188,140,95,62,240,48,254,255,15,182,239,15,175,208,135,127,220,188,63,223,92,60,253,250,227,167,79,239,95,43,155,62,62,116,237,246, +253,219,183,111,127,251,202,196,246,251,211,175,223,191,254,252,251,255,239,207,127,134,191,191,255,254,251,3,141,108,100,26,93,236,47,150,18,98,80,37,4,128,0,98,28,100,141,64,92,17,207,140,22,241,172,232,180,32,7,43,187,0,59,43,7,47,39,7,71,156,185, +150,190,228,211,235,106,210,234,154,74,156,111,159,169,48,189,123,33,196,248,251,55,39,11,51,35,27,200,200,127,223,127,49,252,253,6,244,55,44,217,192,108,4,70,219,127,96,84,49,115,1,45,231,224,96,248,255,255,31,195,191,255,255,127,252,103,101,253,198, +32,169,244,225,227,127,230,187,111,63,127,121,116,237,55,219,249,109,183,159,221,122,253,237,231,183,15,191,255,253,120,255,253,215,79,160,238,223,208,136,255,141,196,254,131,165,116,64,46,85,6,60,33,0,4,208,96,73,0,232,17,207,132,37,183,195,34,28,134, +217,36,5,249,185,213,185,153,5,149,248,216,69,172,196,249,244,149,132,248,13,120,63,60,211,97,126,251,76,146,129,145,153,225,223,151,223,12,204,156,64,67,217,217,128,52,19,3,19,51,16,179,179,48,176,112,177,0,249,204,12,204,236,76,12,204,28,204,112,155, +255,124,253,195,0,202,215,127,191,253,1,226,223,12,127,127,2,249,191,255,49,252,253,245,159,225,223,215,95,12,255,129,114,140,32,245,127,255,50,48,42,170,191,124,245,139,225,210,51,86,158,75,123,174,223,63,253,232,47,235,187,43,47,223,191,7,38,134,239, +64,211,126,33,37,4,108,137,1,189,138,24,176,132,0,16,64,3,157,0,8,229,120,140,72,7,97,121,97,1,94,119,97,102,37,55,123,91,11,177,231,183,205,121,223,191,208,249,247,225,45,199,127,96,80,51,177,129,139,3,6,118,1,32,22,98,103,224,144,224,100,96,19,102, +103,96,7,98,102,54,38,6,86,46,102,6,70,78,86,164,22,5,35,82,109,15,141,131,191,255,25,254,127,255,195,240,27,152,32,254,254,252,199,240,243,253,79,134,159,175,129,248,205,15,134,159,239,126,130,249,191,223,127,7,39,22,70,86,70,6,70,110,222,175,95,228, +181,47,221,252,240,245,208,182,235,15,79,29,121,247,251,217,235,47,223,190,66,19,2,182,196,48,104,74,4,128,0,26,168,4,64,74,196,179,65,49,187,158,184,128,128,187,156,128,166,173,170,130,141,232,245,227,46,172,95,127,138,131,12,97,229,99,97,96,19,225, +100,224,16,230,96,224,146,226,98,224,81,225,99,224,18,227,96,96,224,102,129,154,206,8,142,84,48,254,7,165,225,65,141,20,222,200,225,192,204,8,193,224,178,136,9,218,12,252,199,240,255,219,95,134,111,79,191,49,124,121,240,133,225,251,139,31,12,63,94,127, +99,248,245,238,7,195,175,183,191,25,152,184,152,24,126,136,73,223,122,46,32,123,232,196,135,223,199,55,159,187,118,231,230,251,175,31,144,18,194,47,28,165,2,182,158,3,93,18,2,64,0,13,68,2,64,143,124,108,17,207,134,28,241,214,106,10,34,190,226,236,70, +58,28,255,237,196,126,125,179,96,120,250,68,132,149,155,137,129,75,154,155,129,91,153,159,129,91,142,155,129,83,156,19,152,227,129,202,217,153,33,65,247,251,47,52,104,255,163,6,37,41,94,69,209,199,8,209,203,2,36,216,160,29,136,31,127,129,165,193,47,134, +239,207,190,49,124,125,248,133,225,211,173,15,12,95,159,124,3,43,251,43,42,241,242,37,43,231,241,155,191,152,78,174,127,241,243,244,177,187,79,222,0,133,127,98,73,12,127,176,244,32,232,150,8,0,2,136,222,9,0,189,31,15,139,120,228,98,158,29,134,85,197, +132,248,147,141,148,204,76,57,25,188,249,238,95,179,96,250,245,141,131,133,135,153,129,83,146,151,65,80,79,152,129,79,155,159,129,141,159,13,18,41,160,92,13,172,175,193,17,254,143,196,136,38,21,252,135,86,29,32,31,176,50,65,216,127,255,49,124,7,150,12, +31,47,127,96,248,116,247,35,195,143,23,95,128,109,10,96,35,146,91,240,199,71,73,249,19,251,158,191,95,179,253,213,207,107,231,31,189,120,7,74,58,104,137,1,214,120,68,79,4,255,105,157,8,0,2,136,158,9,0,125,0,7,214,6,103,67,139,120,14,127,109,5,153,8,225, +127,62,82,2,188,70,172,15,238,169,114,252,255,46,36,100,32,196,192,171,38,8,204,229,28,12,172,192,186,157,77,128,21,146,43,127,254,67,212,221,140,180,114,246,127,112,241,143,232,197,129,74,3,102,212,225,3,80,34,0,37,6,160,91,126,125,252,5,172,22,126, +49,252,6,182,23,62,222,120,199,240,225,202,59,134,111,172,252,207,254,74,72,62,125,250,233,219,233,69,47,255,109,218,126,235,201,51,164,132,240,19,75,27,129,46,141,68,128,0,162,71,2,64,30,120,65,142,124,244,28,207,1,194,51,35,92,61,181,223,223,9,227, +120,241,68,253,207,135,223,108,130,186,188,12,18,78,210,12,220,10,60,144,22,59,44,204,255,64,235,114,70,28,86,162,12,237,252,39,207,217,255,128,153,243,247,39,136,126,70,86,136,24,40,162,255,253,131,200,49,177,64,251,140,160,222,37,19,68,29,72,158,5, +97,255,95,96,169,244,245,214,71,134,39,91,159,48,124,125,244,141,129,153,159,245,247,15,33,241,91,23,5,148,151,100,173,61,184,11,154,8,208,19,2,172,125,128,220,91,160,73,34,0,8,32,90,38,0,92,13,61,88,223,157,13,26,233,160,200,231,180,83,16,151,108,48, +145,41,228,125,112,215,252,255,199,15,252,172,192,6,156,168,133,40,131,168,141,56,3,155,32,59,180,104,255,143,39,8,96,173,121,96,248,253,254,2,84,251,23,90,230,0,173,99,1,245,5,217,160,74,136,12,195,63,95,33,17,43,97,203,192,32,160,206,192,192,163,0, +116,165,24,208,7,64,177,111,175,24,24,222,93,2,226,43,12,192,44,206,192,240,253,21,164,52,98,19,0,234,1,181,65,144,74,36,80,3,18,152,32,126,190,250,206,240,230,228,107,134,87,199,95,129,187,153,140,34,34,31,94,136,202,238,242,217,112,190,31,168,234,27, +90,66,64,175,22,104,214,83,0,8,32,90,37,0,92,13,61,22,164,198,29,7,20,115,89,41,203,136,215,75,253,41,19,126,255,214,250,255,239,63,204,130,58,2,12,18,14,146,12,156,242,60,144,94,26,161,136,7,141,222,252,1,70,250,95,96,216,177,242,50,48,8,233,3,109,224, +135,132,217,143,183,12,192,74,25,24,148,31,129,182,243,0,93,195,142,54,32,135,197,188,95,192,134,59,175,50,3,131,81,45,3,131,176,46,208,229,60,216,149,254,6,170,251,9,196,175,78,51,48,60,217,1,164,143,67,220,192,46,8,173,34,80,19,2,176,15,193,240,13, +216,123,120,177,255,5,195,135,203,239,24,24,185,88,126,190,16,83,216,157,114,226,89,223,139,207,223,128,14,100,248,142,163,52,160,89,3,17,32,128,104,145,0,144,35,159,25,173,200,103,67,42,238,57,65,184,222,207,222,194,237,221,149,2,246,247,111,229,88, +120,216,153,164,93,165,24,132,76,69,128,165,43,80,219,159,127,248,189,9,138,248,223,159,33,185,91,88,135,129,65,210,9,136,29,128,185,85,134,1,50,204,7,173,187,127,1,219,93,143,128,17,116,125,26,48,24,129,225,203,194,139,35,17,48,66,18,138,56,48,215,155, +180,66,114,252,203,135,12,255,79,109,5,234,191,193,240,255,229,35,160,235,57,25,24,197,229,25,24,84,140,24,24,141,93,128,9,69,8,90,98,124,131,148,10,55,231,3,19,194,81,72,73,4,178,7,61,33,48,3,19,2,208,95,111,79,190,98,120,182,235,25,195,239,95,255,255, +254,20,23,191,179,149,89,110,114,251,206,227,167,161,137,224,59,150,210,224,15,150,6,34,197,0,32,128,104,149,0,144,71,242,144,35,31,30,241,160,156,191,212,199,40,86,251,205,237,148,191,159,62,51,113,203,243,51,202,7,203,51,112,200,114,3,189,253,7,127, +38,5,73,130,114,26,51,59,36,210,149,35,129,185,94,23,26,233,160,224,3,38,138,15,175,33,197,47,168,200,22,145,130,232,121,118,144,129,225,108,53,36,135,131,19,1,90,255,16,148,152,68,76,24,24,108,103,129,139,255,255,7,87,51,252,235,74,0,22,208,191,161, +99,145,76,144,4,5,106,123,48,3,189,198,47,196,192,168,98,204,192,104,29,192,192,96,229,203,192,40,40,193,0,30,46,124,119,25,152,216,102,0,19,207,17,136,185,44,28,168,115,79,160,16,98,101,102,248,114,247,19,195,189,229,247,24,126,189,249,241,159,69,66, +232,235,5,22,145,249,169,7,238,172,252,243,239,223,87,164,106,1,91,105,64,181,68,0,16,64,212,78,0,140,104,131,58,44,232,185,158,135,149,153,71,73,86,70,184,89,133,35,93,246,249,77,127,6,22,102,6,62,101,1,6,89,127,89,6,54,73,96,186,248,242,7,127,255,235, +31,104,184,15,152,158,196,173,25,24,180,11,32,117,243,31,96,248,124,254,200,240,255,242,65,134,255,39,54,51,252,63,3,108,91,125,255,4,111,173,51,154,186,51,48,134,149,48,48,170,155,49,48,188,62,201,192,112,166,10,82,111,179,112,67,195,16,212,141,3,102, +58,46,105,6,6,199,101,144,34,255,248,38,134,191,237,209,192,196,2,204,128,220,60,136,158,6,220,41,255,33,141,193,159,223,33,209,34,36,200,192,232,155,201,192,20,152,15,116,19,176,45,192,10,244,246,155,19,192,132,48,155,129,225,61,176,173,240,23,218,104, +68,110,181,2,123,13,160,174,227,227,205,143,24,190,60,248,204,240,255,215,63,134,231,6,54,235,58,78,220,154,127,242,241,235,23,127,254,253,255,138,163,52,160,90,34,0,8,32,106,38,0,228,110,30,122,43,31,156,227,185,89,152,120,39,59,107,7,235,252,124,29, +195,252,230,165,56,151,20,15,131,148,167,44,3,159,6,47,52,231,254,67,157,164,133,7,246,63,72,206,2,181,184,165,93,129,57,62,12,216,48,211,6,230,176,39,12,255,15,0,35,236,232,6,134,127,143,129,141,177,183,239,33,234,185,128,214,50,179,32,34,234,51,48, +252,248,184,24,152,10,102,48,48,186,198,2,19,1,48,98,78,131,18,1,176,148,96,1,154,249,15,84,154,0,157,104,191,8,168,78,149,129,97,69,27,195,223,105,192,146,130,19,152,134,57,185,33,17,141,211,215,208,176,3,205,7,253,0,198,15,63,63,3,163,142,53,3,147, +123,18,3,131,177,27,48,241,0,253,246,233,14,3,195,229,94,160,189,167,160,61,10,22,68,136,177,49,131,19,215,135,203,31,24,94,238,125,202,240,229,241,23,134,255,138,202,79,231,63,248,220,56,237,250,171,11,208,146,0,185,145,72,213,68,0,16,64,212,74,0,232, +131,59,232,69,62,48,148,25,184,43,244,165,172,67,153,95,183,252,255,250,155,131,87,67,128,65,49,68,129,129,85,6,40,245,249,15,238,46,29,40,199,131,234,122,33,96,29,175,145,1,108,149,219,1,11,67,160,250,83,219,24,254,206,40,98,96,184,125,23,106,19,48, +80,217,216,17,195,182,40,67,188,160,32,252,194,192,40,42,205,192,212,182,147,129,65,17,152,120,174,77,98,96,184,49,27,52,237,7,12,214,55,64,179,83,25,24,12,128,137,226,225,53,134,191,73,218,16,115,184,120,240,71,62,70,215,243,63,164,68,248,250,23,28, +18,76,150,192,196,26,89,201,192,168,97,9,116,31,208,158,91,11,24,24,238,46,6,38,188,183,144,170,9,230,76,86,160,94,110,86,134,159,192,6,226,227,13,15,25,62,222,252,192,240,67,76,244,222,130,231,127,58,231,220,126,127,17,168,2,86,37,124,167,118,34,0,8, +32,106,36,0,244,200,103,65,234,219,115,65,49,79,166,142,148,97,20,239,183,10,206,79,31,101,133,141,69,25,228,252,229,24,152,120,128,233,228,235,31,44,185,158,17,146,235,65,93,49,54,62,6,6,133,16,6,6,157,92,112,11,254,255,131,171,12,255,119,45,100,248, +191,30,24,129,95,128,185,78,128,7,145,11,255,227,9,3,144,220,143,175,224,18,128,169,16,88,199,255,122,14,44,230,129,197,245,135,91,144,58,218,97,9,3,131,160,14,195,255,137,89,12,255,214,76,7,38,56,62,18,34,31,189,68,0,85,41,192,132,251,241,59,56,113, +50,250,103,48,48,69,0,19,151,184,44,176,90,0,150,2,103,234,129,254,126,140,84,5,65,1,176,235,251,247,211,47,134,199,235,31,49,188,187,240,154,225,135,128,200,195,121,175,24,218,230,222,122,67,179,68,0,16,64,76,84,206,249,200,117,62,172,177,199,157,102, +32,175,31,45,248,171,132,227,253,7,89,81,83,96,228,7,2,35,159,11,168,252,27,142,200,7,229,122,80,131,12,212,10,215,47,99,96,208,43,1,122,247,47,176,81,182,146,225,95,91,52,195,255,5,221,144,0,6,69,18,44,114,255,255,39,28,49,160,62,250,217,61,192,220, +15,172,2,120,20,25,24,68,205,33,137,76,200,0,88,116,3,187,125,95,129,237,8,96,117,194,0,74,152,255,201,44,85,255,67,123,30,32,187,64,238,3,54,22,255,175,156,193,240,111,66,22,48,247,3,75,116,17,96,59,196,164,5,232,55,113,200,120,5,114,177,7,108,255,48, +11,176,51,72,251,202,50,112,203,240,49,176,191,125,35,159,32,201,82,26,171,33,161,13,10,71,104,120,114,32,141,158,34,47,131,35,180,206,17,43,0,8,32,38,42,69,62,182,162,31,156,243,227,77,53,180,99,249,127,21,177,62,125,163,200,43,207,203,32,237,37,11, +158,147,103,248,241,15,211,185,160,72,2,245,231,65,117,50,168,174,183,232,99,96,144,15,98,248,127,251,28,195,191,73,192,156,217,17,7,236,102,1,51,131,16,48,44,56,184,73,207,161,172,192,18,228,221,11,134,127,39,54,65,248,18,86,64,49,160,57,98,230,224, +170,224,255,217,93,12,255,223,62,7,171,35,59,1,160,183,93,184,184,193,238,253,127,96,11,195,191,206,100,104,34,48,102,96,48,106,132,180,59,254,125,71,196,27,136,250,252,27,60,212,45,237,37,205,192,33,193,205,192,245,234,133,74,186,52,115,101,168,142, +130,58,52,17,112,65,19,2,59,210,160,26,19,3,230,58,71,162,0,64,0,81,171,4,64,238,234,193,235,124,31,107,83,133,120,254,159,185,108,143,158,171,114,73,115,2,27,124,50,12,204,160,41,218,95,127,49,157,9,170,231,65,117,49,168,88,212,202,97,96,48,111,7,246, +237,141,128,125,240,109,192,174,88,50,195,255,173,11,33,17,206,207,7,73,40,228,68,16,40,87,130,218,26,87,129,37,192,155,23,96,243,193,37,129,160,54,196,27,231,247,147,19,134,248,1,200,205,160,97,98,17,96,34,184,14,76,200,61,169,224,177,5,6,9,27,96,47, +6,232,207,223,223,33,126,71,182,19,88,50,242,104,10,128,171,73,54,97,78,6,142,39,79,85,178,100,216,10,28,117,84,101,145,18,0,108,20,149,5,169,36,32,217,225,0,1,196,68,133,220,207,130,54,180,11,78,0,110,38,250,114,197,242,28,57,60,183,239,235,115,203, +114,49,200,135,40,50,240,170,241,65,6,119,176,229,148,127,192,106,77,204,2,24,241,29,12,12,154,153,224,90,238,255,22,80,209,153,9,201,53,188,192,132,193,198,9,157,148,161,96,26,15,216,255,254,255,228,6,195,255,59,103,129,108,126,96,189,12,108,160,113, +75,64,226,234,230,105,160,29,108,212,201,253,24,211,135,140,224,246,202,255,235,103,24,254,245,167,131,27,165,12,138,126,192,94,135,50,164,212,67,142,59,144,23,191,253,101,224,213,226,103,144,3,141,141,136,115,50,240,220,187,101,88,163,35,84,32,43,42, +44,140,84,29,176,163,85,7,204,164,86,5,0,1,196,68,131,122,159,203,76,81,90,162,84,252,95,1,215,201,35,150,124,90,124,12,74,113,42,12,188,170,188,144,9,156,255,88,234,204,191,192,182,141,82,20,3,131,229,4,96,206,112,98,248,191,110,18,195,191,98,59,134, +127,51,129,245,63,176,200,6,247,195,25,25,169,51,248,197,6,76,163,31,223,51,252,63,183,27,152,251,128,237,8,5,127,160,249,178,12,255,159,221,3,230,204,7,136,238,35,173,0,15,176,36,56,179,147,225,223,212,60,96,180,9,49,48,168,197,65,198,8,192,109,57,164, +16,6,141,59,0,171,73,62,117,1,6,229,4,53,6,30,5,30,6,222,115,167,172,166,218,41,101,161,85,5,28,72,93,110,146,219,3,0,1,196,68,70,228,51,96,153,203,71,41,250,195,245,21,173,249,111,93,49,231,18,99,99,2,53,104,56,229,184,33,145,143,62,152,2,30,125,3,166, +126,25,79,6,6,221,2,96,252,242,0,115,124,58,48,226,171,25,254,223,187,0,105,232,177,178,81,55,2,64,221,59,80,14,187,117,1,146,184,4,52,129,98,64,167,63,190,14,204,117,159,161,179,122,180,156,27,101,4,15,39,255,63,178,142,225,255,93,96,123,70,198,17,88, +186,41,1,195,225,27,106,156,193,18,193,239,127,12,28,146,28,192,134,179,2,3,27,47,11,147,216,221,171,14,93,145,30,78,72,137,0,185,42,64,174,14,136,170,203,0,2,136,28,223,162,55,250,144,199,246,185,188,172,76,21,204,239,159,77,100,227,102,100,150,245, +149,103,224,81,6,22,251,223,255,224,142,124,73,123,6,6,227,102,96,11,252,39,176,145,23,197,240,127,195,60,160,201,192,220,192,206,77,187,220,8,52,246,255,171,187,12,255,223,63,131,204,35,128,192,155,39,216,171,39,90,0,80,91,228,231,119,134,255,59,230, +3,179,14,176,250,17,49,130,140,68,226,234,85,252,252,199,192,37,203,205,160,16,170,200,192,242,251,59,143,197,211,107,209,97,86,134,106,72,221,108,14,164,70,33,242,158,8,130,0,32,128,152,200,44,250,153,176,21,253,98,124,220,2,197,114,172,153,156,223, +191,139,138,217,75,51,240,25,3,139,184,159,127,177,148,220,208,161,87,94,96,3,204,162,23,40,207,202,240,111,235,76,96,255,126,19,120,64,4,60,206,78,43,0,10,80,80,43,31,212,218,7,69,58,76,248,221,43,160,175,232,184,30,19,88,18,253,191,115,30,18,22,66, +26,144,73,163,255,127,113,171,255,251,143,129,87,155,31,216,76,18,99,100,123,242,88,41,89,134,61,142,151,155,139,15,169,187,13,107,15,160,55,10,241,150,2,0,1,196,68,102,228,163,207,236,113,177,48,51,243,116,5,58,4,241,157,60,102,193,33,207,203,40,98, +42,2,212,192,136,88,128,137,234,27,200,92,187,73,51,164,213,15,236,126,49,44,1,246,141,121,25,105,95,7,131,0,40,129,129,18,230,147,187,144,117,3,32,240,241,53,3,93,1,40,52,127,253,128,132,15,151,4,98,65,9,158,118,36,19,80,147,144,129,48,176,42,96,98, +20,186,114,194,106,98,176,99,32,40,220,209,18,1,73,237,1,128,0,34,181,4,64,111,248,193,139,254,0,59,11,37,157,115,219,163,153,120,153,24,248,128,173,125,86,208,170,220,31,88,186,123,224,249,246,79,192,126,190,27,176,27,102,8,238,18,253,155,152,205,240, +255,203,55,72,177,255,159,14,185,144,17,210,14,248,255,236,54,176,222,255,4,17,3,45,222,101,26,136,229,241,36,12,224,1,171,81,78,96,85,32,110,37,14,26,62,96,81,191,127,214,59,211,197,194,0,71,215,144,133,152,174,33,64,0,49,145,144,251,209,39,122,224, +197,191,154,8,191,72,182,208,143,44,96,93,197,206,163,192,207,32,233,40,1,46,178,48,235,125,88,31,7,104,132,124,0,88,254,255,206,133,192,6,31,176,95,204,207,75,97,23,143,196,134,24,200,105,207,239,67,26,126,224,137,168,111,84,24,22,33,177,42,98,97,3, +175,15,96,248,241,158,129,168,149,172,160,82,128,133,137,65,196,90,156,65,64,155,143,129,237,241,11,105,95,97,230,32,3,21,69,113,180,4,64,116,85,0,16,64,164,84,1,204,216,38,122,128,69,16,119,151,155,65,28,223,229,179,250,160,212,169,16,34,199,192,204, +203,6,153,217,195,150,251,255,0,139,61,110,73,96,195,7,152,251,127,255,100,248,191,103,33,176,107,52,0,57,15,228,11,80,183,239,235,71,72,216,254,252,70,95,251,65,153,3,52,41,5,138,213,119,87,17,3,70,132,0,176,161,202,38,194,206,32,27,32,207,192,165,192, +201,32,112,248,144,85,165,149,90,144,152,160,0,63,218,80,49,11,218,80,49,86,0,16,64,164,148,0,232,131,62,224,220,159,19,224,174,39,127,227,184,15,104,173,188,184,173,4,3,155,60,47,142,49,126,100,91,217,33,141,30,96,253,251,31,148,3,153,153,232,187,31, +6,60,3,199,12,108,248,61,99,248,15,77,0,144,109,62,244,205,253,204,142,209,192,146,18,152,251,223,156,5,109,105,37,126,252,6,216,53,4,101,54,81,43,9,6,70,14,38,6,197,155,103,189,99,109,141,244,208,122,4,200,137,128,17,87,41,0,16,64,76,36,68,62,214,201, +30,255,191,79,34,255,126,251,197,196,173,192,203,32,108,44,194,192,240,233,55,129,6,24,208,163,223,159,67,134,125,217,57,24,24,117,108,25,24,190,252,165,115,253,251,31,226,142,47,192,158,200,231,119,116,46,122,128,254,252,1,180,87,203,156,129,65,31,232, +247,23,39,129,97,118,31,178,94,145,216,92,0,222,229,196,192,32,160,43,192,32,160,195,203,240,255,201,27,94,125,33,46,61,30,78,14,30,2,19,70,24,0,32,128,136,45,1,176,77,246,112,24,171,43,139,241,188,125,166,204,200,202,196,32,105,43,14,217,149,243,231, +31,158,132,12,93,12,1,26,250,124,186,27,220,31,102,242,207,2,58,25,180,210,246,59,237,7,97,176,181,3,96,9,128,46,123,35,160,51,157,160,0,13,175,4,218,255,139,129,225,209,22,232,10,102,180,81,92,240,34,152,127,72,237,34,52,247,253,254,203,192,42,204,193, +32,100,40,10,238,72,73,125,124,165,163,40,42,40,132,214,22,96,37,84,10,0,4,16,19,137,185,31,185,241,199,30,166,167,100,252,239,253,55,14,62,37,94,6,62,45,65,96,202,38,166,24,101,132,204,130,221,93,2,233,13,232,59,48,48,197,149,51,48,254,252,13,89,218, +69,175,68,192,8,169,118,254,127,122,139,40,153,104,93,13,129,74,185,143,63,24,24,93,163,25,24,141,157,33,43,146,222,92,0,134,40,15,116,129,43,48,60,126,0,197,126,190,133,132,13,12,131,196,126,127,66,77,8,255,33,37,1,191,150,0,3,175,26,55,3,239,173,43, +234,246,122,90,202,204,76,76,176,238,32,59,49,165,0,64,0,17,234,116,51,225,73,0,28,134,127,63,88,49,254,250,198,46,102,165,6,217,12,241,243,31,145,197,47,104,237,31,176,229,127,109,10,120,21,14,99,80,17,195,255,71,215,25,24,214,172,97,96,144,252,7,25, +175,167,117,119,16,148,227,65,206,125,15,237,255,179,178,50,208,52,5,128,34,255,21,48,18,213,53,24,152,146,219,33,98,247,128,254,253,120,11,50,37,205,12,244,51,143,60,3,3,159,34,176,108,87,131,172,108,6,137,129,102,11,223,94,130,44,61,255,8,236,182,178, +242,64,212,131,74,6,96,120,51,11,176,50,8,26,139,51,124,186,126,143,221,85,128,201,126,13,47,247,141,23,31,63,131,134,21,97,139,73,127,65,227,238,47,82,87,3,238,81,128,0,98,33,179,235,199,94,224,96,100,200,117,247,186,170,160,38,63,35,143,154,0,100,138, +151,164,58,24,216,94,121,176,22,104,146,48,3,131,102,58,3,83,106,63,195,191,95,255,192,99,228,12,223,127,67,102,255,192,203,187,254,211,56,1,188,132,112,217,56,104,151,230,64,161,248,246,51,3,163,130,60,3,83,201,108,96,15,72,154,129,225,254,74,6,134, +27,51,24,24,196,45,32,11,82,64,115,2,194,192,118,28,139,48,34,151,255,254,5,153,11,81,8,7,150,2,207,128,122,128,97,115,103,57,48,172,161,123,28,64,30,248,245,159,65,80,87,144,225,157,6,47,131,212,181,99,22,14,202,178,59,87,95,184,249,249,239,191,255, +63,144,74,128,95,208,76,12,219,95,0,79,4,0,1,196,66,194,192,15,188,1,200,198,194,194,225,206,253,219,155,227,245,87,126,9,71,53,240,34,93,134,63,68,134,4,124,217,2,51,36,21,223,154,11,12,156,51,192,146,160,154,129,169,28,200,246,207,96,248,55,191,134, +225,255,133,83,192,68,192,6,89,231,71,171,152,1,25,11,234,133,128,204,231,228,165,93,66,123,255,153,129,201,220,145,129,49,119,18,48,50,117,24,24,110,47,2,118,65,143,50,48,88,79,3,38,6,125,200,172,32,168,186,63,189,141,225,255,197,3,12,255,239,93,130, +12,80,253,249,5,89,213,44,163,194,192,24,215,196,192,168,153,3,89,12,123,44,23,50,131,10,42,73,129,109,1,102,126,54,6,126,13,65,134,207,183,31,177,199,232,242,249,109,190,202,122,231,235,207,95,223,144,18,0,8,255,70,138,83,120,110,5,8,32,66,37,0,122, +235,31,156,0,210,92,44,117,120,159,93,148,103,23,98,103,228,16,225,196,49,220,139,110,220,63,200,248,63,168,72,67,94,244,15,170,139,65,235,245,255,252,134,204,11,152,184,50,48,169,25,49,252,91,63,137,225,255,242,14,96,105,240,5,180,152,156,54,137,128, +17,218,253,3,37,68,80,3,154,218,3,81,160,18,236,3,48,34,197,196,16,145,15,170,250,64,107,0,20,67,32,43,146,95,62,98,248,183,174,153,225,255,201,173,64,246,83,232,178,119,38,104,12,48,66,6,203,110,159,5,102,136,131,192,210,99,46,120,137,59,131,70,26,3, +195,213,137,144,238,244,127,200,126,69,14,73,46,6,22,62,86,6,201,251,231,77,204,149,229,36,246,93,187,251,5,41,1,192,50,240,31,244,18,0,32,128,88,112,4,11,3,190,198,159,141,36,191,9,235,221,79,34,156,138,2,12,140,160,37,216,132,178,25,120,166,11,104, +156,32,176,136,19,183,66,172,136,5,1,208,214,173,247,87,33,107,231,119,251,3,27,133,229,12,12,114,190,12,76,241,141,12,12,230,62,12,127,123,147,129,69,223,101,96,34,224,162,254,72,29,248,92,160,223,144,86,56,55,63,245,115,254,87,96,233,194,199,11,137, +124,57,45,136,56,168,158,7,225,47,31,24,254,111,155,198,240,111,69,39,176,4,4,118,137,185,129,65,203,2,91,79,139,214,10,99,97,5,207,85,252,235,140,103,96,234,63,204,192,168,18,202,192,240,28,152,105,62,0,195,140,85,0,60,175,193,43,207,205,192,33,198, +197,240,229,198,71,150,24,123,93,43,96,2,120,132,150,0,144,27,130,240,68,0,16,64,44,68,54,254,224,137,192,92,77,81,92,252,237,35,45,160,17,140,188,202,188,12,76,44,140,56,134,124,25,32,107,249,255,254,133,212,115,160,84,43,98,138,40,122,209,123,11,63, +94,0,219,4,27,128,13,163,85,192,196,112,141,129,65,53,6,168,199,148,129,185,109,43,195,191,153,165,12,255,143,109,130,116,155,152,89,169,215,101,3,25,243,251,39,56,1,48,114,243,1,11,0,42,153,11,42,173,64,43,126,128,117,61,168,206,103,52,245,132,14,54, +1,195,226,243,123,134,255,91,103,51,252,223,56,153,225,255,243,231,144,136,23,224,197,29,134,240,178,154,21,162,119,239,98,6,198,132,38,96,130,242,130,236,64,2,149,90,191,25,25,152,4,217,24,64,241,241,245,193,71,6,181,23,87,44,129,189,129,245,127,255, +253,99,67,27,16,98,70,175,6,0,2,136,133,196,238,31,155,139,188,176,26,231,187,103,226,108,124,76,12,188,74,124,184,227,2,84,148,129,182,110,105,166,0,91,190,41,144,72,127,253,12,188,123,7,60,11,6,213,200,40,171,193,192,32,42,203,192,192,197,11,89,247, +15,194,31,128,9,224,205,121,96,238,249,0,148,211,100,96,170,89,193,240,255,248,102,134,127,139,129,165,194,93,96,105,193,244,15,50,107,72,105,151,17,60,35,247,29,82,10,128,118,243,80,101,136,23,24,174,63,127,130,19,47,83,222,84,6,70,117,104,162,255,244, +14,188,213,236,255,178,86,96,143,231,49,208,62,102,72,196,255,255,79,56,242,97,37,10,200,187,183,207,65,134,141,65,37,41,168,167,240,29,212,136,229,6,87,5,252,106,124,12,111,78,177,50,112,191,122,32,239,103,97,40,191,254,216,217,207,72,25,24,219,220, +192,127,128,0,98,33,162,248,71,169,255,85,24,191,169,49,191,124,38,192,163,35,192,192,34,196,129,189,231,4,174,199,128,218,180,243,24,24,148,163,128,69,225,39,200,10,152,85,221,12,255,239,92,195,28,147,23,145,1,7,20,163,29,176,94,4,209,66,114,208,34, +243,39,180,177,195,205,192,104,9,172,22,244,29,128,102,244,0,115,193,18,200,56,62,104,80,9,84,108,50,145,153,16,64,157,12,240,148,44,48,210,120,5,33,103,2,81,2,64,165,9,104,18,220,10,232,214,252,233,192,86,189,36,36,65,60,187,195,240,111,74,62,48,12, +118,66,134,104,132,121,17,37,5,73,9,150,153,225,255,67,96,248,129,150,175,73,201,65,26,132,224,253,5,60,224,106,0,180,104,132,93,148,139,225,27,176,20,112,226,251,98,176,30,216,196,102,192,92,51,200,140,212,100,103,4,8,32,22,28,197,63,250,228,15,184, +4,48,82,144,22,145,102,103,81,5,69,58,191,26,63,3,11,39,51,150,4,240,31,146,90,229,188,33,145,255,234,33,195,191,37,45,12,255,55,204,129,152,204,195,133,212,6,129,110,237,126,243,132,225,255,19,32,222,11,116,178,148,4,3,163,161,51,3,163,145,11,3,131, +172,38,3,35,104,99,167,24,100,123,54,35,176,148,96,76,0,150,2,206,209,12,255,87,180,49,252,63,123,136,225,255,135,39,144,163,97,64,99,7,132,230,212,177,249,20,20,105,160,165,103,124,34,144,46,215,255,255,36,86,49,140,144,72,6,38,36,70,113,96,164,184, +37,48,48,197,214,1,205,4,134,241,189,139,12,255,175,28,5,54,242,250,129,237,152,59,192,64,227,130,172,69,32,183,65,11,238,81,188,6,250,123,39,176,103,144,13,76,72,192,238,227,243,253,208,237,241,76,192,58,153,149,129,15,88,42,127,189,251,145,65,135,143, +213,152,155,131,125,211,215,31,63,145,207,84,68,223,71,240,31,32,128,88,136,40,254,225,85,128,179,146,132,42,255,139,59,138,108,2,204,12,220,138,192,226,31,52,184,129,190,140,10,20,24,92,192,148,175,145,14,172,179,62,49,252,155,86,200,240,127,39,48,98, +5,216,17,1,140,82,216,176,64,138,127,46,168,222,119,47,24,254,111,89,10,212,179,20,210,128,82,3,150,8,206,81,12,140,186,54,192,190,178,58,68,139,172,26,3,99,233,2,6,198,43,71,24,254,29,90,203,192,112,96,37,195,255,215,192,250,148,157,21,218,109,36,33, +1,252,252,1,73,0,160,220,10,90,117,252,227,43,241,9,0,164,14,84,130,252,250,205,192,168,109,193,192,148,210,14,30,217,252,255,244,54,195,255,77,192,18,224,240,122,32,251,1,36,36,249,120,200,203,245,232,246,253,249,9,172,70,129,13,65,127,96,2,16,2,150, +0,28,194,64,63,188,135,108,113,3,205,15,104,241,51,188,58,254,130,129,255,249,61,21,47,93,21,249,213,167,175,126,68,43,1,144,19,0,3,64,0,177,96,41,254,209,143,101,133,215,255,138,130,60,50,140,15,63,114,115,104,241,49,176,242,179,226,110,245,131,234, +38,78,73,134,255,123,128,17,121,8,216,120,227,101,65,139,124,44,141,38,88,151,16,156,24,254,67,138,229,239,95,25,254,159,218,199,240,255,252,62,112,66,96,176,13,0,86,5,126,12,140,138,58,16,245,58,54,12,76,64,204,0,236,26,253,219,60,11,220,143,102,248, +12,108,124,113,115,19,31,137,160,21,185,32,187,248,69,33,165,200,143,47,68,54,30,64,155,78,129,85,44,27,43,3,163,95,26,3,83,120,25,3,131,164,50,195,255,125,75,25,254,45,3,118,103,175,159,135,132,26,15,133,185,30,219,252,5,168,250,251,12,140,87,30,96, +162,101,23,133,12,41,131,98,10,88,13,112,74,114,2,227,134,131,225,219,243,111,76,118,202,188,90,171,129,46,65,235,9,160,180,3,0,2,136,5,199,224,15,70,9,32,201,207,195,35,254,251,179,44,72,148,83,156,11,114,94,15,186,167,64,45,82,144,35,37,44,25,254,127, +5,70,222,161,213,144,17,66,30,94,226,3,0,166,142,9,186,51,23,52,178,253,231,23,195,255,235,167,129,13,160,211,12,255,15,172,6,38,2,111,6,38,79,96,247,80,66,17,162,214,212,131,129,73,221,140,225,223,169,173,12,255,215,79,102,96,184,2,84,203,205,1,105, +57,227,179,23,150,131,127,3,115,48,104,32,8,188,39,128,136,57,4,80,162,121,15,212,167,164,194,192,20,85,206,192,232,145,8,113,239,182,57,12,255,38,20,3,35,2,216,247,23,228,66,28,23,67,205,49,12,80,12,125,120,7,44,250,129,237,0,85,77,96,248,0,19,192,7, +88,98,254,7,90,161,193,192,37,193,193,240,253,217,23,6,5,166,223,170,12,168,39,176,161,119,7,255,1,4,16,19,17,9,0,172,81,145,151,93,128,251,251,103,17,208,6,88,78,113,14,6,38,86,28,221,63,208,193,11,82,142,224,134,202,255,139,251,32,91,172,201,245,63, +44,240,64,93,63,62,94,72,17,125,247,2,195,255,229,237,224,131,27,254,239,95,129,24,188,225,19,98,96,114,137,101,96,42,95,200,192,96,231,15,108,28,253,128,12,34,225,42,9,64,110,2,173,67,0,45,4,1,13,78,1,213,49,242,8,225,95,152,9,106,108,254,254,1,222, +110,206,232,236,199,192,84,189,136,129,209,43,5,98,220,202,46,134,127,179,171,128,242,192,42,132,159,7,58,217,68,139,193,43,38,200,1,24,111,159,130,206,173,5,86,1,34,136,182,15,216,79,140,192,26,152,11,172,146,247,253,51,105,17,94,110,46,124,37,0,64, +0,49,17,104,3,192,27,130,202,210,18,66,252,255,126,137,177,112,49,130,143,96,69,108,195,70,11,85,208,106,31,78,57,134,255,55,142,131,135,64,25,216,217,169,51,201,242,31,122,42,7,104,203,54,11,59,176,113,5,172,255,39,100,51,252,171,242,2,150,52,171,16, +30,144,211,100,96,46,156,14,108,35,76,3,70,168,32,120,12,30,94,50,161,187,21,148,67,127,124,99,248,255,27,186,36,91,80,28,82,29,160,15,82,128,187,96,64,255,126,1,230,236,119,191,24,24,195,115,25,152,10,128,118,104,90,130,39,177,254,213,249,51,252,155, +95,207,240,255,27,232,108,33,78,218,206,42,2,221,2,114,239,255,247,47,32,124,80,27,128,1,169,148,1,102,74,208,241,184,160,41,122,30,198,191,66,190,6,234,138,104,221,64,148,68,0,16,64,76,120,34,31,165,26,16,99,103,22,100,126,245,84,136,13,216,152,3,47, +249,194,230,75,80,35,14,52,204,249,235,63,100,7,238,95,104,81,78,109,0,74,8,236,192,128,254,5,172,102,206,238,97,248,215,155,197,240,175,198,15,216,86,128,238,237,19,146,100,96,242,2,214,203,29,192,214,178,3,176,55,242,17,152,203,63,126,198,156,87,7, +23,231,255,33,231,13,128,19,128,24,226,116,49,228,200,7,53,20,95,126,2,87,73,76,37,61,192,198,94,39,176,209,40,197,240,111,59,176,200,175,3,218,123,106,59,244,148,48,118,218,79,41,131,236,1,245,92,160,147,88,224,147,201,96,231,33,49,66,214,9,112,138, +178,3,75,104,96,24,125,249,202,174,202,250,71,6,109,44,0,229,70,21,128,0,98,194,51,11,136,114,76,187,156,162,146,48,195,151,63,204,108,252,236,192,82,158,5,187,71,65,186,64,39,116,129,14,188,122,117,159,198,107,44,25,33,117,60,168,225,246,7,152,35,78, +111,7,70,70,0,195,191,246,24,134,255,87,143,65,18,158,186,9,3,83,229,18,6,166,166,165,192,86,186,17,164,129,8,106,241,35,15,32,129,252,1,93,15,200,40,38,135,178,67,11,50,114,247,25,28,177,76,1,177,12,204,125,7,24,24,67,139,193,185,239,111,107,20,195, +255,201,133,64,127,62,129,84,77,44,204,12,116,1,32,183,255,249,3,236,254,66,167,177,65,39,146,177,176,35,170,194,191,160,179,147,217,24,216,128,248,223,247,63,140,82,82,82,98,88,114,63,124,68,16,32,128,88,176,68,60,122,59,0,140,69,63,189,144,2,205,250, +177,9,115,0,237,99,198,82,255,255,135,28,209,6,58,86,237,219,23,72,17,197,74,143,0,97,68,228,190,127,127,192,103,8,252,63,190,137,129,81,82,137,129,49,2,216,64,115,140,4,98,96,55,210,200,21,60,185,244,111,105,31,48,39,3,19,1,7,23,162,85,253,17,186,40, +68,92,17,50,24,244,31,218,11,1,230,52,70,183,104,200,188,4,232,100,48,80,154,88,217,201,240,127,13,208,12,208,66,18,208,6,19,198,129,184,115,3,148,48,223,64,19,128,0,100,82,8,180,152,6,86,85,178,49,49,112,136,2,123,2,47,190,51,242,126,120,46,140,165, +10,128,119,5,1,2,136,9,71,238,199,72,4,44,207,238,243,50,130,142,91,231,102,129,52,0,177,109,242,4,173,77,226,146,129,172,252,5,77,103,50,209,51,80,160,245,52,43,7,120,168,244,255,195,43,12,255,154,163,24,254,21,219,131,187,145,160,227,220,24,211,186, +25,152,234,23,3,59,203,226,144,177,122,6,232,154,128,79,208,220,36,42,13,73,72,160,99,94,128,13,79,166,172,126,112,9,2,238,109,92,58,196,240,175,192,150,225,255,204,10,96,209,250,17,146,235,25,153,24,6,4,128,194,30,180,174,16,188,194,158,11,122,138,41, +210,9,232,76,140,224,19,212,255,51,252,99,100,124,243,148,19,91,227,15,86,23,2,4,16,190,70,32,74,2,224,226,229,231,248,247,253,31,3,51,55,51,142,85,188,255,32,39,114,130,122,1,63,126,128,251,240,144,110,208,0,4,16,40,103,179,114,130,119,21,255,191,0, +140,184,18,103,134,127,147,114,192,227,254,140,46,49,12,76,93,187,24,24,244,108,129,17,253,11,82,228,127,131,158,44,42,36,5,9,65,69,29,96,181,177,158,129,49,48,143,129,225,205,83,134,255,179,202,24,254,150,186,48,252,191,124,2,178,83,153,133,149,97,192, +0,172,49,11,170,182,64,109,19,80,152,51,49,99,38,0,110,54,96,135,134,9,40,205,203,138,165,68,135,183,3,0,2,136,9,207,80,48,74,66,224,22,145,226,130,196,49,43,246,173,218,224,57,117,97,232,152,248,87,136,3,153,153,24,6,28,128,78,233,98,231,96,248,191, +126,6,195,223,134,96,6,134,59,231,25,24,21,180,25,152,65,13,196,16,208,185,67,60,144,105,91,96,189,202,200,47,2,20,43,98,96,154,116,130,129,209,208,9,216,144,61,206,240,183,196,133,225,223,194,94,200,146,49,126,62,134,65,3,126,65,187,175,160,243,141, +64,243,46,104,93,78,22,80,70,101,98,96,228,22,22,97,71,107,216,35,199,45,3,64,0,177,96,201,253,200,227,1,240,226,130,237,251,39,46,208,104,35,19,43,19,142,235,22,255,66,150,119,129,152,160,34,244,23,168,158,165,82,23,144,226,238,35,208,155,188,192,162, +242,232,78,134,127,119,129,9,32,169,13,216,46,136,96,96,202,232,99,248,15,154,107,224,21,134,168,19,16,101,96,2,202,129,86,10,255,63,190,1,88,220,151,51,48,60,124,4,172,26,120,32,11,47,254,253,27,60,9,0,116,182,1,108,201,24,19,43,70,21,193,12,108,167, +49,49,255,103,96,250,254,133,141,1,251,245,121,224,120,6,8,32,124,211,193,200,235,2,24,25,255,254,102,6,149,52,76,176,226,31,219,24,0,27,116,81,197,151,15,208,69,63,131,232,70,82,80,125,45,200,203,240,255,245,43,134,255,45,41,12,140,87,79,50,48,69,150, +2,115,124,9,102,97,6,154,91,232,201,98,248,15,26,30,16,102,67,172,95,24,44,23,190,129,47,196,248,5,193,160,200,103,100,197,72,244,140,108,140,144,136,252,251,135,153,1,247,29,138,12,0,1,196,132,99,58,24,227,230,205,255,127,129,21,10,172,32,193,58,6,240, +31,114,228,10,116,238,27,178,254,116,176,36,0,104,236,129,119,33,129,186,123,192,198,222,157,75,208,237,217,12,24,171,229,25,117,108,24,24,147,27,25,24,157,220,128,165,26,48,247,127,250,2,105,116,49,12,162,68,13,26,11,97,134,174,243,68,31,189,4,141,113, +1,27,196,140,144,163,237,113,93,158,9,246,12,64,0,225,91,18,134,154,32,160,119,235,225,14,224,127,144,37,203,160,65,41,216,118,43,70,166,129,143,120,240,162,15,96,23,233,59,48,183,72,72,49,48,218,4,50,48,89,251,51,48,40,233,3,139,124,96,23,249,217,109, +96,143,225,6,176,155,232,12,140,108,46,134,255,123,151,129,207,243,99,140,171,99,96,4,246,100,254,159,220,198,240,127,223,114,134,255,103,119,51,48,124,0,77,52,209,120,161,42,177,13,65,94,1,72,213,245,243,14,228,160,106,92,9,19,18,111,140,56,170,121, +6,128,0,194,53,14,128,145,8,254,51,49,130,189,140,219,223,255,33,235,216,255,65,91,168,255,6,56,179,192,70,204,62,3,35,158,19,152,16,157,67,25,152,130,242,192,199,184,66,182,103,125,101,248,191,125,54,195,255,117,179,193,61,100,70,77,115,96,196,2,219, +185,243,170,192,71,190,50,154,58,49,48,133,150,128,219,10,140,230,94,224,4,240,15,52,247,112,100,61,176,68,248,12,89,182,206,200,68,255,132,0,179,15,20,249,160,54,214,167,15,144,99,245,208,23,197,252,255,7,235,17,252,199,87,116,1,4,16,161,101,225,112, +204,200,204,242,23,126,9,19,3,150,113,117,112,63,28,58,229,11,154,48,25,168,226,146,17,186,64,227,195,55,200,250,74,123,111,6,70,231,104,112,171,158,17,60,214,255,135,225,255,142,121,144,92,125,251,12,3,195,139,47,12,140,38,166,144,101,234,160,69,28, +160,217,193,119,47,193,83,217,255,110,3,27,140,174,113,12,140,158,201,12,140,182,193,12,76,6,142,12,255,237,67,25,254,47,107,103,96,184,124,1,88,26,48,65,102,44,25,24,232,151,16,254,67,59,111,130,144,147,205,24,126,188,131,28,129,207,136,122,26,249,63, +208,213,119,32,200,196,140,183,229,10,16,64,68,15,99,253,101,227,252,3,58,2,255,255,159,191,72,43,202,208,26,89,204,208,1,9,80,227,100,32,74,72,80,157,247,21,84,95,3,27,65,38,192,156,30,86,202,192,164,105,1,153,228,1,185,236,240,26,6,134,53,253,12,255, +238,92,6,207,35,128,71,242,64,137,4,212,183,7,5,42,120,107,26,208,12,78,118,112,215,234,255,147,91,12,255,23,214,51,48,2,19,11,163,123,60,3,163,111,22,3,163,125,24,3,3,208,76,208,250,3,134,45,211,25,254,191,2,70,0,15,27,100,210,139,30,137,224,63,100, +245,19,163,4,100,100,18,188,209,22,52,240,134,220,19,0,250,225,31,232,178,75,80,212,179,114,224,221,177,3,16,64,196,38,128,255,223,24,153,63,115,252,134,28,211,143,181,7,0,187,72,9,20,8,127,254,208,57,226,153,32,137,238,205,15,6,70,17,30,6,198,194,94, +200,25,254,160,58,30,228,186,215,143,25,254,47,110,2,230,234,85,144,250,18,212,117,130,13,5,131,67,129,3,98,198,207,175,208,201,32,38,232,240,50,7,100,11,251,227,235,12,255,231,84,131,231,251,153,252,51,25,24,253,114,24,152,226,235,25,24,220,227,24,254, +111,154,193,240,111,235,12,200,204,39,104,38,16,188,6,129,134,221,69,208,10,102,46,1,6,70,41,85,104,143,235,41,100,111,3,242,82,123,240,17,76,127,65,139,178,255,255,96,100,254,129,207,56,128,0,98,66,138,65,124,152,225,243,131,27,191,65,231,251,254,1, +93,158,240,15,219,186,57,70,164,121,233,63,244,41,1,224,197,253,39,240,74,92,38,255,120,6,166,41,167,24,24,61,146,192,145,15,58,123,224,223,210,22,134,127,5,54,192,98,127,1,80,253,31,72,78,69,174,47,65,51,197,224,190,52,19,176,219,247,13,58,29,140,28, +66,204,144,147,60,64,151,69,60,189,205,240,111,66,41,195,191,166,48,96,206,127,200,192,32,163,198,192,152,214,201,192,60,249,56,3,163,87,20,100,8,25,52,101,76,242,186,66,18,235,0,97,96,137,166,160,7,76,244,111,33,27,77,208,27,92,208,107,112,25,153,25, +25,190,63,125,240,7,41,142,49,0,64,0,177,16,89,235,48,252,230,21,250,198,240,237,61,208,224,223,12,255,127,255,3,27,142,181,175,77,175,250,16,52,171,247,227,39,120,249,23,147,83,32,3,99,88,25,184,104,6,131,63,64,55,110,159,7,142,124,134,167,247,129,69, +58,7,100,250,24,91,24,128,15,139,96,135,46,180,248,130,56,52,10,91,147,8,164,14,148,193,15,173,6,159,43,12,110,32,250,102,48,48,42,27,48,48,149,47,98,248,15,76,120,255,103,149,130,79,52,7,223,29,192,12,93,163,72,237,6,32,232,100,17,113,25,200,189,7,160, +4,0,191,136,226,63,164,243,254,231,31,195,239,47,191,193,252,63,92,188,160,229,75,56,35,4,32,128,88,176,4,7,86,252,89,66,233,221,255,199,119,24,126,125,248,9,172,6,254,51,176,112,35,175,192,133,174,238,253,250,140,129,65,10,116,254,143,54,100,238,233, +255,63,234,119,5,65,21,27,168,174,150,80,4,47,140,100,50,247,97,96,144,86,1,7,206,255,55,192,226,112,55,48,34,118,1,241,163,27,144,225,91,30,30,124,25,0,26,10,208,107,223,64,221,87,80,67,144,80,238,5,45,31,3,29,111,179,97,38,195,127,160,125,140,106,38, +224,158,2,99,112,1,3,227,244,115,12,12,247,175,128,79,34,253,183,127,57,3,195,237,139,208,129,88,42,108,104,1,133,39,143,32,48,193,199,64,252,243,108,63,164,13,128,124,253,13,120,225,40,232,252,13,80,201,207,252,255,151,152,60,48,85,63,194,25,183,0,1, +196,66,32,231,195,241,163,79,223,95,27,254,103,252,255,235,195,47,198,63,63,255,0,237,68,155,255,6,77,139,130,46,77,2,49,21,245,24,254,179,51,65,2,147,133,74,39,125,130,138,102,240,138,99,62,96,139,60,136,129,49,177,5,114,121,19,8,0,35,30,212,69,251, +191,182,143,129,225,49,48,17,114,49,66,22,134,254,39,98,153,56,184,4,96,133,84,11,160,129,34,80,201,66,240,168,58,232,240,50,104,153,26,168,87,113,241,48,195,255,83,135,25,24,14,174,98,96,74,106,103,96,212,182,4,38,134,66,6,230,160,66,134,127,7,129,238, +2,182,29,24,174,30,135,108,64,1,15,167,50,145,151,24,64,183,150,171,26,50,48,152,121,0,187,127,183,32,219,195,254,51,96,44,135,255,15,140,31,208,37,215,12,204,204,255,95,253,252,247,14,91,149,14,3,0,1,196,66,40,226,97,248,249,221,155,223,152,196,4,127, +253,254,252,133,253,47,232,146,7,17,180,162,13,148,194,63,221,3,223,150,5,94,138,197,47,12,153,103,167,244,232,117,80,34,2,69,10,27,47,3,163,1,48,96,65,125,115,208,68,13,184,97,242,14,178,155,118,97,3,195,255,171,151,33,75,203,133,121,160,37,18,9,199, +175,177,113,65,26,176,160,241,11,240,168,26,43,241,69,50,40,66,65,139,94,185,129,236,27,231,25,254,149,122,48,48,154,185,128,103,18,25,53,204,24,152,28,34,24,254,131,240,178,54,134,255,199,54,2,51,227,77,200,68,14,248,160,12,102,226,87,76,253,131,158, +22,98,236,10,241,215,203,227,160,134,25,228,172,0,100,127,130,238,40,124,241,11,88,74,255,101,96,230,229,252,247,244,249,211,15,12,152,87,209,194,3,7,32,128,88,8,68,60,252,230,202,23,12,236,31,191,137,72,189,99,184,117,65,242,247,7,96,181,34,199,141, +86,2,128,46,128,120,6,217,176,200,35,5,217,238,245,250,53,100,85,47,57,141,59,80,196,131,234,120,14,14,240,218,59,70,159,116,240,84,46,220,177,55,79,51,252,95,217,203,240,127,255,74,200,148,174,16,242,121,2,36,172,64,6,101,68,80,143,0,164,23,180,77,12, +84,210,176,50,146,87,55,243,242,66,86,235,28,219,3,44,17,246,0,19,172,45,216,205,224,75,171,162,170,24,24,194,203,129,238,93,202,240,255,40,48,33,220,56,11,62,164,10,188,113,150,25,186,195,9,20,134,176,5,46,48,115,193,139,83,126,131,47,175,98,52,112, +96,96,116,3,54,112,191,220,97,96,184,187,12,218,240,102,97,64,153,10,102,101,102,248,254,250,7,48,1,252,97,248,195,199,243,227,220,15,222,39,12,168,55,144,162,36,6,128,0,194,87,2,160,104,122,240,233,199,167,247,12,76,111,57,126,49,72,254,4,90,0,190,106, +134,137,1,245,122,55,208,128,196,211,189,12,12,234,197,12,140,58,118,192,220,121,14,218,37,98,36,46,210,161,13,56,240,122,2,144,223,100,180,129,245,124,42,3,163,107,60,100,232,19,60,240,241,5,28,128,255,22,53,3,3,17,152,155,132,160,203,194,254,145,185, +252,26,100,45,59,52,1,252,248,6,221,55,75,230,125,4,176,133,171,66,188,224,110,233,255,179,192,170,225,244,97,96,137,101,1,44,185,10,25,24,181,128,9,217,37,14,140,25,174,30,1,202,237,4,175,105,4,159,84,254,245,29,100,16,10,189,185,2,98,115,177,65,134, +176,211,187,33,213,206,137,70,200,105,33,28,162,12,24,119,35,1,193,183,231,223,129,5,217,127,134,143,28,188,111,142,29,185,241,26,45,62,81,50,57,64,0,161,151,0,255,176,69,62,8,63,126,255,233,235,27,38,214,183,146,140,160,27,215,190,129,79,243,96,6,223, +120,245,15,181,29,240,236,0,248,2,38,38,96,164,253,221,179,20,88,63,3,237,23,68,46,150,209,198,233,97,197,60,200,243,63,255,131,75,95,70,121,45,6,6,27,63,6,38,251,16,6,6,21,99,132,150,187,23,24,254,109,154,14,108,228,45,128,140,237,139,243,66,93,75,65, +21,3,74,196,28,208,210,12,84,2,80,163,3,3,94,29,5,244,8,232,58,251,223,192,30,201,165,19,192,158,65,18,248,218,58,70,75,31,240,62,71,6,109,27,96,91,1,136,221,19,193,7,66,252,127,122,7,178,231,239,37,176,215,242,238,53,36,17,130,110,27,17,7,54,118,245, +128,37,137,67,20,164,55,115,23,24,166,15,55,66,214,2,98,75,204,160,91,204,159,129,174,176,103,252,255,156,93,224,233,207,223,191,209,111,30,69,73,8,0,1,196,194,128,61,205,33,151,2,96,205,159,191,255,252,117,247,203,159,103,186,28,236,255,190,63,255,202, +244,23,216,29,4,205,57,99,12,200,124,125,2,217,226,173,6,76,4,192,98,239,31,104,9,213,91,96,67,20,116,71,16,120,137,56,180,187,2,202,233,160,57,237,159,208,42,87,72,148,129,81,197,16,178,201,3,88,212,49,128,216,48,0,90,149,115,100,45,195,255,45,179,25, +254,223,185,2,185,106,141,143,151,242,238,230,63,232,53,117,176,179,1,126,253,160,114,143,5,218,88,4,237,2,6,157,14,126,102,63,195,255,11,251,25,24,129,25,131,209,23,88,165,217,5,51,48,128,214,46,130,48,76,15,232,232,186,47,208,157,30,160,132,41,0,93, +132,242,253,49,48,242,129,13,205,235,211,33,155,65,25,209,206,52,2,49,129,225,242,247,227,47,134,31,175,190,51,48,114,176,48,156,127,247,227,46,82,228,99,77,4,0,1,196,66,32,226,255,33,107,190,240,244,245,51,103,1,190,55,204,47,222,136,125,7,22,51,224, +75,157,81,134,132,161,99,196,247,65,155,60,157,129,197,119,14,3,147,152,52,195,191,221,75,24,24,46,236,3,22,91,72,219,174,64,9,66,66,14,216,80,2,246,221,141,128,141,38,121,29,6,70,41,101,96,66,16,67,205,76,160,113,251,237,243,25,254,223,61,7,57,206,149, +135,154,103,7,65,219,0,176,4,0,26,200,161,197,248,13,120,161,38,39,100,171,24,176,62,255,127,235,28,195,255,25,192,106,242,240,58,6,166,152,106,6,6,208,89,137,32,183,188,2,70,240,59,96,183,145,91,10,178,208,243,61,176,91,250,20,152,161,62,191,0,150,235, +192,46,238,231,135,208,171,111,185,176,183,115,128,61,175,207,231,63,51,252,254,242,139,225,39,39,207,231,245,87,30,220,129,198,29,206,59,136,1,2,8,219,56,0,114,10,129,105,0,223,93,123,232,225,171,231,201,154,122,207,120,94,190,22,251,114,239,51,3,175, +58,63,3,19,122,125,9,26,148,0,53,6,207,0,235,41,227,122,6,70,251,80,6,102,125,71,200,53,45,160,179,111,62,191,101,96,228,23,103,96,144,85,103,96,4,13,213,10,203,64,183,142,125,133,180,108,127,232,0,83,62,100,162,227,255,218,9,12,255,150,181,2,27,150, +111,32,3,42,92,208,254,46,181,6,154,96,243,90,28,92,16,254,239,31,52,156,191,130,186,25,84,34,128,150,169,129,182,187,157,222,197,240,247,217,93,96,215,17,216,165,117,8,7,182,115,212,25,24,158,0,51,202,213,25,144,243,127,192,179,236,191,145,246,78,178, +64,102,92,177,69,62,19,100,167,214,199,91,159,24,254,125,255,203,240,66,89,235,238,163,227,199,63,51,32,238,29,254,131,165,4,248,7,16,64,132,74,128,191,200,6,124,249,254,227,231,125,6,174,39,178,156,44,122,159,238,126,100,18,253,44,206,192,198,207,134, +101,72,152,21,146,146,143,23,0,139,114,96,221,165,24,12,140,108,27,240,66,11,176,201,200,99,67,95,129,117,222,237,53,144,83,65,84,98,33,145,255,254,37,195,191,217,192,22,51,104,231,47,232,160,36,46,34,6,115,40,137,20,80,35,18,196,251,243,155,94,115,186, +144,54,2,40,49,188,124,192,240,111,50,176,203,248,233,45,3,147,95,22,176,52,40,132,228,242,71,155,33,179,171,76,108,104,51,171,56,70,51,217,24,25,126,191,249,1,172,129,191,128,59,19,167,191,179,220,96,64,92,65,143,158,8,96,87,210,255,7,8,32,124,37,192, +95,36,3,224,134,156,126,253,229,161,169,144,216,59,166,199,207,69,126,190,248,193,192,198,135,101,221,31,168,84,0,141,11,128,218,3,151,122,25,24,238,0,171,0,126,117,200,217,56,160,226,11,116,87,31,168,148,248,246,28,88,34,0,19,192,79,96,81,103,84,15, +44,254,245,192,183,116,255,235,75,129,172,192,101,103,163,254,149,49,216,0,204,142,191,127,232,59,131,13,155,112,250,242,158,225,63,232,24,156,111,159,193,123,25,24,244,75,33,103,38,129,194,143,88,7,1,219,99,95,239,127,97,248,245,254,59,195,95,110,174, +159,203,206,221,184,134,20,233,216,170,0,112,53,0,16,64,184,18,0,122,238,135,37,130,223,91,207,94,121,16,225,166,253,138,227,217,51,145,79,183,62,50,112,171,242,65,142,249,197,118,43,8,19,180,143,250,13,88,135,125,125,138,180,116,9,54,113,4,42,182,126, +65,174,137,83,12,4,159,134,245,175,3,216,229,187,15,116,59,23,23,29,150,148,65,219,0,204,172,136,161,214,129,0,160,68,0,236,129,252,91,80,203,192,4,108,248,49,6,228,64,74,78,80,230,33,102,98,137,25,114,78,195,135,155,159,25,254,126,249,199,240,66,75, +243,206,195,211,224,227,97,64,113,246,11,45,19,163,220,52,10,16,64,76,120,198,0,254,162,21,29,96,131,64,213,192,117,6,174,59,255,217,217,126,127,123,242,149,225,31,214,43,97,176,204,18,130,230,171,65,245,23,24,179,67,248,160,200,7,121,84,51,131,129,225, +193,117,134,127,45,209,192,210,226,42,105,251,251,41,110,165,51,161,78,165,14,8,248,15,153,172,2,150,64,255,102,20,1,171,190,117,144,91,212,36,29,193,35,171,4,107,49,96,238,255,9,108,148,127,125,248,17,92,189,30,254,201,121,17,91,233,141,165,29,192,0, +16,64,76,68,180,1,96,169,8,134,127,111,187,247,250,198,23,17,233,183,223,95,126,97,248,7,154,117,34,231,164,111,208,8,152,4,176,245,171,95,5,44,238,94,49,252,91,209,206,192,112,243,38,228,226,8,250,148,191,144,28,207,206,197,192,200,54,208,9,0,218,83, +0,53,114,129,225,9,58,75,137,1,116,135,145,78,54,228,238,100,134,127,248,7,178,88,24,25,190,62,250,202,240,235,237,119,134,31,66,130,31,151,158,189,121,13,185,212,102,64,189,103,24,165,4,0,8,32,38,28,105,10,150,66,254,96,73,0,191,142,92,190,241,226,154, +128,216,213,239,223,88,254,188,187,244,142,225,63,51,137,103,234,128,14,126,226,85,99,96,48,239,129,156,2,178,160,134,129,97,235,82,6,6,17,78,250,173,36,2,183,176,255,66,150,116,65,27,129,144,197,28,3,152,8,64,37,18,47,27,195,255,107,39,128,61,166,243, +192,146,80,17,216,91,242,134,174,194,193,53,144,5,41,254,191,60,248,4,94,23,178,151,79,253,192,235,119,239,191,225,40,254,255,160,13,4,49,0,4,16,182,4,240,15,75,21,128,145,8,22,220,124,115,230,171,136,212,187,87,39,94,130,7,31,136,62,97,11,148,235,64, +39,108,232,230,65,246,18,158,216,196,240,111,249,108,134,255,220,176,13,14,116,140,1,208,214,112,208,96,11,116,171,23,35,203,32,168,10,64,147,103,160,1,201,19,91,129,141,99,96,176,75,58,224,14,23,104,241,255,227,201,55,134,79,215,222,49,124,23,17,127, +183,232,234,227,203,191,255,252,249,133,37,247,99,45,1,0,2,136,9,123,191,8,165,26,64,54,8,118,250,244,175,115,183,238,190,121,40,42,125,231,251,187,63,127,223,95,0,205,250,17,121,245,0,168,7,32,8,236,235,139,219,128,199,222,255,174,232,128,172,218,101, +231,160,127,35,236,31,108,34,8,58,162,9,154,19,24,12,155,63,64,109,103,208,152,201,143,79,192,158,147,28,116,185,61,142,190,63,208,193,239,206,191,101,248,241,234,15,195,9,1,213,51,47,223,190,251,130,150,97,113,54,0,65,70,0,4,16,190,42,224,47,90,87,16, +150,0,224,137,96,231,243,47,87,128,13,182,223,47,79,188,134,148,2,44,140,4,2,240,63,244,102,112,55,200,204,23,232,208,200,107,64,143,242,114,12,204,182,43,144,149,160,197,29,176,249,127,142,65,146,0,192,71,216,254,132,14,85,195,246,118,98,113,24,7,19, +195,207,103,223,25,222,159,127,205,240,83,84,232,243,166,187,47,174,125,249,246,253,39,129,214,255,63,100,195,0,2,136,9,79,219,18,87,67,16,158,8,246,93,187,247,248,15,31,247,183,159,175,190,51,188,57,5,186,2,134,133,64,183,245,31,100,96,3,124,91,55,3, +228,128,228,127,12,72,199,20,208,25,128,214,127,130,18,0,172,4,0,29,24,61,24,54,254,128,66,28,116,164,60,248,216,186,55,208,101,223,140,88,71,254,222,95,4,22,253,207,127,49,60,20,81,184,115,251,233,203,15,216,26,237,88,122,0,240,18,0,32,128,112,149,0, +48,140,62,24,132,92,13,252,124,253,241,243,151,107,60,210,87,64,70,190,58,254,154,225,55,48,33,224,61,20,234,63,52,69,243,200,66,184,143,111,65,207,70,30,160,108,7,178,150,79,24,177,221,27,52,39,192,204,52,176,187,126,96,213,160,190,3,164,129,10,26,33, +5,237,182,70,63,108,1,88,247,127,3,214,253,111,129,185,31,52,188,114,243,31,251,163,55,95,190,126,69,111,171,225,43,254,65,0,32,128,152,8,20,144,232,35,130,176,220,255,3,102,65,239,149,215,7,191,203,201,189,249,245,238,59,195,243,253,207,33,41,149,133, +17,255,224,59,35,52,199,129,143,107,25,192,110,23,104,101,150,140,42,228,194,74,16,0,237,31,96,101,31,184,1,33,70,232,133,82,188,236,12,76,154,86,144,92,254,116,31,34,188,224,35,151,204,12,255,126,252,97,120,115,252,37,195,215,7,63,24,62,26,26,61,222, +117,255,213,237,63,127,255,253,68,175,166,113,36,0,56,0,8,32,38,252,131,228,24,9,224,23,90,34,248,113,243,225,227,247,147,126,73,173,251,199,206,244,251,221,249,55,12,175,246,128,214,228,225,57,132,28,180,100,28,52,42,8,242,47,104,246,239,215,0,37,0, +208,184,63,59,48,128,85,76,192,71,170,128,221,3,58,9,132,157,99,0,187,129,192,224,254,252,143,129,209,37,26,178,119,241,201,78,6,134,215,167,16,35,149,208,162,255,63,48,129,190,57,246,10,136,129,141,63,9,145,143,11,158,253,220,119,230,246,253,87,216, +170,105,164,4,240,15,91,2,0,8,32,38,2,5,36,182,222,0,44,242,225,169,109,245,161,19,247,142,41,88,30,249,251,254,15,195,75,160,195,190,222,4,86,69,60,88,14,146,2,165,228,63,192,20,254,241,38,132,175,101,137,119,140,131,166,57,13,180,145,68,76,6,216,205, +2,70,250,151,251,64,119,125,2,31,90,13,190,156,226,239,223,129,113,211,135,175,12,140,70,38,12,76,81,181,192,112,249,0,153,251,7,101,24,228,98,18,152,0,190,222,251,194,240,98,239,51,134,127,64,119,158,150,208,56,179,250,252,205,59,208,220,255,3,41,110, +144,27,129,40,19,64,200,137,0,32,128,8,245,221,208,135,133,145,83,216,119,100,11,27,247,94,56,252,73,78,238,37,168,42,120,117,248,53,80,244,31,100,51,5,198,252,0,80,236,237,5,176,209,140,22,190,192,92,39,2,89,138,69,239,173,228,63,129,246,131,54,118, +8,74,67,86,49,253,124,7,94,151,199,40,174,0,25,120,161,171,123,128,118,125,249,204,192,40,39,207,192,148,209,195,192,32,5,116,195,165,126,160,216,3,212,69,163,224,94,244,111,112,85,251,243,253,111,134,167,10,42,119,103,159,189,123,254,215,239,63,223, +209,75,102,164,68,128,49,252,139,12,0,2,136,152,18,224,63,218,160,208,47,36,75,224,137,224,61,176,1,50,245,51,247,150,255,140,12,127,191,62,252,196,240,245,225,23,72,255,254,63,250,64,7,176,161,245,28,88,175,125,186,11,62,161,155,209,43,21,200,166,115, +142,251,15,189,219,80,197,8,88,239,11,50,48,188,60,5,89,108,1,10,99,208,158,134,159,116,206,253,160,3,170,5,161,215,202,232,217,51,48,188,57,3,116,211,49,6,140,187,159,129,185,255,203,205,79,12,31,174,188,103,248,46,194,255,113,249,243,223,71,110,62, +121,254,22,41,67,126,71,43,157,127,163,13,254,96,180,184,1,2,136,152,209,155,127,104,213,192,47,180,148,6,79,4,91,46,221,126,176,87,193,122,255,183,23,191,255,191,60,248,130,225,255,231,63,224,85,42,168,137,157,5,178,63,239,206,98,72,123,16,116,16,147, +150,6,100,203,53,189,114,29,116,229,47,163,154,25,132,15,90,109,3,171,150,148,244,232,219,41,1,45,67,19,148,96,96,202,155,4,62,8,27,60,115,122,5,152,16,126,190,65,205,253,160,189,171,191,254,50,188,58,243,154,225,47,19,211,239,19,34,154,103,86,94,121, +120,7,41,14,190,163,37,2,244,250,31,235,114,105,128,0,34,166,10,192,214,37,252,133,102,49,56,1,252,4,22,69,29,251,207,158,120,97,96,124,231,237,169,183,12,79,119,62,5,102,182,255,104,163,132,255,33,167,91,130,174,140,123,121,152,129,65,8,232,249,220, +41,144,165,94,223,191,51,208,188,91,0,59,249,83,92,22,124,236,60,195,255,47,144,203,25,65,221,45,144,23,181,45,192,3,44,224,181,1,180,46,133,64,75,208,128,213,16,115,221,42,6,70,251,112,200,54,175,51,85,192,18,224,20,100,73,24,44,44,128,57,255,31,176, +104,125,177,227,25,195,135,171,31,255,63,82,215,191,85,185,237,228,17,164,56,248,6,197,176,248,192,86,252,99,77,214,0,1,68,236,190,45,124,165,192,119,36,203,127,124,248,246,227,203,148,7,223,247,253,228,21,252,242,250,200,51,134,215,135,94,50,252,5,37, +2,148,246,0,244,232,161,243,45,64,79,63,98,96,52,112,102,96,138,169,7,154,204,138,116,182,0,13,187,127,160,117,31,26,230,12,140,160,6,224,135,123,144,238,40,104,1,6,176,191,205,168,160,11,94,174,6,62,85,132,86,137,17,212,3,1,217,169,98,204,192,84,182, +144,129,1,116,104,5,168,216,7,69,254,139,67,144,161,95,88,105,200,12,172,83,129,110,126,123,236,37,195,139,131,207,25,62,136,136,189,234,187,252,106,223,191,255,255,145,115,252,55,36,252,3,169,248,71,111,253,99,36,2,128,0,34,38,1,252,199,209,24,252,137, +197,1,224,68,176,247,252,213,199,171,69,20,119,253,226,18,250,254,120,227,67,134,151,59,129,45,86,208,197,18,172,72,155,145,65,107,222,64,43,130,142,101,3,235,223,155,12,140,161,165,12,76,9,133,144,11,37,191,127,167,93,2,0,157,26,194,203,13,94,103,15, +94,155,7,218,95,7,242,18,104,87,211,171,83,224,97,97,102,207,36,160,27,64,237,4,42,215,5,160,56,253,9,57,204,129,209,61,137,129,185,113,29,3,163,186,33,3,195,85,96,145,127,36,29,216,229,59,13,172,50,133,160,221,101,6,112,120,129,242,206,11,96,248,61, +222,244,136,225,183,160,208,215,165,44,210,123,78,222,127,250,28,41,220,191,66,241,55,44,197,63,114,235,31,43,0,8,32,82,118,110,254,199,49,38,128,145,8,128,169,243,199,164,253,231,46,236,21,80,58,242,139,137,237,247,243,61,79,24,94,29,120,193,240,239, +23,242,45,225,208,147,69,65,27,28,142,131,206,216,7,150,4,9,173,12,76,169,205,224,13,144,12,95,190,208,96,68,142,17,60,195,6,218,205,11,222,94,246,7,216,238,120,117,2,186,234,6,88,223,62,222,2,81,102,27,194,192,32,192,3,185,252,137,42,165,0,116,225,44, +232,176,41,30,33,6,166,228,54,6,166,130,25,144,147,73,47,118,2,91,252,61,144,238,49,155,32,34,164,217,32,145,255,114,207,51,134,23,251,159,49,252,97,99,249,189,139,87,254,240,162,163,231,111,64,35,25,61,242,209,115,255,95,92,163,127,200,0,32,128,152, +72,136,124,244,146,0,185,26,248,134,134,193,245,80,207,225,75,167,143,51,177,158,254,251,143,225,239,211,157,79,24,222,156,120,13,73,0,140,200,237,1,62,96,9,0,236,17,92,232,4,71,8,99,64,46,3,83,62,48,71,200,3,139,225,207,95,241,108,215,38,167,241,247, +27,178,5,11,116,31,17,104,212,239,229,17,232,254,122,208,214,111,62,72,98,248,254,138,129,65,68,22,88,39,3,19,193,199,223,148,31,119,203,4,109,79,124,2,86,47,202,250,12,76,160,163,236,131,11,32,107,34,174,0,187,122,183,23,66,54,121,128,23,126,252,135, +231,124,240,197,32,192,190,254,243,3,207,25,24,129,41,225,48,187,196,241,134,61,231,143,161,229,252,111,4,114,255,63,66,227,236,0,1,68,170,247,96,9,0,189,75,136,205,81,223,223,127,255,245,185,227,9,243,225,43,58,86,23,254,3,251,221,207,118,61,5,175,92, +1,221,106,129,2,64,37,193,139,163,192,54,65,43,208,180,151,224,3,158,153,170,150,48,48,154,187,64,170,131,127,127,169,147,19,65,237,11,121,77,6,38,215,56,200,82,171,39,123,32,13,64,240,142,93,22,200,221,59,119,87,128,183,119,49,129,54,119,74,128,174, +99,249,65,94,239,4,182,199,15,216,191,103,248,240,157,129,209,57,132,129,169,114,62,120,103,51,120,65,236,233,90,6,134,27,179,33,85,33,8,195,14,117,2,13,163,3,123,78,175,129,37,38,40,231,255,251,252,151,225,162,145,235,233,202,51,79,15,32,149,184,232, +145,143,173,238,71,46,250,113,38,2,128,0,34,181,10,64,95,45,132,173,49,136,226,184,215,31,63,125,108,59,251,228,192,109,3,171,203,191,63,254,97,120,180,238,62,195,183,251,160,227,214,144,207,180,97,130,96,208,82,232,211,213,192,0,187,14,222,115,207,84, +52,155,129,209,46,0,152,19,191,67,239,209,165,32,17,128,143,126,97,97,96,114,8,101,96,144,82,130,12,70,129,26,94,140,240,11,180,128,57,15,216,254,120,184,22,114,7,143,162,62,3,131,115,48,176,113,248,27,106,47,35,241,145,14,30,211,7,6,193,235,207,224, +21,199,140,81,185,224,59,4,193,187,157,64,165,206,169,50,96,226,219,10,89,31,9,110,237,195,79,244,2,182,79,88,25,190,92,255,200,240,226,240,115,134,223,111,254,50,220,176,112,57,95,181,235,204,222,223,255,254,125,67,11,223,47,72,108,146,26,126,200,0, +32,128,152,27,26,26,24,26,27,27,41,109,218,96,59,139,14,126,206,240,251,143,31,255,92,250,206,244,220,196,64,83,128,251,206,125,209,175,15,190,48,112,8,177,51,176,203,65,23,58,252,249,15,221,51,207,2,217,242,12,42,138,65,219,158,101,44,25,24,245,157, +33,126,187,4,44,253,190,65,215,28,48,147,49,125,252,227,59,120,115,38,232,4,112,208,69,79,12,215,103,66,18,0,11,23,194,233,160,118,0,168,68,248,5,44,9,100,128,165,15,159,36,195,255,163,43,33,215,190,179,67,237,69,142,100,100,12,242,7,168,91,247,249,7, +228,104,58,30,118,6,70,87,96,73,150,213,199,192,228,145,2,217,252,114,115,62,164,216,7,45,133,7,217,11,91,53,13,138,34,208,29,76,92,204,12,159,206,191,103,120,188,225,33,48,147,252,96,184,99,235,124,177,122,255,165,61,79,95,191,253,128,20,249,160,136, +255,140,39,1,160,15,251,226,5,0,1,196,8,222,229,75,90,206,66,191,89,4,148,149,65,201,24,52,139,2,10,77,208,46,14,94,52,12,18,227,210,86,86,20,233,82,102,13,18,127,116,75,142,141,159,149,65,202,77,142,65,200,84,136,129,17,84,37,124,133,186,25,188,29,250, +39,228,18,4,121,63,232,70,9,54,200,222,192,77,83,128,197,230,73,134,255,223,254,66,22,145,128,150,112,17,154,185,131,230,70,70,14,110,6,166,166,13,12,12,6,142,192,198,222,38,72,117,3,178,135,137,13,179,155,8,2,160,37,107,202,177,12,255,79,108,99,96,88, +80,203,240,15,180,53,237,43,212,167,160,222,12,108,131,11,232,206,194,159,144,144,96,20,226,7,230,114,96,3,83,11,216,173,179,14,4,118,41,245,128,161,194,6,185,9,245,234,52,96,130,59,1,41,137,208,78,244,2,87,137,223,126,51,188,62,249,154,225,197,222,39, +12,63,95,255,97,184,100,225,118,166,227,208,165,195,183,159,190,120,131,22,241,32,252,9,74,163,39,128,63,248,70,253,176,1,128,0,34,39,1,160,39,2,22,180,68,192,13,197,232,137,0,36,198,37,193,201,202,159,110,162,98,232,247,233,166,11,168,169,195,37,203, +207,32,237,41,197,192,173,198,143,72,4,96,167,255,133,68,16,159,60,3,131,54,48,17,72,185,64,78,245,126,114,147,225,255,186,126,134,127,123,150,65,210,59,232,100,46,88,137,128,182,249,24,60,226,247,13,180,0,149,15,216,223,6,214,191,54,192,250,247,254, +106,96,203,187,3,98,62,19,27,238,97,15,144,89,234,137,12,12,154,217,224,155,79,25,158,220,98,248,119,12,152,128,78,237,0,111,111,3,151,88,160,102,58,191,48,3,35,104,72,89,199,150,129,17,52,140,11,186,129,20,180,176,228,31,48,190,238,46,103,96,120,186, +11,168,255,57,164,149,207,200,136,122,100,14,19,164,190,255,124,237,3,176,125,244,156,225,203,253,143,12,255,121,184,255,108,100,22,223,63,253,218,171,115,111,63,131,78,156,130,23,247,95,144,34,254,51,82,15,0,91,228,19,125,72,2,64,0,145,155,0,144,19, +1,51,90,34,224,68,42,9,120,144,74,0,24,230,100,102,98,228,140,119,177,85,75,249,112,222,135,237,203,103,46,54,126,78,6,25,79,105,6,65,107,49,160,151,254,32,109,247,102,132,44,33,3,229,26,25,55,6,6,173,44,160,105,202,144,125,117,87,142,48,252,95,210,12, +190,153,147,225,199,111,168,43,88,144,6,123,254,130,175,113,1,69,10,99,102,47,3,163,146,1,176,161,185,143,129,225,68,9,228,88,53,22,78,252,97,244,31,26,142,210,192,238,162,86,46,48,249,202,33,142,192,67,30,37,4,29,47,3,222,247,192,4,209,3,58,38,231,193, +58,200,141,158,224,11,29,217,160,67,186,140,152,51,227,64,125,175,14,190,96,120,182,231,41,195,191,111,127,24,126,72,73,127,154,203,162,176,99,241,190,227,183,254,252,251,135,220,166,250,140,148,0,96,137,1,214,242,39,106,200,23,23,0,8,32,74,19,0,210, +176,30,252,110,58,228,68,192,141,37,17,112,67,229,57,108,100,132,164,235,53,5,189,133,158,223,19,103,230,100,97,148,116,146,102,16,177,22,5,86,141,160,211,58,254,161,22,203,127,191,66,174,164,145,7,230,98,149,72,160,41,178,16,39,60,188,198,240,239,228, +54,112,213,192,240,246,57,36,177,128,150,121,75,171,48,48,58,69,131,79,213,0,135,7,232,138,250,163,192,4,244,227,53,164,203,71,76,24,129,34,20,52,111,193,14,84,47,233,2,89,203,40,164,5,29,169,99,130,204,223,255,2,86,207,159,238,0,35,254,10,164,129,7, +218,19,9,78,96,92,152,11,57,224,189,30,70,134,127,191,255,131,199,70,158,238,125,10,108,250,48,253,127,201,47,254,180,249,230,151,29,199,95,124,124,134,165,159,255,25,173,222,255,138,20,249,191,72,173,247,145,1,64,0,81,146,0,208,27,128,176,146,0,118, +209,52,122,34,64,198,92,176,68,192,193,198,198,217,109,33,235,100,241,253,185,1,227,167,111,172,2,90,66,12,82,30,82,12,236,50,92,224,75,194,33,39,127,192,6,83,254,64,26,105,160,126,179,74,52,176,142,6,38,4,118,96,213,193,200,142,187,227,2,154,230,125, +180,29,216,0,155,13,90,196,6,116,33,129,141,22,88,7,113,64,103,25,124,129,158,134,202,9,57,22,31,20,193,160,42,10,212,96,4,173,217,3,177,65,173,122,112,163,18,203,34,78,200,129,187,12,255,152,254,51,252,120,250,157,225,201,150,39,12,31,111,125,96,248, +203,203,245,253,152,136,198,217,242,93,23,142,0,115,61,242,4,219,87,2,141,190,31,132,22,123,16,3,0,2,136,210,4,128,173,213,15,75,4,200,13,67,110,164,132,192,141,158,8,64,106,155,92,140,44,92,94,92,181,102,251,253,147,131,133,151,141,65,204,74,148,65, +216,76,148,1,116,75,25,234,21,235,208,253,132,160,8,1,221,81,40,102,13,185,68,153,95,13,104,26,244,126,36,80,233,249,11,40,255,234,36,164,107,9,26,231,7,29,170,0,26,111,32,123,5,10,244,40,60,6,232,105,101,224,209,67,38,104,241,206,132,148,219,177,47, +223,254,15,196,127,62,253,2,15,134,189,60,250,146,1,116,208,214,55,62,158,143,203,127,139,28,152,126,254,254,21,44,131,106,95,145,138,123,228,92,255,29,75,127,159,232,70,31,58,0,8,32,106,36,0,108,61,3,102,180,146,0,189,52,128,37,8,46,40,6,39,130,20,93, +25,237,96,129,63,230,34,31,223,72,252,255,242,135,153,75,150,147,65,214,75,150,129,71,131,31,82,45,128,27,118,255,161,87,187,253,135,108,47,3,237,51,0,207,43,179,65,138,106,208,190,195,223,159,33,231,231,130,115,37,59,228,28,61,70,106,222,248,192,136, +54,60,130,69,26,212,38,96,130,206,228,1,123,10,31,206,189,97,120,126,240,57,195,183,199,192,238,40,39,211,223,55,98,178,47,230,223,255,124,120,213,189,119,183,209,166,214,191,33,213,241,95,176,12,246,252,66,154,233,251,71,78,189,143,12,0,2,136,90,9,128, +80,34,64,111,23,112,227,74,4,42,194,124,130,121,90,98,230,106,108,127,228,184,222,188,227,231,101,254,198,45,102,41,194,192,167,42,200,192,12,186,15,79,128,21,88,10,179,64,18,194,31,164,165,139,224,99,212,96,97,194,2,29,87,96,102,160,235,85,31,140,208, +46,34,48,60,255,2,27,117,191,63,253,102,248,243,229,55,195,199,43,111,193,185,254,43,11,207,215,239,130,130,159,174,255,227,124,208,125,225,217,241,167,31,193,173,252,31,88,114,62,182,73,158,159,164,142,243,19,3,0,2,136,154,9,0,87,34,96,129,38,0,118, +44,165,1,50,205,137,84,37,176,73,11,240,242,58,75,112,201,123,11,177,233,42,125,124,169,200,194,250,139,25,116,43,54,175,18,63,131,128,150,0,3,183,34,15,3,51,232,112,10,80,66,0,53,24,255,13,192,82,110,216,9,35,160,238,28,27,100,6,239,215,251,159,12,223, +30,125,101,248,120,237,61,195,151,135,159,25,126,189,251,193,240,135,137,235,239,53,97,217,155,251,95,124,190,121,232,229,151,199,247,223,126,250,136,20,161,223,113,204,236,125,67,171,239,145,183,120,253,163,70,228,131,0,64,0,81,59,1,224,106,19,160,143, +21,112,34,229,124,228,82,0,150,8,96,9,134,85,150,143,139,47,70,83,74,211,130,253,151,134,212,251,231,210,192,46,31,19,43,15,19,3,191,166,16,3,191,190,16,176,51,192,13,57,171,8,182,43,9,52,48,3,154,122,254,135,165,180,166,70,132,195,250,239,32,251,96, +211,219,64,59,65,39,115,126,190,249,137,225,221,133,55,12,223,158,124,1,230,254,127,12,140,124,92,255,158,240,137,61,61,250,254,231,141,25,183,222,94,252,242,243,23,114,17,142,28,249,216,38,118,190,163,141,240,33,79,240,80,37,242,65,0,32,128,104,145, +0,208,123,7,200,35,134,172,72,145,203,129,20,233,232,165,0,188,36,128,98,86,67,113,126,17,43,45,85,73,107,166,143,234,202,159,95,41,50,189,251,200,198,202,207,204,192,41,197,195,192,37,205,13,196,92,12,28,98,156,224,123,115,25,121,88,225,187,102,225, +137,225,223,127,242,154,73,208,214,59,164,44,99,134,38,180,255,12,255,63,255,102,248,254,246,39,3,232,176,172,239,79,190,49,124,125,252,153,225,251,139,47,192,162,255,63,195,47,46,206,31,247,36,212,238,29,127,243,245,222,209,71,111,158,92,120,249,225, +45,3,238,229,116,216,102,82,145,87,245,252,198,50,187,247,159,90,245,26,64,0,209,42,1,224,74,4,176,132,192,134,86,26,112,34,37,0,46,36,113,14,36,181,172,208,18,129,215,144,159,69,60,64,75,65,75,231,227,67,117,230,143,31,217,192,183,166,115,48,50,176, +242,178,51,112,8,115,49,112,43,1,19,133,44,48,65,8,114,48,176,129,206,234,3,109,89,99,66,58,105,3,148,24,254,226,9,63,208,78,103,216,186,5,240,110,102,208,112,242,31,134,95,31,127,131,115,250,151,7,95,128,197,252,23,240,129,204,191,63,127,103,0,117,222, +64,199,18,127,226,230,255,112,142,67,252,198,254,167,159,238,157,127,253,249,213,179,79,224,157,58,232,219,234,144,35,31,121,53,21,114,113,255,19,203,162,142,127,148,180,246,113,1,128,0,162,101,2,96,96,192,188,133,140,25,203,120,1,7,18,230,196,82,10, +112,64,19,0,27,18,102,145,228,227,226,209,224,102,22,50,149,20,144,50,22,96,87,80,248,254,78,154,229,243,59,78,240,249,255,160,140,202,197,6,108,252,179,50,176,2,187,145,108,2,108,12,156,98,28,192,68,194,12,20,7,54,34,121,89,24,88,65,147,47,56,218,135, +191,191,255,1,54,222,254,128,27,112,127,127,252,101,248,249,250,39,48,226,127,1,35,251,39,248,190,4,240,81,185,44,144,218,248,175,176,232,143,155,12,236,15,174,252,102,127,178,231,238,139,135,183,62,255,250,240,249,39,248,62,122,228,101,244,191,144,34, +246,59,3,238,133,156,63,209,90,249,127,177,204,235,83,181,177,3,16,64,180,78,0,184,218,5,200,195,199,232,213,2,114,238,231,68,19,71,78,8,32,125,44,236,204,76,192,38,0,11,135,48,55,39,151,133,146,180,184,62,235,79,41,29,230,111,74,252,31,95,9,129,51,49, +35,11,195,63,208,134,89,208,108,48,23,19,248,58,53,208,197,17,204,176,141,172,88,130,19,116,206,238,255,127,144,9,31,208,117,185,32,215,50,131,174,98,253,243,151,225,255,223,191,12,111,165,52,94,94,123,255,233,201,101,118,137,39,39,110,221,123,245,242, +227,215,175,159,254,252,251,249,243,207,223,95,12,152,231,41,252,64,203,249,63,208,18,193,79,44,221,187,223,72,35,123,255,168,89,228,163,3,128,0,162,87,2,32,84,37,160,151,8,236,72,52,39,22,49,118,164,68,0,211,207,204,194,196,4,76,16,140,44,188,108,44, +108,170,10,242,188,6,2,236,162,226,207,175,11,241,201,40,176,138,139,138,241,49,63,190,197,198,193,240,151,157,71,84,146,141,229,231,55,86,112,93,142,230,119,208,221,104,127,216,57,127,127,122,247,250,199,207,255,204,191,127,73,43,127,123,251,250,245, +247,15,207,30,255,124,35,171,243,254,252,243,119,175,111,61,121,254,9,216,160,251,253,243,31,195,159,63,255,254,193,114,42,182,131,52,126,98,201,249,216,54,111,160,239,226,253,71,171,34,31,29,0,4,16,61,19,0,190,42,1,185,68,64,30,59,64,79,16,28,132,18, +1,3,218,245,232,12,168,187,43,176,94,137,135,163,173,207,128,165,193,133,126,150,50,250,25,10,191,209,114,61,122,100,163,71,58,174,237,219,52,43,242,209,1,64,0,209,123,99,62,242,37,172,200,129,137,126,44,45,44,32,217,144,104,88,0,34,39,0,88,34,96,193, +147,8,152,240,44,90,193,215,217,195,22,241,196,68,254,79,28,137,224,23,150,150,61,174,136,255,207,64,167,209,43,128,0,26,136,147,25,112,229,176,255,72,129,202,140,22,176,172,208,192,99,135,6,38,59,90,41,193,134,148,0,88,176,36,0,92,137,0,215,184,46,250, +81,57,12,12,152,39,168,227,58,67,9,57,1,252,194,81,204,35,183,238,209,235,122,6,6,58,238,77,2,8,32,122,87,1,196,84,11,76,56,218,8,172,104,61,1,54,180,42,128,13,45,1,192,48,35,145,213,1,177,197,62,182,131,52,127,225,40,5,126,227,137,248,127,244,46,238, +177,1,128,0,26,12,9,128,1,75,132,224,75,8,44,88,34,29,57,145,48,227,168,6,112,94,161,142,167,248,255,79,32,1,252,69,139,92,108,24,219,9,93,3,30,241,48,0,16,64,131,41,1,16,91,34,48,35,69,52,11,26,155,25,75,2,32,183,4,96,192,146,0,254,99,73,0,127,145,34, +248,55,26,251,239,96,141,120,24,0,8,160,193,152,0,112,37,4,70,164,72,101,38,128,153,112,244,4,112,229,124,66,13,65,98,74,2,108,248,223,64,215,241,132,0,64,0,177,48,12,94,128,28,72,127,145,122,15,140,80,62,122,233,192,68,160,200,103,194,146,176,136,41, +1,24,176,180,206,255,225,104,20,98,187,156,105,80,70,60,12,0,4,208,96,78,0,248,18,194,63,180,136,101,196,18,233,132,234,124,98,75,0,108,189,21,108,221,194,255,12,216,175,103,27,148,17,15,3,0,1,52,20,18,0,174,238,35,3,150,196,192,128,150,211,241,69,60, +169,9,0,87,15,129,129,1,247,197,140,255,7,123,160,2,4,208,80,74,0,184,18,2,250,200,222,95,34,70,253,24,73,176,3,215,216,5,190,132,57,100,0,64,0,13,197,4,64,76,201,64,40,146,73,77,0,164,202,15,25,0,16,96,0,155,121,235,71,10,157,3,42,0,0,0,0,73,69,78,68, +174,66,96,130,0,0 }; + +const char* BinaryData::juce_icon_png = (const char*) temp_8e334414; diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.h b/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.h new file mode 100755 index 000000000..43e818f7d --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/BinaryData.h @@ -0,0 +1,52 @@ +/* ========================================================================================= + + This is an auto-generated file, created by The Jucer V3.0.0 + Do not edit anything in this file! + +*/ + +namespace BinaryData +{ + extern const char* AudioPluginXCodeScript_txt; + const int AudioPluginXCodeScript_txtSize = 1449; + + extern const char* brushed_aluminium_png; + const int brushed_aluminium_pngSize = 14724; + + extern const char* jucer_AudioPluginEditorTemplate_cpp; + const int jucer_AudioPluginEditorTemplate_cppSize = 1003; + + extern const char* jucer_AudioPluginEditorTemplate_h; + const int jucer_AudioPluginEditorTemplate_hSize = 794; + + extern const char* jucer_AudioPluginFilterTemplate_cpp; + const int jucer_AudioPluginFilterTemplate_cppSize = 4468; + + extern const char* jucer_AudioPluginFilterTemplate_h; + const int jucer_AudioPluginFilterTemplate_hSize = 2413; + + extern const char* jucer_MainConsoleAppTemplate_cpp; + const int jucer_MainConsoleAppTemplate_cppSize = 749; + + extern const char* jucer_MainTemplate_cpp; + const int jucer_MainTemplate_cppSize = 1820; + + extern const char* jucer_NewCppFileTemplate_cpp; + const int jucer_NewCppFileTemplate_cppSize = 232; + + extern const char* jucer_NewCppFileTemplate_h; + const int jucer_NewCppFileTemplate_hSize = 308; + + extern const char* jucer_WindowTemplate_cpp; + const int jucer_WindowTemplate_cppSize = 794; + + extern const char* jucer_WindowTemplate_h; + const int jucer_WindowTemplate_hSize = 1229; + + extern const char* juce_icon_png; + const int juce_icon_pngSize = 19826; + + // 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). + const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw(); +} diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/jucer/JuceLibraryCode/JuceHeader.h new file mode 100644 index 000000000..60e8a4ff2 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceHeader.h @@ -0,0 +1,27 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This is the header file that your files should include in order to get all the + Juce library headers. You should NOT include juce.h or juce_amalgamated.h directly in + your own source files, because that wouldn't pick up the correct Juce configuration + options for your app. + +*/ + +#ifndef __APPHEADERFILE_601085AA__ +#define __APPHEADERFILE_601085AA__ + +#include "AppConfig.h" +#include "../../juce_amalgamated.h" +#include "BinaryData.h" + +namespace ProjectInfo +{ + const char* const projectName = "The Jucer"; + const char* const versionString = "3.0.0"; + const int versionNumber = 0x30000; +} + +#endif // __APPHEADERFILE_601085AA__ diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.cpp b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.cpp new file mode 100644 index 000000000..4ee773c8d --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.cpp @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated1.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.mm b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.mm new file mode 100644 index 000000000..4ee773c8d --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode1.mm @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated1.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.cpp b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.cpp new file mode 100644 index 000000000..a4e6ad518 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.cpp @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated2.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.mm b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.mm new file mode 100644 index 000000000..a4e6ad518 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode2.mm @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated2.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.cpp b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.cpp new file mode 100644 index 000000000..225e3af72 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.cpp @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated3.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.mm b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.mm new file mode 100644 index 000000000..225e3af72 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode3.mm @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated3.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.cpp b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.cpp new file mode 100644 index 000000000..1f4f99e51 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.cpp @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated4.cpp" diff --git a/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.mm b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.mm new file mode 100644 index 000000000..1f4f99e51 --- /dev/null +++ b/JuceLibraryCode/jucer/JuceLibraryCode/JuceLibraryCode4.mm @@ -0,0 +1,15 @@ +/* + + IMPORTANT! This file is auto-generated by the Jucer each time you save your + project - if you alter its contents, your changes may be overwritten! + + This file pulls in all the Juce source code, and builds it using the settings + defined in AppConfig.h. + + If you want to change the method by which Juce is linked into your app, use the + Jucer to change it, rather than trying to edit this file directly. + +*/ + +#include "AppConfig.h" +#include "../../amalgamation/juce_amalgamated4.cpp" diff --git a/JuceLibraryCode/jucer/Jucer.jucer b/JuceLibraryCode/jucer/Jucer.jucer new file mode 100644 index 000000000..e3dc39f16 --- /dev/null +++ b/JuceLibraryCode/jucer/Jucer.jucer @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<JUCERPROJECT id="M70qfTRRk" name="The Jucer" projectType="guiapp" juceLinkage="amalg_multi" + juceFolder="../../juce" jucerVersion="3.0.0" version="3.0.0" + buildVST="1" buildRTAS="0" buildAU="1" vstFolderMac="~/SDKs/vstsdk2.4" + vstFolderPC="c:\SDKs\vstsdk2.4" rtasFolderMac="~/SDKs/PT_80_SDK" + rtasFolderPC="c:\SDKs\PT_80_SDK" pluginName="The Jucer" pluginDesc="The Jucer" + pluginManufacturer="yourcompany" pluginManufacturerCode="abcd" + pluginCode="Abcd" pluginChannelConfigs="{ {1, 1}, {2, 2} }" pluginIsSynth="0" + pluginWantsMidiIn="0" pluginProducesMidiOut="0" pluginSilenceInIsSilenceOut="0" + pluginTailLength="0" pluginEditorRequiresKeys="0" pluginAUExportPrefix="TheJucerAU" + pluginAUViewClass="TheJucerAU_V1" pluginRTASCategory="" bundleIdentifier="com.rawmaterialsoftware.thejucer"> + <EXPORTFORMATS> + <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" + juceFolder=".." documentExtensions=".jucer"/> + <VS2005 targetFolder="Builds/VisualStudio2005" vstFolder="c:\SDKs\vstsdk2.4" + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder=".." libraryType="1"/> + <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" + rtasFolder="c:\SDKs\PT_80_SDK" juceFolder=".." libraryType="1"/> + <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder=".."/> + <VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4" + rtasFolder="c:\SDKs\PT_80_SDK" libraryType="1" juceFolder=".."/> + </EXPORTFORMATS> + <CONFIGURATIONS> + <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Jucer" + osxSDK="1" osxCompatibility="1"/> + <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Jucer" + osxSDK="1" osxCompatibility="1"/> + </CONFIGURATIONS> + <MAINGROUP name="The Jucer" id="NhrJq66R"> + <GROUP id="mslFIKZ" name="Application"> + <FILE id="PXX8Yi" name="jucer_Application.h" compile="0" resource="0" + file="Source/Application/jucer_Application.h"/> + <FILE id="lHd3UQJ" name="jucer_CommandIDs.h" compile="0" resource="0" + file="Source/Application/jucer_CommandIDs.h"/> + <FILE id="vXhFyvd" name="jucer_CommonHeaders.h" compile="0" resource="0" + file="Source/Application/jucer_CommonHeaders.h"/> + <FILE id="YNZhhqp" name="jucer_DocumentEditorComponent.cpp" compile="1" + resource="0" file="Source/Application/jucer_DocumentEditorComponent.cpp"/> + <FILE id="tyrTEq" name="jucer_DocumentEditorComponent.h" compile="0" + resource="0" file="Source/Application/jucer_DocumentEditorComponent.h"/> + <FILE id="jGu5u7N" name="jucer_FilePreviewComponent.cpp" compile="1" + resource="0" file="Source/Application/jucer_FilePreviewComponent.cpp"/> + <FILE id="C4MqR1U" name="jucer_FilePreviewComponent.h" compile="0" + resource="0" file="Source/Application/jucer_FilePreviewComponent.h"/> + <FILE id="qXOJtpg" name="jucer_Headers.h" compile="0" resource="0" + file="Source/jucer_Headers.h"/> + <FILE id="uXkdSAZ" name="jucer_JuceUpdater.cpp" compile="1" resource="0" + file="Source/Application/jucer_JuceUpdater.cpp"/> + <FILE id="QWUk0cM" name="jucer_JuceUpdater.h" compile="0" resource="0" + file="Source/Application/jucer_JuceUpdater.h"/> + <FILE id="ga7xgxf" name="jucer_Main.cpp" compile="1" resource="0" file="Source/Application/jucer_Main.cpp"/> + <FILE id="Glk9Bg" name="jucer_MainWindow.cpp" compile="1" resource="0" + file="Source/Application/jucer_MainWindow.cpp"/> + <FILE id="OUmWPg" name="jucer_MainWindow.h" compile="0" resource="0" + file="Source/Application/jucer_MainWindow.h"/> + <FILE id="9hfMs0O" name="jucer_OpenDocumentManager.cpp" compile="1" + resource="0" file="Source/Application/jucer_OpenDocumentManager.cpp"/> + <FILE id="NYEknlp" name="jucer_OpenDocumentManager.h" compile="0" resource="0" + file="Source/Application/jucer_OpenDocumentManager.h"/> + </GROUP> + <GROUP id="i1s14uV" name="Code Editor"> + <FILE id="36CkPUf" name="jucer_SourceCodeEditor.cpp" compile="1" resource="0" + file="Source/Code Editor/jucer_SourceCodeEditor.cpp"/> + <FILE id="CygyGGA" name="jucer_SourceCodeEditor.h" compile="0" resource="0" + file="Source/Code Editor/jucer_SourceCodeEditor.h"/> + </GROUP> + <GROUP id="vGFZIJg" name="Project"> + <FILE id="Wx7kXq7" name="jucer_GroupInformationComponent.cpp" compile="1" + resource="0" file="Source/Project/jucer_GroupInformationComponent.cpp"/> + <FILE id="sQjHbVN" name="jucer_GroupInformationComponent.h" compile="0" + resource="0" file="Source/Project/jucer_GroupInformationComponent.h"/> + <FILE id="Vf0IGtm" name="jucer_NewFileWizard.cpp" compile="1" resource="0" + file="Source/Project/jucer_NewFileWizard.cpp"/> + <FILE id="VRwC9Js" name="jucer_NewFileWizard.h" compile="0" resource="0" + file="Source/Project/jucer_NewFileWizard.h"/> + <FILE id="zOpCNRX" name="jucer_NewProjectWizard.cpp" compile="1" resource="0" + file="Source/Project/jucer_NewProjectWizard.cpp"/> + <FILE id="QLdtoIl" name="jucer_NewProjectWizard.h" compile="0" resource="0" + file="Source/Project/jucer_NewProjectWizard.h"/> + <FILE id="o4UdN4D" name="jucer_Project.cpp" compile="1" resource="0" + file="Source/Project/jucer_Project.cpp"/> + <FILE id="aFopF9G" name="jucer_Project.h" compile="0" resource="0" + file="Source/Project/jucer_Project.h"/> + <FILE id="KqyDGWJ" name="jucer_ProjectContentComponent.cpp" compile="1" + resource="0" file="Source/Project/jucer_ProjectContentComponent.cpp"/> + <FILE id="mIJMR08" name="jucer_ProjectContentComponent.h" compile="0" + resource="0" file="Source/Project/jucer_ProjectContentComponent.h"/> + <FILE id="h6J3UPy" name="jucer_ProjectExporter.cpp" compile="1" resource="0" + file="Source/Project/jucer_ProjectExporter.cpp"/> + <FILE id="KFY4Re5" name="jucer_ProjectExporter.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectExporter.h"/> + <FILE id="b8ouh7s" name="jucer_ProjectExport_Make.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectExport_Make.h"/> + <FILE id="lbo8KcG" name="jucer_ProjectExport_MSVC.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectExport_MSVC.h"/> + <FILE id="ymhtjf" name="jucer_ProjectExport_XCode.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectExport_XCode.h"/> + <FILE id="5I09Gpe" name="jucer_ProjectInformationComponent.cpp" compile="1" + resource="0" file="Source/Project/jucer_ProjectInformationComponent.cpp"/> + <FILE id="nvEyCt5" name="jucer_ProjectInformationComponent.h" compile="0" + resource="0" file="Source/Project/jucer_ProjectInformationComponent.h"/> + <FILE id="grlWO2E" name="jucer_ProjectSaver.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectSaver.h"/> + <FILE id="TL3snCb" name="jucer_ProjectTreeViewBase.cpp" compile="1" + resource="0" file="Source/Project/jucer_ProjectTreeViewBase.cpp"/> + <FILE id="UwhAsi1" name="jucer_ProjectTreeViewBase.h" compile="0" resource="0" + file="Source/Project/jucer_ProjectTreeViewBase.h"/> + <FILE id="pIeJPuR" name="jucer_ResourceFile.cpp" compile="1" resource="0" + file="Source/Project/jucer_ResourceFile.cpp"/> + <FILE id="Bvb3uEg" name="jucer_ResourceFile.h" compile="0" resource="0" + file="Source/Project/jucer_ResourceFile.h"/> + <FILE id="JTbTiIc" name="jucer_TreeViewTypes.cpp" compile="1" resource="0" + file="Source/Project/jucer_TreeViewTypes.cpp"/> + <FILE id="WaT0B16" name="jucer_TreeViewTypes.h" compile="0" resource="0" + file="Source/Project/jucer_TreeViewTypes.h"/> + </GROUP> + <GROUP id="Ga8fLmv" name="Utility"> + <FILE id="mceJWJc" name="jucer_CodeHelpers.cpp" compile="1" resource="0" + file="Source/Utility/jucer_CodeHelpers.cpp"/> + <FILE id="BBRteob" name="jucer_CodeHelpers.h" compile="0" resource="0" + file="Source/Utility/jucer_CodeHelpers.h"/> + <FILE id="wQtNWXb" name="jucer_Colours.h" compile="0" resource="0" + file="Source/Utility/jucer_Colours.h"/> + <FILE id="MQYSse6" name="jucer_FileHelpers.cpp" compile="1" resource="0" + file="Source/Utility/jucer_FileHelpers.cpp"/> + <FILE id="NeLXzRp" name="jucer_FileHelpers.h" compile="0" resource="0" + file="Source/Utility/jucer_FileHelpers.h"/> + <FILE id="4fxv0YC" name="jucer_JucerTreeViewBase.cpp" compile="1" resource="0" + file="Source/Utility/jucer_JucerTreeViewBase.cpp"/> + <FILE id="F0vVVSX" name="jucer_JucerTreeViewBase.h" compile="0" resource="0" + file="Source/Utility/jucer_JucerTreeViewBase.h"/> + <FILE id="P4hiiqU" name="jucer_MiscUtilities.cpp" compile="1" resource="0" + file="Source/Utility/jucer_MiscUtilities.cpp"/> + <FILE id="xyRXOU6" name="jucer_MiscUtilities.h" compile="0" resource="0" + file="Source/Utility/jucer_MiscUtilities.h"/> + <FILE id="i0HWAP4" name="jucer_PresetIDs.h" compile="0" resource="0" + file="Source/Utility/jucer_PresetIDs.h"/> + <FILE id="F3VxlRX" name="jucer_RelativePath.h" compile="0" resource="0" + file="Source/Utility/jucer_RelativePath.h"/> + <FILE id="5UDCwsI" name="jucer_StoredSettings.cpp" compile="1" resource="0" + file="Source/Utility/jucer_StoredSettings.cpp"/> + <FILE id="BkswLvF" name="jucer_StoredSettings.h" compile="0" resource="0" + file="Source/Utility/jucer_StoredSettings.h"/> + <FILE id="lZ9s99o" name="jucer_ValueSourceHelpers.h" compile="0" resource="0" + file="Source/Utility/jucer_ValueSourceHelpers.h"/> + </GROUP> + <GROUP id="KPIRFfz" name="BinaryData"> + <FILE id="RSJcrRl" name="AudioPluginXCodeScript.txt" compile="0" resource="1" + file="Source/BinaryData/AudioPluginXCodeScript.txt"/> + <FILE id="mDywA9N" name="brushed_aluminium.png" compile="0" resource="1" + file="Source/BinaryData/brushed_aluminium.png"/> + <FILE id="8H7vztx" name="jucer_AudioPluginEditorTemplate.cpp" compile="0" + resource="1" file="Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp"/> + <FILE id="908LsXi" name="jucer_AudioPluginEditorTemplate.h" compile="0" + resource="1" file="Source/BinaryData/jucer_AudioPluginEditorTemplate.h"/> + <FILE id="AfHjhZ9" name="jucer_AudioPluginFilterTemplate.cpp" compile="0" + resource="1" file="Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp"/> + <FILE id="pvgTmND" name="jucer_AudioPluginFilterTemplate.h" compile="0" + resource="1" file="Source/BinaryData/jucer_AudioPluginFilterTemplate.h"/> + <FILE id="pizYtv9" name="jucer_MainConsoleAppTemplate.cpp" compile="0" + resource="1" file="Source/BinaryData/jucer_MainConsoleAppTemplate.cpp"/> + <FILE id="gJwHD6A" name="jucer_MainTemplate.cpp" compile="0" resource="1" + file="Source/BinaryData/jucer_MainTemplate.cpp"/> + <FILE id="cI2ImgX" name="jucer_NewCppFileTemplate.cpp" compile="0" + resource="1" file="Source/BinaryData/jucer_NewCppFileTemplate.cpp"/> + <FILE id="YDcz5P" name="jucer_NewCppFileTemplate.h" compile="0" resource="1" + file="Source/BinaryData/jucer_NewCppFileTemplate.h"/> + <FILE id="qk3GRQF" name="jucer_WindowTemplate.cpp" compile="0" resource="1" + file="Source/BinaryData/jucer_WindowTemplate.cpp"/> + <FILE id="2WpRpdr" name="jucer_WindowTemplate.h" compile="0" resource="1" + file="Source/BinaryData/jucer_WindowTemplate.h"/> + <FILE id="rVgowdy" name="juce_icon.png" compile="0" resource="1" file="Source/BinaryData/juce_icon.png"/> + </GROUP> + </MAINGROUP> + <JUCEOPTIONS JUCE_ASIO="disabled" JUCE_WASAPI="disabled" JUCE_DIRECTSOUND="disabled" + JUCE_ALSA="disabled" JUCE_QUICKTIME="disabled" JUCE_OPENGL="disabled" + JUCE_USE_FLAC="disabled" JUCE_USE_OGGBVORBIS="2" JUCE_USE_CDBURNER="disabled" + JUCE_USE_CDREADER="disabled" JUCE_USE_CAMERA="disabled" JUCE_PLUGINHOST_VST="disabled" + JUCE_PLUGINHOST_AU="disabled" JUCE_USE_OGGVORBIS="disabled" JUCE_FORCE_DEBUG="default" + JUCE_LOG_ASSERTIONS="default" JUCE_ENABLE_REPAINT_DEBUGGING="default" + JUCE_USE_XINERAMA="default" JUCE_USE_XSHM="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default" + JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" + JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" + JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> +</JUCERPROJECT> diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_Application.h b/JuceLibraryCode/jucer/Source/Application/jucer_Application.h new file mode 100755 index 000000000..38ab66eba --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_Application.h @@ -0,0 +1,506 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_APPLICATION_H_6595C2A8__ +#define __JUCER_APPLICATION_H_6595C2A8__ + +#include "../jucer_Headers.h" +#include "jucer_MainWindow.h" +#include "jucer_JuceUpdater.h" +#include "../Project/jucer_NewProjectWizard.h" + + +//============================================================================== +class JucerApplication : public JUCEApplication +{ +public: + //============================================================================== + JucerApplication() {} + ~JucerApplication() {} + + //============================================================================== + void initialise (const String& commandLine) + { + /* Running a command-line of the form "Jucer --resave foobar.jucer" will try to load that + jucer file and re-export all of its projects. + */ + if (commandLine.startsWithIgnoreCase ("-resave ") || commandLine.startsWithIgnoreCase ("--resave ")) + { + Project::resaveJucerFile (File::getCurrentWorkingDirectory() + .getChildFile (commandLine.fromFirstOccurrenceOf (" ", false, false).unquoted())); + quit(); + return; + } + + commandManager = new ApplicationCommandManager(); + commandManager->registerAllCommandsForTarget (this); + + menuModel = new MainMenuModel(); + + MainWindow* main = createNewMainWindow (false); + doExtraInitialisation(); + + ImageCache::setCacheTimeout (30 * 1000); + + if (commandLine.trim().isNotEmpty() && ! commandLine.trim().startsWithChar ('-')) + { + anotherInstanceStarted (commandLine); + } + else + { + Array<File> projects (StoredSettings::getInstance()->getLastProjects()); + + for (int i = 0; i < projects.size(); ++ i) + openFile (projects.getReference(i)); + } + + #if JUCE_MAC + MenuBarModel::setMacMainMenu (menuModel); + #endif + + main->setVisible (true); + } + + void shutdown() + { + #if JUCE_MAC + MenuBarModel::setMacMainMenu (0); + #endif + menuModel = 0; + + StoredSettings::deleteInstance(); + mainWindows.clear(); + + OpenDocumentManager::deleteInstance(); + deleteAndZero (commandManager); + } + + //============================================================================== + void systemRequestedQuit() + { + while (mainWindows.size() > 0) + { + if (! mainWindows[0]->closeCurrentProject()) + return; + + mainWindows.remove (0); + } + + quit(); + } + + void closeWindow (MainWindow* w) + { + jassert (mainWindows.contains (w)); + mainWindows.removeObject (w); + + #if ! JUCE_MAC + if (mainWindows.size() == 0) + systemRequestedQuit(); + #endif + + updateRecentProjectList(); + } + + //============================================================================== + const String getApplicationName() + { + return "The Jucer V" + getApplicationVersion(); + } + + const String getApplicationVersion() + { + return ProjectInfo::versionString; + } + + bool moreThanOneInstanceAllowed() + { + #ifndef JUCE_LINUX + return false; + #else + return true; //xxx should be false but doesn't work on linux.. + #endif + } + + void anotherInstanceStarted (const String& commandLine) + { + openFile (commandLine.unquoted()); + } + + virtual void doExtraInitialisation() {} + + //============================================================================== + class MainMenuModel : public MenuBarModel + { + public: + MainMenuModel() + { + setApplicationCommandManagerToWatch (commandManager); + } + + const StringArray getMenuBarNames() + { + const char* const names[] = { "File", "Edit", "View", "Window", "Update", 0 }; + return StringArray ((const char**) names); + } + + const PopupMenu getMenuForIndex (int topLevelMenuIndex, const String& menuName) + { + PopupMenu menu; + + if (topLevelMenuIndex == 0) // "File" menu + { + menu.addCommandItem (commandManager, CommandIDs::newProject); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::open); + + PopupMenu recentFiles; + StoredSettings::getInstance()->recentFiles.createPopupMenuItems (recentFiles, 100, true, true); + menu.addSubMenu ("Open recent file", recentFiles); + + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::closeDocument); + menu.addCommandItem (commandManager, CommandIDs::saveDocument); + menu.addCommandItem (commandManager, CommandIDs::saveDocumentAs); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::closeProject); + menu.addCommandItem (commandManager, CommandIDs::saveProject); + menu.addCommandItem (commandManager, CommandIDs::saveProjectAs); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::openInIDE); + menu.addCommandItem (commandManager, CommandIDs::saveAndOpenInIDE); + + #if ! JUCE_MAC + menu.addSeparator(); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit); + #endif + } + else if (topLevelMenuIndex == 1) // "Edit" menu + { + menu.addCommandItem (commandManager, CommandIDs::undo); + menu.addCommandItem (commandManager, CommandIDs::redo); + menu.addSeparator(); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::cut); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::copy); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::paste); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::del); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::selectAll); + menu.addCommandItem (commandManager, StandardApplicationCommandIDs::deselectAll); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::toFront); + menu.addCommandItem (commandManager, CommandIDs::toBack); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::group); + menu.addCommandItem (commandManager, CommandIDs::ungroup); + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::bringBackLostItems); + } + else if (topLevelMenuIndex == 2) // "View" menu + { + menu.addCommandItem (commandManager, CommandIDs::showProjectSettings); + menu.addSeparator(); + + menu.addCommandItem (commandManager, CommandIDs::test); + menu.addSeparator(); + + menu.addCommandItem (commandManager, CommandIDs::showGrid); + menu.addCommandItem (commandManager, CommandIDs::enableSnapToGrid); + + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::zoomIn); + menu.addCommandItem (commandManager, CommandIDs::zoomOut); + menu.addCommandItem (commandManager, CommandIDs::zoomNormal); + + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::useTabbedWindows); + } + else if (topLevelMenuIndex == 3) // "Window" menu + { + menu.addCommandItem (commandManager, CommandIDs::closeWindow); + menu.addSeparator(); + + const int numDocs = jmin (50, OpenDocumentManager::getInstance()->getNumOpenDocuments()); + + for (int i = 0; i < numDocs; ++i) + { + OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument(i); + + menu.addItem (300 + i, doc->getName()); + } + + menu.addSeparator(); + menu.addCommandItem (commandManager, CommandIDs::closeAllDocuments); + } + else if (topLevelMenuIndex == 4) // "Juce" menu + { + menu.addCommandItem (commandManager, CommandIDs::showJuceVersion); + } + + return menu; + } + + void menuItemSelected (int menuItemID, int topLevelMenuIndex) + { + if (menuItemID >= 100 && menuItemID < 200) + { + // open a file from the "recent files" menu + const File file (StoredSettings::getInstance()->recentFiles.getFile (menuItemID - 100)); + + getApp()->openFile (file); + } + else if (menuItemID >= 300 && menuItemID < 400) + { + OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (menuItemID - 300); + getApp()->getOrCreateFrontmostWindow (true)->getProjectContentComponent()->showDocument (doc); + } + } + + private: + JucerApplication* getApp() const + { + return static_cast<JucerApplication*> (JUCEApplication::getInstance()); + } + }; + + //============================================================================== + void getAllCommands (Array <CommandID>& commands) + { + JUCEApplication::getAllCommands (commands); + + const CommandID ids[] = { CommandIDs::newProject, + CommandIDs::open, + CommandIDs::showPrefs, + CommandIDs::closeAllDocuments, + CommandIDs::saveAll, + CommandIDs::showJuceVersion }; + + commands.addArray (ids, numElementsInArray (ids)); + } + + void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result) + { + switch (commandID) + { + case CommandIDs::newProject: + result.setInfo ("New Project...", "Creates a new Jucer project", CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::open: + result.setInfo ("Open...", "Opens a Jucer project", CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::showPrefs: + result.setInfo ("Preferences...", "Shows the preferences panel.", CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress (',', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::closeAllDocuments: + result.setInfo ("Close All Documents", "Closes all open documents", CommandCategories::general, 0); + result.setActive (OpenDocumentManager::getInstance()->getNumOpenDocuments() > 0); + break; + + case CommandIDs::saveAll: + result.setInfo ("Save All", "Saves all open documents", CommandCategories::general, 0); + result.setActive (OpenDocumentManager::getInstance()->anyFilesNeedSaving()); + break; + + case CommandIDs::showJuceVersion: + result.setInfo ("Download the latest JUCE version", "Checks online for any Juce updates", CommandCategories::general, 0); + break; + + default: + JUCEApplication::getCommandInfo (commandID, result); + break; + } + } + + bool perform (const InvocationInfo& info) + { + switch (info.commandID) + { + case CommandIDs::newProject: createNewProject(); break; + case CommandIDs::open: askUserToOpenFile(); break; + case CommandIDs::showPrefs: showPrefsPanel(); break; + case CommandIDs::saveAll: OpenDocumentManager::getInstance()->saveAll(); break; + case CommandIDs::closeAllDocuments: closeAllDocuments (true); break; + case CommandIDs::showJuceVersion: JuceUpdater::show (mainWindows[0]); break; + default: return JUCEApplication::perform (info); + } + + return true; + } + + //============================================================================== + void showPrefsPanel() + { + jassertfalse; + } + + void createNewProject() + { + MainWindow* mw = createNewMainWindow (false); + ScopedPointer <Project> newProj (NewProjectWizard::runNewProjectWizard (mw)); + + if (newProj != 0) + { + mw->setProject (newProj.release()); + mw->setVisible (true); + } + else + { + closeWindow (mw); + } + } + + void askUserToOpenFile() + { + FileChooser fc ("Open File"); + + if (fc.browseForFileToOpen()) + openFile (fc.getResult()); + } + + bool openFile (const File& file) + { + for (int j = mainWindows.size(); --j >= 0;) + { + if (mainWindows.getUnchecked(j)->getProject() != 0 + && mainWindows.getUnchecked(j)->getProject()->getFile() == file) + { + mainWindows.getUnchecked(j)->toFront (true); + return true; + } + } + + if (file.hasFileExtension (Project::projectFileExtension)) + { + ScopedPointer <Project> newDoc (new Project (file)); + + if (file == File::nonexistent ? newDoc->loadFromUserSpecifiedFile (true) + : newDoc->loadFrom (file, true)) + { + MainWindow* w = getOrCreateEmptyWindow (false); + w->setProject (newDoc.release()); + w->restoreWindowPosition(); + w->setVisible (true); + return true; + } + } + else if (file.exists()) + { + return getOrCreateFrontmostWindow (true)->openFile (file); + } + + return false; + } + + bool closeAllDocuments (bool askUserToSave) + { + for (int i = OpenDocumentManager::getInstance()->getNumOpenDocuments(); --i >= 0;) + { + OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (i); + + for (int j = mainWindows.size(); --j >= 0;) + mainWindows.getUnchecked(j)->getProjectContentComponent()->hideDocument (doc); + + if (! OpenDocumentManager::getInstance()->closeDocument (i, askUserToSave)) + return false; + } + + return true; + } + + void updateRecentProjectList() + { + Array<File> projects; + + for (int i = 0; i < mainWindows.size(); ++i) + { + MainWindow* mw = mainWindows[i]; + + if (mw != 0 && mw->getProject() != 0) + projects.add (mw->getProject()->getFile()); + } + + StoredSettings::getInstance()->setLastProjects (projects); + } + + ScopedPointer<MainMenuModel> menuModel; + +private: + OwnedArray <MainWindow> mainWindows; + + MainWindow* createNewMainWindow (bool makeVisible) + { + MainWindow* mw = new MainWindow(); + + for (int i = mainWindows.size(); --i >= 0;) + if (mw->getBounds() == mainWindows.getUnchecked(i)->getBounds()) + mw->setBounds (mw->getBounds().translated (20, 20)); + + mainWindows.add (mw); + + if (makeVisible) + mw->setVisible (true); + + mw->restoreWindowPosition(); + return mw; + } + + MainWindow* getOrCreateFrontmostWindow (bool makeVisible) + { + if (mainWindows.size() == 0) + return createNewMainWindow (makeVisible); + + for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) + { + MainWindow* mw = dynamic_cast <MainWindow*> (Desktop::getInstance().getComponent (i)); + if (mainWindows.contains (mw)) + return mw; + } + + return mainWindows.getLast(); + } + + MainWindow* getOrCreateEmptyWindow (bool makeVisible) + { + if (mainWindows.size() == 0) + return createNewMainWindow (makeVisible); + + for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) + { + MainWindow* mw = dynamic_cast <MainWindow*> (Desktop::getInstance().getComponent (i)); + if (mainWindows.contains (mw) && mw->getProject() == 0) + return mw; + } + + return createNewMainWindow (makeVisible); + } +}; + + +#endif // __JUCER_APPLICATION_H_6595C2A8__ diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_CommandIDs.h b/JuceLibraryCode/jucer/Source/Application/jucer_CommandIDs.h new file mode 100755 index 000000000..47942af57 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_CommandIDs.h @@ -0,0 +1,102 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +/** + A namespace to hold all the possible command IDs. +*/ +namespace CommandIDs +{ + static const int newProject = 0x200010; + static const int open = 0x200020; + static const int closeDocument = 0x200030; + static const int saveDocument = 0x200040; + static const int saveDocumentAs = 0x200050; + + static const int closeProject = 0x200051; + static const int saveProject = 0x200060; + static const int saveProjectAs = 0x200070; + static const int openInIDE = 0x200072; + static const int saveAndOpenInIDE = 0x200073; + static const int showProjectSettings = 0x200074; + static const int showJuceVersion = 0x200075; + + static const int saveAll = 0x200080; + static const int undo = 0x200090; + static const int redo = 0x2000a0; + + static const int closeWindow = 0x201001; + static const int closeAllDocuments = 0x201000; + + static const int test = 0x202090; + static const int toFront = 0x2020a0; + static const int toBack = 0x2030a1; + static const int showOrHideProperties = 0x2030b0; + static const int showOrHideTree = 0x2030b1; + static const int showOrHideMarkers = 0x2030b2; + static const int toggleSnapping = 0x2030b3; + + static const int makeLineSegment = 0x2030c0; + static const int makeCubicSegment = 0x2030c1; + static const int breakSegment = 0x2030c2; + static const int pointModeCorner = 0x2030c3; + static const int pointModeRounded = 0x2030c4; + static const int pointModeSymmetric = 0x2030c5; + + static const int group = 0x202170; + static const int ungroup = 0x202180; + + static const int showPrefs = 0x2020c0; + static const int useTabbedWindows = 0x2020d0; + + static const int showGrid = 0x2020e0; + static const int enableSnapToGrid = 0x2020f0; + + static const int editCompLayout = 0x202100; + static const int editCompGraphics = 0x202110; + + static const int bringBackLostItems = 0x202120; + + static const int zoomIn = 0x202130; + static const int zoomOut = 0x202140; + static const int zoomNormal = 0x202150; + static const int spaceBarDrag = 0x202160; + + static const int compOverlay0 = 0x202200; + static const int compOverlay33 = 0x202210; + static const int compOverlay66 = 0x202220; + static const int compOverlay100 = 0x202230; + + static const int newDocumentBase = 0x322010; + static const int newComponentBase = 0x302010; + static const int newElementBase = 0x312010; +} + +namespace CommandCategories +{ + static const char* const general = "General"; + static const char* const editing = "Editing"; + static const char* const view = "View"; + static const char* const windows = "Windows"; +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_CommonHeaders.h b/JuceLibraryCode/jucer/Source/Application/jucer_CommonHeaders.h new file mode 100755 index 000000000..e2a1f94fd --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_CommonHeaders.h @@ -0,0 +1,52 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_COMMONINCLUDES_H__ +#define __JUCER_COMMONINCLUDES_H__ + + +#include "../Utility/jucer_StoredSettings.h" +#include "../Utility/jucer_MiscUtilities.h" +#include "../Utility/jucer_CodeHelpers.h" +#include "../Utility/jucer_FileHelpers.h" +#include "../Utility/jucer_RelativePath.h" +#include "../Utility/jucer_ValueSourceHelpers.h" +#include "../Utility/jucer_PresetIDs.h" +#include "jucer_CommandIDs.h" + +//============================================================================== +extern ApplicationCommandManager* commandManager; + +//============================================================================== +const char* const projectItemDragType = "Project Items"; +const char* const drawableItemDragType = "Drawable Items"; +const char* const componentItemDragType = "Components"; + +const char* const sourceFileExtensions = "cpp;mm;m;c;cc;cxx"; +const char* const headerFileExtensions = "h;hpp;hxx"; +const char* const sourceOrHeaderFileExtensions = "cpp;mm;m;c;cc;cxx;h;hpp;hxx"; + + +#endif \ No newline at end of file diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.cpp new file mode 100755 index 000000000..650fce447 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.cpp @@ -0,0 +1,131 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_DocumentEditorComponent.h" +#include "../Project/jucer_ProjectContentComponent.h" + + +//============================================================================== +DocumentEditorComponent::DocumentEditorComponent (OpenDocumentManager::Document* document_) + : document (document_) +{ + OpenDocumentManager::getInstance()->addListener (this); +} + +DocumentEditorComponent::~DocumentEditorComponent() +{ + OpenDocumentManager::getInstance()->removeListener (this); +} + +void DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc) +{ + if (document == closingDoc) + { + jassert (document != 0); + ProjectContentComponent* pcc = findParentComponentOfClass ((ProjectContentComponent*) 0); + + if (pcc != 0) + { + pcc->hideDocument (document); + return; + } + + jassertfalse + } +} + +ApplicationCommandTarget* DocumentEditorComponent::getNextCommandTarget() +{ + return findFirstTargetParentComponent(); +} + +void DocumentEditorComponent::getAllCommands (Array <CommandID>& commands) +{ + const CommandID ids[] = { CommandIDs::saveDocument, + CommandIDs::saveDocumentAs, + CommandIDs::closeDocument }; + + commands.addArray (ids, numElementsInArray (ids)); +} + +void DocumentEditorComponent::getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) +{ + result.setActive (document != 0); + String name; + + if (document != 0) + name = " '" + document->getName().substring (0, 32) + "'"; + + switch (commandID) + { + case CommandIDs::saveDocument: + result.setInfo ("Save" + name, + "Saves the current document", + CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::saveDocumentAs: + result.setInfo ("Save" + name + " As...", + "Saves the current document to a different filename", + CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); + break; + + case CommandIDs::closeDocument: + result.setInfo ("Close" + name, + "Closes the current document", + CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('w', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); + break; + + default: + break; + } +} + +bool DocumentEditorComponent::perform (const InvocationInfo& info) +{ + switch (info.commandID) + { + case CommandIDs::saveDocument: + document->save(); + return true; + + case CommandIDs::saveDocumentAs: + jassertfalse //xxxx + //document.save(); + return true; + + case CommandIDs::closeDocument: + OpenDocumentManager::getInstance()->closeDocument (document, true); + return true; + + default: + break; + } + + return false; +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.h b/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.h new file mode 100755 index 000000000..bfbd03628 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_DocumentEditorComponent.h @@ -0,0 +1,61 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_DOCUMENTEDITORCOMPONENT_JUCEHEADER__ +#define __JUCER_DOCUMENTEDITORCOMPONENT_JUCEHEADER__ + +#include "jucer_OpenDocumentManager.h" + + +//============================================================================== +/** +*/ +class DocumentEditorComponent : public Component, + public ApplicationCommandTarget, + public OpenDocumentManager::DocumentCloseListener +{ +public: + //============================================================================== + DocumentEditorComponent (OpenDocumentManager::Document* document); + ~DocumentEditorComponent(); + + OpenDocumentManager::Document* getDocument() const { return document; } + void documentAboutToClose (OpenDocumentManager::Document* document); + + //============================================================================== + ApplicationCommandTarget* getNextCommandTarget(); + void getAllCommands (Array <CommandID>& commands); + void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result); + bool perform (const InvocationInfo& info); + +protected: + OpenDocumentManager::Document* document; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DocumentEditorComponent); +}; + + +#endif // __JUCER_DOCUMENTEDITORCOMPONENT_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.cpp new file mode 100755 index 000000000..32b3ac1b1 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.cpp @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_FilePreviewComponent.h" + + +//============================================================================== +ItemPreviewComponent::ItemPreviewComponent (const File& file_) + : file (file_) +{ + tryToLoadImage(); +} + +ItemPreviewComponent::~ItemPreviewComponent() +{ +} + +void ItemPreviewComponent::tryToLoadImage() +{ + facts.clear(); + facts.add (file.getFullPathName()); + image = Image(); + + ScopedPointer <InputStream> input (file.createInputStream()); + + if (input != 0) + { + const int64 totalSize = input->getTotalLength(); + ImageFileFormat* format = ImageFileFormat::findImageFormatForStream (*input); + input = 0; + + String formatName; + if (format != 0) + formatName = " " + format->getFormatName(); + + image = ImageCache::getFromFile (file); + + if (image.isValid()) + facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName); + + if (totalSize > 0) + facts.add (File::descriptionOfSizeInBytes (totalSize)); + } + + facts.removeEmptyStrings (true); +} + +void ItemPreviewComponent::paint (Graphics& g) +{ + g.drawImageWithin (image, 2, 22, getWidth() - 4, getHeight() - 24, + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, + false); + + g.setFont (15.0f, Font::bold); + g.setColour (Colours::white); + g.drawMultiLineText (facts.joinIntoString ("\n"), + 10, 15, getWidth() - 16); +} + +void ItemPreviewComponent::resized() +{ +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.h b/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.h new file mode 100755 index 000000000..860a50d36 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_FilePreviewComponent.h @@ -0,0 +1,56 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_ITEMPREVIEWCOMPONENT_JUCEHEADER__ +#define __JUCER_ITEMPREVIEWCOMPONENT_JUCEHEADER__ + + +//============================================================================== +/** +*/ +class ItemPreviewComponent : public Component +{ +public: + //============================================================================== + // This will delete the stream + ItemPreviewComponent (const File& file); + ~ItemPreviewComponent(); + + void paint (Graphics& g); + void resized(); + + +private: + StringArray facts; + File file; + Image image; + + void tryToLoadImage(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ItemPreviewComponent); +}; + + +#endif // __JUCER_ITEMPREVIEWCOMPONENT_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.cpp new file mode 100755 index 000000000..82eefe5ec --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.cpp @@ -0,0 +1,402 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_JuceUpdater.h" + + +//============================================================================== +JuceUpdater::JuceUpdater() + : filenameComp ("Juce Folder", StoredSettings::getInstance()->getLastKnownJuceFolder(), + true, true, false, "*", String::empty, "Select your Juce folder"), + checkNowButton ("Check Online for Available Updates...", + "Contacts the website to see if this version is up-to-date") +{ + addAndMakeVisible (&label); + addAndMakeVisible (&filenameComp); + addAndMakeVisible (&checkNowButton); + addAndMakeVisible (¤tVersionLabel); + checkNowButton.addListener (this); + filenameComp.addListener (this); + + currentVersionLabel.setFont (Font (14.0f, Font::italic)); + label.setFont (Font (12.0f)); + label.setText ("Destination folder:", false); + + addAndMakeVisible (&availableVersionsList); + availableVersionsList.setModel (this); + + setSize (600, 300); +} + +JuceUpdater::~JuceUpdater() +{ + checkNowButton.removeListener (this); + filenameComp.removeListener (this); +} + +void JuceUpdater::show (Component* mainWindow) +{ + JuceUpdater updater; + DialogWindow::showModalDialog ("Juce Update...", &updater, mainWindow, + Colours::lightgrey, + true, false, false); +} + +void JuceUpdater::resized() +{ + filenameComp.setBounds (20, 40, getWidth() - 40, 22); + label.setBounds (filenameComp.getX(), filenameComp.getY() - 18, filenameComp.getWidth(), 18); + currentVersionLabel.setBounds (filenameComp.getX(), filenameComp.getBottom(), filenameComp.getWidth(), 25); + checkNowButton.changeWidthToFitText (20); + checkNowButton.setCentrePosition (getWidth() / 2, filenameComp.getBottom() + 40); + availableVersionsList.setBounds (filenameComp.getX(), checkNowButton.getBottom() + 20, filenameComp.getWidth(), getHeight() - (checkNowButton.getBottom() + 20)); +} + +void JuceUpdater::paint (Graphics& g) +{ + g.fillAll (Colours::white); +} + +const String findVersionNum (const String& file, const String& token) +{ + return file.fromFirstOccurrenceOf (token, false, false) + .upToFirstOccurrenceOf ("\n", false, false) + .trim(); +} + +const String JuceUpdater::getCurrentVersion() +{ + const String header (filenameComp.getCurrentFile() + .getChildFile ("src/core/juce_StandardHeader.h").loadFileAsString()); + + const String v1 (findVersionNum (header, "JUCE_MAJOR_VERSION")); + const String v2 (findVersionNum (header, "JUCE_MINOR_VERSION")); + const String v3 (findVersionNum (header, "JUCE_BUILDNUMBER")); + + if ((v1 + v2 + v3).isEmpty()) + return String::empty; + + return v1 + "." + v2 + "." + v3; +} + +XmlElement* JuceUpdater::downloadVersionList() +{ + return URL ("http://www.rawmaterialsoftware.com/juce/downloads/juce_versions.php").readEntireXmlStream(); +} + +void JuceUpdater::updateVersions (const XmlElement& xml) +{ + availableVersions.clear(); + + forEachXmlChildElementWithTagName (xml, v, "VERSION") + { + VersionInfo* vi = new VersionInfo(); + vi->url = URL (v->getStringAttribute ("url")); + vi->desc = v->getStringAttribute ("desc"); + vi->version = v->getStringAttribute ("version"); + vi->date = v->getStringAttribute ("date"); + availableVersions.add (vi); + } + + availableVersionsList.updateContent(); +} + +void JuceUpdater::buttonClicked (Button*) +{ + ScopedPointer<XmlElement> xml (downloadVersionList()); + + if (xml == 0 || xml->hasTagName ("html")) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Connection Problems...", + "Couldn't connect to the Raw Material Software website!"); + + return; + } + + if (! xml->hasTagName ("JUCEVERSIONS")) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Update Problems...", + "This version of the Jucer may be too old to receive automatic updates!\n\n" + "Please visit www.rawmaterialsoftware.com and get the latest version manually!"); + return; + } + + const String currentVersion (getCurrentVersion()); + + OwnedArray<VersionInfo> versions; + updateVersions (*xml); +} + +//============================================================================== +class NewVersionDownloader : public ThreadWithProgressWindow +{ +public: + NewVersionDownloader (const String& title, const URL& url_, const File& target_) + : ThreadWithProgressWindow (title, true, true), + url (url_), target (target_) + { + } + + void run() + { + setStatusMessage ("Contacting website..."); + + ScopedPointer<InputStream> input (url.createInputStream (false)); + + if (input == 0) + { + error = "Couldn't connect to the website..."; + return; + } + + if (! target.deleteFile()) + { + error = "Couldn't delete the destination file..."; + return; + } + + ScopedPointer<OutputStream> output (target.createOutputStream (32768)); + + if (output == 0) + { + error = "Couldn't write to the destination file..."; + return; + } + + setStatusMessage ("Downloading..."); + + int totalBytes = (int) input->getTotalLength(); + int bytesSoFar = 0; + + while (! (input->isExhausted() || threadShouldExit())) + { + HeapBlock<char> buffer (8192); + const int num = input->read (buffer, 8192); + + if (num == 0) + break; + + output->write (buffer, num); + bytesSoFar += num; + + setProgress (totalBytes > 0 ? bytesSoFar / (double) totalBytes : -1.0); + } + } + + String error; + +private: + URL url; + File target; +}; + +//============================================================================== +class Unzipper : public ThreadWithProgressWindow +{ +public: + Unzipper (ZipFile& zipFile_, const File& targetDir_) + : ThreadWithProgressWindow ("Unzipping...", true, true), + worked (true), zipFile (zipFile_), targetDir (targetDir_) + { + } + + void run() + { + for (int i = 0; i < zipFile.getNumEntries(); ++i) + { + if (threadShouldExit()) + break; + + const ZipFile::ZipEntry* e = zipFile.getEntry (i); + setStatusMessage ("Unzipping " + e->filename + "..."); + setProgress (i / (double) zipFile.getNumEntries()); + + worked = zipFile.uncompressEntry (i, targetDir, true) && worked; + } + } + + bool worked; + +private: + ZipFile& zipFile; + File targetDir; +}; + +//============================================================================== +void JuceUpdater::applyVersion (VersionInfo* version) +{ + File destDir (filenameComp.getCurrentFile()); + + const bool destDirExisted = destDir.isDirectory(); + + if (destDirExisted && destDir.getNumberOfChildFiles (File::findFilesAndDirectories, "*") > 0) + { + int r = AlertWindow::showYesNoCancelBox (AlertWindow::WarningIcon, "Folder already exists", + "The folder " + destDir.getFullPathName() + "\nalready contains some files...\n\n" + "Do you want to delete everything in the folder and replace it entirely, or just merge the new files into the existing folder?", + "Delete and replace entire folder", + "Add and overwrite existing files", + "Cancel"); + + if (r == 0) + return; + + if (r == 1) + { + if (! destDir.deleteRecursively()) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Problems...", + "Couldn't delete the existing folder!"); + return; + } + } + } + + if (! (destDir.isDirectory() || destDir.createDirectory())) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Problems...", + "Couldn't create that target folder.."); + return; + } + + File zipFile (destDir.getNonexistentChildFile ("juce_download", ".tar.gz", false)); + + bool worked = false; + + { + NewVersionDownloader downloader ("Downloading Version " + version->version + "...", + version->url, zipFile); + worked = downloader.runThread(); + } + + if (worked) + { + ZipFile zip (zipFile); + Unzipper unzipper (zip, destDir); + worked = unzipper.runThread() && unzipper.worked; + } + + zipFile.deleteFile(); + + if ((! destDirExisted) && (destDir.getNumberOfChildFiles (File::findFilesAndDirectories, "*") == 0 || ! worked)) + destDir.deleteRecursively(); + + filenameComponentChanged (&filenameComp); +} + +void JuceUpdater::filenameComponentChanged (FilenameComponent*) +{ + const String version (getCurrentVersion()); + + if (version.isEmpty()) + currentVersionLabel.setText ("(Not a Juce folder)", false); + else + currentVersionLabel.setText ("(Current version in this folder: " + version + ")", false); +} + +//============================================================================== +int JuceUpdater::getNumRows() +{ + return availableVersions.size(); +} + +void JuceUpdater::paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) +{ + if (rowIsSelected) + g.fillAll (findColour (TextEditor::highlightColourId)); +} + +Component* JuceUpdater::refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate) +{ + class UpdateListComponent : public Component, + public ButtonListener + { + public: + UpdateListComponent (JuceUpdater& updater_) + : updater (updater_), version (0), applyButton ("Install this version...") + { + addAndMakeVisible (&applyButton); + applyButton.addListener (this); + setInterceptsMouseClicks (false, true); + } + + ~UpdateListComponent() + { + applyButton.removeListener (this); + } + + void setVersion (VersionInfo* v) + { + if (version != v) + { + version = v; + repaint(); + resized(); + } + } + + void paint (Graphics& g) + { + if (version != 0) + { + g.setColour (Colours::green.withAlpha (0.12f)); + + g.fillRect (0, 1, getWidth(), getHeight() - 2); + g.setColour (Colours::black); + g.setFont (getHeight() * 0.7f); + + String s; + s << "Version " << version->version << " - " << version->desc << " - " << version->date; + + g.drawText (s, 4, 0, applyButton.getX() - 4, getHeight(), Justification::centredLeft, true); + } + } + + void resized() + { + applyButton.changeWidthToFitText (getHeight() - 4); + applyButton.setTopRightPosition (getWidth(), 2); + applyButton.setVisible (version != 0); + } + + void buttonClicked (Button*) + { + updater.applyVersion (version); + } + + private: + JuceUpdater& updater; + VersionInfo* version; + TextButton applyButton; + }; + + UpdateListComponent* c = dynamic_cast <UpdateListComponent*> (existingComponentToUpdate); + if (c == 0) + c = new UpdateListComponent (*this); + + c->setVersion (availableVersions [rowNumber]); + return c; +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.h b/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.h new file mode 100755 index 000000000..47aabe952 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_JuceUpdater.h @@ -0,0 +1,77 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_JUCEUPDATER_H_81537815__ +#define __JUCER_JUCEUPDATER_H_81537815__ + + +//============================================================================== +class JuceUpdater : public Component, + public ButtonListener, + public FilenameComponentListener, + public ListBoxModel +{ +public: + JuceUpdater(); + ~JuceUpdater(); + + static void show (Component* mainWindow); + + //============================================================================== + void resized(); + void paint (Graphics& g); + void buttonClicked (Button*); + void filenameComponentChanged (FilenameComponent* fileComponentThatHasChanged); + + int getNumRows(); + void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected); + Component* refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate); + +private: + Label label, currentVersionLabel; + FilenameComponent filenameComp; + TextButton checkNowButton; + ListBox availableVersionsList; + + XmlElement* downloadVersionList(); + const String getCurrentVersion(); + bool isAlreadyUpToDate(); + + struct VersionInfo + { + URL url; + String desc; + String version; + String date; + }; + + OwnedArray<VersionInfo> availableVersions; + + void updateVersions (const XmlElement& xml); + void applyVersion (VersionInfo* version); +}; + + +#endif // __JUCER_JUCEUPDATER_H_81537815__ diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_Main.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_Main.cpp new file mode 100755 index 000000000..082eb38bd --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_Main.cpp @@ -0,0 +1,28 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_Application.h" + +START_JUCE_APPLICATION(JucerApplication) diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.cpp new file mode 100755 index 000000000..2398c9b3f --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.cpp @@ -0,0 +1,276 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_Application.h" +#include "jucer_MainWindow.h" +#include "jucer_OpenDocumentManager.h" +#include "../Code Editor/jucer_SourceCodeEditor.h" +#include "../Project/jucer_NewProjectWizard.h" + +ApplicationCommandManager* commandManager = 0; + + +//============================================================================== +MainWindow::MainWindow() + : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(), + Colour::greyLevel (0.6f), + DocumentWindow::allButtons) +{ + setUsingNativeTitleBar (true); + setContentComponent (new ProjectContentComponent()); + +#if ! JUCE_MAC + JucerApplication* app = static_cast<JucerApplication*> (JUCEApplication::getInstance()); + setMenuBar (app->menuModel); +#endif + + setResizable (true, false); + + centreWithSize (700, 600); + + // Register all the app commands.. + { + commandManager->registerAllCommandsForTarget (this); + + // use a temporary one of these to harvest its commands.. + ProjectContentComponent pcc; + commandManager->registerAllCommandsForTarget (&pcc); + + DocumentEditorComponent dec (0); + commandManager->registerAllCommandsForTarget (&dec); + } + + commandManager->getKeyMappings()->resetToDefaultMappings(); + + ScopedPointer <XmlElement> keys (StoredSettings::getInstance()->getProps().getXmlValue ("keyMappings")); + + if (keys != 0) + commandManager->getKeyMappings()->restoreFromXml (*keys); + + addKeyListener (commandManager->getKeyMappings()); + + // don't want the window to take focus when the title-bar is clicked.. + setWantsKeyboardFocus (false); + + //getPeer()->setCurrentRenderingEngine (0); + getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack); +} + +MainWindow::~MainWindow() +{ +#if ! JUCE_MAC + setMenuBar (0); +#endif + + removeKeyListener (commandManager->getKeyMappings()); + + // save the current size and position to our settings file.. + StoredSettings::getInstance()->getProps() + .setValue ("lastMainWindowPos", getWindowStateAsString()); + + setContentComponent (0); + currentProject = 0; +} + +ProjectContentComponent* MainWindow::getProjectContentComponent() //const +{ + return dynamic_cast <ProjectContentComponent*> (getContentComponent()); +} + +void MainWindow::closeButtonPressed() +{ + if (! closeCurrentProject()) + return; + + JucerApplication* jucer = static_cast<JucerApplication*> (JUCEApplication::getInstance()); + jucer->closeWindow (this); +} + +bool MainWindow::closeProject (Project* project) +{ + jassert (project == currentProject && project != 0); + + if (project == 0) + return true; + + StoredSettings::getInstance()->getProps() + .setValue (getProjectWindowPosName(), getWindowStateAsString()); + + if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) + return false; + + FileBasedDocument::SaveResult r = project->saveIfNeededAndUserAgrees(); + + if (r == FileBasedDocument::savedOk) + { + setProject (0); + return true; + } + + return false; +} + +bool MainWindow::closeCurrentProject() +{ + return currentProject == 0 || closeProject (currentProject); +} + +void MainWindow::setProject (Project* newProject) +{ + getProjectContentComponent()->setProject (newProject); + currentProject = newProject; + commandManager->commandStatusChanged(); + + // (mustn't do this when the project is 0, because that'll happen on shutdown, + // which will erase the list of recent projects) + if (newProject != 0) + static_cast<JucerApplication*> (JUCEApplication::getInstance())->updateRecentProjectList(); +} + +void MainWindow::restoreWindowPosition() +{ + String windowState; + + if (currentProject != 0) + windowState = StoredSettings::getInstance()->getProps().getValue (getProjectWindowPosName()); + + if (windowState.isEmpty()) + windowState = StoredSettings::getInstance()->getProps().getValue ("lastMainWindowPos"); + + restoreWindowStateFromString (windowState); +} + +bool MainWindow::canOpenFile (const File& file) const +{ + return file.hasFileExtension (Project::projectFileExtension) + || OpenDocumentManager::getInstance()->canOpenFile (file); +} + +bool MainWindow::openFile (const File& file) +{ + if (file.hasFileExtension (Project::projectFileExtension)) + { + ScopedPointer <Project> newDoc (new Project (file)); + + if (file == File::nonexistent ? newDoc->loadFromUserSpecifiedFile (true) + : newDoc->loadFrom (file, true)) + { + if (closeCurrentProject()) + { + setProject (newDoc.release()); + return true; + } + } + } + else if (file.exists()) + { + return getProjectContentComponent()->showEditorForFile (file); + } + + return false; +} + +bool MainWindow::isInterestedInFileDrag (const StringArray& filenames) +{ + for (int i = filenames.size(); --i >= 0;) + if (canOpenFile (filenames[i])) + return true; + + return false; +} + +void MainWindow::filesDropped (const StringArray& filenames, int mouseX, int mouseY) +{ + for (int i = filenames.size(); --i >= 0;) + { + const File f (filenames[i]); + + if (canOpenFile (f) && openFile (f)) + break; + } +} + +void MainWindow::activeWindowStatusChanged() +{ + DocumentWindow::activeWindowStatusChanged(); + + if (getProjectContentComponent() != 0) + getProjectContentComponent()->updateMissingFileStatuses(); + + OpenDocumentManager::getInstance()->reloadModifiedFiles(); +} + +void MainWindow::updateTitle (const String& documentName) +{ + String name (JUCEApplication::getInstance()->getApplicationName()); + if (documentName.isNotEmpty()) + name = documentName + " - " + name; + + setName (name); +} + + +//============================================================================== +ApplicationCommandTarget* MainWindow::getNextCommandTarget() +{ + return 0; +} + +void MainWindow::getAllCommands (Array <CommandID>& commands) +{ + const CommandID ids[] = { CommandIDs::closeWindow }; + + commands.addArray (ids, numElementsInArray (ids)); +} + +void MainWindow::getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) +{ + switch (commandID) + { + case CommandIDs::closeWindow: + result.setInfo ("Close Window", "Closes the current window", CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress ('w', ModifierKeys::commandModifier, 0)); + break; + + default: + break; + } +} + +bool MainWindow::perform (const InvocationInfo& info) +{ + switch (info.commandID) + { + case CommandIDs::closeWindow: + closeButtonPressed(); + break; + + default: + return false; + } + + return true; +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.h b/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.h new file mode 100755 index 000000000..1eb60ce41 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_MainWindow.h @@ -0,0 +1,90 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_MAINWINDOW_JUCEHEADER__ +#define __JUCER_MAINWINDOW_JUCEHEADER__ + +#include "../Project/jucer_ProjectContentComponent.h" + + +//============================================================================== +/** + The big top-level window where everything happens. +*/ +class MainWindow : public DocumentWindow, + public ApplicationCommandTarget, + public FileDragAndDropTarget, + public DragAndDropContainer +{ +public: + //============================================================================== + MainWindow(); + ~MainWindow(); + + //============================================================================== + void closeButtonPressed(); + + //============================================================================== + bool canOpenFile (const File& file) const; + bool openFile (const File& file); + void setProject (Project* newProject); + Project* getProject() const { return currentProject; } + + void restoreWindowPosition(); + bool closeProject (Project* project); + bool closeCurrentProject(); + + bool isInterestedInFileDrag (const StringArray& files); + void filesDropped (const StringArray& filenames, int mouseX, int mouseY); + + void activeWindowStatusChanged(); + + void updateTitle (const String& documentName); + + ProjectContentComponent* getProjectContentComponent();// const; + + //============================================================================== + ApplicationCommandTarget* getNextCommandTarget(); + void getAllCommands (Array <CommandID>& commands); + void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result); + bool perform (const InvocationInfo& info); + +private: + ScopedPointer <Project> currentProject; + + const String getProjectWindowPosName() const + { + jassert (currentProject != 0); + if (currentProject == 0) + return String::empty; + + return "projectWindowPos_" + currentProject->getProjectUID(); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow); +}; + + +#endif // __JUCER_MAINWINDOW_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.cpp b/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.cpp new file mode 100755 index 000000000..f96e0136a --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.cpp @@ -0,0 +1,387 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_OpenDocumentManager.h" +#include "jucer_FilePreviewComponent.h" +#include "../Code Editor/jucer_SourceCodeEditor.h" + + +//============================================================================== +class SourceCodeDocument : public OpenDocumentManager::Document +{ +public: + //============================================================================== + SourceCodeDocument (const File& file_) + : modDetector (file_) + { + codeDoc = new CodeDocument(); + reloadFromFile(); + } + + ~SourceCodeDocument() + { + } + + //============================================================================== + class Type : public OpenDocumentManager::DocumentType + { + public: + Type() {} + ~Type() {} + + bool canOpenFile (const File& file) { return SourceCodeEditor::isTextFile (file); } + Document* openFile (Project*, const File& file) { return new SourceCodeDocument (file); } + }; + + //============================================================================== + bool loadedOk() const { return true; } + bool isForFile (const File& file) const { return modDetector.getFile() == file; } + bool isForNode (const ValueTree& node) const { return false; } + bool refersToProject (Project& project) const { return false; } + const String getName() const { return modDetector.getFile().getFileName(); } + const String getType() const { return modDetector.getFile().getFileExtension() + " file"; } + bool needsSaving() const { return codeDoc != 0 && codeDoc->hasChangedSinceSavePoint(); } + bool hasFileBeenModifiedExternally() { return modDetector.hasBeenModified(); } + void fileHasBeenRenamed (const File& newFile) { modDetector.fileHasBeenRenamed (newFile); } + + void reloadFromFile() + { + modDetector.updateHash(); + + ScopedPointer <InputStream> in (modDetector.getFile().createInputStream()); + + if (in != 0) + codeDoc->loadFromStream (*in); + } + + bool save() + { + TemporaryFile temp (modDetector.getFile()); + ScopedPointer <FileOutputStream> out (temp.getFile().createOutputStream()); + + if (out == 0 || ! codeDoc->writeToStream (*out)) + return false; + + out = 0; + if (! temp.overwriteTargetFileWithTemporary()) + return false; + + modDetector.updateHash(); + return true; + } + + Component* createEditor() + { + CodeTokeniser* tokeniser = 0; + + if (SourceCodeEditor::isCppFile (modDetector.getFile())) + tokeniser = &cppTokeniser; + + return new SourceCodeEditor (this, *codeDoc, tokeniser); + } + + Component* createViewer() { return createEditor(); } + +private: + FileModificationDetector modDetector; + ScopedPointer <CodeDocument> codeDoc; + CPlusPlusCodeTokeniser cppTokeniser; +}; + +//============================================================================== +class UnknownDocument : public OpenDocumentManager::Document +{ +public: + UnknownDocument (Project* project_, const File& file_) + : project (project_), file (file_) + { + reloadFromFile(); + } + + ~UnknownDocument() {} + + //============================================================================== + class Type : public OpenDocumentManager::DocumentType + { + public: + Type() {} + ~Type() {} + + bool canOpenFile (const File& file) { return true; } + Document* openFile (Project* project, const File& file) { return new UnknownDocument (project, file); } + }; + + //============================================================================== + bool loadedOk() const { return true; } + bool isForFile (const File& file_) const { return file == file_; } + bool isForNode (const ValueTree& node_) const { return false; } + bool refersToProject (Project& p) const { return project == &p; } + bool needsSaving() const { return false; } + bool save() { return true; } + bool hasFileBeenModifiedExternally() { return fileModificationTime != file.getLastModificationTime(); } + void reloadFromFile() { fileModificationTime = file.getLastModificationTime(); } + const String getName() const { return file.getFileName(); } + Component* createEditor() { return new ItemPreviewComponent (file); } + Component* createViewer() { return createEditor(); } + void fileHasBeenRenamed (const File& newFile) { file = newFile; } + + const String getType() const + { + if (file.getFileExtension().isNotEmpty()) + return file.getFileExtension() + " file"; + + jassertfalse + return "Unknown"; + } + +private: + Project* const project; + File file; + Time fileModificationTime; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnknownDocument); +}; + + +//============================================================================== +OpenDocumentManager::OpenDocumentManager() +{ + registerType (new UnknownDocument::Type()); + registerType (new SourceCodeDocument::Type()); +} + +OpenDocumentManager::~OpenDocumentManager() +{ + clearSingletonInstance(); +} + +juce_ImplementSingleton_SingleThreaded (OpenDocumentManager); + +//============================================================================== +void OpenDocumentManager::registerType (DocumentType* type) +{ + types.add (type); +} + +//============================================================================== +void OpenDocumentManager::addListener (DocumentCloseListener* listener) +{ + listeners.addIfNotAlreadyThere (listener); +} + +void OpenDocumentManager::removeListener (DocumentCloseListener* listener) +{ + listeners.removeValue (listener); +} + +//============================================================================== +bool OpenDocumentManager::canOpenFile (const File& file) +{ + for (int i = types.size(); --i >= 0;) + if (types.getUnchecked(i)->canOpenFile (file)) + return true; + + return false; +} + +OpenDocumentManager::Document* OpenDocumentManager::getDocumentForFile (Project* project, const File& file) +{ + for (int i = documents.size(); --i >= 0;) + if (documents.getUnchecked(i)->isForFile (file)) + return documents.getUnchecked(i); + + Document* d = 0; + + for (int i = types.size(); --i >= 0 && d == 0;) + { + if (types.getUnchecked(i)->canOpenFile (file)) + { + d = types.getUnchecked(i)->openFile (project, file); + jassert (d != 0); + } + } + + jassert (d != 0); + + if (d != 0) + documents.add (d); + + commandManager->commandStatusChanged(); + return d; +} + +int OpenDocumentManager::getNumOpenDocuments() const +{ + return documents.size(); +} + +OpenDocumentManager::Document* OpenDocumentManager::getOpenDocument (int index) const +{ + return documents.getUnchecked (index); +} + +void OpenDocumentManager::moveDocumentToTopOfStack (Document* doc) +{ + for (int i = documents.size(); --i >= 0;) + { + if (doc == documents.getUnchecked(i)) + { + documents.move (i, 0); + commandManager->commandStatusChanged(); + break; + } + } +} + +FileBasedDocument::SaveResult OpenDocumentManager::saveIfNeededAndUserAgrees (OpenDocumentManager::Document* doc) +{ + if (! doc->needsSaving()) + return FileBasedDocument::savedOk; + + const int r = AlertWindow::showYesNoCancelBox (AlertWindow::QuestionIcon, + TRANS("Closing document..."), + TRANS("Do you want to save the changes to \"") + + doc->getName() + "\"?", + TRANS("save"), + TRANS("discard changes"), + TRANS("cancel")); + + if (r == 1) + { + // save changes + return doc->save() ? FileBasedDocument::savedOk + : FileBasedDocument::failedToWriteToFile; + } + else if (r == 2) + { + // discard changes + return FileBasedDocument::savedOk; + } + + return FileBasedDocument::userCancelledSave; +} + + +bool OpenDocumentManager::closeDocument (int index, bool saveIfNeeded) +{ + Document* doc = documents [index]; + + if (doc != 0) + { + if (saveIfNeeded) + { + if (saveIfNeededAndUserAgrees (doc) != FileBasedDocument::savedOk) + return false; + } + + for (int i = listeners.size(); --i >= 0;) + listeners.getUnchecked(i)->documentAboutToClose (doc); + + documents.remove (index); + commandManager->commandStatusChanged(); + } + + return true; +} + +bool OpenDocumentManager::closeDocument (Document* document, bool saveIfNeeded) +{ + return closeDocument (documents.indexOf (document), saveIfNeeded); +} + +void OpenDocumentManager::closeFile (const File& f, bool saveIfNeeded) +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (d->isForFile (f)) + closeDocument (i, saveIfNeeded); + } +} + +bool OpenDocumentManager::closeAllDocumentsUsingProject (Project& project, bool saveIfNeeded) +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (d->refersToProject (project)) + { + if (! closeDocument (i, saveIfNeeded)) + return false; + } + } + + return true; +} + +bool OpenDocumentManager::anyFilesNeedSaving() const +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (d->needsSaving()) + return true; + } + + return false; +} + +bool OpenDocumentManager::saveAll() +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (! d->save()) + return false; + } + + return true; +} + +void OpenDocumentManager::reloadModifiedFiles() +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (d->hasFileBeenModifiedExternally()) + d->reloadFromFile(); + } +} + +void OpenDocumentManager::fileHasBeenRenamed (const File& oldFile, const File& newFile) +{ + for (int i = documents.size(); --i >= 0;) + { + Document* d = documents.getUnchecked (i); + + if (d->isForFile (oldFile)) + d->fileHasBeenRenamed (newFile); + } +} diff --git a/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.h b/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.h new file mode 100755 index 000000000..38b9d4107 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Application/jucer_OpenDocumentManager.h @@ -0,0 +1,120 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_OPENDOCUMENTMANAGER_JUCEHEADER__ +#define __JUCER_OPENDOCUMENTMANAGER_JUCEHEADER__ + +#include "../Project/jucer_Project.h" + + +//============================================================================== +/** +*/ +class OpenDocumentManager +{ +public: + //============================================================================== + OpenDocumentManager(); + ~OpenDocumentManager(); + + juce_DeclareSingleton_SingleThreaded_Minimal (OpenDocumentManager); + + //============================================================================== + class Document + { + public: + Document() {} + virtual ~Document() {} + + virtual bool loadedOk() const = 0; + virtual bool isForFile (const File& file) const = 0; + virtual bool isForNode (const ValueTree& node) const = 0; + virtual bool refersToProject (Project& project) const = 0; + virtual const String getName() const = 0; + virtual const String getType() const = 0; + virtual bool needsSaving() const = 0; + virtual bool save() = 0; + virtual bool hasFileBeenModifiedExternally() = 0; + virtual void reloadFromFile() = 0; + virtual Component* createEditor() = 0; + virtual Component* createViewer() = 0; + virtual void fileHasBeenRenamed (const File& newFile) = 0; + }; + + Document* getDocumentForFile (Project* project, const File& file); + bool canOpenFile (const File& file); + + //============================================================================== + int getNumOpenDocuments() const; + Document* getOpenDocument (int index) const; + void moveDocumentToTopOfStack (Document* doc); + + bool closeDocument (int index, bool saveIfNeeded); + bool closeDocument (Document* document, bool saveIfNeeded); + bool closeAllDocumentsUsingProject (Project& project, bool saveIfNeeded); + void closeFile (const File& f, bool saveIfNeeded); + bool anyFilesNeedSaving() const; + bool saveAll(); + FileBasedDocument::SaveResult saveIfNeededAndUserAgrees (Document* doc); + void reloadModifiedFiles(); + void fileHasBeenRenamed (const File& oldFile, const File& newFile); + + //============================================================================== + class DocumentCloseListener + { + public: + DocumentCloseListener() {} + virtual ~DocumentCloseListener() {} + + virtual void documentAboutToClose (Document* document) = 0; + }; + + void addListener (DocumentCloseListener* listener); + void removeListener (DocumentCloseListener* listener); + + //============================================================================== + class DocumentType + { + public: + DocumentType() {} + virtual ~DocumentType() {} + + virtual bool canOpenFile (const File& file) = 0; + virtual Document* openFile (Project* project, const File& file) = 0; + }; + + void registerType (DocumentType* type); + + +private: + OwnedArray <DocumentType> types; + OwnedArray <Document> documents; + Array <DocumentCloseListener*> listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenDocumentManager); +}; + + +#endif // __JUCER_OPENDOCUMENTMANAGER_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/BinaryData/AudioPluginXCodeScript.txt b/JuceLibraryCode/jucer/Source/BinaryData/AudioPluginXCodeScript.txt new file mode 100755 index 000000000..316bd1152 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/AudioPluginXCodeScript.txt @@ -0,0 +1,44 @@ + +# This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on +# which plugin types you've built + +original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME + +# this looks inside the binary to detect which platforms are needed.. +copyAU=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'AudioUnit' | wc -l` +copyVST=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'VSTPlugin' | wc -l` +copyRTAS=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'CProcess' | wc -l` + +if [ $copyAU -gt 0 ]; then + echo "Copying to AudioUnit folder..." + AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component + if [ -d "$AU" ]; then + rm -r "$AU" + fi + + cp -r "$original" "$AU" + sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$AU/Contents/PkgInfo" + sed -i "" -e 's/TDMw/BNDL/g' "$AU/Contents/$INFOPLIST_FILE" +fi + +if [ $copyVST -gt 0 ]; then + echo "Copying to VST folder..." + VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst + if [ -d "$VST" ]; then + rm -r "$VST" + fi + + cp -r "$original" "$VST" + sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$VST/Contents/PkgInfo" + sed -i "" -e 's/TDMw/BNDL/g' "$VST/Contents/$INFOPLIST_FILE" +fi + +if [ $copyRTAS -gt 0 ]; then + echo "Copying to RTAS folder..." + RTAS=/Library/Application\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm + if [ -d "$RTAS" ]; then + rm -r "$RTAS" + fi + + cp -r "$original" "$RTAS" +fi diff --git a/JuceLibraryCode/jucer/Source/BinaryData/brushed_aluminium.png b/JuceLibraryCode/jucer/Source/BinaryData/brushed_aluminium.png new file mode 100755 index 0000000000000000000000000000000000000000..1269023e5d3749e43846691589985070333eeee5 GIT binary patch literal 14724 zcmX||RX|%^w5@{&cXzkq?(XjH?(W6iDems>4#lN7#ih{V6fI7Hob*5U+=pZ*dCOjF z%`wI|=Z;lXmO(}!KmY&$$a1oh>Hq+QCit^65EA_UWc|4Se1UhB)$;%V5HbI~AON}f zc;FwQZN!ws0DzXH&wtg@z~9L%WYv`b0Do!#AS4_BcmaX0X8?c~D*$kA3IOnD0|2-# zsV3vn008f+oTQkh?^eBr49XB0lEO16=R_P`jcLa0UX>Kh{qc`}T~1Hmz<%)cE|46d zRplo7VVpIa^(j_W^ph-y_}H;d;5<$XtUSH>hJG4!3ZBCsI0Unqgmf0JWBsuch#p<D z#$8@k(69L5wapH5B!#WPdg?SmnV(rbx5l@5WmAlGbla_c^t^|qz8=jweI=B?Y?n%M zUPz7rq!4tBW!MO2cu^F;L7>|qv2JoIqoY?=OLL{R@49qj_++_7i`mzjX{BBxmqrR{ zYm$NAu$>HIs!52|uC51)_96>9)&O*<HSdz=oYEXs&W`k_#~evCnBG&H<TUya9x-p& zI83+pywe;LzQL~*iQP$jtf8BUO6IIFa<*x5XzmUinE4u$gQ}r{cDKVq#O|f;3_7by zu-f;H=8g#WaB0t9&UFClb!0H6co9aAAlv|5F(7&Da!Wy!<5soYD`0|id}?|s6s0sn zSpN&@7ee98!-NVw$_gBJbGvLQ8OUE@rI~{9N^G20RM%YsdBq;ucZiRFCv-D^4~ajE zkbH0vRvrr)9@hMYO)8MpQW`3NU#fdH!TDm_qf1Wr#nvZ1mY!tJ3m*;FDC$?1wkf*m z`y3<S=qMGE6>Vfu={oorCj#vcdf(YR%E4IH^NkYG^sg=oAG03G5E{y=X$*Z)ZBuIh zJ`oWgqDUm%?&#<)-uxNwgAiTWoe3=}-}Lc7Z42*#74FlwirDnY5KQDW10Fdik*(G4 zQ`h;_!|m4Xr-GZQBVR5Qnl~P4(b<=V?G%b_t(|VaWZN;H>H$bsb69#nxF}NpJ;=ow zd}}cEe$RyoRZm|zl5l5!`E1)3X@8q}(vFY&^J3_gm{NMhv6sztpmrxf&CqjIyW@)4 znGCV}+0Z*U;B1@)Yt5|E)$AHw+Vjz+<fU#+qf&5()xS_V(@%1~v3G0Mykr3eMs1wo z@ES#na01VI)$$vyRiYZ!5F>!zIsr-*7`}M42bx8pIfSt#9?Xj`T}JrKwU_%RRWS93 zB4i)Q;0O0PdX%w4YqJs~MrRL_Jn;`md=n<a3>B5XI%P8KG+L!f4Qjc9Engcu3yTI! zAv-ORzlSsb)Ucl(pIUjKe`kN6yXed`e<&PDW6q9+ihoP`Eu2tFWt>sEFi%ItmD0(? zt3-ickgY)kfydE>9U_JoHKGdwWktecq<-%ey4cM%IH;o&(cGb3al&a!L0(t<WJTYj zqt(5A0Wuwtg*D7%)y|PE*`RIZSbz8IoG(s=GTMvMX5D^Z&3Or>iCq`^Y$y=Pd}z>> zb!AD;jPKxj-RrhfzIe!)TQWq<S?CZrcwJk&g;gw2x=Hrjfztt{-%tso%>$wa*k~s~ zu>wakKR|Pu;;o;y*<upusX3#QQ6alIM?bjfqO-aM`Movw0#c_*U%DCjJ>vVnz<pgW z(gjFm91+2cK7F0P)pMhhkas5BU4$cKVK_%kEo5bx6w|0?$J#icll3LwPeUif78Z`5 z_k!};{dW6tXq?gyKohk)D4=cpsdRX!fUsPHOc@zy4B2dd#0wA=Rs9Ka(U#?A&q`FK z!@`){;8UCy>@l>-I~jWk+OCa;>6WZ&a_Mm&@pYwhf2D|Tz89GBn{Ue79*qXP#qZmE z?c|&0>JHK-8Zw3GS{_Rs@(yY{pl@WCt2n#Lj<?GWh8d<?l^2FFWt4blgO921geF^6 zbOywT;XTWNxUMNvtzJaymjR@#(b1H`l9p#~e22O_kWCE5pef+h;h{-nPd3G@3vY8r zIeu5C0|!ms_<oYbtmH*AVV={E2@ro+a?tQ`lI?l~m4bB^ZOoDn7J#BV)rK7YDiT-# z^E#iP|8RAXPdCp{gVqdq8L}fBK4xJKV`$1(0m#o$!-(R+mKvq+fTnPu@sHD1t_<nI z><SjPwX9UMzagyzs&Se}#_<yc5a=aD=f`|R+*;ASd=GG`<a_Y$1ePZkJlgzXtbghx z+GZiMS>d&STT|!{$V*ufmg;XWb8H+WQuw2^-lsiry;4}rOs3x$OM9!PRGSDT_er(( z>UOy^0e;0{sJtam<TrYV7Kbhb8Fc8W)jP=K2aK3yVa=HLc{*0&rbl5KrIvp-CClyf zQ&;S$x%=g%NrII%e&aEu+}3ld>Yani^X)oW2M&jHj$T+5GmPLCb<@M<%)^M`qHCJ^ z34Xz1*b%0;2RApgnfj5y?72(*kctu)I-ZMw7EYgoaC5(oLYh>Mru7HOEp~_(hcqM^ zv{`W^D7cMy)KVg9<bz-#hALhMW2Qey8;fBgbpc7_(^A9h*0o0%a)2O$N{k0NB|O2e z@UVQ?f|m+Fu#udg%DN-kMHWM6G|<th@=KiRr*nlLXc_~Z<(J)OWKoZ6Odfra_Ob4^ z7jh4fduPJp6tApRbPb^yjSuC^0vm$A;YEA#4*_UltT&*q+AQUEW}JN_JvBhy^t2Zx z`WNwpi*b8h`)%1pHuGN@3k&jNv71AvDKM!Gf|%0s%hNRb>zRBn0j)!9)6gN-!LSkQ z+b=bU%ZH=goR>$hHS^lEOJ>MvV<V<2#t3DlwOEZz4W4RkH);+Hy9RBd97~JePK&Ac z9N>q#dkz4=QC3c<ClL+_YQ|@sH3T)Xa<#&O=x>O0fhx4G2q!I^m!aL?2s4MsHf{*2 zBP9qM=5>x8kQoRB;4>dZiiHz#5JMvUd#7#9q}IjX(+;U!e(h8)VvM$7==U0<$`c#Q z!fFZBlp0{U$dX&G1d@f(*G>P>;cktNS-o+r@A@VDD@=ihUdpzqAJWyC`M)YZ0BSG- zN=z*bTa|d~WB;aN*}2;@*K}vT{EJ;bz+1%cN6&2&?!%kwJu2>*{*Ag+n+-nw)JBW` zBQpCybh2E$L@e8t*b5q4ed~?tDfQ=IBB&XDd1<JUm1e8D)%lEAzN|&AGL!A1XiZ4G zH*M|wE<}~YxdWaexPI4`_8vI&4ZjS4HNv_w{I}=@H7vcH#rruA$gJ<6RCq<Ox9RSa z7uS3e$0@gS0zihWEGDLS?uc$a1^KNb?>f@EGRM+IF>ONU#9=a@CQ!@Xnt)fxB9*L_ zhfjr>2g{(z^ESN5JEt(#l+J+v^6N8cD9&d6I1rm=g{8^JaO6gz<u}X92ej$YtP=oW zh9^7x!STIhijR;=H-sT%UZwIt%O>wY>XMblG!x!rtp6v}A>KY|ODprs`0KrS+QO#b z#uqg77DQ6MpWz-fD6FaDGH9+Jf|>NjhZ7c`pRK83Yh^Q-@1m0jc~XJQc|A4a{JKLc z1KZbVqDUU9f%D;vT`Ibes_w9SfCw_A!)EXqflEU!DX1mAu@tQgH!+Fr0^WXo6_`N0 zI4J}~VxtE>radkHj{K%uQipjb!mUeCExpEz*Kve+Ko>?i`BD@^6L_L}v9LC7eyxGn zLF-As`<k9vs*|ScRO`|c!t5Mvwn1PhZ{Xz0>YU{-K(Lbbh-?3JO2^5qp0Tq24I|_W zhdu-yte7nbv}%DAm92l>7tV~XpkmZ1GFw-yMdGdhaN%>bBh|g5Oc^`GnnsB^AS16T z;S+U45niEql+ePSUAwK#&HvWZ(I~C!#MzI|vymRqpMph{TY>6{Q(_qC+9n8M`Q5z| zHCcRU0Ohczpe!%A>{$?)WVG;?>Z_c`c9;l)-D~h4py)I<Ap}}DS$xw@@V;juT+9c6 zUR@SQW@1giCPBeScuaHWh{Q@ZaiJLXEp(#!ubxdGF#~3nyXW6KMvj<WmIBow%2#NW zS=nItpgJP26}Q<9!|wYdMshd&+4&?CF4>mVk6lWY+4*0K2Gew-CeHXmjfjs@US&(- z@=i`dP=A2PKE@ONkSXpHynt|4q}fGKFt0+itd;{UZuu236{0!uHX|p5^HARL0Seb{ zZ7NsmrQSM3fKN660nNh1b6URN=B+FyKad2PUkm7Gqt*7+>TTuR&x1W$L<a{2*_Dy= zAhT+x>v`h1gQNWe-!}-d5&ih`R<tnIkw4R~&(zAuEdEAl$7#mg#j0I5+yw%U&xa_) z3@wWN{=?>Kv0@~M+h9WW3;gqF8KQKx3<9b|(rxH~RHooeSeuf-qHpI_+tjk%htk}o zy_(4wd4b1v@cpc1xsm3(KJHX7-wB=CQOF3d{h2Mcr~TpBuY4*z#D`ux7xdE3Q-|LK z6#VxsjPd0$e|e&CPB^zd`|mIUsBQk)u@TkiU=W8u${QyWQ+F?Z3|YlBqo%EBJdA&h zf~w~OzcA9zIXb*tx~~z+fp)*4)TBILGQ50fRY)odMwD59bU<*S_!hpNw;7c0EgXi4 zvg%KAL)~B|IwP2Sof57lr#G<jQySPZX&Y75bs^*vYSxh)mKQC$*`8_fI5h*vl?eCZ z`Fp_2!b}SYVMTh_{~$yRi>8=sBlU#DR&-dl<nNWL!|}%pH=f`5g0~Wi4~54UQXXQS zJx60f<MK2q&}t?*OXeE8Zyz&3W{TCTj^1Z*`29zDU4V{rQ>2*ho2ZNS=xKb~NOXa- zT>*B;y3zspPO!2r5<3d)i<Q@k2gN#0NIS;{1R%_;IvfPDR;F+;;c&x+i)y&E-x4A_ z7G2dzfAk3}{;GaN7*0r`O~N=TV#$cJwNz7FJUB4ChMt}WqxvqFzJ}DgV3u<iJOa94 z!cm>@`1Dkv;$(f)(Y(b0qo-wOOrvu+^J>O8i8V&n$@}$S$2@KGZ_0&D)P@8z1g`*i zD}a6IzpYTIPNg~iST?j0i=q}U66=?`YKeG<4Lt8wATdKw=;E#F;SC`%!1}538}ZdZ z`-wVaX!$Ug;Hx>x<p5*N1RDO3;^CD7tf%*@fGLW*C(G0Z436GnA2G)&4co2~CPnrG zfJ6>@b8uui;Bt1=CIi+BX+eLzVTS>~-vME0Gh+t;2xBF=5@{0=_Xn6kNyMy@+_($H z+!;*^-nhF&jIq%UxueJ-K%iB)^HLVcB^@X3+HRpw5_~~IFfc10uB)*1;r@}xu`=&y za;LYy@yj=1iD)hX6>imPh&i2_ThAZADFP*8tyXoZIH}Gf<0uQ4j;ue=at>hxH>4Hp zE%0E?bfdxkcWwn@hG8zBI!gd3&Gyut@hMKV{-eDNC%a@0I1)6wN^bH~!f18@z&TXI zZ48O5F2v&>F`_=g6?`^(Eg{NLs)tb@%;863Bhg<TQOL4w?RR4@nrQGKax(>qq*Nl5 zrk3v^kI<mH9r9@>*(>y^f59Jm{{n100ikH8qaO~B3xGy%(}V!n=(+lQS@p*!2li=S zCZ&X~UzXyjGJf6ZR2ir8^135o7w%N(@`oKQjA@R$ZHm`#@!~(^tB#M3BobI55@Ss* zce^jtGxc)DLc`%YRfoLVP>XAoI#1K$&m}bejJI*laZb=^L-tis0xbSJjp2*qVA;%j zi%f^}=2;!qrOP1M5sqEW`*EF~lz*NuWra~UArt6j!tA}GQ{NGYVq%WGph8c#P4%so zuVH)q68@`?x=8p1X@TW;b?GB-^XvJ}YU?MGzoZcY3`E$Z7c7fVb@`21+OYuT7_qBZ z&`p$S&Y08~fqmNVP2rru9j+okdBHI95GxSM&l8mMH=e<QS(=!f4t;Fsg-`O<VWLx} z0b*7a!qm04#&?{0CBI6CR<kUhFQd9?ziFieg<a#Vqu|ocUTQ{#;_f@KBjcIJ=-#>3 zP+;nHRl`p+)kuLwb#8+i!$xRdA)W1?Z6c7(`R!3(1n&&yW@n@yutVDKx*-4&W@M<3 zMLDG6eA|*ku*JokS<~Fc{s5%#L6nhw<;nRke&v(enT!Xsvu8MLYbqg<_!7{9u$aVN z0pHYzyrQUAs1h$;QTK3Wl$s)n?o?x7Xi5<QcJLxtwvh~f{Br4vW^Q-#Dy@}YlFlsm z7-L{sAXCvc00zd8uHF;efCyHk^5=J(N{KIloh1AO5vo8mjQOIF;W62FjvmB}Ql`Kv z++B5~1Vozq&%W|{67V3_t|EJdROfU9TsI@2^(2;O?=U~z>zW#=dI%$?-5%`wUe}CE z@uAxv#d;yViAM#S(a$ocpQ-fnPb=^aD=GD9wB(;K)SQiV<wM^bUBKla3kx8M7Snn9 zVZ#g*Kemv-wKdBwt8|g~(<`X@nb<txdh|pC*(d&+HQsZ9?=N%O3m;zy;3ZXqaqcA2 z-kG&JkG02-5`aEzn9|?#<6+ACjEdy<sWW+sfTfpg7Le~qs9wEy4fB*DFNyi^Gn6v# zik#ALv*61mO!G=}6@V=N6Wp_q5oC(DG(ET|19#t5c2y*2tB`v|(Guo7kG&u0*-;g; za_tD2k5BLOWYnBcVItXSQtD$g71@!e(I760K`Ju@h(K&3t*?bi_dlWj+W4Qqjoj#{ z5UGwn9(InTP>Gu(br4F9Tvm_5^kO03+cH3$5tY)-@Ih~lcxz#OXO3cQZpixtf!CKt z1Q17yDgE^NVdE{s-{N};!#PaGz5=4~IKSO$NJjluzW5_~pvB=BzCzQsK{<_ZT#Ss2 z$9y*SkK$8=WMBywTWqz>Wv9M{{uGhlu%#(or_`0w^@#CYwi6Mo6Ah-@r(XCFz^`uF zAj}Nc+_mzT@DLh)*#Kr$m1IDE0UHWfl%ND|Ks-L8aTG-s9ab=GqLS4f9U^*zYk^j$ z_6GRBxpd1mCK#uQa5N9o&fhR8<8qqrUD$G`{7P5Y8**lUWX`zvTP32FsqUfFRY7lO z6gxzrTOWH|ZvWJuMp(!H+)1eNjNRy`-PA<{O*DniNB#BQNZXRQ6_GiMeN8E}T1)Lb zm&lW5tD$iRQq`Lo>@C4dGW))8F`qpWK98MSonBOgEgLrDC4uFD@uShB)&SbpbJBm$ z-kyj`wEC9}GfPFwa%ST@GG(peAfSQ!2d^mix#Qy7r(fG9)WK&Hx8r39rrd0DHc_7x zak`eHbm3plkMa0NW}r_-PUGrpBAUK6a^=1&Ujv6WI}QL?Va+^K?@brhiox729$e(2 zcJvO`RF#pMD@CI3vxV9d+h}N4;v6AGAyk`f;|)%?-MnvM_yIO%$KUpM+ip=hXMTV6 z3$S_I=qGG#NC&uIzeD=~<_I3x3_a}H$wNUNlybnHQA*d$Ea}$@NO7EbMZuXHl+SDb zWO@Pu0ByGa3$%AJG4!x_3a6-u_Nm><jT#tV%LHG~N7_d$6~y}^pZ(_=RPrI|BgpwJ zxhyajSvlvdTawDU)Z(^%Peby#h|V<0E-y-OBfy9PvhB3|$6AP6Lc|&t>zYz~oQ;|j zK%g}h)-NoykFUkO3<;uADCqm;q~B-aRv6RE1UCSJ7~a-@;f5I@P%G^#J}n$Z^U!a) z9!`%A;LNs12Mz$`-Jm_s>|wmV%v|qk`hpsX1yQ$p6G1w}c;+*2?JWFTX#v#xjBR4z z<3O!Xlda&U*PuSOLBqPYca0!bJk|DV3q>h$4<Z{*^_<Wff~o*7mrY5cYWm#`{Lm); zE&y$W?EbN6>ubEaZwGU6Y|R8@q(!-ou?czmvL*}S-}+*y&W-Q-VpPGDL9lW0sHHGJ z9M!wq8F0eC<ksoU<D{BaA47zac3hQZ$e0gW(y0nHryYwguMO37{OWMxzF)5?Ol=VG zVa}{RW-;qXgOJ@Y9u;ZfKrd1Ntj*)W0nj2sQNRk#kFjOE(#?;LY^zZ6-CK3#r-y3L zx`u6ii4%k3A2ZpA=xVN2SuJ5pD@z>S6+x>rI^ve<iN0L=4V6EvDL+Vzhp<Gk0_(-7 z8p}g11HBy6!}L);+8%$nFk!6ZGhSAm0hwIPWqw2b<{VL6sV#$`EE{NrF22}t0szhM z<lX)*fY-xZ1PYN1Asr3$M@mR<h0m^yxDT#uy!N0vq7Iuh`yk9JimFpY|8+9%R(303 zbv^g|;@%Y^O+TkQq^v)Sta?4wjdWzQY;!%J-c)6!tf#)5R;`z4ctId5gGlB>@E57m z>Vqmw+VXsf{Z=0TAWIXu5A$~-3L~LQ+>ka0y?=X=<Q3#{g%;B-v&IKR(9>8q>_GHK zM)6;wy>g3+^;wC*6);-O&^po<ISG$rK6RC4*yS3|a%Cl&+BBtrB{`282sU_{@8d4~ ztlXNqV#^t#Q9oC0o`4ZSQ=<7E=OhkIa5oh70WwjE!wX&gOLbn`jwSv_HWA9BhI++o zlnG#C;|c`;j);<6h_vm&Hj3_uCK6P4WMvnJG)6Hypsp#)%nUbvqC5IkEo<?-PIML? zfYp<322{QBkn-cF&w|9z#GY-}79!PqcQAWsIBbXnpzw0QwcD`;&W#xF(Am9?VxSK_ zla*5Ny?U$RuFzNeaOAQH5^SRi;C9ubScV8y3IJ6A^Yg@TVDw%>!f+LQh>}r@5L~Rs zVHJWF{?=Xl%_;j`+7gp$Ic7rVGe;X=qG6U)?Ym<;La+sQKw>v}4U+^4Z)49VU@GJ% z1x%VL&Na@f@XCFNQja?Zz8RV~{mG$NgzU;@sp!ZC&caqUW=D@>Q)kR8<ki2|A@G=} zBul_Mq90)4rse@lRW<5U(Pk69O@2un0%Y_Lp{O1=Ri*@NBWv7&=JM*K@u$*Xam=<- zXtg-IHA<n@j#zFoI(-&PaeBsqqYINg#3tDjsvA17zKvBaSCe?=T;G9}Y_ORhyV}po z<y0l=o!NY~_T+PN9O85>4aF}AqFXsc5J-@0v&r`+9zpolOoXZJLj$Je4%J+e_%x2Z zV*wRdMkXk0>i7z_PZf0^SkhE9xv9}{aB1AT6&k7x2;$V2i*6OmAAYN#;g`BBQ8(g6 zyP5Erjib+w<?*!FW8_`*p(7rN>i+t7e61Kk1>*^mL$tj~NK=>OIxpejQ?~Ai;EGWH z&$G8nfIxEv7@KQ~*BFvy$M;S)tg!hgH1Z@SS<ziq+Sco0Ju+ku9BbTyy?Y@_FOea? zFYJnrq!D)5W<P%}VI;2Cr&|dXwT0~6Iv34*qYpRf_t?Zsg{FOulTkc`?7UAIbg`-o zkA3!9pB_3K!Afq;F+!nia2aD%*#U!efpEeQGd$?mFYh+<3vnZ%1EPQJY$I;nJohh5 zL&#n32Snp5)M#3UrKts*ck*wKk*0P4ckkXe;xS%8pn_is<&28SYUdhN5nCxCJ1xY1 z%NaXSAl%7z29{1g)JlTO1hVaYmD=~e<O31k+g)&nUGK;StSO<kYW#AjaRp`U7hKqh zQ8K+?OfSF%Iz$ZZ6lAj70*gBGL(2m@{rbiu0oOV9(is=vODDU%%kimWPt-wd*XuPB zlUNF^(7eewKWq*f9a(o<bc<57%}8Jgc{5;1;%Qou+#ipE%KLNH=u*f8m#ukX&-P^r zX3qlFU{47_l2!AR6z&inMnb?a+axBqBy9dmk>J{xw+rSYgg$KKC3)VvHD7?CW=^Gw z`<B&r4vDt)AwQ=*m(C?>XAod_dh{Z!YPBO0!Y}0YbG8uHl()+Mlr{52->Y;<8$jX( zLDvuAf5)nCl-#ov{jEJ2>bm9#SEcxBSdhrBQOo8qFq`@f1Em9NcLw%69C}N+m9@Sl z2~ch{g8(1{-hl~+N3^K9heor7C#J+P32mEm;8+Dct3g(^Ch3F=_H8qC^nMuxP$q-w z`Yy1Cok;w3R!S?ykw3<j1s_`ojrnQU`SYSujFIkx8e@Z&G8!8P?)KPjCo4nSRuGve z{DeXBV(O>rglRJ@7{6!N%?n!gue-h{2%?+Vl;9gt3<C8I(~AyGNZ-u@&Ir$7j+-^J z#W=fap!6Vx{(MrJsR%YsLoRN&Lvyhm4M~lyL6TuKz}Ps{C!syDV7hr7!KmYr)aOj0 z`$B-)@DjSm_<OiI?k!U#jPl}`+o7IqUyr<L^iskfUk-{h-=7nQSmeJP{m(6``+_)J zY*KRIdMh&6mO}0<He0zXd0o0xMKzl{pZHaU7}J<wjATFRGm|yyTtFMz{i2=uE!{AG zr|BB2IO|@><`{`%C#nMW7Q_g$vfwF1)L*q^t;Ha=yVZ&QDrq@V)gs(uRq}~)<gp#N z#)d-^@(iTDN=`F~Q;CGq2gIuYj^~MC0BBJq#QmTgVg&U+HD2GRmBb{|CQj_9{N_<i zHR5=*GHm$PHF1_BNUf*p&SCq0#xl@SCg@c1@^+<RvMA20ShJ26ixm%Y;osNMWLb+V zW)xqsx(U^kYMc(^qF(TGh{IZDz1c_&J^%u`yN*hpFGY{%j`pxs{jvS{4FEsp@el!M z&?P@WE67~WszE*N9ei2{kZ_kxDhkeRyT-&W;cSyAqfQRv@QZGBp}6>MoQQt`^a}kY zSeTRuldxTlULEZ>!Rzq9@2m>Bf3VEwC-5f7hjUa&Kto9ty)+`UFr5j_V{`XPUevmN zL5=#}n2+BRa>~BT0zvn$7>MD)9xuJy9EWO_JUfm+lF1`-(VVEXi1`+pL>UNceocx` zAb0ZWlQgnOe+UlR<{$s7rA%Y>-5@rET8~)2vs{tdv$i14gIs|x{JCRlU5n?Kw4D#p zbYcGNYqkCuCkjzzyo+>Mz#s3Qw1KPgbGSaqFgjh*uKYaQ?bz%^9K3sdN7MkT|C2{B z&lpT7xfkVGv^6g=%sSWY&dSyKeeuq!a0nE!auRGwDJY?1GrJb}tZ<d$%9_sS+^?CJ zE??p%3}odJV}xFD6i5U`J|UwD=iZ3pG1mI!A$cBSggY#ac7=5<oW(i;F9l1NFWW7D zN^-ST_X^Y~2&J`kf}=Fszh*uZ{xc}L&9fRS!<1BPcjHS;TK1hH;uc$?1D;1lz;wva zLJ}SRM6=08Knzd^&RZBO99G`k$75rjb&c}tG`^$yoq*$S(wE(wlZQzJoiNDR6KZmq zD?MUDnMd2b72^3H=ifVe#Ieu{xAU-mVU{B$uHLZ3r(oGGE+5k#$^0kJVAEED^y6RK zHEKhLtWlXjO_<55=MP4bbns3(1qHL4*R6;067i;jl)i__JKy2X2bvXp>Zxo0F4;Uz z6vjiAT1Wx^b^yv*hu35YrPIOBuT3(MsJHa|oaiS8Lg5CB1;-9j1V93K=L?KbY(+Qy z>D)w|bU#Nzje>46WptWyXDhH$b%2#>q?j1&nV5kT$CPKwfx}UXRb|=YvglG+v?2#P zwwn$6?|Jv<I1qPAf2sAVe=w)&U%jM#k`k-CxYr(G+GS#87n@*o>@4T_ia#cqg&r1j zcNupnBTqUB2Wzo7;1Yf%JHABCx7(n4nR6?q&3sUS$=i<!p-ce<QOKD6pbRb%7F6I8 z0js_PB31Ni7)@1d?;24fqdNS3rK-*kG(&ptolW>XnQ`wgm_2-ScxYImw>F*r3(c08 zDoo?-BCWI5cFpS;#>Iv7u{B8uJMY9;>~`T0f7R&3Gu^UOOv8y_pdJPIt(4YsrH0U^ z<q{nqY6O35o)t0Bg)6A{?u`Y!DHFh+EnE~13>$eQpp}h?cWOlya-1ELYOr-o%Od6u z&^)oaUNC+1q+#)Rl92RjVSHY*Mbj2hpi~r9!~H!>Y~l%*rs=Bjf!lu@HgF+PX`5|6 z>R3(#|2($4W#=xhN9CCpB~NBjCPvOi(v(T7j*1zri|`^~HqY=fd_%y=1eE8qp@0<v z3jYn1N34iM?=;LSK)|r#J_EOV8q-LGrGYo8&DoN}_@g!rLMzNkMs{6;X+cz~tQf&Y z(Qho}v=J8;$t3&GV|Mrxdvqm3`_%W&V~|crp=FFaCXENQQbXi~P%di0RtqDoFNUB_ zJ#z*p3?~T@av&z^B{xRe-U`^c>ZC#epvT@ot0<DWXY9VAk|XKPeRV88{xA;;=r_IM zT>X>_ex{3|uYNLHU7s`R%uehMa&<S`A{v_jWZ^zi-@uKdJ$Dy9p4<b94`@M^sIP7X zhZ&4r1ppki@EOA%8ER_pg1+-ZnkgHyVEF0gOtd9Tx;yctUzVxaT@4s|4oVPoedbhP z&N8+L61iADr>FQRZarXyGL{@tuw}9?Uf<TpRQ}%DK?(5sljq8hnzFtWZ>nwUcaip| z%SSKW&)S3`aDV;70|rJ$0s;T~@zAiH$u0wiHx6Az#C^@i3a+wJ93b8BH}gFm_T*6= zHaBDRXLBL?Z1=>G&OtC*7)JiL1b*G1*`UzO(Njo*a9G60BxKvhe2HHW?akE#_xhuN zznA@~m5-Yog7h!k8m)qQfVdIt#j(gUN{d3s*J3QVH?`^HIhVB1{@Iilyv%TOyHhrf z%ld=9+TSdAF&Sx?*!4The;rr0gE}@&cmm*RNy@YSNV2sB%-njw>|Ypyd8ZiOx8Zl2 zNBL6+uI@0l@#O_K@pOnKl$?k8e7+t<OZl&DY@TL!O;FTX??gz!dPpa6NUYa4HZ$3= z6YNXq0_N8*f6$dZ#!jzneH^|VlH75)E+tw8*{`2TQ1ss3Ef|(vFV%g=mzk{!&b0qM zQaVOZUM8=D@OC3GwPyk$D_}tcUIEw-(E7wUS~pHuUfq%^UB%9DVUM=wX}}&q0{#f< zSL+1HDJ<VfhyE}2`R0whL<edMj+u3NXJ-XGkNSwstZ#2W(a-rg4D$+h0*Z3CakB@7 zqUeQEBeB)=pPnM@<sCH9*&-Pnm8F{1whT?6ChpKf+C6%}m{II>9Q@bUvi}V20Z0<; zwCGsb6(jjiwA)wjIxP*>qD@J{@3_ZiFqz!ia@?}xfk;IGlHKl39EkW<uA2)W%OBxW zC(x{Y=c*_{>#CG<!qUZ9nDys54KfLLcCUFF@k^p}jjcVMl;z9K<Ayn0wJnM9*xw7a z>M8;C1!@RjWsrE^0CSv4(}@0dhC6_VEjedLps<@`^<?(%pMwIHiS4B<W7^T*!14BY z$BTNX-6NrN%f*1{IJ)X-TPV~8o}Ev=$4AyOIN>#;shw+^H?jq~*blSI^r@bRuj-1$ zPfW9GL!Rh>H{$yFq44@`W<Ro$9*KH*uqD$jc{4X78?xCOh7S-zRxJVcie1)Z)dnK2 zb!H_)%ng6}5tyzlsAmwmtLY{lj?);wB-6v^hO4=SQ&I>BRU^lwhsWN)Rj!<Ys7J1d zCq`~nY#fD^pA?Q&((11qEKJpc54B4vEO~!12qWWIX=Q6#apmn3tTZU+1RqJ)6eC|1 z-k!6=zWh@sGB{H-=rEyY5YLmSIB=G^QwMdz7LDrn{4j+Lw-M`)W_0x?>bt$-mmH-6 zY1jn&o}Zg!^8=B+)3Tvo`qlEDiGzW=8HZ82#=W$qEfLX(AccN;>NA%Vm4^}jDiBVC zAo0!5#3gfpeB6sbmXQf*H9v>&73N4sAxtjsI;6K$6uthJWvt0(MsS=?2bbos#jD`+ zpu9h50-^?_W~E4yhU>bW17$<oBhyEl*;>r>X(g~Po&}N!t=%}@2W-c3m_izq-W$DF zN6nzon>8TS3Cb=;7pK2)^!LxnKdI^KPC~YflJ@A*V|(+OUrMokf69A4uIBj+8H4wK zI3Yk34?1Wk*!p0BELzN`x)S;uG6ekgk7}Z-fV>3NKZH|<+!JI8&4!NN<1Pp$R&r&D z4&vQ-e}MI0NXXJMKP?kHYeCm#{4Od&>=?hymDP7p#vocEJzC_zW86$Bwfhpln)lIp zt^FphFIt^gg>BfbGA$zTza$HM_)qu2FwGix-%LJ#Ud&dKuI|nBN#rQant*1!4TFGF zE6|;#Y`<qHFx$ST6??C}p86#M3v!8=l78{-=X^M7=Ah%9MmX^6(X+I9lH3HXNEFgM zM(#K)vdKwqh(yP!?BTd0nHKg5*JDEv>4}gRxXH4k4uB2C>n0rl<rvUm$<ef2!bqAe z1yUW5zu8?ox?r1*qYun=nQ*&cghB=X86{`sXH#$IBN7j@I~sl7zA9C|uxp6l6K9JE ze%Nj>{5D?y#lHHF#F?h+&HCBCmoc=a_vV6Sx)u6@MZG*Mvxn88q@wq3Z_kZS#v#9< zPKU)or6vEu;~`cRApQUB*((_Dnu_uLmG_~d!ooMBos^jH6%>ZUh_#_C#z@_+-rSKw z8?QUi*5fI%^lA;nu|+$qNQ8`orBbW5x#fDeb^dznWh4yoX8+2#^W;{R>@NKi4MPoT zmnV4sofTyCF-yPg`^T0wahWJ!Gzan(JrO<pOZoEpcDxDLk9dFqHy$ka8)(jR2_ac# zNquQilJCo9KD8XBRM?le^x#ms9zJbMruJF%YRXSiB$r3qD<nCbV>#3F2Pf@%UE|o? z)yU&Lj(@U<1Xzwi6A&ktR#Dih8l`$}&I`VI(onmi&lkMHoVULoo0(3q_8kwBKLws` z8*t$a?KFWcsvZh}94IjWswo(gRLVM;%pXEVx1*QoBE=HO|8yC=?)yWuBwjCZ<J0i1 ztB!e^9J`j-<46v7i*#)b{S<~U%Qj??atUI!ABS}JY<LR*1){L)6?N^Ddp%vYvu;<O z*PIEFI`V`04@&Y127e}Yj8n|myRY5qu<+l$W!+}9>Ao}Ruiqn#1+zXU3xhQYN&O$- zJ2eA=ej4{PRZL6XLxq*DM)AH#FB?C*$;qM;@_M8<(V^C%mg3;nJ^nu5_(t5Gw)i`W z$wA8sA+fV*Qh2YH0Q!s9F9H){1q#;_NU>ip1}7?p$9t8+^5hR>!*{r>mjqR8SQKG% z-uhT(ZJv2*6ybrHNfQx`iVp|(k>5z}s5Oh209HEg|BTvautI+jjAZab>6eHHC_qyn zlZcqre+wxIU`KE}Z}QxV-!SmsZL?j^vy+g5Xx4w9!t%#xAv9q<rab*%sp-z>FuJKL zpveL8I2D^<w6NgFe|2LZ3WP`ZSW8(TLY3Otir{xr6kAr8))3%0W68T#4$;R-iTkzW z52jjIx_~fIq@9t!MVs@{(^PaqyO4k3B^o;v$BmLOAKDPmVu84i@d`D+Uwrk-(UbC1 zu&d?IdRfixIsx*7`hP@;0}n8s9|p81acWWox7+lCMETZUXjFC6@SWi4tOE}32I_E) zi(O3neS&H<$93&~=Y8VmOzIW-<s1>OoU-uE0I)m{o~uQR2?di*o+lawYsJVyAv$2M zwZ$<!+>GJcBPhbgc2!k!fJakF%@VL(K5jZ$Vw*jAyC(-5H&=#MAx}<C9b~o`wf7?- z2VHw7W#EySbwL4gYkKmXgH=J{C~VJaJ+VY_n;m>SW(L(bTu#b;g7iBN#PliryH^4Z z-Bwaxy@9YbIOvCn3;6#Ij0Lzkh6l?J)(Zh3g_66JjFjtl?t#iSm?=$;=3L2<(2Yb+ z>~>7Udg+i5egjOd5Q^39@5>R9(=G2wj_0~GT6P%EbITpOn+dSxLzC`Jq(1?y7N$yS z_x<IPgFiL~HC!+7o=<}vqHU5`rQpOvG;s#9Xji+OI#T?v=coa8>zV&Vq8C*2_bhx` zqLX=1dj<pjGi;%uf~OJ+WAI|NjAfOoA01`f4L2tfPCq)FZGkzdSea!>xZ5&+r8wmL z$0Xg|Wq(j7$vYe56bCxgqA5C6rjAkRd_D+b4lfHz{;vM^UDjM-P(~2fBgUIZ^&|x) z1aencIX(LSEE68|zyIHdPa(7=X~Uybfn~NAL$bx@>0mc!KS0-=+c4HU76ijtw;ZB9 zp^@qI+UABzV-WR)gJKsPLnx_7K)C_FpO0NnCikEofma>*b-m^35)Uv-KICXxFEKJT z*jp`pyzT|9(Q7Zw5^@!+@^pSaaj-(*mf$h>zc~%ZjbLkiM%*M9h&W)%!Pw)}gz@2R zYU^p6yxoJ&#Hg^6SM=S=3l_dKA!+)M!68zl7#*%posPg>wO!yvVbPvh06p2;N!5*A z(#0z4%IBl<Aq0~pU(0S;TIz1oR)Id9uYB#lDvzYMLU~CX=g<c{{id+~*R(;K{b$;& zffY?^GOS|7Md{c+eB4x0BR!8&O7!^H4{qlSxmpilO|Y7{PII%aYlxzT7THw}Cpt5l z{T<I7iJ^!gau{FTRvZdghxHUupgel<Z?Il_4+4k-HCzy=b;Cmw7A3rxUguWJufC$; zZ5ChQfF~0sAn_u^swKd~+$hXUq^wtggT0a%K*3Sm*>B3cxEto53bkiZC3g$xcsftV zm3Wa|nC2A`Mcf@qBH_=bN%V&MUDXQqg_eUHGDFoWt-4}`?vgK2IhH(Qh*K+iFK^cO zehERqvFX_inA&pL(QI3g#80jIo7h;=yU<(R_KE*NAX6<O1yPqsI@d)#*|8;Cnhtp@ zG3Dm%*Cl*G6`#!Db@f_Vsw8j0Iq5#95IhN^P~kf0mBhQN6<0qQn4S-XhLeHUUeTNe zjpZeCTZDNT5`grY#*%%0;Xe&?kiqH1@>PcH*bnKC9`u-Etd|1{E9$x*(J|`F*#?q7 zmtsjmlK~t~!XUxZ$*R}E_V{7xhZT&DBtxh;rAk|Zn?ahAz!sA%EbpZ=0MEIubzYYD zr#eH4s|-XDbfQJBjfWUaaTF^=JcHEBfQ-{(JoxSP&lg=hwC%ZZ(_djb6}&WMs~PWr zHx#6WsWH9>TGIw1=+g|1c7x352BRBBhlb@b=!~i>niO0MqaOMH(qj_%436NvfdcTs z0k%YD5!W_hhsh`hABWl;h<!^vD@{!oJ=(Lz+T<*|6p{X<6-w|Vy{|<dgkSU_zLq%D zH;rWrgT*4M&xMw=(FPIyxg6eJ2GQvc4}7ilwq{czJ6FnFs0Ag`mJhiXHtx{g-?7H3 zXDR*Y?^5A3#|4$9N)zuI>zG~tKgR6_+l$x(iD2@F$(A$kJcAr1H*Hea=$Te)d`Sv| zi`hg_p+^KheG<n_SItuNS#b|>E@8H>g<)V6nz)q=FH$g5L5<TWbB=(2Re(M~Aoy{x z@aSV2Y1_I5>B_Pu6>zFo+}Bndnz2XAf|#D9YaFNOOyzB+Zi+axg@5pm{-+FszUt9h zd{bj{^Ppj)7+4NfIJn_{jXYUDtE*<m?lhB@)LS3M^$oWB4C&(SAADxbh-ydGt;#^w zt}Zy?^>DrIwGbU^eT9UZ8+m@gr3(k2ioLa!XQ|dLWmY}1&5)Ld{<b8Ozywu^L6|Cp zVUC5PCPDJ#NLvLq5ZlQA7}sX7y|BKP+EqeWFF>~69IDgAEV*#7hQ?u$D_Dt(POAOR zDChLO%9^BWxZ)sDAATKqg2$k;mHwP>yMd8bky_S4O{@03>Isu+pK97?u*D@A@IX&i za)iXJz%SB$b#teZYPw2-8RddDKo7*wkteu}d{bc#FL$Q-tifJ~`P$wIQ+#2V1OSTR z*@LvM6Q{o^M8NV+kx{(7#Rv&e_hz~GZ>@^P5Cutng>je@9g?h@;Fn=)K7i=Y4Ob*> z<e_Dtwi;kvxziu^z4Q0es#a;D;(6-XT~&1`-h0kUhVstsp+Z5~7W1m*0YvYQ?Qdmf z6dVb@iR<`GxxHaskLY1ycg8)!i*EJo0MH=G@6AD60e1jY8ha?339qnEMPAOb7z<_s zxiUvRlC%${iN!6y6`SS9l}zc72`J^<X7Jj{_WWz%<yHsAg(C#Nqi%Y0<sx!LZv4Tg zOi;>`4g5QnC2<yyyV}{^@U2adZ^zA8R`2Hdx<;ZWJ!UEAKytzfoF>3?BcXUv*5m`A zFGj#pZWiJP$ToT;rQ8K=Ewh5DL+F>530Gb7sZXcHZc+LW+gMb<N8;opRLdXnn-@A( z<1s%ON-AOaNkBb`@lb^#ws0mnFBd+06%P?S@M+0i8-`PTsTHg1>brrh7Ad!0-l5pb z;zw9)w&oII-d~C|Hoz;e<Mt0JobQ8Utu?Tzp_`w8TsHWx@`xf$ucAe+T<VT7sAWvV z5QiO(s&%m&9+9QB)FJeNjXX}dv|uEi$__YO8ePB%3>YLEvf)|C2Dw_z&7?E&RylN; zdoc5h@tlP~k*LE`@@OL~XPyr*u==D)u{IbMZcaZg@v<`yHD)BY1BAiG=~xypN`_Q^ z1Ezc#=}5L#scY2Sqa~xX9N|vQjQc%%cwMfTK4j@b-fIiT3u62E7Ywnf7j{4hWr3({ zvduwvf^w1o*tzl@_d8J8{7nAKJp>NCk%XSZx}3~fg1$~AnkoIa?pAD?m__H>7Z1$V z(>*@ENYxp7p4`?V3aPRZjDeHn{{n_6Ig+>lxF6A%a}1%CMcP$_w-N<u6y7w`syD5# zN^u-b&PQ*5Q4_wc(vvbM>mRf|d(EN<+6uNC%SHy(v$6?ykUO#k3ucFR?+0oxD-eRR zi1V?ZNAY0pO|Y7{r=X{#Tbx#_&(I-b9SUB$H!%UJwQ!0(=6`ZK>xU#t3gq*8rK<9Y zCrF$jbpIc0VgKixveCqo&-ZaTWlK7Yj@v9dgm`rQ{S)u|Q|eIvaMzDcVLfkVkJR6N zvc~q}M7VjQlpQQXw)2Nbiy*WZZ*=86)-1yHy!?HqFfqY$87@Z6@Gw4D^{%Hd(|7b* z0dMYQ$dvaMGokx4AhfbZj!iqJ1cAr%OqxgEsz4RL=YPo)tQp=p)Zc|2!qVG#xjqOo zsv8z#e7RpXiYqo)SOugXs`m?JKNpgH*Rj)4)CVSgy=9TY;Y*oWWej~+(WvcJ4f?w{ z$Xx^)g3QNX4o`|^&~zLzIM*9x86-&{y9hM--$n&cgBz>Rj0<%~5ny*|tO~wE2q>+P zR-vWQ8|L-7gP&^?2>&-+1nYkTa#^Ev+X~}JCT#lx%kQc1sLXK3FdhvL-A;6*P6n6C zmoTp6mfwotN@7I41A7_t%ipV2s^4^=-pXV|6SaZQk$>L6KP~6Y#n9!i7W-Nxi)Q>g zuh;IpA=NkX^@AyWf^<ky`m3Abo^WE-QcqN6^|`m1QF=b#4-#;@4xB>&gR#$`JR>4m z1&AXEWtz(Nqx%sASX170YqJPdG_DMf6~Y*%B24Y3bPd1&qjyH);AEYda3$`u%jfgP zE3$&O48vrObBAb<z~i1}-000G3jdz6Woe}S1gwS>xm&q`CHge~7@dt95p_OTCRk~y zyBbZ3P(%KIBX6=`0)*u8?<Opj*-6>hFvv*cjF#VLp;-xjO2ld>l-;+<u-kD3LF<K! zLgO-cte-sOGoEKLAjWz6sYk0ofm*Gy6<YYXPVW(!AOA|2H~I}b{~!SpMQph0Zp$GE z*LVn?#iF(Fn@hEt=ol5iG#Vv$-uEt7NrxlC=t3d^IBir3TBmAJ!B0#A<fN1(8^uk- F{s*9Fn=$|Z literal 0 HcmV?d00001 diff --git a/JuceLibraryCode/jucer/Source/BinaryData/juce_icon.png b/JuceLibraryCode/jucer/Source/BinaryData/juce_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..396aaeccb821d497fdab5d3e406d9a3046c7ee54 GIT binary patch literal 19826 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%0AHl8sA6Rlewn?6! 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 UM+%(-DgXcg07*qoM6N<$f`y&AK>z>% literal 0 HcmV?d00001 diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp new file mode 100755 index 000000000..5c7fef48b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.cpp @@ -0,0 +1,35 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +EDITORCPPHEADERS + + +//============================================================================== +EDITORCLASSNAME::EDITORCLASSNAME (FILTERCLASSNAME* ownerFilter) + : AudioProcessorEditor (ownerFilter) +{ + // This is where our plugin's editor size is set. + setSize (400, 300); +} + +EDITORCLASSNAME::~EDITORCLASSNAME() +{ +} + +//============================================================================== +void EDITORCLASSNAME::paint (Graphics& g) +{ + g.fillAll (Colours::white); + g.setColour (Colours::black); + g.setFont (15.0f); + g.drawFittedText ("Hello World!", + 0, 0, getWidth(), getHeight(), + Justification::centred, 1); +} diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.h b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.h new file mode 100755 index 000000000..45c00f9b0 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginEditorTemplate.h @@ -0,0 +1,32 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#ifndef HEADERGUARD +#define HEADERGUARD + +EDITORHEADERS + + +//============================================================================== +/** +*/ +class EDITORCLASSNAME : public AudioProcessorEditor +{ +public: + EDITORCLASSNAME (FILTERCLASSNAME* ownerFilter); + ~EDITORCLASSNAME(); + + //============================================================================== + // This is just a standard Juce paint method... + void paint (Graphics& g); +}; + + +#endif // HEADERGUARD diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp new file mode 100755 index 000000000..56ab9425b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp @@ -0,0 +1,177 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +FILTERHEADERS + + +//============================================================================== +FILTERCLASSNAME::FILTERCLASSNAME() +{ +} + +FILTERCLASSNAME::~FILTERCLASSNAME() +{ +} + +//============================================================================== +const String FILTERCLASSNAME::getName() const +{ + return JucePlugin_Name; +} + +int FILTERCLASSNAME::getNumParameters() +{ + return 0; +} + +float FILTERCLASSNAME::getParameter (int index) +{ + return 0.0f; +} + +void FILTERCLASSNAME::setParameter (int index, float newValue) +{ +} + +const String FILTERCLASSNAME::getParameterName (int index) +{ + return String::empty; +} + +const String FILTERCLASSNAME::getParameterText (int index) +{ + return String::empty; +} + +const String FILTERCLASSNAME::getInputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +const String FILTERCLASSNAME::getOutputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +bool FILTERCLASSNAME::isInputChannelStereoPair (int index) const +{ + return true; +} + +bool FILTERCLASSNAME::isOutputChannelStereoPair (int index) const +{ + return true; +} + +bool FILTERCLASSNAME::acceptsMidi() const +{ +#if JucePlugin_WantsMidiInput + return true; +#else + return false; +#endif +} + +bool FILTERCLASSNAME::producesMidi() const +{ +#if JucePlugin_ProducesMidiOutput + return true; +#else + return false; +#endif +} + +int FILTERCLASSNAME::getNumPrograms() +{ + return 0; +} + +int FILTERCLASSNAME::getCurrentProgram() +{ + return 0; +} + +void FILTERCLASSNAME::setCurrentProgram (int index) +{ +} + +const String FILTERCLASSNAME::getProgramName (int index) +{ + return String::empty; +} + +void FILTERCLASSNAME::changeProgramName (int index, const String& newName) +{ +} + +//============================================================================== +void FILTERCLASSNAME::prepareToPlay (double sampleRate, int samplesPerBlock) +{ + // Use this method as the place to do any pre-playback + // initialisation that you need.. +} + +void FILTERCLASSNAME::releaseResources() +{ + // When playback stops, you can use this as an opportunity to free up any + // spare memory, etc. +} + +void FILTERCLASSNAME::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) +{ + // This is the place where you'd normally do the guts of your plugin's + // audio processing... + for (int channel = 0; channel < getNumInputChannels(); ++channel) + { + float* channelData = buffer.getSampleData (channel); + + // ..do something to the data... + } + + // In case we have more outputs than inputs, we'll clear any output + // channels that didn't contain input data, (because these aren't + // guaranteed to be empty - they may contain garbage). + for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) + { + buffer.clear (i, 0, buffer.getNumSamples()); + } +} + +//============================================================================== +bool FILTERCLASSNAME::hasEditor() const +{ + return true; // (change this to false if you choose to not supply an editor) +} + +AudioProcessorEditor* FILTERCLASSNAME::createEditor() +{ + return new EDITORCLASSNAME (this); +} + +//============================================================================== +void FILTERCLASSNAME::getStateInformation (MemoryBlock& destData) +{ + // You should use this method to store your parameters in the memory block. + // You could do that either as raw data, or use the XML or ValueTree classes + // as intermediaries to make it easy to save and load complex data. +} + +void FILTERCLASSNAME::setStateInformation (const void* data, int sizeInBytes) +{ + // You should use this method to restore your parameters from this memory block, + // whose contents will have been created by the getStateInformation() call. +} + +//============================================================================== +// This creates new instances of the plugin.. +AudioProcessor* JUCE_CALLTYPE createPluginFilter() +{ + return new FILTERCLASSNAME(); +} diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h new file mode 100755 index 000000000..11c1f6962 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h @@ -0,0 +1,72 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#ifndef HEADERGUARD +#define HEADERGUARD + +APPHEADERS + + +//============================================================================== +/** +*/ +class FILTERCLASSNAME : public AudioProcessor +{ +public: + //============================================================================== + FILTERCLASSNAME(); + ~FILTERCLASSNAME(); + + //============================================================================== + void prepareToPlay (double sampleRate, int samplesPerBlock); + void releaseResources(); + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages); + + //============================================================================== + AudioProcessorEditor* createEditor(); + bool hasEditor() const; + + //============================================================================== + const String getName() const; + + int getNumParameters(); + + float getParameter (int index); + void setParameter (int index, float newValue); + + const String getParameterName (int index); + const String getParameterText (int index); + + const String getInputChannelName (int channelIndex) const; + const String getOutputChannelName (int channelIndex) const; + bool isInputChannelStereoPair (int index) const; + bool isOutputChannelStereoPair (int index) const; + + bool acceptsMidi() const; + bool producesMidi() const; + + //============================================================================== + int getNumPrograms(); + int getCurrentProgram(); + void setCurrentProgram (int index); + const String getProgramName (int index); + void changeProgramName (int index, const String& newName); + + //============================================================================== + void getStateInformation (MemoryBlock& destData); + void setStateInformation (const void* data, int sizeInBytes); + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FILTERCLASSNAME); +}; + +#endif // HEADERGUARD diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainConsoleAppTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainConsoleAppTemplate.cpp new file mode 100755 index 000000000..4c8c3447b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainConsoleAppTemplate.cpp @@ -0,0 +1,27 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +APPHEADERS + + +//============================================================================== +int main (int argc, char* argv[]) +{ + // This object makes sure that Juce is initialised and shut down correctly + // for the scope of this function call. Make sure this declaration is the + // first statement of this function. + const ScopedJuceInitialiser_NonGUI juceSystemInitialiser; + + + // ..your code goes here! + + + return 0; +} diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainTemplate.cpp new file mode 100755 index 000000000..ea271a63d --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_MainTemplate.cpp @@ -0,0 +1,73 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +APPHEADERS + + +//============================================================================== +class APPCLASSNAME : public JUCEApplication +{ +public: + //============================================================================== + APPCLASSNAME()MEMBERINITIALISERS + { + } + + ~APPCLASSNAME() + { + } + + //============================================================================== + void initialise (const String& commandLine) + { + // Do your application's initialisation code here.. + APPINITCODE + } + + void shutdown() + { + // Do your application's shutdown code here.. + APPSHUTDOWNCODE + } + + //============================================================================== + void systemRequestedQuit() + { + quit(); + } + + //============================================================================== + const String getApplicationName() + { + return "APPNAME"; + } + + const String getApplicationVersion() + { + return ProjectInfo::versionString; + } + + bool moreThanOneInstanceAllowed() + { + return ALLOWMORETHANONEINSTANCE; + } + + void anotherInstanceStarted (const String& commandLine) + { + ANOTHERINSTANCECODE + } + +private: + PRIVATEMEMBERS +}; + +//============================================================================== +// This macro generates the main() routine that starts the app. +START_JUCE_APPLICATION(APPCLASSNAME) diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.cpp new file mode 100755 index 000000000..c3d6a5c44 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.cpp @@ -0,0 +1,10 @@ +/* + ============================================================================== + + FILENAME + Created: DATE + Author: AUTHOR + + ============================================================================== +*/ + diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.h b/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.h new file mode 100755 index 000000000..1c1bdd816 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_NewCppFileTemplate.h @@ -0,0 +1,18 @@ +/* + ============================================================================== + + FILENAME + Created: DATE + Author: AUTHOR + + ============================================================================== +*/ + +#ifndef HEADERGUARD +#define HEADERGUARD + + + + + +#endif // HEADERGUARD diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.cpp b/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.cpp new file mode 100755 index 000000000..b6464917e --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.cpp @@ -0,0 +1,31 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic outline for a simple desktop window. + + ============================================================================== +*/ + +INCLUDES + + +//============================================================================== +WINDOWCLASS::WINDOWCLASS() + : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(), + Colours::lightgrey, + DocumentWindow::allButtons) +{ + centreWithSize (500, 400); + setVisible (true); +} + +WINDOWCLASS::~WINDOWCLASS() +{ +} + +void WINDOWCLASS::closeButtonPressed() +{ + JUCEApplication::getInstance()->systemRequestedQuit(); +} diff --git a/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.h b/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.h new file mode 100755 index 000000000..a4df1854a --- /dev/null +++ b/JuceLibraryCode/jucer/Source/BinaryData/jucer_WindowTemplate.h @@ -0,0 +1,41 @@ +/* + ============================================================================== + + This file was auto-generated by the Jucer! + + It contains the basic outline for a simple desktop window. + + ============================================================================== +*/ + +#ifndef HEADERGUARD +#define HEADERGUARD + +INCLUDES + + +//============================================================================== +class WINDOWCLASS : public DocumentWindow +{ +public: + //============================================================================== + WINDOWCLASS(); + ~WINDOWCLASS(); + + void closeButtonPressed(); + + + /* Note: Be careful when overriding DocumentWindow methods - the base class + uses a lot of them, so by overriding you might break its functionality. + It's best to do all your work in you content component instead, but if + you really have to override any DocumentWindow methods, make sure your + implementation calls the superclass's method. + */ + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WINDOWCLASS) +}; + + +#endif // HEADERGUARD diff --git a/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.cpp b/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.cpp new file mode 100755 index 000000000..8c19f0ace --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.cpp @@ -0,0 +1,66 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_SourceCodeEditor.h" +#include "../Application/jucer_OpenDocumentManager.h" + + +//============================================================================== +SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_, + CodeDocument& codeDocument, + CodeTokeniser* const codeTokeniser) + : DocumentEditorComponent (document_), + editor (codeDocument, codeTokeniser) +{ + addAndMakeVisible (&editor); + +#if JUCE_MAC + Font font (10.6f); + font.setTypefaceName ("Andale Mono"); +#else + Font font (10.0f); + font.setTypefaceName (Font::getDefaultMonospacedFontName()); +#endif + editor.setFont (font); +} + +SourceCodeEditor::~SourceCodeEditor() +{ +} + +void SourceCodeEditor::resized() +{ + editor.setBounds (0, 0, getWidth(), getHeight()); +} + +bool SourceCodeEditor::isTextFile (const File& file) +{ + return file.hasFileExtension ("cpp;h;hpp;mm;m;c;cc;cxx;txt;xml;plist;rtf;html;htm;php;py;rb;cs"); +} + +bool SourceCodeEditor::isCppFile (const File& file) +{ + return file.hasFileExtension (sourceOrHeaderFileExtensions); +} diff --git a/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.h b/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.h new file mode 100755 index 000000000..f643d8931 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Code Editor/jucer_SourceCodeEditor.h @@ -0,0 +1,58 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_SOURCECODEEDITOR_JUCEHEADER__ +#define __JUCER_SOURCECODEEDITOR_JUCEHEADER__ + +#include "../Project/jucer_Project.h" +#include "../Application/jucer_DocumentEditorComponent.h" + + +//============================================================================== +/** +*/ +class SourceCodeEditor : public DocumentEditorComponent +{ +public: + //============================================================================== + SourceCodeEditor (OpenDocumentManager::Document* document, + CodeDocument& codeDocument, + CodeTokeniser* const codeTokeniser); + + ~SourceCodeEditor(); + + static bool isTextFile (const File& file); + static bool isCppFile (const File& file); + + void resized(); + +private: + CodeEditorComponent editor; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceCodeEditor); +}; + + +#endif // __JUCER_SOURCECODEEDITOR_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.cpp new file mode 100755 index 000000000..b97f8b6b8 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.cpp @@ -0,0 +1,146 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_GroupInformationComponent.h" + + +//============================================================================== +GroupInformationComponent::GroupInformationComponent (const Project::Item& item_) + : item (item_) +{ + list.setModel (this); + addAndMakeVisible (&list); + list.updateContent(); + list.setRowHeight (20); + item.getNode().addListener (this); +} + +GroupInformationComponent::~GroupInformationComponent() +{ + item.getNode().removeListener (this); +} + +void GroupInformationComponent::resized() +{ + list.setSize (getWidth(), getHeight()); +} + +int GroupInformationComponent::getNumRows() +{ + return item.getNumChildren(); +} + +void GroupInformationComponent::paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) +{ +} + +//============================================================================== +void GroupInformationComponent::valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property) +{ + list.updateContent(); +} + +void GroupInformationComponent::valueTreeChildrenChanged (ValueTree& treeWhoseChildHasChanged) +{ + list.updateContent(); +} + +void GroupInformationComponent::valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) +{ + list.updateContent(); +} + +//============================================================================== +class FileOptionComponent : public Component +{ +public: + FileOptionComponent (const Project::Item& item_) + : item (item_), + compileButton ("Compile"), + resourceButton ("Add to Binary Resources") + { + if (item.isFile()) + { + addAndMakeVisible (&compileButton); + compileButton.getToggleStateValue().referTo (item.getShouldCompileValue()); + + addAndMakeVisible (&resourceButton); + resourceButton.getToggleStateValue().referTo (item.getShouldAddToResourceValue()); + } + } + + void paint (Graphics& g) + { + int x = getHeight() + 6; + + item.getIcon()->drawWithin (g, Rectangle<float> (2.0f, 2.0f, x - 4.0f, getHeight() - 4.0f), + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, 1.0f); + + g.setColour (Colours::black); + g.setFont (getHeight() * 0.6f); + + const int x2 = compileButton.isVisible() ? compileButton.getX() - 4 + : getWidth() - 4; + + g.drawText (item.getName().toString(), x, 0, x2 - x, getHeight(), Justification::centredLeft, true); + + g.setColour (Colours::lightgrey); + g.fillRect (0, getHeight() - 1, getWidth(), 1); + } + + void resized() + { + int w = 180; + resourceButton.setBounds (getWidth() - w, 1, w, getHeight() - 2); + w = 100; + compileButton.setBounds (resourceButton.getX() - w, 1, w, getHeight() - 2); + } + + Project::Item item; + +private: + ToggleButton compileButton, resourceButton; +}; + +Component* GroupInformationComponent::refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate) +{ + if (rowNumber < getNumRows()) + { + Project::Item child (item.getChild (rowNumber)); + + if (existingComponentToUpdate == 0 + || dynamic_cast <FileOptionComponent*> (existingComponentToUpdate)->item != child) + { + delete existingComponentToUpdate; + existingComponentToUpdate = new FileOptionComponent (child); + } + } + else + { + deleteAndZero (existingComponentToUpdate); + } + + return existingComponentToUpdate; +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.h b/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.h new file mode 100755 index 000000000..df64b71df --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_GroupInformationComponent.h @@ -0,0 +1,63 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_GROUPINFORMATIONCOMPONENT_JUCEHEADER__ +#define __JUCER_GROUPINFORMATIONCOMPONENT_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "../Project/jucer_Project.h" + + +//============================================================================== +class GroupInformationComponent : public Component, + private ListBoxModel, + private ValueTree::Listener +{ +public: + //============================================================================== + GroupInformationComponent (const Project::Item& item_); + ~GroupInformationComponent(); + + //============================================================================== + void resized(); + + int getNumRows(); + void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected); + Component* refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate); + + //============================================================================== + void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property); + void valueTreeChildrenChanged (ValueTree& treeWhoseChildHasChanged); + void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged); + +private: + Project::Item item; + ListBox list; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GroupInformationComponent); +}; + + +#endif // __JUCER_GROUPINFORMATIONCOMPONENT_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.cpp new file mode 100755 index 000000000..ab0139169 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.cpp @@ -0,0 +1,184 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_NewFileWizard.h" + + +//============================================================================== +static bool fillInNewCppFileTemplate (const File& file, const Project::Item& item, const char* templateName) +{ + String s = item.getProject().getFileTemplate (templateName) + .replace ("FILENAME", file.getFileName(), false) + .replace ("DATE", Time::getCurrentTime().toString (true, true, true), false) + .replace ("AUTHOR", SystemStats::getFullUserName(), false) + .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (file), false); + + return FileHelpers::overwriteFileWithNewDataIfDifferent (file, s); +} + +//============================================================================== +class NewCppFileWizard : public NewFileWizard::Type +{ +public: + NewCppFileWizard() {} + ~NewCppFileWizard() {} + + const String getName() { return "CPP File"; } + + void createNewFile (Project::Item parent) + { + const File newFile (askUserToChooseNewFile ("SourceCode.cpp", "*.cpp", parent)); + + if (newFile != File::nonexistent) + create (parent, newFile); + } + + static bool create (Project::Item parent, const File& newFile) + { + if (fillInNewCppFileTemplate (newFile, parent, "jucer_NewCppFileTemplate_cpp")) + { + parent.addFile (newFile, 0); + return true; + } + + showFailedToWriteMessage (newFile); + return false; + } +}; + +//============================================================================== +class NewHeaderFileWizard : public NewFileWizard::Type +{ +public: + NewHeaderFileWizard() {} + ~NewHeaderFileWizard() {} + + const String getName() { return "Header File"; } + + void createNewFile (Project::Item parent) + { + const File newFile (askUserToChooseNewFile ("SourceCode.h", "*.h", parent)); + + if (newFile != File::nonexistent) + create (parent, newFile); + } + + static bool create (Project::Item parent, const File& newFile) + { + if (fillInNewCppFileTemplate (newFile, parent, "jucer_NewCppFileTemplate_h")) + { + parent.addFile (newFile, 0); + return true; + } + + showFailedToWriteMessage (newFile); + return false; + } +}; + +//============================================================================== +class NewCppAndHeaderFileWizard : public NewFileWizard::Type +{ +public: + NewCppAndHeaderFileWizard() {} + ~NewCppAndHeaderFileWizard() {} + + const String getName() { return "CPP & Header File"; } + + void createNewFile (Project::Item parent) + { + const File newFile (askUserToChooseNewFile ("SourceCode.h", "*.h;*.cpp", parent)); + + if (newFile != File::nonexistent) + { + if (NewHeaderFileWizard::create (parent, newFile.withFileExtension ("h"))) + NewCppFileWizard::create (parent, newFile.withFileExtension ("cpp")); + } + } +}; + +//============================================================================== +void NewFileWizard::Type::showFailedToWriteMessage (const File& file) +{ + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + "Failed to Create File!", + "Couldn't write to the file: " + file.getFullPathName()); +} + +const File NewFileWizard::Type::askUserToChooseNewFile (const String& suggestedFilename, const String& wildcard, + const Project::Item& projectGroupToAddTo) +{ + FileChooser fc ("Select File to Create", + projectGroupToAddTo.determineGroupFolder() + .getChildFile (suggestedFilename) + .getNonexistentSibling(), + wildcard); + + if (fc.browseForFileToSave (true)) + return fc.getResult(); + + return File::nonexistent; +} + +//============================================================================== +NewFileWizard::NewFileWizard() +{ + registerWizard (new NewCppFileWizard()); + registerWizard (new NewHeaderFileWizard()); + registerWizard (new NewCppAndHeaderFileWizard()); +} + +NewFileWizard::~NewFileWizard() +{ + clearSingletonInstance(); +} + +juce_ImplementSingleton_SingleThreaded (NewFileWizard) + +static const int menuBaseID = 0x12d83f0; + +void NewFileWizard::addWizardsToMenu (PopupMenu& m) const +{ + for (int i = 0; i < wizards.size(); ++i) + m.addItem (menuBaseID + i, "Add New " + wizards.getUnchecked(i)->getName() + "..."); +} + +bool NewFileWizard::runWizardFromMenu (int chosenMenuItemID, const Project::Item& projectGroupToAddTo) const +{ + Type* wiz = wizards [chosenMenuItemID - menuBaseID]; + + if (wiz != 0) + { + wiz->createNewFile (projectGroupToAddTo); + return true; + } + + return false; +} + +void NewFileWizard::registerWizard (Type* newWizard) +{ + wizards.add (newWizard); +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.h b/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.h new file mode 100755 index 000000000..70aa031ff --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_NewFileWizard.h @@ -0,0 +1,73 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_NEWFILEWIZARD_JUCEHEADER__ +#define __JUCER_NEWFILEWIZARD_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "jucer_Project.h" + + +//============================================================================== +class NewFileWizard : public DeletedAtShutdown +{ +public: + //============================================================================== + NewFileWizard(); + ~NewFileWizard(); + + juce_DeclareSingleton_SingleThreaded_Minimal (NewFileWizard); + + //============================================================================== + class Type + { + public: + Type() {} + virtual ~Type() {} + + //============================================================================== + virtual const String getName() = 0; + virtual void createNewFile (Project::Item projectGroupToAddTo) = 0; + + protected: + //============================================================================== + const File askUserToChooseNewFile (const String& suggestedFilename, const String& wildcard, + const Project::Item& projectGroupToAddTo); + + static void showFailedToWriteMessage (const File& file); + }; + + //============================================================================== + void addWizardsToMenu (PopupMenu& m) const; + bool runWizardFromMenu (int chosenMenuItemID, const Project::Item& projectGroupToAddTo) const; + + void registerWizard (Type* newWizard); + +private: + OwnedArray <Type> wizards; +}; + + +#endif // __JUCER_NEWFILEWIZARD_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.cpp new file mode 100755 index 000000000..f84a41ae5 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.cpp @@ -0,0 +1,495 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_NewProjectWizard.h" + + +//============================================================================== +class GUIAppWizard : public NewProjectWizard +{ +public: + GUIAppWizard() {} + ~GUIAppWizard() {} + + const String getName() { return "GUI Application"; } + const String getDescription() { return "Creates a standard application"; } + + void addItemsToAlertWindow (AlertWindow& aw) + { + const char* fileOptions[] = { "Create a Main.cpp file", + "Create a Main.cpp file and a basic window", + "Don't create any files", 0 }; + + aw.addComboBox ("files", StringArray (fileOptions), "Files to Auto-Generate"); + } + + const String processResultsFromAlertWindow (AlertWindow& aw) + { + createMainCpp = createWindow = false; + + switch (aw.getComboBoxComponent ("files")->getSelectedItemIndex()) + { + case 0: createMainCpp = true; break; + case 1: createMainCpp = createWindow = true; break; + case 2: break; + default: jassertfalse; break; + } + + return String::empty; + } + + bool initialiseProject (Project& project) + { + if (! getSourceFilesFolder().createDirectory()) + failedFiles.add (getSourceFilesFolder().getFullPathName()); + + File mainCppFile = getSourceFilesFolder().getChildFile ("Main.cpp"); + File mainWindowCpp = getSourceFilesFolder().getChildFile ("MainWindow.cpp"); + File mainWindowH = mainWindowCpp.withFileExtension (".h"); + String windowClassName = "MainAppWindow"; + + project.getProjectType() = Project::application; + + Project::Item group (project.createNewGroup()); + project.getMainGroup().addChild (group, 0); + group.getName() = "Source"; + + for (int i = project.getNumConfigurations(); --i >= 0;) + project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + + String appHeaders (CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), mainCppFile)); + String initCode, shutdownCode, anotherInstanceStartedCode, privateMembers, memberInitialisers; + + if (createWindow) + { + appHeaders << newLine << CodeHelpers::createIncludeStatement (mainWindowH, mainCppFile); + initCode = "mainWindow = new " + windowClassName + "();"; + shutdownCode = "mainWindow = 0;"; + privateMembers = "ScopedPointer <" + windowClassName + "> mainWindow;"; + + String windowH = project.getFileTemplate ("jucer_WindowTemplate_h") + .replace ("INCLUDES", CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), mainWindowH), false) + .replace ("WINDOWCLASS", windowClassName, false) + .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (mainWindowH), false); + + String windowCpp = project.getFileTemplate ("jucer_WindowTemplate_cpp") + .replace ("INCLUDES", CodeHelpers::createIncludeStatement (mainWindowH, mainWindowCpp), false) + .replace ("WINDOWCLASS", windowClassName, false); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (mainWindowH, windowH)) + failedFiles.add (mainWindowH.getFullPathName()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (mainWindowCpp, windowCpp)) + failedFiles.add (mainWindowCpp.getFullPathName()); + + group.addFile (mainWindowCpp, -1); + group.addFile (mainWindowH, -1); + } + + if (createMainCpp) + { + String mainCpp = project.getFileTemplate ("jucer_MainTemplate_cpp") + .replace ("APPHEADERS", appHeaders, false) + .replace ("APPCLASSNAME", CodeHelpers::makeValidIdentifier (appTitle + "Application", false, true, false), false) + .replace ("MEMBERINITIALISERS", memberInitialisers, false) + .replace ("APPINITCODE", initCode, false) + .replace ("APPSHUTDOWNCODE", shutdownCode, false) + .replace ("APPNAME", CodeHelpers::addEscapeChars (appTitle), false) + .replace ("APPVERSION", "1.0", false) + .replace ("ALLOWMORETHANONEINSTANCE", "true", false) + .replace ("ANOTHERINSTANCECODE", anotherInstanceStartedCode, false) + .replace ("PRIVATEMEMBERS", privateMembers, false); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (mainCppFile, mainCpp)) + failedFiles.add (mainCppFile.getFullPathName()); + + group.addFile (mainCppFile, -1); + } + + return true; + } + +private: + bool createMainCpp, createWindow; +}; + +//============================================================================== +class ConsoleAppWizard : public NewProjectWizard +{ +public: + ConsoleAppWizard() {} + ~ConsoleAppWizard() {} + + const String getName() { return "Console Application"; } + const String getDescription() { return "Creates a command-line application with no GUI features"; } + + void addItemsToAlertWindow (AlertWindow& aw) + { + const char* fileOptions[] = { "Create a Main.cpp file", + "Don't create any files", 0 }; + + aw.addComboBox ("files", StringArray (fileOptions), "Files to Auto-Generate"); + } + + const String processResultsFromAlertWindow (AlertWindow& aw) + { + createMainCpp = false; + + switch (aw.getComboBoxComponent ("files")->getSelectedItemIndex()) + { + case 0: createMainCpp = true; break; + case 1: break; + default: jassertfalse; break; + } + + return String::empty; + } + + bool initialiseProject (Project& project) + { + if (! getSourceFilesFolder().createDirectory()) + failedFiles.add (getSourceFilesFolder().getFullPathName()); + + File mainCppFile = getSourceFilesFolder().getChildFile ("Main.cpp"); + + project.getProjectType() = Project::commandLineApp; + + Project::Item group (project.createNewGroup()); + project.getMainGroup().addChild (group, 0); + group.getName() = "Source"; + + for (int i = project.getNumConfigurations(); --i >= 0;) + project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + + if (createMainCpp) + { + String appHeaders (CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), mainCppFile)); + + String mainCpp = project.getFileTemplate ("jucer_MainConsoleAppTemplate_cpp") + .replace ("APPHEADERS", appHeaders, false); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (mainCppFile, mainCpp)) + failedFiles.add (mainCppFile.getFullPathName()); + + group.addFile (mainCppFile, -1); + } + + return true; + } + +private: + bool createMainCpp; +}; + +//============================================================================== +class AudioPluginAppWizard : public NewProjectWizard +{ +public: + AudioPluginAppWizard() {} + ~AudioPluginAppWizard() {} + + const String getName() { return "Audio Plug-In"; } + const String getDescription() { return "Creates an audio plugin project"; } + + void addItemsToAlertWindow (AlertWindow& aw) + { + } + + const String processResultsFromAlertWindow (AlertWindow& aw) + { + return String::empty; + } + + bool initialiseProject (Project& project) + { + if (! getSourceFilesFolder().createDirectory()) + failedFiles.add (getSourceFilesFolder().getFullPathName()); + + String filterClassName = CodeHelpers::makeValidIdentifier (appTitle, true, true, false) + "AudioProcessor"; + filterClassName = filterClassName.substring (0, 1).toUpperCase() + filterClassName.substring (1); + String editorClassName = filterClassName + "Editor"; + + File filterCppFile = getSourceFilesFolder().getChildFile ("PluginProcessor.cpp"); + File filterHFile = filterCppFile.withFileExtension (".h"); + File editorCppFile = getSourceFilesFolder().getChildFile ("PluginEditor.cpp"); + File editorHFile = editorCppFile.withFileExtension (".h"); + + project.getProjectType() = Project::audioPlugin; + project.getObjectiveCClassSuffix() = project.getProjectUID(); + + Project::Item group (project.createNewGroup()); + project.getMainGroup().addChild (group, 0); + group.getName() = "Source"; + project.getJuceConfigFlag ("JUCE_QUICKTIME") = Project::configFlagDisabled; // disabled because it interferes with RTAS build on PC + + for (int i = project.getNumConfigurations(); --i >= 0;) + project.getConfiguration(i).getTargetBinaryName() = File::createLegalFileName (appTitle); + + String appHeaders (CodeHelpers::createIncludeStatement (project.getAppIncludeFile(), filterCppFile)); + appHeaders << newLine << CodeHelpers::createIncludeStatement (project.getPluginCharacteristicsFile(), filterCppFile); + + String filterCpp = project.getFileTemplate ("jucer_AudioPluginFilterTemplate_cpp") + .replace ("FILTERHEADERS", CodeHelpers::createIncludeStatement (filterHFile, filterCppFile) + + newLine + CodeHelpers::createIncludeStatement (editorHFile, filterCppFile), false) + .replace ("FILTERCLASSNAME", filterClassName, false) + .replace ("EDITORCLASSNAME", editorClassName, false); + + String filterH = project.getFileTemplate ("jucer_AudioPluginFilterTemplate_h") + .replace ("APPHEADERS", appHeaders, false) + .replace ("FILTERCLASSNAME", filterClassName, false) + .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (filterHFile), false); + + String editorCpp = project.getFileTemplate ("jucer_AudioPluginEditorTemplate_cpp") + .replace ("EDITORCPPHEADERS", CodeHelpers::createIncludeStatement (filterHFile, filterCppFile) + + newLine + CodeHelpers::createIncludeStatement (editorHFile, filterCppFile), false) + .replace ("FILTERCLASSNAME", filterClassName, false) + .replace ("EDITORCLASSNAME", editorClassName, false); + + String editorH = project.getFileTemplate ("jucer_AudioPluginEditorTemplate_h") + .replace ("EDITORHEADERS", appHeaders + newLine + CodeHelpers::createIncludeStatement (filterHFile, filterCppFile), false) + .replace ("FILTERCLASSNAME", filterClassName, false) + .replace ("EDITORCLASSNAME", editorClassName, false) + .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (editorHFile), false); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (filterCppFile, filterCpp)) + failedFiles.add (filterCppFile.getFullPathName()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (filterHFile, filterH)) + failedFiles.add (filterHFile.getFullPathName()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (editorCppFile, editorCpp)) + failedFiles.add (editorCppFile.getFullPathName()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (editorHFile, editorH)) + failedFiles.add (editorHFile.getFullPathName()); + + group.addFile (filterCppFile, -1); + group.addFile (filterHFile, -1); + group.addFile (editorCppFile, -1); + group.addFile (editorHFile, -1); + + return true; + } +}; + +//============================================================================== +/*class BrowserPluginAppWizard : public NewProjectWizard +{ +public: + BrowserPluginAppWizard() {} + ~BrowserPluginAppWizard() {} + + const String getName() { return "Browser Plug-In"; } + const String getDescription() { return "Creates an audio plugin project"; } + + void addItemsToAlertWindow (AlertWindow& aw) + { + } + + const String processResultsFromAlertWindow (AlertWindow& aw) + { + return String::empty; + } + + bool initialiseProject (Project& project) + { + return true; + } +};*/ + +//============================================================================== +//============================================================================== +NewProjectWizard::NewProjectWizard() +{ +} + +NewProjectWizard::~NewProjectWizard() +{ +} + +const StringArray NewProjectWizard::getWizards() +{ + StringArray s; + + for (int i = 0; i < getNumWizards(); ++i) + { + ScopedPointer <NewProjectWizard> wiz (createWizard (i)); + s.add (wiz->getName()); + } + + return s; +} + +int NewProjectWizard::getNumWizards() +{ + return 3; +} + +NewProjectWizard* NewProjectWizard::createWizard (int index) +{ + switch (index) + { + case 0: return new GUIAppWizard(); + case 1: return new ConsoleAppWizard(); + case 2: return new AudioPluginAppWizard(); + //case 3: return new BrowserPluginAppWizard(); + default: jassertfalse; break; + } + + return 0; +} + +//============================================================================== +Project* NewProjectWizard::runWizard (Component* ownerWindow_) +{ + ownerWindow = ownerWindow_; + + { + static File newProjectFolder; + FileChooser fc ("New Juce Project", newProjectFolder, "*"); + + if (! fc.browseForDirectory()) + return 0; + + targetFolder = newProjectFolder = fc.getResult(); + + if (! newProjectFolder.exists()) + { + if (! newProjectFolder.createDirectory()) + failedFiles.add (newProjectFolder.getFullPathName()); + } + + if (FileHelpers::containsAnyNonHiddenFiles (newProjectFolder)) + { + if (! AlertWindow::showOkCancelBox (AlertWindow::InfoIcon, "New Juce Project", + "The folder you chose isn't empty - are you sure you want to create the project there?\n\nAny existing files with the same names may be overwritten by the new files.")) + return 0; + } + } + + if (failedFiles.size() == 0) + { + AlertWindow aw ("New " + getName(), + "Please choose some basic project options...", + AlertWindow::NoIcon, ownerWindow); + + aw.addTextEditor ("name", "", "Project Name", false); + + addItemsToAlertWindow (aw); + + aw.addButton ("Create Project", 1, KeyPress (KeyPress::returnKey)); + aw.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey)); + + for (;;) + { + if (aw.runModalLoop() == 0) + return 0; + + appTitle = aw.getTextEditorContents ("name").trim(); + + String error (processResultsFromAlertWindow (aw)); + + if (error.isEmpty() && appTitle.isEmpty()) + error = "Please enter a sensible project title!"; + + if (error.isEmpty()) + break; + + aw.setColour (AlertWindow::textColourId, Colours::red); + aw.setMessage (error); + } + } + + projectFile = targetFolder.getChildFile (File::createLegalFileName (appTitle)) + .withFileExtension (Project::projectFileExtension); + + ScopedPointer <Project> project (new Project (projectFile)); + + if (failedFiles.size() == 0) + { + project->setFile (projectFile); + project->setTitle (appTitle); + project->setBundleIdentifierToDefault(); + + if (! initialiseProject (*project)) + return 0; + + if (project->save (false, true) != FileBasedDocument::savedOk) + return 0; + + project->setChangedFlag (false); + } + + if (failedFiles.size() > 0) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, + "Errors in Creating Project!", + "The following files couldn't be written:\n\n" + + failedFiles.joinIntoString ("\n", 0, 10)); + return 0; + } + + return project.release(); +} + +Project* NewProjectWizard::runNewProjectWizard (Component* ownerWindow) +{ + ScopedPointer <NewProjectWizard> wizard; + + { + AlertWindow aw ("New Juce Project", + "Select the type of project to create, and the location of your Juce folder", + AlertWindow::NoIcon, + ownerWindow); + + aw.addComboBox ("type", getWizards(), "Project Type"); + + FilenameComponent juceFolderSelector ("Juce Library Location", StoredSettings::getInstance()->getLastKnownJuceFolder(), + true, true, false, "*", String::empty, "(Please select the folder containing Juce!)"); + juceFolderSelector.setSize (350, 22); + + aw.addCustomComponent (&juceFolderSelector); + + aw.addButton ("Next", 1, KeyPress (KeyPress::returnKey)); + aw.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey)); + + for (;;) + { + if (aw.runModalLoop() == 0) + return 0; + + if (FileHelpers::isJuceFolder (juceFolderSelector.getCurrentFile())) + { + wizard = createWizard (aw.getComboBoxComponent ("type")->getSelectedItemIndex()); + break; + } + + aw.setColour (AlertWindow::textColourId, Colours::red); + aw.setMessage ("Please select a valid Juce folder for the project to use!"); + } + } + + return wizard != 0 ? wizard->runWizard (ownerWindow) : 0; +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.h b/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.h new file mode 100755 index 000000000..1388ea10b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_NewProjectWizard.h @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTWIZARD_JUCEHEADER__ +#define __JUCER_PROJECTWIZARD_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "jucer_Project.h" + + +//============================================================================== +class NewProjectWizard +{ +public: + virtual ~NewProjectWizard(); + + //============================================================================== + static const StringArray getWizards(); + static int getNumWizards(); + static NewProjectWizard* createWizard (int index); + + static Project* runNewProjectWizard (Component* ownerWindow); + + //============================================================================== + virtual const String getName() = 0; + virtual const String getDescription() = 0; + + virtual void addItemsToAlertWindow (AlertWindow& aw) = 0; + virtual const String processResultsFromAlertWindow (AlertWindow& aw) = 0; + virtual bool initialiseProject (Project& project) = 0; + +protected: + String appTitle; + File targetFolder, projectFile; + Component* ownerWindow; + StringArray failedFiles; + + //============================================================================== + NewProjectWizard(); + Project* runWizard (Component* ownerWindow); + + const File getSourceFilesFolder() const { return projectFile.getSiblingFile ("Source"); } +}; + + +#endif // __JUCER_PROJECTWIZARD_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_Project.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_Project.cpp new file mode 100755 index 000000000..b10e18f2e --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_Project.cpp @@ -0,0 +1,1104 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_Project.h" +#include "jucer_ProjectExporter.h" +#include "jucer_ResourceFile.h" +#include "jucer_ProjectSaver.h" +#include "../Application/jucer_OpenDocumentManager.h" + + +//============================================================================== +namespace Tags +{ + const Identifier projectRoot ("JUCERPROJECT"); + const Identifier projectMainGroup ("MAINGROUP"); + const Identifier group ("GROUP"); + const Identifier file ("FILE"); + const Identifier configurations ("CONFIGURATIONS"); + const Identifier configuration ("CONFIGURATION"); + const Identifier exporters ("EXPORTFORMATS"); + const Identifier configGroup ("JUCEOPTIONS"); +} + +const char* Project::projectFileExtension = ".jucer"; + +//============================================================================== +Project::Project (const File& file_) + : FileBasedDocument (projectFileExtension, + String ("*") + projectFileExtension, + "Choose a Jucer project to load", + "Save Jucer project"), + projectRoot (Tags::projectRoot) +{ + setFile (file_); + setMissingDefaultValues(); + + setChangedFlag (false); + + mainProjectIcon.setImage (ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize)); + + projectRoot.addListener (this); +} + +Project::~Project() +{ + projectRoot.removeListener (this); + OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*this, false); +} + +//============================================================================== +void Project::setTitle (const String& newTitle) +{ + projectRoot.setProperty (Ids::name, newTitle, getUndoManagerFor (projectRoot)); + getMainGroup().getName() = newTitle; +} + +const String Project::getDocumentTitle() +{ + return getProjectName().toString(); +} + +void Project::updateProjectSettings() +{ + projectRoot.setProperty (Ids::jucerVersion, ProjectInfo::versionString, 0); + projectRoot.setProperty (Ids::name, getDocumentTitle(), 0); +} + +void Project::setMissingDefaultValues() +{ + if (! projectRoot.hasProperty (Ids::id_)) + projectRoot.setProperty (Ids::id_, createAlphaNumericUID(), 0); + + // Create main file group if missing + if (! projectRoot.getChildWithName (Tags::projectMainGroup).isValid()) + { + Item mainGroup (*this, ValueTree (Tags::projectMainGroup)); + projectRoot.addChild (mainGroup.getNode(), 0, 0); + } + + getMainGroup().initialiseNodeValues(); + + if (getDocumentTitle().isEmpty()) + setTitle ("Juce Project"); + + if (! projectRoot.hasProperty (Ids::projectType)) + getProjectType() = application; + + if (! projectRoot.hasProperty (Ids::version)) + getVersion() = "1.0.0"; + + if (! projectRoot.hasProperty (Ids::juceLinkage)) + getJuceLinkageModeValue() = useAmalgamatedJuceViaMultipleTemplates; + + const String juceFolderPath (getRelativePathForFile (StoredSettings::getInstance()->getLastKnownJuceFolder())); + + // Create configs group + if (! projectRoot.getChildWithName (Tags::configurations).isValid()) + { + projectRoot.addChild (ValueTree (Tags::configurations), 0, 0); + createDefaultConfigs(); + } + + if (! projectRoot.getChildWithName (Tags::exporters).isValid()) + createDefaultExporters(); + + const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (getProjectName().toString(), false, true, false)); + + if (! projectRoot.hasProperty (Ids::buildVST)) + { + shouldBuildVST() = true; + shouldBuildRTAS() = false; + shouldBuildAU() = true; + + getPluginName() = getProjectName().toString(); + getPluginDesc() = getProjectName().toString(); + getPluginManufacturer() = "yourcompany"; + getPluginManufacturerCode() = "Manu"; + getPluginCode() = "Plug"; + getPluginChannelConfigs() = "{1, 1}, {2, 2}"; + getPluginIsSynth() = false; + getPluginWantsMidiInput() = false; + getPluginProducesMidiOut() = false; + getPluginSilenceInProducesSilenceOut() = false; + getPluginTailLengthSeconds() = 0; + getPluginEditorNeedsKeyFocus() = false; + getPluginAUExportPrefix() = sanitisedProjectName + "AU"; + getPluginAUCocoaViewClassName() = sanitisedProjectName + "AU_V1"; + getPluginRTASCategory() = String::empty; + } + + if (! projectRoot.hasProperty (Ids::bundleIdentifier)) + setBundleIdentifierToDefault(); +} + +//============================================================================== +const String Project::loadDocument (const File& file) +{ + ScopedPointer <XmlElement> xml (XmlDocument::parse (file)); + + if (xml == 0 || ! xml->hasTagName (Tags::projectRoot.toString())) + return "Not a valid Jucer project!"; + + ValueTree newTree (ValueTree::fromXml (*xml)); + + if (! newTree.hasType (Tags::projectRoot)) + return "The document contains errors and couldn't be parsed!"; + + StoredSettings::getInstance()->recentFiles.addFile (file); + StoredSettings::getInstance()->flush(); + projectRoot = newTree; + + setMissingDefaultValues(); + + return String::empty; +} + +const String Project::saveDocument (const File& file) +{ + updateProjectSettings(); + + { + // (getting these forces the values to be sanitised) + OwnedArray <Project::JuceConfigFlag> flags; + getJuceConfigFlags (flags); + } + + if (FileHelpers::isJuceFolder (getLocalJuceFolder())) + StoredSettings::getInstance()->setLastKnownJuceFolder (getLocalJuceFolder().getFullPathName()); + + StoredSettings::getInstance()->recentFiles.addFile (file); + + ProjectSaver saver (*this, file); + return saver.save(); +} + +//============================================================================== +File Project::lastDocumentOpened; + +const File Project::getLastDocumentOpened() +{ + return lastDocumentOpened; +} + +void Project::setLastDocumentOpened (const File& file) +{ + lastDocumentOpened = file; +} + +//============================================================================== +void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& property) +{ + if (isLibrary()) + getJuceLinkageModeValue() = notLinkedToJuce; + + changed(); +} + +void Project::valueTreeChildrenChanged (ValueTree& tree) +{ + changed(); +} + +void Project::valueTreeParentChanged (ValueTree& tree) +{ +} + +//============================================================================== +const File Project::resolveFilename (String filename) const +{ + if (filename.isEmpty()) + return File::nonexistent; + + filename = replacePreprocessorDefs (getPreprocessorDefs(), filename); + + if (File::isAbsolutePath (filename)) + return File (filename); + + return getFile().getSiblingFile (filename); +} + +const String Project::getRelativePathForFile (const File& file) const +{ + String filename (file.getFullPathName()); + + File relativePathBase (getFile().getParentDirectory()); + + String p1 (relativePathBase.getFullPathName()); + String p2 (file.getFullPathName()); + + while (p1.startsWithChar (File::separator)) + p1 = p1.substring (1); + + while (p2.startsWithChar (File::separator)) + p2 = p2.substring (1); + + if (p1.upToFirstOccurrenceOf (File::separatorString, true, false) + .equalsIgnoreCase (p2.upToFirstOccurrenceOf (File::separatorString, true, false))) + { + filename = file.getRelativePathFrom (relativePathBase); + } + + return filename; +} + +//============================================================================== +bool Project::shouldBeAddedToBinaryResourcesByDefault (const File& file) +{ + return ! file.hasFileExtension (sourceOrHeaderFileExtensions); +} + +//============================================================================== +const char* const Project::application = "guiapp"; +const char* const Project::commandLineApp = "consoleapp"; +const char* const Project::audioPlugin = "audioplug"; +const char* const Project::library = "library"; +const char* const Project::browserPlugin = "browserplug"; + +bool Project::isLibrary() const { return getProjectType().toString() == library; } +bool Project::isGUIApplication() const { return getProjectType().toString() == application; } +bool Project::isCommandLineApp() const { return getProjectType().toString() == commandLineApp; } +bool Project::isAudioPlugin() const { return getProjectType().toString() == audioPlugin; } +bool Project::isBrowserPlugin() const { return getProjectType().toString() == browserPlugin; } + +const char* const Project::notLinkedToJuce = "none"; +const char* const Project::useLinkedJuce = "static"; +const char* const Project::useAmalgamatedJuce = "amalg_big"; +const char* const Project::useAmalgamatedJuceViaSingleTemplate = "amalg_template"; +const char* const Project::useAmalgamatedJuceViaMultipleTemplates = "amalg_multi"; + +const File Project::getLocalJuceFolder() +{ + ScopedPointer <ProjectExporter> exp (ProjectExporter::createPlatformDefaultExporter (*this)); + + if (exp != 0) + { + File f (resolveFilename (exp->getJuceFolder().toString())); + + if (FileHelpers::isJuceFolder (f)) + return f; + } + + return StoredSettings::getInstance()->getLastKnownJuceFolder(); +} + +//============================================================================== +void Project::createPropertyEditors (Array <PropertyComponent*>& props) +{ + props.add (new TextPropertyComponent (getProjectName(), "Project Name", 256, false)); + props.getLast()->setTooltip ("The name of the project."); + + props.add (new TextPropertyComponent (getVersion(), "Project Version", 16, false)); + props.getLast()->setTooltip ("The project's version number, This should be in the format major.minor.point"); + + const char* projectTypes[] = { "Application (GUI)", "Application (Non-GUI)", "Audio Plug-in", "Static Library", 0 }; + const char* projectTypeValues[] = { application, commandLineApp, audioPlugin, library, 0 }; + props.add (new ChoicePropertyComponent (getProjectType(), "Project Type", StringArray (projectTypes), Array<var> (projectTypeValues))); + + const char* linkageTypes[] = { "Not linked to Juce", "Linked to Juce Static Library", "Include Juce Amalgamated Files", "Include Juce Source Code Directly (In a single file)", "Include Juce Source Code Directly (Split across several files)", 0 }; + const char* linkageTypeValues[] = { notLinkedToJuce, useLinkedJuce, useAmalgamatedJuce, useAmalgamatedJuceViaSingleTemplate, useAmalgamatedJuceViaMultipleTemplates, 0 }; + props.add (new ChoicePropertyComponent (getJuceLinkageModeValue(), "Juce Linkage Method", StringArray (linkageTypes), Array<var> (linkageTypeValues))); + props.getLast()->setTooltip ("The method by which your project will be linked to Juce."); + + props.add (new TextPropertyComponent (getBundleIdentifier(), "Bundle Identifier", 256, false)); + props.getLast()->setTooltip ("A unique identifier for this product, mainly for use in Mac builds. It should be something like 'com.yourcompanyname.yourproductname'"); + + { + OwnedArray<Project::Item> images; + findAllImageItems (images); + + StringArray choices; + Array<var> ids; + + choices.add ("<None>"); + ids.add (var::null); + choices.add (String::empty); + ids.add (var::null); + + for (int i = 0; i < images.size(); ++i) + { + choices.add (images.getUnchecked(i)->getName().toString()); + ids.add (images.getUnchecked(i)->getID()); + } + + props.add (new ChoicePropertyComponent (getSmallIconImageItemID(), "Icon (small)", choices, ids)); + props.getLast()->setTooltip ("Sets an icon to use for the executable."); + + props.add (new ChoicePropertyComponent (getBigIconImageItemID(), "Icon (large)", choices, ids)); + props.getLast()->setTooltip ("Sets an icon to use for the executable."); + } + + props.add (new TextPropertyComponent (getObjectiveCClassSuffix(), "Objective-C Name Suffix", 256, false)); + props.getLast()->setTooltip ("An optional string which will be appended to objective-C class names. If you're building a plugin, it's important to define this, to avoid name clashes between multiple plugin modules that are dynamically loaded into the same address space."); + + if (isAudioPlugin()) + { + props.add (new BooleanPropertyComponent (shouldBuildVST(), "Build VST", "Enabled")); + props.getLast()->setTooltip ("Whether the project should produce a VST plugin."); + props.add (new BooleanPropertyComponent (shouldBuildAU(), "Build AudioUnit", "Enabled")); + props.getLast()->setTooltip ("Whether the project should produce an AudioUnit plugin."); + props.add (new BooleanPropertyComponent (shouldBuildRTAS(), "Build RTAS", "Enabled")); + props.getLast()->setTooltip ("Whether the project should produce an RTAS plugin."); + } + + if (isAudioPlugin()) + { + props.add (new TextPropertyComponent (getPluginName(), "Plugin Name", 128, false)); + props.getLast()->setTooltip ("The name of your plugin (keep it short!)"); + props.add (new TextPropertyComponent (getPluginDesc(), "Plugin Description", 256, false)); + props.getLast()->setTooltip ("A short description of your plugin."); + + props.add (new TextPropertyComponent (getPluginManufacturer(), "Plugin Manufacturer", 256, false)); + props.getLast()->setTooltip ("The name of your company (cannot be blank)."); + props.add (new TextPropertyComponent (getPluginManufacturerCode(), "Plugin Manufacturer Code", 4, false)); + props.getLast()->setTooltip ("A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!"); + props.add (new TextPropertyComponent (getPluginCode(), "Plugin Code", 4, false)); + props.getLast()->setTooltip ("A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!"); + + props.add (new TextPropertyComponent (getPluginChannelConfigs(), "Plugin Channel Configurations", 256, false)); + props.getLast()->setTooltip ("This is the set of input/output channel configurations that your plugin can handle. The list is a comma-separated set of pairs of values in the form { numInputs, numOutputs }, and each " + "pair indicates a valid configuration that the plugin can handle. So for example, {1, 1}, {2, 2} means that the plugin can be used in just two configurations: either with 1 input " + "and 1 output, or with 2 inputs and 2 outputs."); + + props.add (new BooleanPropertyComponent (getPluginIsSynth(), "Plugin is a Synth", "Is a Synth")); + props.getLast()->setTooltip ("Enable this if you want your plugin to be treated as a synth or generator. It doesn't make much difference to the plugin itself, but some hosts treat synths differently to other plugins."); + + props.add (new BooleanPropertyComponent (getPluginWantsMidiInput(), "Plugin Midi Input", "Plugin wants midi input")); + props.getLast()->setTooltip ("Enable this if you want your plugin to accept midi messages."); + + props.add (new BooleanPropertyComponent (getPluginProducesMidiOut(), "Plugin Midi Output", "Plugin produces midi output")); + props.getLast()->setTooltip ("Enable this if your plugin is going to produce midi messages."); + + props.add (new BooleanPropertyComponent (getPluginSilenceInProducesSilenceOut(), "Silence", "Silence in produces silence out")); + props.getLast()->setTooltip ("Enable this if your plugin has no tail - i.e. if passing a silent buffer to it will always result in a silent buffer being produced."); + + props.add (new TextPropertyComponent (getPluginTailLengthSeconds(), "Tail Length (in seconds)", 12, false)); + props.getLast()->setTooltip ("This indicates the length, in seconds, of the plugin's tail. This information may or may not be used by the host."); + + props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus(), "Key Focus", "Plugin editor requires keyboard focus")); + props.getLast()->setTooltip ("Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus.."); + + props.add (new TextPropertyComponent (getPluginAUExportPrefix(), "Plugin AU Export Prefix", 64, false)); + props.getLast()->setTooltip ("A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token."); + + props.add (new TextPropertyComponent (getPluginAUCocoaViewClassName(), "Plugin AU Cocoa View Name", 64, false)); + props.getLast()->setTooltip ("In an AU, this is the name of Cocoa class that creates the UI. Some hosts bizarrely display the class-name, so you might want to make it reflect your plugin. But the name must be " + "UNIQUE to this exact version of your plugin, to avoid objective-C linkage mix-ups that happen when different plugins containing the same class-name are loaded simultaneously."); + + props.add (new TextPropertyComponent (getPluginRTASCategory(), "Plugin RTAS Category", 64, false)); + props.getLast()->setTooltip ("(Leave this blank if your plugin is a synth). This is one of the RTAS categories from FicPluginEnums.h, such as: ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, " + "ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, " + "ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, " + "ePlugInCategory_Dither, ePlugInCategory_SoundField"); + } + + props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "Preprocessor definitions", 32768, false)); + props.getLast()->setTooltip ("Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); + + for (int i = props.size(); --i >= 0;) + props.getUnchecked(i)->setPreferredHeight (22); +} + +const Image Project::getBigIcon() +{ + Item icon (getMainGroup().findItemWithID (getBigIconImageItemID().toString())); + + if (icon.isValid()) + return ImageCache::getFromFile (icon.getFile()); + + return Image(); +} + +const Image Project::getSmallIcon() +{ + Item icon (getMainGroup().findItemWithID (getSmallIconImageItemID().toString())); + + if (icon.isValid()) + return ImageCache::getFromFile (icon.getFile()); + + return Image(); +} + +const StringPairArray Project::getPreprocessorDefs() const +{ + return parsePreprocessorDefs (getProjectPreprocessorDefs().toString()); +} + +//============================================================================== +Project::Item Project::getMainGroup() +{ + return Item (*this, projectRoot.getChildWithName (Tags::projectMainGroup)); +} + +Project::Item Project::createNewGroup() +{ + Item item (*this, ValueTree (Tags::group)); + item.initialiseNodeValues(); + item.getName() = "New Group"; + return item; +} + +Project::Item Project::createNewItem (const File& file) +{ + Item item (*this, ValueTree (Tags::file)); + item.initialiseNodeValues(); + item.getName() = file.getFileName(); + item.getShouldCompileValue() = file.hasFileExtension ("cpp;mm;c;m;cc;cxx"); + item.getShouldAddToResourceValue() = shouldBeAddedToBinaryResourcesByDefault (file); + return item; +} + +static void findImages (const Project::Item& item, OwnedArray<Project::Item>& found) +{ + if (item.isImageFile()) + { + found.add (new Project::Item (item)); + } + else if (item.isGroup()) + { + for (int i = 0; i < item.getNumChildren(); ++i) + findImages (item.getChild (i), found); + } +} + +void Project::findAllImageItems (OwnedArray<Project::Item>& items) +{ + findImages (getMainGroup(), items); +} + +//============================================================================== +Project::Item::Item (Project& project_, const ValueTree& node_) + : project (project_), node (node_) +{ +} + +Project::Item::Item (const Item& other) + : project (other.project), node (other.node) +{ +} + +Project::Item::~Item() +{ +} + +const String Project::Item::getID() const { return node [Ids::id_]; } +const String Project::Item::getImageFileID() const { return "id:" + getID(); } + +bool Project::Item::isFile() const { return node.hasType (Tags::file); } +bool Project::Item::isGroup() const { return node.hasType (Tags::group) || isMainGroup(); } +bool Project::Item::isMainGroup() const { return node.hasType (Tags::projectMainGroup); } +bool Project::Item::isImageFile() const { return isFile() && getFile().hasFileExtension ("png;jpg;jpeg;gif;drawable"); } + +Project::Item Project::Item::findItemWithID (const String& targetId) const +{ + if (node [Ids::id_] == targetId) + return *this; + + if (isGroup()) + { + for (int i = getNumChildren(); --i >= 0;) + { + Item found (getChild(i).findItemWithID (targetId)); + if (found.isValid()) + return found; + } + } + + return Item (project, ValueTree::invalid); +} + +bool Project::Item::canContain (const Item& child) const +{ + if (isFile()) + return false; + + if (isGroup()) + return child.isFile() || child.isGroup(); + + jassertfalse + return false; +} + +bool Project::Item::shouldBeAddedToTargetProject() const +{ + return isFile(); +} + +bool Project::Item::shouldBeCompiled() const +{ + return getShouldCompileValue().getValue(); +} + +Value Project::Item::getShouldCompileValue() const +{ + return node.getPropertyAsValue (Ids::compile, getUndoManager()); +} + +bool Project::Item::shouldBeAddedToBinaryResources() const +{ + return getShouldAddToResourceValue().getValue(); +} + +Value Project::Item::getShouldAddToResourceValue() const +{ + return node.getPropertyAsValue (Ids::resource, getUndoManager()); +} + +const File Project::Item::getFile() const +{ + if (isFile()) + return project.resolveFilename (node [Ids::file].toString()); + else + return File::nonexistent; +} + +void Project::Item::setFile (const File& file) +{ + jassert (isFile()); + node.setProperty (Ids::file, project.getRelativePathForFile (file), getUndoManager()); + node.setProperty (Ids::name, file.getFileName(), getUndoManager()); + + jassert (getFile() == file); +} + +bool Project::Item::renameFile (const File& newFile) +{ + const File oldFile (getFile()); + + if (oldFile.moveFileTo (newFile)) + { + setFile (newFile); + OpenDocumentManager::getInstance()->fileHasBeenRenamed (oldFile, newFile); + return true; + } + + return false; +} + +Project::Item Project::Item::findItemForFile (const File& file) const +{ + if (getFile() == file) + return *this; + + if (isGroup()) + { + for (int i = getNumChildren(); --i >= 0;) + { + Item found (getChild(i).findItemForFile (file)); + + if (found.isValid()) + return found; + } + } + + return Item (project, ValueTree::invalid); +} + +const File Project::Item::determineGroupFolder() const +{ + jassert (isGroup()); + File f; + + for (int i = 0; i < getNumChildren(); ++i) + { + f = getChild(i).getFile(); + + if (f.exists()) + return f.getParentDirectory(); + } + + Item parent (getParent()); + if (parent != *this) + { + f = parent.determineGroupFolder(); + + if (f.getChildFile (getName().toString()).isDirectory()) + f = f.getChildFile (getName().toString()); + } + else + { + f = project.getFile().getParentDirectory(); + + if (f.getChildFile ("Source").isDirectory()) + f = f.getChildFile ("Source"); + } + + return f; +} + +void Project::Item::initialiseNodeValues() +{ + if (! node.hasProperty (Ids::id_)) + node.setProperty (Ids::id_, createAlphaNumericUID(), 0); + + if (isFile()) + { + node.setProperty (Ids::name, getFile().getFileName(), 0); + } + else if (isGroup()) + { + for (int i = getNumChildren(); --i >= 0;) + getChild(i).initialiseNodeValues(); + } +} + +Value Project::Item::getName() const +{ + return node.getPropertyAsValue (Ids::name, getUndoManager()); +} + +void Project::Item::addChild (const Item& newChild, int insertIndex) +{ + node.addChild (newChild.getNode(), insertIndex, getUndoManager()); +} + +void Project::Item::removeItemFromProject() +{ + node.getParent().removeChild (node, getUndoManager()); +} + +Project::Item Project::Item::getParent() const +{ + if (isMainGroup() || ! isGroup()) + return *this; + + return Item (project, node.getParent()); +} + +struct ItemSorter +{ + static int compareElements (const ValueTree& first, const ValueTree& second) + { + return first [Ids::name].toString().compareIgnoreCase (second [Ids::name].toString()); + } +}; + +void Project::Item::sortAlphabetically() +{ + ItemSorter sorter; + node.sort (sorter, getUndoManager(), true); +} + +bool Project::Item::addFile (const File& file, int insertIndex) +{ + if (file == File::nonexistent || file.isHidden() || file.getFileName().startsWithChar ('.')) + return false; + + if (file.isDirectory()) + { + Item group (project.createNewGroup()); + group.getName() = file.getFileNameWithoutExtension(); + + jassert (canContain (group)); + + addChild (group, insertIndex); + //group.setFile (file); + + DirectoryIterator iter (file, false, "*", File::findFilesAndDirectories); + while (iter.next()) + { + if (! project.getMainGroup().findItemForFile (iter.getFile()).isValid()) + group.addFile (iter.getFile(), -1); + } + + group.sortAlphabetically(); + } + else if (file.existsAsFile()) + { + if (! project.getMainGroup().findItemForFile (file).isValid()) + { + Item item (project.createNewItem (file)); + + if (canContain (item)) + { + item.setFile (file); + addChild (item, insertIndex); + } + } + } + else + { + jassertfalse; + } + + return true; +} + +const Drawable* Project::Item::getIcon() const +{ + if (isFile()) + { + if (isImageFile()) + return StoredSettings::getInstance()->getImageFileIcon(); + + return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); + } + else if (isMainGroup()) + { + return &(getProject().mainProjectIcon); + } + + return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); +} + +//============================================================================== +ValueTree Project::getJuceConfigNode() +{ + ValueTree configNode = projectRoot.getChildWithName (Tags::configGroup); + + if (! configNode.isValid()) + { + configNode = ValueTree (Tags::configGroup); + projectRoot.addChild (configNode, -1, 0); + } + + return configNode; +} + +void Project::getJuceConfigFlags (OwnedArray <JuceConfigFlag>& flags) +{ + ValueTree configNode (getJuceConfigNode()); + + File juceConfigH (getLocalJuceFolder().getChildFile ("juce_Config.h")); + StringArray lines; + lines.addLines (juceConfigH.loadFileAsString()); + + for (int i = 0; i < lines.size(); ++i) + { + String line (lines[i].trim()); + + if (line.startsWith ("/** ") && line.containsChar (':')) + { + ScopedPointer <JuceConfigFlag> config (new JuceConfigFlag()); + config->symbol = line.substring (4).upToFirstOccurrenceOf (":", false, false).trim(); + + if (config->symbol.length() > 4) + { + config->description = line.fromFirstOccurrenceOf (":", false, false).trimStart(); + ++i; + while (! (lines[i].contains ("*/") || lines[i].contains ("@see"))) + { + if (lines[i].trim().isNotEmpty()) + config->description = config->description.trim() + " " + lines[i].trim(); + + ++i; + } + + config->description = config->description.upToFirstOccurrenceOf ("*/", false, false); + config->value.referTo (getJuceConfigFlag (config->symbol)); + flags.add (config.release()); + } + } + } +} + +const char* const Project::configFlagDefault = "default"; +const char* const Project::configFlagEnabled = "enabled"; +const char* const Project::configFlagDisabled = "disabled"; + +Value Project::getJuceConfigFlag (const String& name) +{ + const ValueTree configNode (getJuceConfigNode()); + Value v (configNode.getPropertyAsValue (name, getUndoManagerFor (configNode))); + + if (v.getValue().toString().isEmpty()) + v = configFlagDefault; + + return v; +} + +//============================================================================== +ValueTree Project::getConfigurations() const +{ + return projectRoot.getChildWithName (Tags::configurations); +} + +int Project::getNumConfigurations() const +{ + return getConfigurations().getNumChildren(); +} + +Project::BuildConfiguration Project::getConfiguration (int index) +{ + jassert (index < getConfigurations().getNumChildren()); + return BuildConfiguration (this, getConfigurations().getChild (index)); +} + +bool Project::hasConfigurationNamed (const String& name) const +{ + const ValueTree configs (getConfigurations()); + for (int i = configs.getNumChildren(); --i >= 0;) + if (configs.getChild(i) [Ids::name].toString() == name) + return true; + + return false; +} + +const String Project::getUniqueConfigName (String name) const +{ + String nameRoot (name); + while (CharacterFunctions::isDigit (nameRoot.getLastCharacter())) + nameRoot = nameRoot.dropLastCharacters (1); + + nameRoot = nameRoot.trim(); + + int suffix = 2; + while (hasConfigurationNamed (name)) + name = nameRoot + " " + String (suffix++); + + return name; +} + +void Project::addNewConfiguration (BuildConfiguration* configToCopy) +{ + const String configName (getUniqueConfigName (configToCopy != 0 ? configToCopy->config [Ids::name].toString() + : "New Build Configuration")); + + ValueTree configs (getConfigurations()); + + if (! configs.isValid()) + { + projectRoot.addChild (ValueTree (Tags::configurations), 0, getUndoManagerFor (projectRoot)); + configs = getConfigurations(); + } + + ValueTree newConfig (Tags::configuration); + if (configToCopy != 0) + newConfig = configToCopy->config.createCopy(); + + newConfig.setProperty (Ids::name, configName, 0); + + configs.addChild (newConfig, -1, getUndoManagerFor (configs)); +} + +void Project::deleteConfiguration (int index) +{ + ValueTree configs (getConfigurations()); + configs.removeChild (index, getUndoManagerFor (getConfigurations())); +} + +void Project::createDefaultConfigs() +{ + for (int i = 0; i < 2; ++i) + { + addNewConfiguration (0); + BuildConfiguration config = getConfiguration (i); + + const bool debugConfig = i == 0; + + config.getName() = debugConfig ? "Debug" : "Release"; + config.isDebug() = debugConfig; + config.getOptimisationLevel() = debugConfig ? 1 : 2; + config.getTargetBinaryName() = getProjectFilenameRoot(); + } +} + +//============================================================================== +Project::BuildConfiguration::BuildConfiguration (Project* project_, const ValueTree& configNode) + : project (project_), + config (configNode) +{ +} + +Project::BuildConfiguration::BuildConfiguration (const BuildConfiguration& other) + : project (other.project), + config (other.config) +{ +} + +const Project::BuildConfiguration& Project::BuildConfiguration::operator= (const BuildConfiguration& other) +{ + project = other.project; + config = other.config; + return *this; +} + +Project::BuildConfiguration::~BuildConfiguration() +{ +} + +const String Project::BuildConfiguration::getGCCOptimisationFlag() const +{ + const int level = (int) getOptimisationLevel().getValue(); + return String (level <= 1 ? "0" : (level == 2 ? "s" : "3")); +} + +const char* const Project::BuildConfiguration::osxVersionDefault = "default"; +const char* const Project::BuildConfiguration::osxVersion10_4 = "10.4 SDK"; +const char* const Project::BuildConfiguration::osxVersion10_5 = "10.5 SDK"; +const char* const Project::BuildConfiguration::osxVersion10_6 = "10.6 SDK"; + +void Project::BuildConfiguration::createPropertyEditors (Array <PropertyComponent*>& props) +{ + props.add (new TextPropertyComponent (getName(), "Name", 96, false)); + props.getLast()->setTooltip ("The name of this configuration."); + + props.add (new BooleanPropertyComponent (isDebug(), "Debug mode", "Debugging enabled")); + props.getLast()->setTooltip ("If enabled, this means that the configuration should be built with debug synbols."); + + const char* optimisationLevels[] = { "No optimisation", "Optimise for size and speed", "Optimise for maximum speed", 0 }; + const int optimisationLevelValues[] = { 1, 2, 3, 0 }; + props.add (new ChoicePropertyComponent (getOptimisationLevel(), "Optimisation", StringArray (optimisationLevels), Array<var> (optimisationLevelValues))); + props.getLast()->setTooltip ("The optimisation level for this configuration"); + + props.add (new TextPropertyComponent (getTargetBinaryName(), "Binary name", 256, false)); + props.getLast()->setTooltip ("The filename to use for the destination binary executable file. Don't add a suffix to this, because platform-specific suffixes will be added for each target platform."); + + props.add (new TextPropertyComponent (getTargetBinaryRelativePath(), "Binary location", 1024, false)); + props.getLast()->setTooltip ("The folder in which the finished binary should be placed. Leave this blank to cause the binary to be placed in its default location in the build folder."); + + props.add (new TextPropertyComponent (getHeaderSearchPath(), "Header search path", 16384, false)); + props.getLast()->setTooltip ("Extra header search paths. Use semi-colons to separate multiple paths."); + + props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, false)); + props.getLast()->setTooltip ("Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); + + if (getMacSDKVersion().toString().isEmpty()) + getMacSDKVersion() = osxVersionDefault; + + const char* osxVersions[] = { "Use Default", osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; + const char* osxVersionValues[] = { osxVersionDefault, osxVersion10_4, osxVersion10_5, osxVersion10_6, 0 }; + + props.add (new ChoicePropertyComponent (getMacSDKVersion(), "OSX Base SDK Version", StringArray (osxVersions), Array<var> (osxVersionValues))); + props.getLast()->setTooltip ("The version of OSX to link against in the XCode build."); + + if (getMacCompatibilityVersion().toString().isEmpty()) + getMacCompatibilityVersion() = osxVersionDefault; + + props.add (new ChoicePropertyComponent (getMacCompatibilityVersion(), "OSX Compatibility Version", StringArray (osxVersions), Array<var> (osxVersionValues))); + props.getLast()->setTooltip ("The minimum version of OSX that the target binary will be compatible with."); + + for (int i = props.size(); --i >= 0;) + props.getUnchecked(i)->setPreferredHeight (22); +} + +const StringPairArray Project::BuildConfiguration::getAllPreprocessorDefs() const +{ + return mergePreprocessorDefs (project->getPreprocessorDefs(), + parsePreprocessorDefs (getBuildConfigPreprocessorDefs().toString())); +} + +const StringArray Project::BuildConfiguration::getHeaderSearchPaths() const +{ + StringArray s; + s.addTokens (getHeaderSearchPath().toString(), ";", String::empty); + return s; +} + +//============================================================================== +ValueTree Project::getExporters() +{ + ValueTree exporters (projectRoot.getChildWithName (Tags::exporters)); + + if (! exporters.isValid()) + { + projectRoot.addChild (ValueTree (Tags::exporters), 0, getUndoManagerFor (projectRoot)); + exporters = getExporters(); + } + + return exporters; +} + +int Project::getNumExporters() +{ + return getExporters().getNumChildren(); +} + +ProjectExporter* Project::createExporter (int index) +{ + jassert (index >= 0 && index < getNumExporters()); + return ProjectExporter::createExporter (*this, getExporters().getChild (index)); +} + +void Project::addNewExporter (int exporterIndex) +{ + ScopedPointer<ProjectExporter> exp (ProjectExporter::createNewExporter (*this, exporterIndex)); + + ValueTree exporters (getExporters()); + exporters.addChild (exp->getSettings(), -1, getUndoManagerFor (exporters)); +} + +void Project::deleteExporter (int index) +{ + ValueTree exporters (getExporters()); + exporters.removeChild (index, getUndoManagerFor (exporters)); +} + +void Project::createDefaultExporters() +{ + ValueTree exporters (getExporters()); + exporters.removeAllChildren (getUndoManagerFor (exporters)); + + for (int i = 0; i < ProjectExporter::getNumExporters(); ++i) + addNewExporter (i); +} + +//============================================================================== +const String Project::getFileTemplate (const String& templateName) +{ + int dataSize; + const char* data = BinaryData::getNamedResource (templateName.toUTF8(), dataSize); + + if (data == 0) + { + jassertfalse; + return String::empty; + } + + return String::fromUTF8 (data, dataSize); +} + +//============================================================================== +void Project::resaveJucerFile (const File& file) +{ + if (! file.exists()) + { + std::cout << "The file " << file.getFullPathName() << " doesn't exist!" << std::endl; + return; + } + + if (! file.hasFileExtension (Project::projectFileExtension)) + { + std::cout << file.getFullPathName() << " isn't a valid jucer project file!" << std::endl; + return; + } + + Project newDoc (file); + + if (! newDoc.loadFrom (file, true)) + { + std::cout << "Failed to load the project file: " << file.getFullPathName() << std::endl; + return; + } + + std::cout << "The Jucer - Re-saving file: " << file.getFullPathName() << std::endl; + String error (newDoc.saveDocument (file)); + + if (error.isNotEmpty()) + { + std::cout << "Error when writing project: " << error << std::endl; + return; + } +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_Project.h b/JuceLibraryCode/jucer/Source/Project/jucer_Project.h new file mode 100755 index 000000000..44f73f3aa --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_Project.h @@ -0,0 +1,331 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECT_JUCEHEADER__ +#define __JUCER_PROJECT_JUCEHEADER__ + +#include "../jucer_Headers.h" +class ProjectExporter; + +//============================================================================== +class Project : public FileBasedDocument, + public ValueTree::Listener +{ +public: + //============================================================================== + Project (const File& file); + ~Project(); + + //============================================================================== + // FileBasedDocument stuff.. + const String getDocumentTitle(); + const String loadDocument (const File& file); + const String saveDocument (const File& file); + const File getLastDocumentOpened(); + void setLastDocumentOpened (const File& file); + + void setTitle (const String& newTitle); + + //============================================================================== + ValueTree getProjectRoot() const { return projectRoot; } + Value getProjectName() { return getMainGroup().getName(); } + const String getProjectFilenameRoot() { return File::createLegalFileName (getDocumentTitle()); } + const String getProjectUID() const { return projectRoot [Ids::id_]; } + + //============================================================================== + bool shouldBeAddedToBinaryResourcesByDefault (const File& file); + const File resolveFilename (String filename) const; + const String getRelativePathForFile (const File& file) const; + + //============================================================================== + // Creates editors for the project settings + void createPropertyEditors (Array <PropertyComponent*>& properties); + + //============================================================================== + // project types + static const char* const application; + static const char* const commandLineApp; + static const char* const audioPlugin; + static const char* const library; + static const char* const browserPlugin; + + Value getProjectType() const { return getProjectValue ("projectType"); } + + bool isLibrary() const; + bool isGUIApplication() const; + bool isCommandLineApp() const; + bool isAudioPlugin() const; + bool isBrowserPlugin() const; + + Value getVersion() const { return getProjectValue ("version"); } + Value getBundleIdentifier() const { return getProjectValue ("bundleIdentifier"); } + void setBundleIdentifierToDefault() { getBundleIdentifier() = "com.yourcompany." + CodeHelpers::makeValidIdentifier (getProjectName().toString(), false, true, false); } + + //============================================================================== + // linkage modes.. + static const char* const notLinkedToJuce; + static const char* const useLinkedJuce; + static const char* const useAmalgamatedJuce; + static const char* const useAmalgamatedJuceViaSingleTemplate; + static const char* const useAmalgamatedJuceViaMultipleTemplates; + + Value getJuceLinkageModeValue() const { return getProjectValue ("juceLinkage"); } + const String getJuceLinkageMode() const { return getJuceLinkageModeValue().toString(); } + + bool isUsingWrapperFiles() const { return isUsingFullyAmalgamatedFile() || isUsingSingleTemplateFile() || isUsingMultipleTemplateFiles(); } + bool isUsingFullyAmalgamatedFile() const { return getJuceLinkageMode() == useAmalgamatedJuce; } + bool isUsingSingleTemplateFile() const { return getJuceLinkageMode() == useAmalgamatedJuceViaSingleTemplate; } + bool isUsingMultipleTemplateFiles() const { return getJuceLinkageMode() == useAmalgamatedJuceViaMultipleTemplates; } + + //============================================================================== + Value getProjectValue (const Identifier& name) const { return projectRoot.getPropertyAsValue (name, getUndoManagerFor (projectRoot)); } + + Value getProjectPreprocessorDefs() const { return getProjectValue (Ids::defines); } + const StringPairArray getPreprocessorDefs() const; + + Value getBigIconImageItemID() const { return getProjectValue ("bigIcon"); } + Value getSmallIconImageItemID() const { return getProjectValue ("smallIcon"); } + const Image getBigIcon(); + const Image getSmallIcon(); + + Value getObjectiveCClassSuffix() const { return getProjectValue ("objCSuffix"); } + + Value shouldBuildVST() const { return getProjectValue ("buildVST"); } + Value shouldBuildRTAS() const { return getProjectValue ("buildRTAS"); } + Value shouldBuildAU() const { return getProjectValue ("buildAU"); } + bool shouldAddVSTFolderToPath() { return (isAudioPlugin() && (bool) shouldBuildVST().getValue()) || getJuceConfigFlag ("JUCE_PLUGINHOST_VST").toString() == configFlagEnabled; } + + Value getPluginName() const { return getProjectValue ("pluginName"); } + Value getPluginDesc() const { return getProjectValue ("pluginDesc"); } + Value getPluginManufacturer() const { return getProjectValue ("pluginManufacturer"); } + Value getPluginManufacturerCode() const { return getProjectValue ("pluginManufacturerCode"); } + Value getPluginCode() const { return getProjectValue ("pluginCode"); } + Value getPluginChannelConfigs() const { return getProjectValue ("pluginChannelConfigs"); } + Value getPluginIsSynth() const { return getProjectValue ("pluginIsSynth"); } + Value getPluginWantsMidiInput() const { return getProjectValue ("pluginWantsMidiIn"); } + Value getPluginProducesMidiOut() const { return getProjectValue ("pluginProducesMidiOut"); } + Value getPluginSilenceInProducesSilenceOut() const { return getProjectValue ("pluginSilenceInIsSilenceOut"); } + Value getPluginTailLengthSeconds() const { return getProjectValue ("pluginTailLength"); } + Value getPluginEditorNeedsKeyFocus() const { return getProjectValue ("pluginEditorRequiresKeys"); } + Value getPluginAUExportPrefix() const { return getProjectValue ("pluginAUExportPrefix"); } + Value getPluginAUCocoaViewClassName() const { return getProjectValue ("pluginAUViewClass"); } + Value getPluginRTASCategory() const { return getProjectValue ("pluginRTASCategory"); } + + //============================================================================== + const File getAppIncludeFile() const { return getWrapperFolder().getChildFile (getJuceSourceHFilename()); } + const File getWrapperFolder() const { return getFile().getSiblingFile ("JuceLibraryCode"); } + const File getPluginCharacteristicsFile() const { return getWrapperFolder().getChildFile (getPluginCharacteristicsFilename()); } + + //============================================================================== + const String getAmalgamatedHeaderFileName() const { return "juce_amalgamated.h"; } + const String getAmalgamatedMMFileName() const { return "juce_amalgamated.mm"; } + const String getAmalgamatedCppFileName() const { return "juce_amalgamated.cpp"; } + + const String getAppConfigFilename() const { return "AppConfig.h"; } + const String getJuceSourceFilenameRoot() const { return "JuceLibraryCode"; } + int getNumSeparateAmalgamatedFiles() const { return 4; } + const String getJuceSourceHFilename() const { return "JuceHeader.h"; } + const String getJuceCodeGroupName() const { return "Juce Library Code"; } + const String getPluginCharacteristicsFilename() const { return "JucePluginCharacteristics.h"; } + + //============================================================================== + class Item + { + public: + //============================================================================== + Item (Project& project, const ValueTree& itemNode); + Item (const Item& other); + ~Item(); + + void initialiseNodeValues(); + + //============================================================================== + bool isValid() const { return node.isValid(); } + const ValueTree& getNode() const throw() { return node; } + ValueTree& getNode() throw() { return node; } + Project& getProject() const throw() { return project; } + bool operator== (const Item& other) const { return node == other.node && &project == &other.project; } + bool operator!= (const Item& other) const { return ! operator== (other); } + + //============================================================================== + bool isFile() const; + bool isGroup() const; + bool isMainGroup() const; + bool isImageFile() const; + + const String getID() const; + Item findItemWithID (const String& targetId) const; // (recursive search) + const String getImageFileID() const; + + //============================================================================== + Value getName() const; + const File getFile() const; + void setFile (const File& file); + const File determineGroupFolder() const; + bool renameFile (const File& newFile); + + bool shouldBeAddedToTargetProject() const; + bool shouldBeCompiled() const; + Value getShouldCompileValue() const; + bool shouldBeAddedToBinaryResources() const; + Value getShouldAddToResourceValue() const; + + //============================================================================== + bool canContain (const Item& child) const; + int getNumChildren() const { return node.getNumChildren(); } + Item getChild (int index) const { return Item (project, node.getChild (index)); } + void addChild (const Item& newChild, int insertIndex); + bool addFile (const File& file, int insertIndex); + void removeItemFromProject(); + void sortAlphabetically(); + Item findItemForFile (const File& file) const; + + Item getParent() const; + + const Drawable* getIcon() const; + + private: + //============================================================================== + Project& project; + ValueTree node; + + UndoManager* getUndoManager() const { return project.getUndoManagerFor (node); } + Item& operator= (const Item&); + }; + + Item getMainGroup(); + Item createNewGroup(); + Item createNewItem (const File& file); + + void findAllImageItems (OwnedArray<Item>& items); + + //============================================================================== + class BuildConfiguration + { + public: + BuildConfiguration (const BuildConfiguration&); + const BuildConfiguration& operator= (const BuildConfiguration&); + ~BuildConfiguration(); + + //============================================================================== + Project& getProject() const { return *project; } + + void createPropertyEditors (Array <PropertyComponent*>& properties); + + //============================================================================== + Value getName() const { return getValue (Ids::name); } + Value isDebug() const { return getValue (Ids::isDebug); } + Value getTargetBinaryName() const { return getValue (Ids::targetName); } + // the path relative to the build folder in which the binary should go + Value getTargetBinaryRelativePath() const { return getValue (Ids::binaryPath); } + Value getOptimisationLevel() const { return getValue (Ids::optimisation); } + const String getGCCOptimisationFlag() const; + Value getBuildConfigPreprocessorDefs() const { return getValue (Ids::defines); } + const StringPairArray getAllPreprocessorDefs() const; // includes inherited definitions + Value getHeaderSearchPath() const { return getValue (Ids::headerPath); } + const StringArray getHeaderSearchPaths() const; + + static const char* const osxVersionDefault; + static const char* const osxVersion10_4; + static const char* const osxVersion10_5; + static const char* const osxVersion10_6; + Value getMacSDKVersion() const { return getValue (Ids::osxSDK); } + Value getMacCompatibilityVersion() const { return getValue (Ids::osxCompatibility); } + + //============================================================================== + private: + friend class Project; + Project* project; + ValueTree config; + + Value getValue (const Identifier& name) const { return config.getPropertyAsValue (name, getUndoManager()); } + UndoManager* getUndoManager() const { return project->getUndoManagerFor (config); } + + BuildConfiguration (Project* project, const ValueTree& configNode); + }; + + int getNumConfigurations() const; + BuildConfiguration getConfiguration (int index); + void addNewConfiguration (BuildConfiguration* configToCopy); + void deleteConfiguration (int index); + bool hasConfigurationNamed (const String& name) const; + const String getUniqueConfigName (String name) const; + + //============================================================================== + ValueTree getExporters(); + int getNumExporters(); + ProjectExporter* createExporter (int index); + void addNewExporter (int exporterIndex); + void deleteExporter (int index); + void createDefaultExporters(); + + //============================================================================== + struct JuceConfigFlag + { + String symbol, description; + Value value; // 1 = true, 2 = false, anything else = use default + }; + + void getJuceConfigFlags (OwnedArray <JuceConfigFlag>& flags); + + static const char* const configFlagDefault; + static const char* const configFlagEnabled; + static const char* const configFlagDisabled; + Value getJuceConfigFlag (const String& name); + + //============================================================================== + const String getFileTemplate (const String& templateName); + + //============================================================================== + void valueTreePropertyChanged (ValueTree& tree, const Identifier& property); + void valueTreeChildrenChanged (ValueTree& tree); + void valueTreeParentChanged (ValueTree& tree); + + //============================================================================== + UndoManager* getUndoManagerFor (const ValueTree& node) const { return 0; } + + //============================================================================== + static const char* projectFileExtension; + + static void resaveJucerFile (const File& file); + +private: + friend class Item; + ValueTree projectRoot; + static File lastDocumentOpened; + DrawableImage mainProjectIcon; + + const File getLocalJuceFolder(); + void updateProjectSettings(); + void setMissingDefaultValues(); + ValueTree getConfigurations() const; + void createDefaultConfigs(); + ValueTree getJuceConfigNode(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Project); +}; + + +#endif // __JUCER_PROJECT_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.cpp new file mode 100755 index 000000000..2bdab6cf7 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -0,0 +1,344 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_ProjectContentComponent.h" +#include "../Application/jucer_MainWindow.h" +#include "../Code Editor/jucer_SourceCodeEditor.h" +#include "jucer_ProjectInformationComponent.h" +#include "jucer_TreeViewTypes.h" +#include "jucer_ProjectExporter.h" + + +//============================================================================== +ProjectContentComponent::ProjectContentComponent() + : projectTree (0), project (0), + currentDocument (0), resizerBar (0) +{ + setItemLayout (0, 100, 500, 300); + setItemLayout (1, 4, 4, 4); + setItemLayout (2, 100, 10000, 800); + + setOpaque (true); + setWantsKeyboardFocus (true); +} + +ProjectContentComponent::~ProjectContentComponent() +{ + setProject (0); + contentView = 0; + jassert (getNumChildComponents() == 0); +} + +void ProjectContentComponent::paint (Graphics& g) +{ + g.fillAll (Colour::greyLevel (0.8f)); +} + +void ProjectContentComponent::hasBeenMoved() +{ + resized(); +} + +void ProjectContentComponent::resized() +{ + Component* comps[] = { projectTree, resizerBar, contentView }; + layOutComponents (comps, 3, 0, 0, getWidth(), getHeight(), false, true); +} + +void ProjectContentComponent::setProject (Project* newProject) +{ + if (project != newProject) + { + if (project != 0) + project->removeChangeListener (this); + + if (projectTree != 0) + projectTree->deleteRootItem(); + + projectTree = 0; + contentView = 0; + resizerBar = 0; + + project = newProject; + + if (project != 0) + { + addAndMakeVisible (projectTree = new TreeView()); + projectTree->setRootItemVisible (true); + projectTree->setMultiSelectEnabled (true); + projectTree->setDefaultOpenness (true); + projectTree->setColour (TreeView::backgroundColourId, Colour::greyLevel (0.93f)); + projectTree->setIndentSize (14); + + addAndMakeVisible (resizerBar = new StretchableLayoutResizerBar (this, 1, true)); + + resized(); + + projectTree->setRootItem (new GroupTreeViewItem (project->getMainGroup())); + projectTree->getRootItem()->setOpen (true); + + project->addChangeListener (this); + + if (currentDocument == 0) + invokeDirectly (CommandIDs::showProjectSettings, true); + + updateMissingFileStatuses(); + } + } +} + +void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster*) +{ + updateMissingFileStatuses(); +} + +void ProjectContentComponent::updateMissingFileStatuses() +{ + if (projectTree != 0) + { + ProjectTreeViewBase* p = dynamic_cast <ProjectTreeViewBase*> (projectTree->getRootItem()); + if (p != 0) + p->checkFileStatus(); + } +} + +bool ProjectContentComponent::showEditorForFile (const File& f) +{ + return showDocument (OpenDocumentManager::getInstance() + ->getDocumentForFile (project, f)); +} + +bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc) +{ + if (doc == 0) + return false; + + OpenDocumentManager::getInstance()->moveDocumentToTopOfStack (doc); + + if (doc->hasFileBeenModifiedExternally()) + doc->reloadFromFile(); + + return setEditorComponent (doc->createEditor(), doc); +} + +void ProjectContentComponent::hideDocument (OpenDocumentManager::Document* doc) +{ + if (doc == currentDocument) + { + currentDocument = 0; + contentView = 0; + updateMainWindowTitle(); + commandManager->commandStatusChanged(); + } +} + +bool ProjectContentComponent::setEditorComponent (Component* editor, OpenDocumentManager::Document* doc) +{ + if (editor != 0) + { + contentView = editor; + currentDocument = doc; + addAndMakeVisible (editor); + resized(); + updateMainWindowTitle(); + commandManager->commandStatusChanged(); + + return true; + } + + updateMainWindowTitle(); + return false; +} + +void ProjectContentComponent::updateMainWindowTitle() +{ + MainWindow* mw = Component::findParentComponentOfClass ((MainWindow*) 0); + + if (mw != 0) + mw->updateTitle (currentDocument != 0 ? currentDocument->getName() : String::empty); +} + +ApplicationCommandTarget* ProjectContentComponent::getNextCommandTarget() +{ + return findFirstTargetParentComponent(); +} + +void ProjectContentComponent::getAllCommands (Array <CommandID>& commands) +{ + const CommandID ids[] = { CommandIDs::saveProject, + CommandIDs::saveProjectAs, + CommandIDs::closeProject, + CommandIDs::openInIDE, + CommandIDs::saveAndOpenInIDE, + CommandIDs::showProjectSettings, + StandardApplicationCommandIDs::del}; + + commands.addArray (ids, numElementsInArray (ids)); +} + +void ProjectContentComponent::getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) +{ + switch (commandID) + { + case CommandIDs::saveProject: + result.setInfo ("Save Project", + "Saves the current project", + CommandCategories::general, 0); + result.setActive (project != 0); + result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::saveProjectAs: + result.setInfo ("Save Project As...", + "Saves the current project to a different filename", + CommandCategories::general, 0); + result.setActive (project != 0); + result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); + break; + + case CommandIDs::closeProject: + result.setInfo ("Close Project", + "Closes the current project", + CommandCategories::general, 0); + result.setActive (project != 0); + result.defaultKeypresses.add (KeyPress ('w', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); + 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 + "Launches the project in an external IDE", + CommandCategories::general, 0); + result.setActive (project != 0); + 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 + "Saves the project and launches it in an external IDE", + CommandCategories::general, 0); + result.setActive (project != 0); + result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier, 0)); + break; + + case CommandIDs::showProjectSettings: + result.setInfo ("Show Project Build Settings", + "Shows the build options for the project", + CommandCategories::general, 0); + result.setActive (project != 0); + result.defaultKeypresses.add (KeyPress ('i', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); + break; + + case StandardApplicationCommandIDs::del: + result.setInfo ("Delete", String::empty, CommandCategories::general, 0); + result.defaultKeypresses.add (KeyPress (KeyPress::deleteKey, 0, 0)); + result.defaultKeypresses.add (KeyPress (KeyPress::backspaceKey, 0, 0)); + result.setActive (projectTree != 0); + break; + + default: + break; + } +} + +bool ProjectContentComponent::isCommandActive (const CommandID commandID) +{ + return project != 0; +} + +bool ProjectContentComponent::perform (const InvocationInfo& info) +{ + switch (info.commandID) + { + case CommandIDs::saveProject: + if (project != 0) + project->save (true, true); + + break; + + case CommandIDs::saveProjectAs: + if (project != 0) + project->saveAsInteractive (true); + + break; + + case CommandIDs::closeProject: + { + MainWindow* mw = Component::findParentComponentOfClass ((MainWindow*) 0); + + if (mw != 0) + mw->closeCurrentProject(); + } + + break; + + case CommandIDs::openInIDE: + if (project != 0) + { + ScopedPointer <ProjectExporter> exporter (ProjectExporter::createPlatformDefaultExporter (*project)); + exporter->launchProject(); + } + break; + + case CommandIDs::saveAndOpenInIDE: + if (project != 0 && project->save (true, true) == FileBasedDocument::savedOk) + { + ScopedPointer <ProjectExporter> exporter (ProjectExporter::createPlatformDefaultExporter (*project)); + exporter->launchProject(); + } + break; + + case CommandIDs::showProjectSettings: + if (projectTree != 0) + projectTree->getRootItem()->setSelected (true, true); + + break; + + case StandardApplicationCommandIDs::del: + if (projectTree != 0) + { + ProjectTreeViewBase* p = dynamic_cast <ProjectTreeViewBase*> (projectTree->getRootItem()); + if (p != 0) + p->deleteAllSelectedItems(); + } + + break; + + default: + return false; + } + + return true; +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.h new file mode 100755 index 000000000..81f56d4e0 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectContentComponent.h @@ -0,0 +1,82 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTCONTENTCOMPONENT_JUCEHEADER__ +#define __JUCER_PROJECTCONTENTCOMPONENT_JUCEHEADER__ + +#include "jucer_Project.h" +#include "../Application/jucer_OpenDocumentManager.h" + + +//============================================================================== +/** +*/ +class ProjectContentComponent : public Component, + public ApplicationCommandTarget, + public ChangeListener, + public StretchableLayoutManager +{ +public: + //============================================================================== + ProjectContentComponent(); + ~ProjectContentComponent(); + + void paint (Graphics& g); + void resized(); + + void setProject (Project* project); + + bool showEditorForFile (const File& f); + bool showDocument (OpenDocumentManager::Document* doc); + void hideDocument (OpenDocumentManager::Document* doc); + bool setEditorComponent (Component* editor, OpenDocumentManager::Document* doc); + + void updateMissingFileStatuses(); + + void changeListenerCallback (ChangeBroadcaster*); + void hasBeenMoved(); + + //============================================================================== + ApplicationCommandTarget* getNextCommandTarget(); + void getAllCommands (Array <CommandID>& commands); + void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result); + bool isCommandActive (const CommandID commandID); + bool perform (const InvocationInfo& info); + +private: + ScopedPointer<TreeView> projectTree; + Project* project; + ScopedPointer <Component> contentView; + OpenDocumentManager::Document* currentDocument; + + ScopedPointer<StretchableLayoutResizerBar> resizerBar; + + void updateMainWindowTitle(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectContentComponent); +}; + + +#endif // __JUCER_PROJECTCONTENTCOMPONENT_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_MSVC.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_MSVC.h new file mode 100755 index 000000000..15902c7f0 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_MSVC.h @@ -0,0 +1,1556 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTEXPORT_MSVC_JUCEHEADER__ +#define __JUCER_PROJECTEXPORT_MSVC_JUCEHEADER__ + +#include "jucer_ProjectExporter.h" + + +//============================================================================== +class MSVCProjectExporterBase : public ProjectExporter +{ +public: + //============================================================================== + MSVCProjectExporterBase (Project& project_, const ValueTree& settings_, const char* const folderName) + : ProjectExporter (project_, settings_), hasIcon (false) + { + if (getTargetLocation().toString().isEmpty()) + getTargetLocation() = getDefaultBuildsRootFolder() + folderName; + + if (getVSTFolder().toString().isEmpty()) + getVSTFolder() = "c:\\SDKs\\vstsdk2.4"; + + if (getRTASFolder().toString().isEmpty()) + getRTASFolder() = "c:\\SDKs\\PT_80_SDK"; + + if ((int) getLibraryType().getValue() <= 0) + getLibraryType() = 1; + + projectGUID = createGUID (project.getProjectUID()); + } + + ~MSVCProjectExporterBase() {} + + //============================================================================== + bool isPossibleForCurrentProject() { return true; } + bool usesMMFiles() const { return false; } + + void createPropertyEditors (Array <PropertyComponent*>& props) + { + ProjectExporter::createPropertyEditors (props); + + if (project.isLibrary()) + { + const char* const libTypes[] = { "Static Library (.lib)", "Dynamic Library (.dll)", 0 }; + const int libTypeValues[] = { 1, 2, 0 }; + props.add (new ChoicePropertyComponent (getLibraryType(), "Library Type", StringArray (libTypes), Array<var> (libTypeValues))); + + props.add (new TextPropertyComponent (getSetting (Ids::libraryName_Debug), "Library Name (Debug)", 128, false)); + props.getLast()->setTooltip ("If set, this name will override the binary name specified in the configuration settings, for a debug build. You must include the .lib or .dll suffix on this filename."); + + props.add (new TextPropertyComponent (getSetting (Ids::libraryName_Release), "Library Name (Release)", 128, false)); + props.getLast()->setTooltip ("If set, this name will override the binary name specified in the configuration settings, for a release build. You must include the .lib or .dll suffix on this filename."); + } + } + +protected: + String projectGUID; + File rcFile, iconFile; + bool hasIcon; + + const File getProjectFile (const String& extension) const { return getTargetFolder().getChildFile (project.getProjectFilenameRoot()).withFileExtension (extension); } + + Value getLibraryType() const { return getSetting (Ids::libraryType); } + bool isLibraryDLL() const { return project.isLibrary() && getLibraryType() == 2; } + + //============================================================================== + const Array<RelativePath> getRTASFilesRequired() const + { + Array<RelativePath> s; + + if (isRTAS()) + { + static const char* files[] = { "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode1.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode2.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode3.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode_Header.h", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_WinUtilities.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_Wrapper.cpp" }; + + for (int i = 0; i < numElementsInArray (files); ++i) + s.add (getJucePathFromTargetFolder().getChildFile (files[i])); + } + + return s; + } + + const String getIntermediatesPath (const Project::BuildConfiguration& config) const + { + return ".\\" + File::createLegalFileName (config.getName().toString().trim()); + } + + const String getConfigTargetPath (const Project::BuildConfiguration& config) const + { + const String binaryPath (config.getTargetBinaryRelativePath().toString().trim()); + if (binaryPath.isEmpty()) + return getIntermediatesPath (config); + + return ".\\" + RelativePath (binaryPath, RelativePath::projectFolder) + .rebased (project.getFile().getParentDirectory(), getTargetFolder(), RelativePath::buildTargetFolder) + .toWindowsStyle(); + } + + const String getTargetBinarySuffix() const + { + if (project.isLibrary()) + return ".lib"; + else if (isRTAS()) + return ".dpm"; + else if (project.isAudioPlugin() || project.isBrowserPlugin()) + return ".dll"; + + return ".exe"; + } + + const String getPreprocessorDefs (const Project::BuildConfiguration& config, const String& joinString) const + { + StringPairArray defines; + defines.set ("WIN32", ""); + defines.set ("_WINDOWS", ""); + + if (config.isDebug().getValue()) + { + defines.set ("DEBUG", ""); + defines.set ("_DEBUG", ""); + } + else + { + defines.set ("NDEBUG", ""); + } + + if (project.isCommandLineApp()) + defines.set ("_CONSOLE", ""); + + if (project.isLibrary()) + defines.set ("_LIB", ""); + + if (isRTAS()) + { + RelativePath rtasFolder (getRTASFolder().toString(), RelativePath::unknown); + defines.set ("JucePlugin_WinBag_path", CodeHelpers::addEscapeChars (rtasFolder.getChildFile ("WinBag") + .toWindowsStyle().quoted())); + } + + defines = mergePreprocessorDefs (defines, getAllPreprocessorDefs (config)); + + StringArray result; + + for (int i = 0; i < defines.size(); ++i) + { + String def (defines.getAllKeys()[i]); + const String value (defines.getAllValues()[i]); + if (value.isNotEmpty()) + def << "=" << value; + + result.add (def); + } + + return result.joinIntoString (joinString); + } + + const StringArray getHeaderSearchPaths (const Project::BuildConfiguration& config) const + { + StringArray searchPaths (config.getHeaderSearchPaths()); + + if (project.shouldAddVSTFolderToPath() && getVSTFolder().toString().isNotEmpty()) + searchPaths.add (rebaseFromProjectFolderToBuildTarget (RelativePath (getVSTFolder().toString(), RelativePath::projectFolder)).toWindowsStyle()); + + if (project.isAudioPlugin()) + searchPaths.add (juceWrapperFolder.toWindowsStyle()); + + if (isRTAS()) + { + static const char* rtasIncludePaths[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", + "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", + "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses/Interfaces", + "AlturaPorts/TDMPlugins/PluginLibrary/Utilities", + "AlturaPorts/TDMPlugins/PluginLibrary/RTASP_Adapt", + "AlturaPorts/TDMPlugins/PluginLibrary/CoreClasses", + "AlturaPorts/TDMPlugins/PluginLibrary/Controls", + "AlturaPorts/TDMPlugins/PluginLibrary/Meters", + "AlturaPorts/TDMPlugins/PluginLibrary/ViewClasses", + "AlturaPorts/TDMPlugins/PluginLibrary/DSPClasses", + "AlturaPorts/TDMPlugins/PluginLibrary/Interfaces", + "AlturaPorts/TDMPlugins/common", + "AlturaPorts/TDMPlugins/common/Platform", + "AlturaPorts/TDMPlugins/SignalProcessing/Public", + "AlturaPorts/TDMPlugIns/DSPManager/Interfaces", + "AlturaPorts/SADriver/Interfaces", + "AlturaPorts/DigiPublic/Interfaces", + "AlturaPorts/Fic/Interfaces/DAEClient", + "AlturaPorts/NewFileLibs/Cmn", + "AlturaPorts/NewFileLibs/DOA", + "AlturaPorts/AlturaSource/PPC_H", + "AlturaPorts/AlturaSource/AppSupport", + "AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc", + "xplat/AVX/avx2/avx2sdk/inc" }; + + RelativePath sdkFolder (getRTASFolder().toString(), RelativePath::projectFolder); + + for (int i = 0; i < numElementsInArray (rtasIncludePaths); ++i) + searchPaths.add (rebaseFromProjectFolderToBuildTarget (sdkFolder.getChildFile (rtasIncludePaths[i])).toWindowsStyle()); + } + + return searchPaths; + } + + const String getBinaryFileForConfig (const Project::BuildConfiguration& config) const + { + const String targetBinary (getSetting (config.isDebug().getValue() ? Ids::libraryName_Debug : Ids::libraryName_Release).toString().trim()); + if (targetBinary.isNotEmpty()) + return targetBinary; + + return config.getTargetBinaryName().toString() + getTargetBinarySuffix(); + } + + static const String createConfigName (const Project::BuildConfiguration& config) + { + return config.getName().toString() + "|Win32"; + } + + //============================================================================== + void writeSolutionFile (OutputStream& out, const String& versionString, const File& vcProject) + { + out << "Microsoft Visual Studio Solution File, Format Version " << versionString << newLine + << "Project(\"" << createGUID (project.getProjectName().toString() + "sln_guid") << "\") = \"" << project.getProjectName().toString() << "\", \"" + << vcProject.getFileName() << "\", \"" << projectGUID << '"' << newLine + << "EndProject" << newLine + << "Global" << newLine + << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution" << newLine; + + int i; + for (i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + out << "\t\t" << createConfigName (config) << " = " << createConfigName (config) << newLine; + } + + out << "\tEndGlobalSection" << newLine + << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution" << newLine; + + for (i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + out << "\t\t" << projectGUID << "." << createConfigName (config) << ".ActiveCfg = " << createConfigName (config) << newLine; + out << "\t\t" << projectGUID << "." << createConfigName (config) << ".Build.0 = " << createConfigName (config) << newLine; + } + + out << "\tEndGlobalSection" << newLine + << "\tGlobalSection(SolutionProperties) = preSolution" << newLine + << "\t\tHideSolutionNode = FALSE" << newLine + << "\tEndGlobalSection" << newLine + << "EndGlobal" << newLine; + } + + //============================================================================== + static bool writeRCFile (const File& file, const File& iconFile) + { + return file.deleteFile() + && file.appendText ("IDI_ICON1 ICON DISCARDABLE " + + iconFile.getFileName().quoted(), false, false); + } + + static void writeIconFile (const Array<Image>& images, OutputStream& out) + { + out.writeShort (0); // reserved + out.writeShort (1); // .ico tag + out.writeShort ((short) images.size()); + + MemoryOutputStream dataBlock; + + const int imageDirEntrySize = 16; + const int dataBlockStart = 6 + images.size() * imageDirEntrySize; + + for (int i = 0; i < images.size(); ++i) + { + const Image& image = images.getReference (i); + const int w = image.getWidth(); + const int h = image.getHeight(); + const int maskStride = (w / 8 + 3) & ~3; + + const size_t oldDataSize = dataBlock.getDataSize(); + dataBlock.writeInt (40); // bitmapinfoheader size + dataBlock.writeInt (w); + dataBlock.writeInt (h * 2); + dataBlock.writeShort (1); // planes + dataBlock.writeShort (32); // bits + dataBlock.writeInt (0); // compression + dataBlock.writeInt ((h * w * 4) + (h * maskStride)); // size image + dataBlock.writeInt (0); // x pixels per meter + dataBlock.writeInt (0); // y pixels per meter + dataBlock.writeInt (0); // clr used + dataBlock.writeInt (0); // clr important + + const Image::BitmapData bitmap (image, false); + const int alphaThreshold = 5; + + int y; + for (y = h; --y >= 0;) + { + for (int x = 0; x < w; ++x) + { + const Colour pixel (bitmap.getPixelColour (x, y)); + + if (pixel.getAlpha() <= alphaThreshold) + { + dataBlock.writeInt (0); + } + else + { + dataBlock.writeByte ((char) pixel.getBlue()); + dataBlock.writeByte ((char) pixel.getGreen()); + dataBlock.writeByte ((char) pixel.getRed()); + dataBlock.writeByte ((char) pixel.getAlpha()); + } + } + } + + for (y = h; --y >= 0;) + { + int mask = 0, count = 0; + + for (int x = 0; x < w; ++x) + { + const Colour pixel (bitmap.getPixelColour (x, y)); + + mask <<= 1; + if (pixel.getAlpha() <= alphaThreshold) + mask |= 1; + + if (++count == 8) + { + dataBlock.writeByte ((char) mask); + count = 0; + mask = 0; + } + } + + if (mask != 0) + dataBlock.writeByte ((char) mask); + + for (int i = maskStride - w / 8; --i >= 0;) + dataBlock.writeByte (0); + } + + out.writeByte ((char) w); + out.writeByte ((char) h); + out.writeByte (0); + out.writeByte (0); + out.writeShort (1); // colour planes + out.writeShort (32); // bits per pixel + out.writeInt ((int) (dataBlock.getDataSize() - oldDataSize)); + out.writeInt (dataBlockStart + oldDataSize); + } + + jassert (out.getPosition() == dataBlockStart); + out << dataBlock; + } + + static const Image getBestIconImage (const Image& im1, const Image& im2, int size) + { + Image im; + + if (im1.isValid() && im2.isValid()) + { + if (im1.getWidth() >= size && im2.getWidth() >= size) + im = im1.getWidth() < im2.getWidth() ? im1 : im2; + else if (im1.getWidth() >= size) + im = im1; + else if (im2.getWidth() >= size) + im = im2; + else + return Image(); + } + else + { + im = im1.isValid() ? im1 : im2; + } + + if (size == im.getWidth() && size == im.getHeight()) + return im; + + if (im.getWidth() < size && im.getHeight() < size) + return Image(); + + Image newIm (Image::ARGB, size, size, true); + Graphics g (newIm); + g.drawImageWithin (im, 0, 0, size, size, + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, false); + return newIm; + } + + bool createIconFile() + { + Array<Image> images; + + const Image smallIcon (project.getSmallIcon()); + const Image bigIcon (project.getBigIcon()); + + Image im (getBestIconImage (smallIcon, bigIcon, 16)); + if (im.isValid()) + images.add (im); + + im = getBestIconImage (smallIcon, bigIcon, 32); + if (im.isValid()) + images.add (im); + + im = getBestIconImage (smallIcon, bigIcon, 48); + if (im.isValid()) + images.add (im); + + im = getBestIconImage (smallIcon, bigIcon, 128); + if (im.isValid()) + images.add (im); + + if (images.size() == 0) + return true; + + MemoryOutputStream mo; + writeIconFile (images, mo); + + iconFile = getTargetFolder().getChildFile ("icon.ico"); + rcFile = getTargetFolder().getChildFile ("resources.rc"); + + hasIcon = FileHelpers::overwriteFileWithNewDataIfDifferent (iconFile, mo) + && writeRCFile (rcFile, iconFile); + return hasIcon; + } + + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterBase); +}; + + +//============================================================================== +class MSVCProjectExporterVC2008 : public MSVCProjectExporterBase +{ +public: + //============================================================================== + MSVCProjectExporterVC2008 (Project& project_, const ValueTree& settings_, const char* folderName = "VisualStudio2008") + : MSVCProjectExporterBase (project_, settings_, folderName) + { + name = getName(); + } + + ~MSVCProjectExporterVC2008() {} + + static const char* getName() { return "Visual Studio 2008"; } + static const char* getValueTreeTypeName() { return "VS2008"; } + + void launchProject() { getSLNFile().startAsProcess(); } + + bool isDefaultFormatForCurrentOS() + { + #if JUCE_WINDOWS + return true; + #else + return false; + #endif + } + + static MSVCProjectExporterVC2008* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName())) + return new MSVCProjectExporterVC2008 (project, settings); + + return 0; + } + + //============================================================================== + const String create() + { + createIconFile(); + + if (hasIcon) + { + juceWrapperFiles.add (RelativePath (iconFile.getFileName(), RelativePath::buildTargetFolder)); + juceWrapperFiles.add (RelativePath (rcFile.getFileName(), RelativePath::buildTargetFolder)); + } + + { + XmlElement projectXml ("VisualStudioProject"); + fillInProjectXml (projectXml); + + MemoryOutputStream mo; + projectXml.writeToStream (mo, String::empty, false, true, "UTF-8", 10); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getVCProjFile(), mo)) + return "Can't write to the VC project file: " + getVCProjFile().getFullPathName(); + } + + { + MemoryOutputStream mo; + writeSolutionFile (mo, getSolutionVersionString(), getVCProjFile()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getSLNFile(), mo)) + return "Can't write to the VC solution file: " + getSLNFile().getFullPathName(); + } + + return String::empty; + } + +protected: + virtual const String getProjectVersionString() const { return "9.00"; } + virtual const String getSolutionVersionString() const { return "10.00" + newLine + "# Visual C++ Express 2008"; } + + const File getVCProjFile() const { return getProjectFile (".vcproj"); } + const File getSLNFile() const { return getProjectFile (".sln"); } + + //============================================================================== + void fillInProjectXml (XmlElement& projectXml) + { + projectXml.setAttribute ("ProjectType", "Visual C++"); + projectXml.setAttribute ("Version", getProjectVersionString()); + projectXml.setAttribute ("Name", project.getProjectName().toString()); + projectXml.setAttribute ("ProjectGUID", projectGUID); + projectXml.setAttribute ("TargetFrameworkVersion", "131072"); + + { + XmlElement* platforms = projectXml.createNewChildElement ("Platforms"); + XmlElement* platform = platforms->createNewChildElement ("Platform"); + platform->setAttribute ("Name", "Win32"); + } + + projectXml.createNewChildElement ("ToolFiles"); + createConfigs (*projectXml.createNewChildElement ("Configurations")); + projectXml.createNewChildElement ("References"); + createFiles (*projectXml.createNewChildElement ("Files")); + projectXml.createNewChildElement ("Globals"); + } + + //============================================================================== + void addFile (const RelativePath& file, XmlElement& parent, const bool excludeFromBuild, const bool useStdcall) + { + jassert (file.getRoot() == RelativePath::buildTargetFolder); + + XmlElement* fileXml = parent.createNewChildElement ("File"); + fileXml->setAttribute ("RelativePath", file.toWindowsStyle()); + + if (excludeFromBuild || useStdcall) + { + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + + XmlElement* fileConfig = fileXml->createNewChildElement ("FileConfiguration"); + fileConfig->setAttribute ("Name", createConfigName (config)); + + if (excludeFromBuild) + fileConfig->setAttribute ("ExcludedFromBuild", "true"); + + XmlElement* tool = createToolElement (*fileConfig, "VCCLCompilerTool"); + + if (useStdcall) + tool->setAttribute ("CallingConvention", "2"); + } + } + } + + XmlElement* createGroup (const String& groupName, XmlElement& parent) + { + XmlElement* filter = parent.createNewChildElement ("Filter"); + filter->setAttribute ("Name", groupName); + return filter; + } + + void addFiles (const Project::Item& projectItem, XmlElement& parent) + { + if (projectItem.isGroup()) + { + XmlElement* filter = createGroup (projectItem.getName().toString(), parent); + + for (int i = 0; i < projectItem.getNumChildren(); ++i) + addFiles (projectItem.getChild(i), *filter); + } + else + { + if (projectItem.shouldBeAddedToTargetProject()) + { + const RelativePath path (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder); + + addFile (path, parent, + projectItem.shouldBeAddedToBinaryResources() || (shouldFileBeCompiledByDefault (path) && ! projectItem.shouldBeCompiled()), + false); + } + } + } + + void addGroup (XmlElement& parent, const String& groupName, const Array<RelativePath>& files, const bool useStdcall) + { + if (files.size() > 0) + { + XmlElement* const group = createGroup (groupName, parent); + + for (int i = 0; i < files.size(); ++i) + if (files.getReference(i).hasFileExtension ("cpp;c;cc;cxx;h;hpp;hxx;rc;ico")) + addFile (files.getReference(i), *group, false, + useStdcall && shouldFileBeCompiledByDefault (files.getReference(i))); + } + } + + void createFiles (XmlElement& files) + { + addFiles (project.getMainGroup(), files); + + addGroup (files, project.getJuceCodeGroupName(), juceWrapperFiles, false); + addGroup (files, "Juce VST Wrapper", getVSTFilesRequired(), false); + addGroup (files, "Juce RTAS Wrapper", getRTASFilesRequired(), true); + } + + //============================================================================== + XmlElement* createToolElement (XmlElement& parent, const String& toolName) const + { + XmlElement* const e = parent.createNewChildElement ("Tool"); + e->setAttribute ("Name", toolName); + return e; + } + + void createConfig (XmlElement& xml, const Project::BuildConfiguration& config) const + { + String binariesPath (getConfigTargetPath (config)); + String intermediatesPath (getIntermediatesPath (config)); + const bool isDebug = (bool) config.isDebug().getValue(); + const String binaryName (File::createLegalFileName (config.getTargetBinaryName().toString())); + + xml.setAttribute ("Name", createConfigName (config)); + xml.setAttribute ("OutputDirectory", FileHelpers::windowsStylePath (binariesPath)); + xml.setAttribute ("IntermediateDirectory", FileHelpers::windowsStylePath (intermediatesPath)); + xml.setAttribute ("ConfigurationType", (project.isAudioPlugin() || project.isBrowserPlugin() || isLibraryDLL()) + ? "2" : (project.isLibrary() ? "4" : "1")); + xml.setAttribute ("UseOfMFC", "0"); + xml.setAttribute ("ATLMinimizesCRunTimeLibraryUsage", "false"); + xml.setAttribute ("CharacterSet", "2"); + + if (! isDebug) + xml.setAttribute ("WholeProgramOptimization", "1"); + + createToolElement (xml, "VCPreBuildEventTool"); + + XmlElement* customBuild = createToolElement (xml, "VCCustomBuildTool"); + + if (isRTAS()) + { + RelativePath rsrFile (getJucePathFromTargetFolder().getChildFile ("extras/audio plugins/wrapper/RTAS/juce_RTAS_WinResources.rsr")); + + customBuild->setAttribute ("CommandLine", "copy /Y \"" + rsrFile.toWindowsStyle() + "\" \"$(TargetPath)\".rsr"); + customBuild->setAttribute ("Outputs", "\"$(TargetPath)\".rsr"); + } + + createToolElement (xml, "VCXMLDataGeneratorTool"); + createToolElement (xml, "VCWebServiceProxyGeneratorTool"); + + if (! project.isLibrary()) + { + XmlElement* midl = createToolElement (xml, "VCMIDLTool"); + midl->setAttribute ("PreprocessorDefinitions", isDebug ? "_DEBUG" : "NDEBUG"); + midl->setAttribute ("MkTypLibCompatible", "true"); + midl->setAttribute ("SuppressStartupBanner", "true"); + midl->setAttribute ("TargetEnvironment", "1"); + midl->setAttribute ("TypeLibraryName", FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".tlb")); + midl->setAttribute ("HeaderFileName", ""); + } + + { + XmlElement* compiler = createToolElement (xml, "VCCLCompilerTool"); + + const int optimiseLevel = (int) config.getOptimisationLevel().getValue(); + compiler->setAttribute ("Optimization", optimiseLevel <= 1 ? "0" : (optimiseLevel == 2 ? "2" : "3")); + + if (isDebug) + { + compiler->setAttribute ("BufferSecurityCheck", ""); + compiler->setAttribute ("DebugInformationFormat", project.isLibrary() ? "3" : "4"); + } + else + { + compiler->setAttribute ("InlineFunctionExpansion", "1"); + compiler->setAttribute ("StringPooling", "true"); + } + + compiler->setAttribute ("AdditionalIncludeDirectories", replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (";"))); + compiler->setAttribute ("PreprocessorDefinitions", getPreprocessorDefs (config, ";")); + compiler->setAttribute ("RuntimeLibrary", isRTAS() ? (isDebug ? 3 : 2) // MT DLL + : (isDebug ? 1 : 0)); // MT static + compiler->setAttribute ("RuntimeTypeInfo", "true"); + compiler->setAttribute ("UsePrecompiledHeader", "0"); + compiler->setAttribute ("PrecompiledHeaderFile", FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".pch")); + compiler->setAttribute ("AssemblerListingLocation", FileHelpers::windowsStylePath (intermediatesPath + "/")); + compiler->setAttribute ("ObjectFile", FileHelpers::windowsStylePath (intermediatesPath + "/")); + compiler->setAttribute ("ProgramDataBaseFileName", FileHelpers::windowsStylePath (intermediatesPath + "/")); + compiler->setAttribute ("WarningLevel", "4"); + compiler->setAttribute ("SuppressStartupBanner", "true"); + + const String extraFlags (replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim()); + if (extraFlags.isNotEmpty()) + compiler->setAttribute ("AdditionalOptions", extraFlags); + } + + createToolElement (xml, "VCManagedResourceCompilerTool"); + + { + XmlElement* resCompiler = createToolElement (xml, "VCResourceCompilerTool"); + resCompiler->setAttribute ("PreprocessorDefinitions", isDebug ? "_DEBUG" : "NDEBUG"); + } + + createToolElement (xml, "VCPreLinkEventTool"); + + const String outputFileName (getBinaryFileForConfig (config)); + + if (! project.isLibrary()) + { + XmlElement* linker = createToolElement (xml, "VCLinkerTool"); + + linker->setAttribute ("OutputFile", FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName)); + linker->setAttribute ("SuppressStartupBanner", "true"); + + if (project.getJuceLinkageMode() == Project::useLinkedJuce) + linker->setAttribute ("AdditionalLibraryDirectories", getJucePathFromTargetFolder().getChildFile ("bin").toWindowsStyle()); + + linker->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : ""); + linker->setAttribute ("GenerateDebugInformation", isDebug ? "true" : "false"); + linker->setAttribute ("ProgramDatabaseFile", FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".pdb")); + linker->setAttribute ("SubSystem", project.isCommandLineApp() ? "1" : "2"); + + if (! isDebug) + { + linker->setAttribute ("GenerateManifest", "false"); + linker->setAttribute ("OptimizeReferences", "2"); + linker->setAttribute ("EnableCOMDATFolding", "2"); + } + + linker->setAttribute ("TargetMachine", "1"); // (64-bit build = 5) + + String extraLinkerOptions (getExtraLinkerFlags().toString()); + + if (isRTAS()) + { + extraLinkerOptions += " /FORCE:multiple"; + linker->setAttribute ("DelayLoadDLLs", "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; DSPManager.dll"); + linker->setAttribute ("ModuleDefinitionFile", getJucePathFromTargetFolder() + .getChildFile ("extras/audio plugins/wrapper/RTAS/juce_RTAS_WinExports.def") + .toWindowsStyle()); + } + + if (extraLinkerOptions.isNotEmpty()) + linker->setAttribute ("AdditionalOptions", replacePreprocessorTokens (config, extraLinkerOptions).trim()); + } + else + { + if (isLibraryDLL()) + { + XmlElement* linker = createToolElement (xml, "VCLinkerTool"); + + String extraLinkerOptions (getExtraLinkerFlags().toString()); + extraLinkerOptions << " /IMPLIB:" << FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName.upToLastOccurrenceOf (".", false, false) + ".lib"); + linker->setAttribute ("AdditionalOptions", replacePreprocessorTokens (config, extraLinkerOptions).trim()); + + linker->setAttribute ("OutputFile", FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName)); + linker->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : ""); + } + else + { + XmlElement* librarian = createToolElement (xml, "VCLibrarianTool"); + + librarian->setAttribute ("OutputFile", FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName)); + librarian->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : ""); + } + } + + createToolElement (xml, "VCALinkTool"); + createToolElement (xml, "VCManifestTool"); + createToolElement (xml, "VCXDCMakeTool"); + + { + XmlElement* bscMake = createToolElement (xml, "VCBscMakeTool"); + bscMake->setAttribute ("SuppressStartupBanner", "true"); + bscMake->setAttribute ("OutputFile", FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".bsc")); + } + + createToolElement (xml, "VCFxCopTool"); + + if (! project.isLibrary()) + createToolElement (xml, "VCAppVerifierTool"); + + createToolElement (xml, "VCPostBuildEventTool"); + } + + void createConfigs (XmlElement& configs) + { + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + createConfig (*configs.createNewChildElement ("Configuration"), config); + } + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2008); +}; + + +//============================================================================== +class MSVCProjectExporterVC2005 : public MSVCProjectExporterVC2008 +{ +public: + MSVCProjectExporterVC2005 (Project& project_, const ValueTree& settings_) + : MSVCProjectExporterVC2008 (project_, settings_, "VisualStudio2005") + { + name = getName(); + } + + ~MSVCProjectExporterVC2005() {} + + static const char* getName() { return "Visual Studio 2005"; } + static const char* getValueTreeTypeName() { return "VS2005"; } + + bool isDefaultFormatForCurrentOS() { return false; } + + static MSVCProjectExporterVC2005* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName())) + return new MSVCProjectExporterVC2005 (project, settings); + + return 0; + } + +protected: + const String getProjectVersionString() const { return "8.00"; } + const String getSolutionVersionString() const { return "8.00" + newLine + "# Visual C++ Express 2005"; } + + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2005); +}; + + +//============================================================================== +class MSVCProjectExporterVC6 : public MSVCProjectExporterBase +{ +public: + //============================================================================== + MSVCProjectExporterVC6 (Project& project_, const ValueTree& settings_) + : MSVCProjectExporterBase (project_, settings_, "MSVC6") + { + name = getName(); + } + + ~MSVCProjectExporterVC6() {} + + static const char* getName() { return "Visual C++ 6.0"; } + static const char* getValueTreeTypeName() { return "MSVC6"; } + + bool isDefaultFormatForCurrentOS() { return false; } + void launchProject() { getDSWFile().startAsProcess(); } + + static MSVCProjectExporterVC6* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName())) + return new MSVCProjectExporterVC6 (project, settings); + + return 0; + } + + //============================================================================== + const String create() + { + { + MemoryOutputStream mo; + writeProject (mo); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getDSPFile(), mo)) + return "Can't write to the VC project file: " + getDSPFile().getFullPathName(); + } + + { + MemoryOutputStream mo; + writeDSWFile (mo); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getDSWFile(), mo)) + return "Can't write to the VC solution file: " + getDSWFile().getFullPathName(); + } + + return String::empty; + } + +private: + const File getDSPFile() const { return getProjectFile (".dsp"); } + const File getDSWFile() const { return getProjectFile (".dsw"); } + + //============================================================================== + const String createConfigName (const Project::BuildConfiguration& config) const + { + return project.getProjectName().toString() + " - Win32 " + config.getName().toString(); + } + + void writeProject (OutputStream& out) + { + const String defaultConfigName (createConfigName (project.getConfiguration (0))); + + const bool isDLL = project.isAudioPlugin() || project.isBrowserPlugin(); + String targetType, targetCode; + + if (isDLL) { targetType = "\"Win32 (x86) Dynamic-Link Library\""; targetCode = "0x0102"; } + else if (project.isLibrary()) { targetType = "\"Win32 (x86) Static Library\""; targetCode = "0x0104"; } + else if (project.isCommandLineApp()) { targetType = "\"Win32 (x86) Console Application\""; targetCode = "0x0103"; } + else { targetType = "\"Win32 (x86) Application\""; targetCode = "0x0101"; } + + out << "# Microsoft Developer Studio Project File - Name=\"" << project.getProjectName() + << "\" - Package Owner=<4>" << newLine + << "# Microsoft Developer Studio Generated Build File, Format Version 6.00" << newLine + << "# ** DO NOT EDIT **" << newLine + << "# TARGTYPE " << targetType << " " << targetCode << newLine + << "CFG=" << defaultConfigName << newLine + << "!MESSAGE This is not a valid makefile. To build this project using NMAKE," << newLine + << "!MESSAGE use the Export Makefile command and run" << newLine + << "!MESSAGE " << newLine + << "!MESSAGE NMAKE /f \"" << project.getProjectName() << ".mak.\"" << newLine + << "!MESSAGE " << newLine + << "!MESSAGE You can specify a configuration when running NMAKE" << newLine + << "!MESSAGE by defining the macro CFG on the command line. For example:" << newLine + << "!MESSAGE " << newLine + << "!MESSAGE NMAKE /f \"" << project.getProjectName() << ".mak\" CFG=\"" << defaultConfigName << '"' << newLine + << "!MESSAGE " << newLine + << "!MESSAGE Possible choices for configuration are:" << newLine + << "!MESSAGE " << newLine; + + int i; + for (i = 0; i < project.getNumConfigurations(); ++i) + out << "!MESSAGE \"" << createConfigName (project.getConfiguration (i)) << "\" (based on " << targetType << ")" << newLine; + + out << "!MESSAGE " << newLine + << "# Begin Project" << newLine + << "# PROP AllowPerConfigDependencies 0" << newLine + << "# PROP Scc_ProjName \"\"" << newLine + << "# PROP Scc_LocalPath \"\"" << newLine + << "CPP=cl.exe" << newLine + << "MTL=midl.exe" << newLine + << "RSC=rc.exe" << newLine; + + String targetList; + + for (i = 0; i < project.getNumConfigurations(); ++i) + { + const Project::BuildConfiguration config (project.getConfiguration (i)); + const String configName (createConfigName (config)); + targetList << "# Name \"" << configName << '"' << newLine; + + const String binariesPath (getConfigTargetPath (config)); + const String targetBinary (FileHelpers::windowsStylePath (binariesPath + "/" + getBinaryFileForConfig (config))); + const String optimisationFlag (((int) config.getOptimisationLevel().getValue() <= 1) ? "Od" : (config.getOptimisationLevel() == 2 ? "O2" : "O3")); + const String defines (getPreprocessorDefs (config, " /D ")); + const bool isDebug = (bool) config.isDebug().getValue(); + const String extraDebugFlags (isDebug ? "/Gm /ZI /GZ" : ""); + + out << (i == 0 ? "!IF" : "!ELSEIF") << " \"$(CFG)\" == \"" << configName << '"' << newLine + << "# PROP BASE Use_MFC 0" << newLine + << "# PROP BASE Use_Debug_Libraries " << (isDebug ? "1" : "0") << newLine + << "# PROP BASE Output_Dir \"" << binariesPath << '"' << newLine + << "# PROP BASE Intermediate_Dir \"" << getIntermediatesPath (config) << '"' << newLine + << "# PROP BASE Target_Dir \"\"" << newLine + << "# PROP Use_MFC 0" << newLine + << "# PROP Use_Debug_Libraries " << (isDebug ? "1" : "0") << newLine + << "# PROP Output_Dir \"" << binariesPath << '"' << newLine + << "# PROP Intermediate_Dir \"" << getIntermediatesPath (config) << '"' << newLine + << "# PROP Ignore_Export_Lib 0" << newLine + << "# PROP Target_Dir \"\"" << newLine + << "# ADD BASE CPP /nologo /W3 /GX /" << optimisationFlag << " /D " << defines + << " /YX /FD /c " << extraDebugFlags << " /Zm1024" << newLine + << "# ADD CPP /nologo " << (isDebug ? "/MTd" : "/MT") << " /W3 /GR /GX /" << optimisationFlag + << " /I " << replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" /I ")) + << " /D " << defines << " /D \"_UNICODE\" /D \"UNICODE\" /FD /c /Zm1024 " << extraDebugFlags + << " " << replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim() << newLine; + + if (! isDebug) + out << "# SUBTRACT CPP /YX" << newLine; + + if (! project.isLibrary()) + out << "# ADD BASE MTL /nologo /D " << defines << " /mktyplib203 /win32" << newLine + << "# ADD MTL /nologo /D " << defines << " /mktyplib203 /win32" << newLine; + + out << "# ADD BASE RSC /l 0x40c /d " << defines << newLine + << "# ADD RSC /l 0x40c /d " << defines << newLine + << "BSC32=bscmake.exe" << newLine + << "# ADD BASE BSC32 /nologo" << newLine + << "# ADD BSC32 /nologo" << newLine; + + if (project.isLibrary()) + { + out << "LIB32=link.exe -lib" << newLine + << "# ADD BASE LIB32 /nologo" << newLine + << "# ADD LIB32 /nologo /out:\"" << targetBinary << '"' << newLine; + } + else + { + out << "LINK32=link.exe" << newLine + << "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386" << newLine + << "# ADD LINK32 \"C:\\Program Files\\Microsoft Visual Studio\\VC98\\LIB\\shell32.lib\" " // This is avoid debug information corruption when mixing Platform SDK + << "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib " + << (isDebug ? " /debug" : "") + << " /nologo /machine:I386 /out:\"" << targetBinary << "\" " + << (isDLL ? "/dll" : (project.isCommandLineApp() ? "/subsystem:console " + : "/subsystem:windows ")) + << replacePreprocessorTokens (config, getExtraLinkerFlags().toString()).trim() << newLine; + } + } + + out << "!ENDIF" << newLine + << "# Begin Target" << newLine + << targetList; + + writeFiles (out, project.getMainGroup()); + writeGroup (out, project.getJuceCodeGroupName(), juceWrapperFiles); + writeGroup (out, "Juce VST Wrapper", getVSTFilesRequired()); + + out << "# End Target" << newLine + << "# End Project" << newLine; + } + + void writeFile (OutputStream& out, const RelativePath& file, const bool excludeFromBuild) + { + jassert (file.getRoot() == RelativePath::buildTargetFolder); + + out << "# Begin Source File" << newLine + << "SOURCE=" << file.toWindowsStyle().quoted() << newLine; + + if (excludeFromBuild) + out << "# PROP Exclude_From_Build 1" << newLine; + + out << "# End Source File" << newLine; + } + + void writeFiles (OutputStream& out, const Project::Item& projectItem) + { + if (projectItem.isGroup()) + { + out << "# Begin Group \"" << projectItem.getName() << '"' << newLine + << "# PROP Default_Filter \"cpp;c;cc;cxx;rc;def;r;odl;idl;hpj;bat\"" << newLine; + + for (int i = 0; i < projectItem.getNumChildren(); ++i) + writeFiles (out, projectItem.getChild (i)); + + out << "# End Group" << newLine; + } + else if (projectItem.shouldBeAddedToTargetProject()) + { + const RelativePath path (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder); + writeFile (out, path, projectItem.shouldBeAddedToBinaryResources() || (shouldFileBeCompiledByDefault (path) && ! projectItem.shouldBeCompiled())); + } + } + + void writeGroup (OutputStream& out, const String& groupName, const Array<RelativePath>& files) + { + if (files.size() > 0) + { + out << "# Begin Group \"" << groupName << '"' << newLine; + for (int i = 0; i < files.size(); ++i) + if (files.getReference(i).hasFileExtension ("cpp;cc;c;cxx;h;hpp;hxx")) + writeFile (out, files.getReference(i), false); + + out << "# End Group" << newLine; + } + } + + void writeDSWFile (OutputStream& out) + { + out << "Microsoft Developer Studio Workspace File, Format Version 6.00 " << newLine; + + if (! project.isUsingWrapperFiles()) + { + out << "Project: \"JUCE\"= ..\\JUCE.dsp - Package Owner=<4>" << newLine + << "Package=<5>" << newLine + << "{{{" << newLine + << "}}}" << newLine + << "Package=<4>" << newLine + << "{{{" << newLine + << "}}}" << newLine; + } + + out << "Project: \"" << project.getProjectName() << "\" = .\\" << getDSPFile().getFileName() << " - Package Owner=<4>" << newLine + << "Package=<5>" << newLine + << "{{{" << newLine + << "}}}" << newLine + << "Package=<4>" << newLine + << "{{{" << newLine; + + if (! project.isUsingWrapperFiles()) + { + out << " Begin Project Dependency" << newLine + << " Project_Dep_Name JUCE" << newLine + << " End Project Dependency" << newLine; + } + + out << "}}}" << newLine + << "Global:" << newLine + << "Package=<5>" << newLine + << "{{{" << newLine + << "}}}" << newLine + << "Package=<3>" << newLine + << "{{{" << newLine + << "}}}" << newLine; + } + + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC6); +}; + + +//============================================================================== +class MSVCProjectExporterVC2010 : public MSVCProjectExporterBase +{ +public: + MSVCProjectExporterVC2010 (Project& project_, const ValueTree& settings_) + : MSVCProjectExporterBase (project_, settings_, "VisualStudio2010") + { + name = getName(); + } + + ~MSVCProjectExporterVC2010() {} + + static const char* getName() { return "Visual Studio 2010"; } + static const char* getValueTreeTypeName() { return "VS2010"; } + + bool isDefaultFormatForCurrentOS() { return false; } + void launchProject() { getSLNFile().startAsProcess(); } + + static MSVCProjectExporterVC2010* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName())) + return new MSVCProjectExporterVC2010 (project, settings); + + return 0; + } + + //============================================================================== + const String create() + { + createIconFile(); + + { + XmlElement projectXml ("Project"); + fillInProjectXml (projectXml); + + MemoryOutputStream mo; + projectXml.writeToStream (mo, String::empty, false, true, "utf-8", 100); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getVCProjFile(), mo)) + return "Can't write to the VC project file: " + getVCProjFile().getFullPathName(); + } + + { + XmlElement filtersXml ("Project"); + fillInFiltersXml (filtersXml); + + MemoryOutputStream mo; + filtersXml.writeToStream (mo, String::empty, false, true, "utf-8", 100); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getVCProjFiltersFile(), mo)) + return "Can't write to the VC project file: " + getVCProjFiltersFile().getFullPathName(); + } + + { + MemoryOutputStream mo; + writeSolutionFile (mo, "11.00", getVCProjFile()); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (getSLNFile(), mo)) + return "Can't write to the VC solution file: " + getSLNFile().getFullPathName(); + } + + return String::empty; + } + +protected: + const File getVCProjFile() const { return getProjectFile (".vcxproj"); } + const File getVCProjFiltersFile() const { return getProjectFile (".vcxproj.filters"); } + const File getSLNFile() const { return getProjectFile (".sln"); } + + static const String createConfigName (const Project::BuildConfiguration& config) + { + return config.getName().toString() + "|Win32"; + } + + static void setConditionAttribute (XmlElement& xml, const Project::BuildConfiguration& config) + { + xml.setAttribute ("Condition", "'$(Configuration)|$(Platform)'=='" + createConfigName (config) + "'"); + } + + //============================================================================== + void fillInProjectXml (XmlElement& projectXml) + { + projectXml.setAttribute ("DefaultTargets", "Build"); + projectXml.setAttribute ("ToolsVersion", "4.0"); + projectXml.setAttribute ("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); + + { + XmlElement* configsGroup = projectXml.createNewChildElement ("ItemGroup"); + configsGroup->setAttribute ("Label", "ProjectConfigurations"); + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + + XmlElement* e = configsGroup->createNewChildElement ("ProjectConfiguration"); + e->setAttribute ("Include", createConfigName (config)); + e->createNewChildElement ("Configuration")->addTextElement (config.getName().toString()); + e->createNewChildElement ("Platform")->addTextElement ("Win32"); + } + } + + { + XmlElement* globals = projectXml.createNewChildElement ("PropertyGroup"); + globals->setAttribute ("Label", "Globals"); + globals->createNewChildElement ("ProjectGuid")->addTextElement (projectGUID); + } + + { + XmlElement* imports = projectXml.createNewChildElement ("Import"); + imports->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props"); + } + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + + XmlElement* e = projectXml.createNewChildElement ("PropertyGroup"); + setConditionAttribute (*e, config); + e->setAttribute ("Label", "Configuration"); + e->createNewChildElement ("ConfigurationType")->addTextElement (getProjectType()); + e->createNewChildElement ("UseOfMfc")->addTextElement ("false"); + e->createNewChildElement ("CharacterSet")->addTextElement ("MultiByte"); + + if (! config.isDebug().getValue()) + e->createNewChildElement ("WholeProgramOptimization")->addTextElement ("true"); + } + + { + XmlElement* e = projectXml.createNewChildElement ("Import"); + e->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.props"); + } + + { + XmlElement* e = projectXml.createNewChildElement ("ImportGroup"); + e->setAttribute ("Label", "ExtensionSettings"); + } + + { + XmlElement* e = projectXml.createNewChildElement ("ImportGroup"); + e->setAttribute ("Label", "PropertySheets"); + XmlElement* p = e->createNewChildElement ("Import"); + p->setAttribute ("Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props"); + p->setAttribute ("Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')"); + p->setAttribute ("Label", "LocalAppDataPlatform"); + } + + { + XmlElement* e = projectXml.createNewChildElement ("PropertyGroup"); + e->setAttribute ("Label", "UserMacros"); + } + + { + XmlElement* props = projectXml.createNewChildElement ("PropertyGroup"); + props->createNewChildElement ("_ProjectFileVersion")->addTextElement ("10.0.30319.1"); + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + + XmlElement* outdir = props->createNewChildElement ("OutDir"); + setConditionAttribute (*outdir, config); + outdir->addTextElement (getConfigTargetPath (config) + "\\"); + + XmlElement* intdir = props->createNewChildElement ("IntDir"); + setConditionAttribute (*intdir, config); + intdir->addTextElement (getConfigTargetPath (config) + "\\"); + + XmlElement* name = props->createNewChildElement ("TargetName"); + setConditionAttribute (*name, config); + name->addTextElement (getBinaryFileForConfig (config).upToLastOccurrenceOf (".", false, false)); + } + } + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + String binariesPath (getConfigTargetPath (config)); + String intermediatesPath (getIntermediatesPath (config)); + const bool isDebug = (bool) config.isDebug().getValue(); + const String binaryName (File::createLegalFileName (config.getTargetBinaryName().toString())); + const String outputFileName (getBinaryFileForConfig (config)); + + XmlElement* group = projectXml.createNewChildElement ("ItemDefinitionGroup"); + setConditionAttribute (*group, config); + + XmlElement* midl = group->createNewChildElement ("Midl"); + midl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (isDebug ? "_DEBUG;%(PreprocessorDefinitions)" + : "NDEBUG;%(PreprocessorDefinitions)"); + midl->createNewChildElement ("MkTypLibCompatible")->addTextElement ("true"); + midl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); + midl->createNewChildElement ("TargetEnvironment")->addTextElement ("Win32"); + //midl->createNewChildElement ("TypeLibraryName")->addTextElement (""); + midl->createNewChildElement ("HeaderFileName"); + + XmlElement* cl = group->createNewChildElement ("ClCompile"); + cl->createNewChildElement ("Optimization")->addTextElement (isDebug ? "Disabled" : "MaxSpeed"); + + if (isDebug) + cl->createNewChildElement ("DebugInformationFormat")->addTextElement ("EditAndContinue"); + + StringArray includePaths (getHeaderSearchPaths (config)); + includePaths.add ("%(AdditionalIncludeDirectories)"); + cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); + cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"); + cl->createNewChildElement ("RuntimeLibrary")->addTextElement (isRTAS() ? (isDebug ? "MultiThreadedDLLDebug" : "MultiThreadedDLL") + : (isDebug ? "MultiThreadedDebug" : "MultiThreaded")); + cl->createNewChildElement ("RuntimeTypeInfo")->addTextElement ("true"); + cl->createNewChildElement ("PrecompiledHeader"); + cl->createNewChildElement ("AssemblerListingLocation")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/")); + cl->createNewChildElement ("ObjectFileName")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/")); + cl->createNewChildElement ("ProgramDataBaseFileName")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/")); + cl->createNewChildElement ("WarningLevel")->addTextElement ("Level4"); + cl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); + + XmlElement* res = group->createNewChildElement ("ResourceCompile"); + res->createNewChildElement ("PreprocessorDefinitions")->addTextElement (isDebug ? "_DEBUG;%(PreprocessorDefinitions)" + : "NDEBUG;%(PreprocessorDefinitions)"); + + XmlElement* link = group->createNewChildElement ("Link"); + link->createNewChildElement ("OutputFile")->addTextElement (FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName)); + link->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); + link->createNewChildElement ("IgnoreSpecificDefaultLibraries")->addTextElement (isDebug ? "libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)" + : "%(IgnoreSpecificDefaultLibraries)"); + link->createNewChildElement ("GenerateDebugInformation")->addTextElement (isDebug ? "true" : "false"); + link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".pdb")); + link->createNewChildElement ("SubSystem")->addTextElement (project.isCommandLineApp() ? "Console" : "Windows"); + link->createNewChildElement ("TargetMachine")->addTextElement ("MachineX86"); + + if (! isDebug) + { + link->createNewChildElement ("OptimizeReferences")->addTextElement ("true"); + link->createNewChildElement ("EnableCOMDATFolding")->addTextElement ("true"); + } + + XmlElement* bsc = group->createNewChildElement ("Bscmake"); + bsc->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); + bsc->createNewChildElement ("OutputFile")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".bsc")); + } + + { + XmlElement* cppFiles = projectXml.createNewChildElement ("ItemGroup"); + XmlElement* headerFiles = projectXml.createNewChildElement ("ItemGroup"); + + addFilesToCompile (project.getMainGroup(), *cppFiles, *headerFiles); + addFilesToCompile (juceWrapperFiles, *cppFiles, *headerFiles, false); + addFilesToCompile (getVSTFilesRequired(), *cppFiles, *headerFiles, false); + addFilesToCompile (getRTASFilesRequired(), *cppFiles, *headerFiles, true); + } + + if (hasIcon) + { + { + XmlElement* iconGroup = projectXml.createNewChildElement ("ItemGroup"); + XmlElement* e = iconGroup->createNewChildElement ("None"); + e->setAttribute ("Include", ".\\" + iconFile.getFileName()); + } + + { + XmlElement* rcGroup = projectXml.createNewChildElement ("ItemGroup"); + XmlElement* e = rcGroup->createNewChildElement ("ResourceCompile"); + e->setAttribute ("Include", ".\\" + rcFile.getFileName()); + } + } + + { + XmlElement* e = projectXml.createNewChildElement ("Import"); + e->setAttribute ("Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets"); + } + + { + XmlElement* e = projectXml.createNewChildElement ("ImportGroup"); + e->setAttribute ("Label", "ExtensionTargets"); + } + } + + const String getProjectType() const + { + if (project.isGUIApplication() || project.isCommandLineApp()) + return "Application"; + else if (project.isAudioPlugin() || project.isBrowserPlugin()) + return "DynamicLibrary"; + else if (project.isLibrary()) + return "StaticLibrary"; + + jassertfalse; + return String::empty; + } + + //============================================================================== + void addFileToCompile (const RelativePath& file, XmlElement& cpps, XmlElement& headers, const bool excludeFromBuild, const bool useStdcall) + { + jassert (file.getRoot() == RelativePath::buildTargetFolder); + + if (file.hasFileExtension ("cpp;cc;cxx;c")) + { + XmlElement* e = cpps.createNewChildElement ("ClCompile"); + e->setAttribute ("Include", file.toWindowsStyle()); + + if (excludeFromBuild) + e->createNewChildElement ("ExcludedFromBuild")->addTextElement ("true"); + + if (useStdcall) + { + jassertfalse; + } + } + else if (file.hasFileExtension (headerFileExtensions)) + { + headers.createNewChildElement ("ClInclude")->setAttribute ("Include", file.toWindowsStyle()); + } + } + + void addFilesToCompile (const Array<RelativePath>& files, XmlElement& cpps, XmlElement& headers, bool useStdCall) + { + for (int i = 0; i < files.size(); ++i) + addFileToCompile (files.getReference(i), cpps, headers, false, + useStdCall && shouldFileBeCompiledByDefault (files.getReference(i))); + } + + void addFilesToCompile (const Project::Item& projectItem, XmlElement& cpps, XmlElement& headers) + { + if (projectItem.isGroup()) + { + for (int i = 0; i < projectItem.getNumChildren(); ++i) + addFilesToCompile (projectItem.getChild(i), cpps, headers); + } + else + { + if (projectItem.shouldBeAddedToTargetProject()) + { + const RelativePath path (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder); + + if (path.hasFileExtension (headerFileExtensions) || (path.hasFileExtension ("cpp;cc;c;cxx") && projectItem.shouldBeCompiled())) + addFileToCompile (path, cpps, headers, false, false); + } + } + } + + //============================================================================== + void addFilterGroup (XmlElement& groups, const String& path) + { + XmlElement* e = groups.createNewChildElement ("Filter"); + e->setAttribute ("Include", path); + e->createNewChildElement ("UniqueIdentifier")->addTextElement (createGUID (path + "_guidpathsaltxhsdf")); + } + + void addFileToFilter (const RelativePath& file, const String& groupPath, XmlElement& cpps, XmlElement& headers) + { + XmlElement* e; + + if (file.hasFileExtension (headerFileExtensions)) + e = headers.createNewChildElement ("ClInclude"); + else + e = cpps.createNewChildElement ("ClCompile"); + + jassert (file.getRoot() == RelativePath::buildTargetFolder); + e->setAttribute ("Include", file.toWindowsStyle()); + e->createNewChildElement ("Filter")->addTextElement (groupPath); + } + + void addFilesToFilter (const Project::Item& projectItem, const String& path, XmlElement& cpps, XmlElement& headers, XmlElement& groups) + { + if (projectItem.isGroup()) + { + addFilterGroup (groups, path); + + for (int i = 0; i < projectItem.getNumChildren(); ++i) + addFilesToFilter (projectItem.getChild(i), + (path.isEmpty() ? String::empty : (path + "\\")) + projectItem.getChild(i).getName().toString(), + cpps, headers, groups); + } + else + { + if (projectItem.shouldBeAddedToTargetProject()) + { + addFileToFilter (RelativePath (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder), + path.upToLastOccurrenceOf ("\\", false, false), cpps, headers); + } + } + } + + void addFilesToFilter (const Array<RelativePath>& files, const String& path, XmlElement& cpps, XmlElement& headers, XmlElement& groups) + { + if (files.size() > 0) + { + addFilterGroup (groups, path); + + for (int i = 0; i < files.size(); ++i) + addFileToFilter (files.getReference(i), path, cpps, headers); + } + } + + void fillInFiltersXml (XmlElement& filterXml) + { + filterXml.setAttribute ("ToolsVersion", "4.0"); + filterXml.setAttribute ("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003"); + + XmlElement* groups = filterXml.createNewChildElement ("ItemGroup"); + XmlElement* cpps = filterXml.createNewChildElement ("ItemGroup"); + XmlElement* headers = filterXml.createNewChildElement ("ItemGroup"); + + addFilesToFilter (project.getMainGroup(), project.getProjectName().toString(), *cpps, *headers, *groups); + + addFilesToFilter (juceWrapperFiles, project.getJuceCodeGroupName(), *cpps, *headers, *groups); + addFilesToFilter (getVSTFilesRequired(), "Juce VST Wrapper", *cpps, *headers, *groups); + addFilesToFilter (getRTASFilesRequired(), "Juce RTAS Wrapper", *cpps, *headers, *groups); + + if (iconFile.exists()) + { + { + XmlElement* iconGroup = filterXml.createNewChildElement ("ItemGroup"); + XmlElement* e = iconGroup->createNewChildElement ("None"); + e->setAttribute ("Include", ".\\" + iconFile.getFileName()); + e->createNewChildElement ("Filter")->addTextElement (project.getJuceCodeGroupName()); + } + + { + XmlElement* rcGroup = filterXml.createNewChildElement ("ItemGroup"); + XmlElement* e = rcGroup->createNewChildElement ("ResourceCompile"); + e->setAttribute ("Include", ".\\" + rcFile.getFileName()); + e->createNewChildElement ("Filter")->addTextElement (project.getJuceCodeGroupName()); + } + } + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2010); +}; + + +#endif // __JUCER_PROJECTEXPORT_MSVC_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_Make.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_Make.h new file mode 100755 index 000000000..1d6833c4c --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_Make.h @@ -0,0 +1,356 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTEXPORT_MAKE_JUCEHEADER__ +#define __JUCER_PROJECTEXPORT_MAKE_JUCEHEADER__ + +#include "jucer_ProjectExporter.h" + + +//============================================================================== +class MakefileProjectExporter : public ProjectExporter +{ +public: + //============================================================================== + static const char* getNameLinux() { return "Linux Makefile"; } + static const char* getValueTreeTypeName() { return "LINUX_MAKE"; } + + static MakefileProjectExporter* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName())) + return new MakefileProjectExporter (project, settings); + + return 0; + } + + + //============================================================================== + MakefileProjectExporter (Project& project_, const ValueTree& settings_) + : ProjectExporter (project_, settings_) + { + name = getNameLinux(); + + if (getTargetLocation().toString().isEmpty()) + getTargetLocation() = getDefaultBuildsRootFolder() + "Linux"; + + if (getVSTFolder().toString().isEmpty()) + getVSTFolder() = "~/SDKs/vstsdk2.4"; + } + + ~MakefileProjectExporter() + { + } + + //============================================================================== + bool isDefaultFormatForCurrentOS() + { + #if JUCE_LINUX + return true; + #else + return false; + #endif + } + + bool isPossibleForCurrentProject() { return true; } + bool usesMMFiles() const { return false; } + + void launchProject() + { + // what to do on linux? + } + + void createPropertyEditors (Array <PropertyComponent*>& props) + { + ProjectExporter::createPropertyEditors (props); + } + + //============================================================================== + const String create() + { + Array<RelativePath> files; + findAllFilesToCompile (project.getMainGroup(), files); + + for (int i = 0; i < juceWrapperFiles.size(); ++i) + if (shouldFileBeCompiledByDefault (juceWrapperFiles.getReference(i))) + files.add (juceWrapperFiles.getReference(i)); + + const Array<RelativePath> vstFiles (getVSTFilesRequired()); + for (int i = 0; i < vstFiles.size(); i++) + files.add (vstFiles.getReference(i)); + + MemoryOutputStream mo; + writeMakefile (mo, files); + + const File makefile (getTargetFolder().getChildFile ("Makefile")); + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (makefile, mo)) + return "Can't write to the Makefile: " + makefile.getFullPathName(); + + return String::empty; + } + +private: + //============================================================================== + void findAllFilesToCompile (const Project::Item& projectItem, Array<RelativePath>& results) + { + 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)); + } + } + + void writeDefineFlags (OutputStream& out, const Project::BuildConfiguration& config) + { + StringPairArray defines; + defines.set ("LINUX", "1"); + + if (config.isDebug().getValue()) + { + defines.set ("DEBUG", "1"); + defines.set ("_DEBUG", "1"); + } + else + { + defines.set ("NDEBUG", "1"); + } + + defines = mergePreprocessorDefs (defines, getAllPreprocessorDefs (config)); + + for (int i = 0; i < defines.size(); ++i) + { + String def (defines.getAllKeys()[i]); + const String value (defines.getAllValues()[i]); + if (value.isNotEmpty()) + def << "=" << value; + + out << " -D " << def.quoted(); + } + } + + void writeHeaderPathFlags (OutputStream& out, const Project::BuildConfiguration& config) + { + StringArray headerPaths (config.getHeaderSearchPaths()); + headerPaths.insert (0, "/usr/include/freetype2"); + headerPaths.insert (0, "/usr/include"); + + if (project.shouldAddVSTFolderToPath() && getVSTFolder().toString().isNotEmpty()) + headerPaths.insert (0, rebaseFromProjectFolderToBuildTarget (RelativePath (getVSTFolder().toString(), RelativePath::projectFolder)).toUnixStyle()); + + if (isVST()) + headerPaths.insert (0, juceWrapperFolder.toUnixStyle()); + + for (int i = 0; i < headerPaths.size(); ++i) + out << " -I " << FileHelpers::unixStylePath (replacePreprocessorTokens (config, headerPaths[i])).quoted(); + } + + void writeCppFlags (OutputStream& out, const Project::BuildConfiguration& config) + { + out << " CPPFLAGS := $(DEPFLAGS)"; + writeDefineFlags (out, config); + writeHeaderPathFlags (out, config); + out << newLine; + } + + void writeLinkerFlags (OutputStream& out, const Project::BuildConfiguration& config) + { + out << " LDFLAGS += -L$(BINDIR) -L$(LIBDIR)"; + + if (project.isAudioPlugin()) + out << " -shared"; + + { + Array<RelativePath> libraryPaths; + libraryPaths.add (RelativePath ("/usr/X11R6/lib/", RelativePath::unknown)); + libraryPaths.add (getJucePathFromTargetFolder().getChildFile ("bin")); + + for (int i = 0; i < libraryPaths.size(); ++i) + out << " -L" << libraryPaths.getReference(i).toUnixStyle().quoted(); + } + + const char* defaultLibs[] = { "freetype", "pthread", "rt", "X11", "GL", "GLU", "Xinerama", "asound", 0 }; + StringArray libs (defaultLibs); + + if (project.getJuceLinkageMode() == Project::useLinkedJuce) + libs.add ("juce"); + + for (int i = 0; i < libs.size(); ++i) + out << " -l" << libs[i]; + + out << " " << replacePreprocessorTokens (config, getExtraLinkerFlags().toString()).trim() + << newLine; + } + + void writeConfig (OutputStream& out, const Project::BuildConfiguration& config) + { + const String buildDirName ("build"); + const String intermediatesDirName (buildDirName + "/intermediate/" + config.getName().toString()); + String outputDir (buildDirName); + + if (config.getTargetBinaryRelativePath().toString().isNotEmpty()) + { + RelativePath binaryPath (config.getTargetBinaryRelativePath().toString(), RelativePath::projectFolder); + outputDir = binaryPath.rebased (project.getFile().getParentDirectory(), getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle(); + } + + out << "ifeq ($(CONFIG)," << escapeSpaces (config.getName().toString()) << ")" << newLine; + out << " BINDIR := " << escapeSpaces (buildDirName) << newLine + << " LIBDIR := " << escapeSpaces (buildDirName) << newLine + << " OBJDIR := " << escapeSpaces (intermediatesDirName) << newLine + << " OUTDIR := " << escapeSpaces (outputDir) << newLine; + + writeCppFlags (out, config); + + out << " CFLAGS += $(CPPFLAGS) $(TARGET_ARCH)"; + + if (config.isDebug().getValue()) + out << " -g -ggdb"; + + if (project.isAudioPlugin()) + out << " -fPIC"; + + out << " -O" << config.getGCCOptimisationFlag() << newLine; + + out << " CXXFLAGS += $(CFLAGS) " << replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim() << newLine; + + writeLinkerFlags (out, config); + + out << " LDDEPS :=" << newLine + << " RESFLAGS := "; + writeDefineFlags (out, config); + writeHeaderPathFlags (out, config); + out << newLine; + + String targetName (config.getTargetBinaryName().getValue().toString()); + + if (project.isLibrary()) + targetName = getLibbedFilename (targetName); + else if (isVST()) + targetName = targetName.upToLastOccurrenceOf (".", false, false) + ".so"; + + out << " TARGET := " << escapeSpaces (targetName) << newLine; + + if (project.isLibrary()) + out << " BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH)" << newLine; + else + out << " BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)" << newLine; + + out << "endif" << newLine << newLine; + } + + void writeObjects (OutputStream& out, const Array<RelativePath>& files) + { + out << "OBJECTS := \\" << newLine; + + for (int i = 0; i < files.size(); ++i) + if (shouldFileBeCompiledByDefault (files.getReference(i))) + out << " $(OBJDIR)/" << escapeSpaces (getObjectFileFor (files.getReference(i))) << " \\" << newLine; + + out << newLine; + } + + void writeMakefile (OutputStream& out, const Array<RelativePath>& files) + { + out << "# Automatically generated makefile, created by the Jucer" << newLine + << "# Don't edit this file! Your changes will be overwritten when you re-save the Jucer project!" << newLine + << newLine; + + out << "ifndef CONFIG" << newLine + << " CONFIG=" << escapeSpaces (project.getConfiguration(0).getName().toString()) << newLine + << "endif" << newLine + << newLine; + + if (! project.isLibrary()) + out << "ifeq ($(TARGET_ARCH),)" << newLine + << " TARGET_ARCH := -march=native" << newLine + << "endif" << newLine << newLine; + + out << "# (this disables dependency generation if multiple architectures are set)" << newLine + << "DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)" << newLine + << newLine; + + int i; + for (i = 0; i < project.getNumConfigurations(); ++i) + writeConfig (out, project.getConfiguration(i)); + + writeObjects (out, files); + + out << ".PHONY: clean" << newLine + << newLine; + + out << "$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES)" << newLine + << "\t@echo Linking " << project.getProjectName() << newLine + << "\t-@mkdir -p $(BINDIR)" << newLine + << "\t-@mkdir -p $(LIBDIR)" << newLine + << "\t-@mkdir -p $(OUTDIR)" << newLine + << "\t@$(BLDCMD)" << newLine + << newLine; + + out << "clean:" << newLine + << "\t@echo Cleaning " << project.getProjectName() << newLine + << "\t-@rm -f $(OUTDIR)/$(TARGET)" << newLine + << "\t-@rm -rf $(OBJDIR)/*" << newLine + << "\t-@rm -rf $(OBJDIR)" << newLine + << newLine; + + for (i = 0; i < files.size(); ++i) + { + if (shouldFileBeCompiledByDefault (files.getReference(i))) + { + jassert (files.getReference(i).getRoot() == RelativePath::buildTargetFolder); + + out << "$(OBJDIR)/" << escapeSpaces (getObjectFileFor (files.getReference(i))) + << ": " << escapeSpaces (files.getReference(i).toUnixStyle()) << newLine + << "\t-@mkdir -p $(OBJDIR)" << newLine + << "\t@echo \"Compiling " << files.getReference(i).getFileName() << "\"" << newLine + << (files.getReference(i).hasFileExtension (".c") ? "\t@$(CC) $(CFLAGS) -o \"$@\" -c \"$<\"" + : "\t@$(CXX) $(CXXFLAGS) -o \"$@\" -c \"$<\"") + << newLine << newLine; + } + } + + out << "-include $(OBJECTS:%.o=%.d)" << newLine; + } + + static const String escapeSpaces (const String& s) + { + return s.replace (" ", "\\ "); + } + + const String getObjectFileFor (const RelativePath& file) const + { + return file.getFileNameWithoutExtension() + + "_" + String::toHexString (file.toUnixStyle().hashCode()) + ".o"; + } + + JUCE_DECLARE_NON_COPYABLE (MakefileProjectExporter); +}; + + +#endif // __JUCER_PROJECTEXPORT_MAKE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_XCode.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_XCode.h new file mode 100755 index 000000000..f2b4dd38d --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExport_XCode.h @@ -0,0 +1,1194 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTEXPORT_XCODE_JUCEHEADER__ +#define __JUCER_PROJECTEXPORT_XCODE_JUCEHEADER__ + +#include "jucer_ProjectExporter.h" + + +//============================================================================== +class XCodeProjectExporter : public ProjectExporter +{ +public: + //============================================================================== + static const char* getNameMac() { return "XCode (MacOSX)"; } + static const char* getNameiOS() { return "XCode (iOS)"; } + static const char* getValueTreeTypeName (bool iPhone) { return iPhone ? "XCODE_IPHONE" : "XCODE_MAC"; } + + //============================================================================== + XCodeProjectExporter (Project& project_, const ValueTree& settings_, const bool iPhone_) + : ProjectExporter (project_, settings_), + iPhone (iPhone_) + { + name = iPhone ? getNameiOS() : getNameMac(); + + projectIDSalt = hashCode64 (project.getProjectUID()); + + if (getTargetLocation().toString().isEmpty()) + getTargetLocation() = getDefaultBuildsRootFolder() + (iPhone ? "iOS" : "MacOSX"); + + if (getVSTFolder().toString().isEmpty()) + getVSTFolder() = "~/SDKs/vstsdk2.4"; + + if (getRTASFolder().toString().isEmpty()) + getRTASFolder() = "~/SDKs/PT_80_SDK"; + } + + ~XCodeProjectExporter() + { + } + + static XCodeProjectExporter* createForSettings (Project& project, const ValueTree& settings) + { + if (settings.hasType (getValueTreeTypeName (false))) + return new XCodeProjectExporter (project, settings, false); + else if (settings.hasType (getValueTreeTypeName (true))) + return new XCodeProjectExporter (project, settings, true); + + return 0; + } + + //============================================================================== + bool isDefaultFormatForCurrentOS() + { + #if JUCE_MAC + return ! iPhone; + #else + return false; + #endif + } + + bool isPossibleForCurrentProject() { return project.isGUIApplication() || ! iPhone; } + bool usesMMFiles() const { return true; } + + void createPropertyEditors (Array <PropertyComponent*>& props) + { + ProjectExporter::createPropertyEditors (props); + + props.add (new TextPropertyComponent (getSetting ("objCExtraSuffix"), "Objective-C class name suffix", 64, false)); + props.getLast()->setTooltip ("Because objective-C linkage is done by string-matching, you can get horrible linkage mix-ups when different modules containing the " + "same class-names are loaded simultaneously. This setting lets you provide a unique string that will be used in naming the obj-C classes in your executable to avoid this."); + + if (project.isGUIApplication() && ! iPhone) + { + props.add (new TextPropertyComponent (getSetting ("documentExtensions"), "Document file extensions", 128, false)); + props.getLast()->setTooltip ("A comma-separated list of file extensions for documents that your app can open."); + } + } + + void launchProject() + { + getProjectBundle().startAsProcess(); + } + + //============================================================================== + const String create() + { + infoPlistFile = getTargetFolder().getChildFile ("Info.plist"); + + if (! createIconFile()) + return "Can't write the icon file"; + + File projectBundle (getProjectBundle()); + if (! projectBundle.createDirectory()) + return "Can't write to the target directory"; + + createObjects(); + + File projectFile (projectBundle.getChildFile ("project.pbxproj")); + + { + MemoryOutputStream mo; + writeProjectFile (mo); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (projectFile, mo)) + return "Can't write to file: " + projectFile.getFullPathName(); + } + + if (! writeInfoPlistFile()) + return "Can't write the Info.plist file"; + + return String::empty; + } + +private: + OwnedArray<ValueTree> pbxBuildFiles, pbxFileReferences, groups, misc, projectConfigs, targetConfigs; + StringArray buildPhaseIDs, resourceIDs, sourceIDs, frameworkIDs; + StringArray frameworkFileIDs, rezFileIDs, resourceFileRefs; + File infoPlistFile, iconFile; + int64 projectIDSalt; + const bool iPhone; + + static const String sanitisePath (const String& path) + { + if (path.startsWithChar ('~')) + return "$(HOME)" + path.substring (1); + + return path; + } + + const File getProjectBundle() const { return getTargetFolder().getChildFile (project.getProjectFilenameRoot()).withFileExtension (".xcodeproj"); } + + bool hasPList() const { return ! (project.isLibrary() || project.isCommandLineApp()); } + const String getAudioPluginBundleExtension() const { return "component"; } + + //============================================================================== + void createObjects() + { + if (! project.isLibrary()) + addFrameworks(); + + const String productName (project.getConfiguration (0).getTargetBinaryName().toString()); + if (project.isGUIApplication()) + addBuildProduct ("wrapper.application", productName + ".app"); + else if (project.isCommandLineApp()) + addBuildProduct ("compiled.mach-o.executable", productName); + else if (project.isLibrary()) + addBuildProduct ("archive.ar", getLibbedFilename (productName)); + else if (project.isAudioPlugin()) + addBuildProduct ("wrapper.cfbundle", productName + "." + getAudioPluginBundleExtension()); + else if (project.isBrowserPlugin()) + addBuildProduct ("wrapper.cfbundle", productName + ".plugin"); + else + jassert (productName.isEmpty()); + + if (hasPList()) + { + RelativePath plistPath (infoPlistFile, getTargetFolder(), RelativePath::buildTargetFolder); + addFileReference (plistPath); + resourceFileRefs.add (createID (plistPath)); + } + + if (iconFile.exists()) + { + RelativePath iconPath (iconFile, getTargetFolder(), RelativePath::buildTargetFolder); + addFileReference (iconPath); + resourceIDs.add (addBuildFile (iconPath, false, false)); + resourceFileRefs.add (createID (iconPath)); + } + + addProjectItem (project.getMainGroup()); + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + + addProjectConfig (config.getName().getValue(), getProjectSettings (config)); + addTargetConfig (config.getName().getValue(), getTargetSettings (config)); + } + + addConfigList (projectConfigs, createID ("__projList")); + addConfigList (targetConfigs, createID ("__configList")); + + if (! project.isLibrary()) + addBuildPhase ("PBXResourcesBuildPhase", resourceIDs); + + if (rezFileIDs.size() > 0) + addBuildPhase ("PBXRezBuildPhase", rezFileIDs); + + addBuildPhase ("PBXSourcesBuildPhase", sourceIDs); + + if (! project.isLibrary()) + addBuildPhase ("PBXFrameworksBuildPhase", frameworkIDs); + + if (project.isAudioPlugin()) + addPluginShellScriptPhase(); + + addTargetObject(); + addProjectObject(); + } + + static const Image fixMacIconImageSize (Image& image) + { + const int w = image.getWidth(); + const int h = image.getHeight(); + + if (w != h || (w != 16 && w != 32 && w != 48 && w != 64)) + { + const int newSize = w >= 128 ? 128 : (w >= 64 ? 64 : (w >= 32 ? 32 : 16)); + Image newIm (Image::ARGB, newSize, newSize, true); + Graphics g (newIm); + g.drawImageWithin (image, 0, 0, newSize, newSize, + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, false); + return newIm; + } + + return image; + } + + void writeIcnsFile (const Array<Image>& images, OutputStream& out) + { + MemoryOutputStream data; + + for (int i = 0; i < images.size(); ++i) + { + Image image (fixMacIconImageSize (images.getReference (i))); + + const int w = image.getWidth(); + const int h = image.getHeight(); + + const char* type = 0; + const char* maskType = 0; + + if (w == h) + { + if (w == 16) { type = "is32"; maskType = "s8mk"; } + if (w == 32) { type = "il32"; maskType = "l8mk"; } + if (w == 48) { type = "ih32"; maskType = "h8mk"; } + if (w == 128) { type = "it32"; maskType = "t8mk"; } + } + + if (type != 0) + { + data.write (type, 4); + data.writeIntBigEndian (8 + 4 * w * h); + + const Image::BitmapData bitmap (image, false); + + int y; + for (y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const Colour pixel (bitmap.getPixelColour (x, y)); + data.writeByte ((char) pixel.getAlpha()); + data.writeByte ((char) pixel.getRed()); + data.writeByte ((char) pixel.getGreen()); + data.writeByte ((char) pixel.getBlue()); + } + } + + data.write (maskType, 4); + data.writeIntBigEndian (8 + w * h); + + for (y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const Colour pixel (bitmap.getPixelColour (x, y)); + data.writeByte ((char) pixel.getAlpha()); + } + } + } + } + + jassert (data.getDataSize() > 0); // no suitable sized images? + + out.write ("icns", 4); + out.writeIntBigEndian (data.getDataSize() + 8); + out << data; + } + + bool createIconFile() + { + Array<Image> images; + + Image bigIcon (project.getBigIcon()); + if (bigIcon.isValid()) + images.add (bigIcon); + + Image smallIcon (project.getSmallIcon()); + if (smallIcon.isValid()) + images.add (smallIcon); + + if (images.size() == 0) + return true; + + MemoryOutputStream mo; + writeIcnsFile (images, mo); + + iconFile = getTargetFolder().getChildFile ("Icon.icns"); + return FileHelpers::overwriteFileWithNewDataIfDifferent (iconFile, mo); + } + + bool writeInfoPlistFile() + { + if (! hasPList()) + return true; + + XmlElement plist ("plist"); + XmlElement* dict = plist.createNewChildElement ("dict"); + + addPlistDictionaryKey (dict, "CFBundleExecutable", "${EXECUTABLE_NAME}"); + addPlistDictionaryKey (dict, "CFBundleIconFile", iconFile.exists() ? iconFile.getFileName() : String::empty); + addPlistDictionaryKey (dict, "CFBundleIdentifier", project.getBundleIdentifier().toString()); + addPlistDictionaryKey (dict, "CFBundleName", project.getProjectName().toString()); + + if (project.isAudioPlugin()) + { + addPlistDictionaryKey (dict, "CFBundlePackageType", "TDMw"); + addPlistDictionaryKey (dict, "CFBundleSignature", "PTul"); + } + else + { + addPlistDictionaryKey (dict, "CFBundlePackageType", "APPL"); + addPlistDictionaryKey (dict, "CFBundleSignature", "????"); + } + + addPlistDictionaryKey (dict, "CFBundleShortVersionString", project.getVersion().toString()); + addPlistDictionaryKey (dict, "CFBundleVersion", project.getVersion().toString()); + + StringArray documentExtensions; + documentExtensions.addTokens (replacePreprocessorDefs (project.getPreprocessorDefs(), getSetting ("documentExtensions").toString()), + ",", String::empty); + documentExtensions.trim(); + documentExtensions.removeEmptyStrings (true); + + if (documentExtensions.size() > 0) + { + dict->createNewChildElement ("key")->addTextElement ("CFBundleDocumentTypes"); + XmlElement* dict2 = dict->createNewChildElement ("array")->createNewChildElement ("dict"); + + for (int i = 0; i < documentExtensions.size(); ++i) + { + String ex (documentExtensions[i]); + if (ex.startsWithChar ('.')) + ex = ex.substring (1); + + dict2->createNewChildElement ("key")->addTextElement ("CFBundleTypeExtensions"); + dict2->createNewChildElement ("array")->createNewChildElement ("string")->addTextElement (ex); + addPlistDictionaryKey (dict2, "CFBundleTypeName", ex); + addPlistDictionaryKey (dict2, "CFBundleTypeRole", "Editor"); + addPlistDictionaryKey (dict2, "NSPersistentStoreTypeKey", "XML"); + } + } + + MemoryOutputStream mo; + plist.writeToStream (mo, "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"); + + return FileHelpers::overwriteFileWithNewDataIfDifferent (infoPlistFile, mo); + } + + const StringArray getHeaderSearchPaths (const Project::BuildConfiguration& config) + { + StringArray searchPaths (config.getHeaderSearchPaths()); + + if (project.shouldAddVSTFolderToPath() && getVSTFolder().toString().isNotEmpty()) + searchPaths.add (rebaseFromProjectFolderToBuildTarget (RelativePath (getVSTFolder().toString(), RelativePath::projectFolder)).toUnixStyle()); + + if (project.isAudioPlugin()) + { + if (isAU()) + { + searchPaths.add ("$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility"); + searchPaths.add ("$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility"); + } + + if (isRTAS()) + { + searchPaths.add ("/Developer/Headers/FlatCarbon"); + + static const char* rtasIncludePaths[] = { "AlturaPorts/TDMPlugIns/PlugInLibrary/Controls", + "AlturaPorts/TDMPlugIns/PlugInLibrary/CoreClasses", + "AlturaPorts/TDMPlugIns/PlugInLibrary/DSPClasses", + "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses", + "AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild", + "AlturaPorts/TDMPlugIns/PlugInLibrary/Meters", + "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses", + "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses/Interfaces", + "AlturaPorts/TDMPlugIns/PlugInLibrary/RTASP_Adapt", + "AlturaPorts/TDMPlugIns/PlugInLibrary/Utilities", + "AlturaPorts/TDMPlugIns/PlugInLibrary/ViewClasses", + "AlturaPorts/TDMPlugIns/DSPManager/**", + "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption", + "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions", + "AlturaPorts/TDMPlugIns/common", + "AlturaPorts/TDMPlugIns/common/PI_LibInterface", + "AlturaPorts/TDMPlugIns/PACEProtection/**", + "AlturaPorts/TDMPlugIns/SignalProcessing/**", + "AlturaPorts/OMS/Headers", + "AlturaPorts/Fic/Interfaces/**", + "AlturaPorts/Fic/Source/SignalNets", + "AlturaPorts/DSIPublicInterface/PublicHeaders", + "DAEWin/Include", + "AlturaPorts/DigiPublic/Interfaces", + "AlturaPorts/DigiPublic", + "AlturaPorts/NewFileLibs/DOA", + "AlturaPorts/NewFileLibs/Cmn", + "xplat/AVX/avx2/avx2sdk/inc", + "xplat/AVX/avx2/avx2sdk/utils" }; + + RelativePath sdkFolder (getRTASFolder().toString(), RelativePath::projectFolder); + + for (int i = 0; i < numElementsInArray (rtasIncludePaths); ++i) + searchPaths.add (rebaseFromProjectFolderToBuildTarget (sdkFolder.getChildFile (rtasIncludePaths[i])).toUnixStyle()); + } + } + + return searchPaths; + } + + void getLinkerFlagsForStaticLibrary (const RelativePath& library, StringArray& flags, StringArray& librarySearchPaths) + { + jassert (library.getFileNameWithoutExtension().substring (0, 3) == "lib"); + + flags.add ("-l" + library.getFileNameWithoutExtension().substring (3)); + + String searchPath (library.toUnixStyle().upToLastOccurrenceOf ("/", false, false)); + if (! library.isAbsolute()) + searchPath = "$(SRCROOT)/" + searchPath; + + librarySearchPaths.add (sanitisePath (searchPath)); + } + + void getLinkerFlags (const Project::BuildConfiguration& config, StringArray& flags, StringArray& librarySearchPaths) + { + if (project.isAudioPlugin()) + { + flags.add ("-bundle"); + + if (isRTAS() && getRTASFolder().toString().isNotEmpty()) + { + getLinkerFlagsForStaticLibrary (RelativePath (getRTASFolder().toString(), RelativePath::buildTargetFolder) + .getChildFile (config.isDebug().getValue() ? "MacBag/Libs/Debug/libPluginLibrary.a" + : "MacBag/Libs/Release/libPluginLibrary.a"), + flags, librarySearchPaths); + } + } + + if (project.getJuceLinkageMode() == Project::useLinkedJuce) + { + RelativePath juceLib (getJucePathFromTargetFolder().getChildFile (config.isDebug().getValue() ? "bin/libjucedebug.a" + : "bin/libjuce.a")); + getLinkerFlagsForStaticLibrary (juceLib, flags, librarySearchPaths); + } + + flags.add (replacePreprocessorTokens (config, getExtraLinkerFlags().toString())); + flags.removeEmptyStrings (true); + } + + const StringArray getProjectSettings (const Project::BuildConfiguration& config) + { + StringArray s; + s.add ("ALWAYS_SEARCH_USER_PATHS = NO"); + s.add ("GCC_C_LANGUAGE_STANDARD = c99"); + s.add ("GCC_WARN_ABOUT_RETURN_TYPE = YES"); + s.add ("GCC_WARN_CHECK_SWITCH_STATEMENTS = YES"); + s.add ("GCC_WARN_UNUSED_VARIABLE = YES"); + s.add ("GCC_WARN_MISSING_PARENTHESES = YES"); + s.add ("GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES"); + s.add ("GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES"); + s.add ("WARNING_CFLAGS = -Wreorder"); + s.add ("GCC_MODEL_TUNING = G5"); + + if (project.isLibrary() || project.getJuceLinkageMode() == Project::useLinkedJuce) + { + s.add ("GCC_INLINES_ARE_PRIVATE_EXTERN = NO"); + s.add ("GCC_SYMBOLS_PRIVATE_EXTERN = NO"); + } + else + { + s.add ("GCC_INLINES_ARE_PRIVATE_EXTERN = YES"); + } + + s.add ("ZERO_LINK = NO"); + + if (! isRTAS()) // (dwarf seems to be incompatible with the RTAS libs) + s.add ("DEBUG_INFORMATION_FORMAT = \"dwarf\""); + + s.add ("PRODUCT_NAME = \"" + config.getTargetBinaryName().toString() + "\""); + return s; + } + + const StringArray getTargetSettings (const Project::BuildConfiguration& config) + { + StringArray s; + s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\""); + s.add ("PREBINDING = NO"); + s.add ("HEADER_SEARCH_PATHS = \"" + replacePreprocessorTokens (config, getHeaderSearchPaths (config).joinIntoString (" ")) + " $(inherited)\""); + s.add ("GCC_OPTIMIZATION_LEVEL = " + config.getGCCOptimisationFlag()); + s.add ("INFOPLIST_FILE = " + infoPlistFile.getFileName()); + + const String extraFlags (replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim()); + if (extraFlags.isNotEmpty()) + s.add ("OTHER_CPLUSPLUSFLAGS = " + extraFlags); + + if (project.isGUIApplication()) + { + s.add ("INSTALL_PATH = \"$(HOME)/Applications\""); + } + else if (project.isAudioPlugin()) + { + s.add ("LIBRARY_STYLE = Bundle"); + s.add ("INSTALL_PATH = \"$(HOME)/Library/Audio/Plug-Ins/Components/\""); + s.add ("WRAPPER_EXTENSION = " + getAudioPluginBundleExtension()); + s.add ("GENERATE_PKGINFO_FILE = YES"); + s.add ("OTHER_REZFLAGS = \"-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64" + " -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers" + " -I \\\"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\\\"\""); + } + else if (project.isBrowserPlugin()) + { + s.add ("LIBRARY_STYLE = Bundle"); + s.add ("INSTALL_PATH = \"/Library/Internet Plug-Ins/\""); + } + else if (project.isLibrary()) + { + if (config.getTargetBinaryRelativePath().toString().isNotEmpty()) + { + RelativePath binaryPath (config.getTargetBinaryRelativePath().toString(), RelativePath::projectFolder); + binaryPath = binaryPath.rebased (project.getFile().getParentDirectory(), getTargetFolder(), RelativePath::buildTargetFolder); + + s.add ("DSTROOT = " + sanitisePath (binaryPath.toUnixStyle())); + s.add ("SYMROOT = " + sanitisePath (binaryPath.toUnixStyle())); + } + + s.add ("CONFIGURATION_BUILD_DIR = \"$(BUILD_DIR)\""); + s.add ("DEPLOYMENT_LOCATION = YES"); + } + else if (project.isCommandLineApp()) + { + } + else + { + jassertfalse; + } + + if (iPhone) + { + s.add ("SDKROOT = iphonesimulator3.2"); + } + else + { + const String sdk (config.getMacSDKVersion().toString()); + const String sdkCompat (config.getMacCompatibilityVersion().toString()); + + if (sdk == Project::BuildConfiguration::osxVersion10_4) + { + s.add ("SDKROOT = macosx10.4"); + s.add ("GCC_VERSION = 4.0"); + } + else if (sdk == Project::BuildConfiguration::osxVersion10_5) + { + s.add ("SDKROOT = macosx10.5"); + } + else if (sdk == Project::BuildConfiguration::osxVersion10_6) + { + s.add ("SDKROOT = macosx10.6"); + } + + if (sdkCompat == Project::BuildConfiguration::osxVersion10_4) + s.add ("MACOSX_DEPLOYMENT_TARGET = 10.4"); + else if (sdkCompat == Project::BuildConfiguration::osxVersion10_5) + s.add ("MACOSX_DEPLOYMENT_TARGET = 10.5"); + else if (sdkCompat == Project::BuildConfiguration::osxVersion10_6) + s.add ("MACOSX_DEPLOYMENT_TARGET = 10.6"); + + s.add ("MACOSX_DEPLOYMENT_TARGET_ppc = 10.4"); + } + + { + StringArray linkerFlags, librarySearchPaths; + getLinkerFlags (config, linkerFlags, librarySearchPaths); + + if (linkerFlags.size() > 0) + s.add ("OTHER_LDFLAGS = \"" + linkerFlags.joinIntoString (" ") + "\""); + + if (librarySearchPaths.size() > 0) + { + String libPaths ("LIBRARY_SEARCH_PATHS = (\"$(inherited)\""); + + for (int i = 0; i < librarySearchPaths.size(); ++i) + libPaths += ", \"\\\"" + librarySearchPaths[i] + "\\\"\""; + + s.add (libPaths + ")"); + } + } + + StringPairArray defines; + + if (config.isDebug().getValue()) + { + defines.set ("_DEBUG", "1"); + defines.set ("DEBUG", "1"); + s.add ("ONLY_ACTIVE_ARCH = YES"); + s.add ("COPY_PHASE_STRIP = NO"); + s.add ("GCC_DYNAMIC_NO_PIC = NO"); + s.add ("GCC_ENABLE_FIX_AND_CONTINUE = NO"); + } + else + { + defines.set ("_NDEBUG", "1"); + defines.set ("NDEBUG", "1"); + s.add ("GCC_GENERATE_DEBUGGING_SYMBOLS = NO"); + s.add ("GCC_SYMBOLS_PRIVATE_EXTERN = YES"); + } + + { + const String objCSuffix (getSetting ("objCExtraSuffix").toString().trim()); + if (objCSuffix.isNotEmpty()) + defines.set ("JUCE_ObjCExtraSuffix", replacePreprocessorTokens (config, objCSuffix)); + } + + { + defines = mergePreprocessorDefs (defines, getAllPreprocessorDefs (config)); + + StringArray defsList; + + for (int i = 0; i < defines.size(); ++i) + { + String def (defines.getAllKeys()[i]); + const String value (defines.getAllValues()[i]); + if (value.isNotEmpty()) + def << "=" << value; + + defsList.add (def.quoted()); + } + + s.add ("GCC_PREPROCESSOR_DEFINITIONS = (" + indentList (defsList, ",") + ")"); + } + + return s; + } + + void addFrameworks() + { + StringArray s; + + if (iPhone) + { + s.addTokens ("UIKit Foundation CoreGraphics AudioToolbox QuartzCore OpenGLES", false); + } + else + { + s.addTokens ("Cocoa Carbon IOKit CoreAudio CoreMIDI WebKit DiscRecording OpenGL QuartzCore QTKit QuickTime", false); + + if (isAU()) + s.addTokens ("AudioUnit CoreAudioKit AudioToolbox", false); + else if (project.getJuceConfigFlag ("JUCE_PLUGINHOST_AU").toString() == Project::configFlagEnabled) + s.addTokens ("AudioUnit CoreAudioKit", false); + } + + for (int i = 0; i < s.size(); ++i) + addFramework (s[i]); + } + + //============================================================================== + void writeProjectFile (OutputStream& output) + { + output << "// !$*UTF8*$!\n{\n" + "\tarchiveVersion = 1;\n" + "\tclasses = {\n\t};\n" + "\tobjectVersion = 44;\n" + "\tobjects = {\n\n"; + + Array <ValueTree*> objects; + objects.addArray (pbxBuildFiles); + objects.addArray (pbxFileReferences); + objects.addArray (groups); + objects.addArray (targetConfigs); + objects.addArray (projectConfigs); + objects.addArray (misc); + + for (int i = 0; i < objects.size(); ++i) + { + ValueTree& o = *objects.getUnchecked(i); + output << "\t\t" << static_cast <const juce_wchar*> (o.getType()) << " = { "; + + for (int j = 0; j < o.getNumProperties(); ++j) + { + const Identifier propertyName (o.getPropertyName(j)); + String val (o.getProperty (propertyName).toString()); + + if (val.isEmpty() || (val.containsAnyOf (" \t;<>()=,-\r\n") + && ! (val.trimStart().startsWithChar ('(') + || val.trimStart().startsWithChar ('{')))) + val = val.quoted(); + + output << propertyName.toString() << " = " << val << "; "; + } + + output << "};\n"; + } + + output << "\t};\n\trootObject = " << createID ("__root") << ";\n}\n"; + } + + static void addPlistDictionaryKey (XmlElement* xml, const String& key, const String& value) + { + xml->createNewChildElement ("key")->addTextElement (key); + xml->createNewChildElement ("string")->addTextElement (value); + } + + const String addBuildFile (const RelativePath& path, const String& fileRefID, bool addToSourceBuildPhase, bool inhibitWarnings) + { + String fileID (createID (path.toUnixStyle() + "buildref")); + + if (addToSourceBuildPhase) + sourceIDs.add (fileID); + + ValueTree* v = new ValueTree (fileID); + v->setProperty ("isa", "PBXBuildFile", 0); + v->setProperty ("fileRef", fileRefID, 0); + + if (inhibitWarnings) + v->setProperty ("settings", "{COMPILER_FLAGS = \"-w\"; }", 0); + + pbxBuildFiles.add (v); + return fileID; + } + + const String addBuildFile (const RelativePath& path, bool addToSourceBuildPhase, bool inhibitWarnings) + { + return addBuildFile (path, createID (path), addToSourceBuildPhase, inhibitWarnings); + } + + void addFileReference (const RelativePath& path, const String& sourceTree, const String& lastKnownFileType, const String& fileRefID) + { + ValueTree* v = new ValueTree (fileRefID); + v->setProperty ("isa", "PBXFileReference", 0); + v->setProperty ("lastKnownFileType", lastKnownFileType, 0); + v->setProperty (Ids::name, path.getFileName(), 0); + v->setProperty ("path", sanitisePath (path.toUnixStyle()), 0); + v->setProperty ("sourceTree", sourceTree, 0); + pbxFileReferences.add (v); + } + + const String addFileReference (const RelativePath& path) + { + const String fileRefID (createID (path)); + + jassert (path.isAbsolute() || path.getRoot() == RelativePath::buildTargetFolder); + addFileReference (path, path.isAbsolute() ? "<absolute>" : "SOURCE_ROOT", + getFileType (path), fileRefID); + + return fileRefID; + } + + static const String getFileType (const RelativePath& file) + { + if (file.hasFileExtension ("cpp;cc;cxx")) return "sourcecode.cpp.cpp"; + else if (file.hasFileExtension (".mm")) return "sourcecode.cpp.objcpp"; + else if (file.hasFileExtension (".m")) return "sourcecode.c.objc"; + else if (file.hasFileExtension (headerFileExtensions)) return "sourcecode.c.h"; + else if (file.hasFileExtension (".framework")) return "wrapper.framework"; + else if (file.hasFileExtension (".jpeg;.jpg")) return "image.jpeg"; + else if (file.hasFileExtension ("png;gif")) return "image" + file.getFileExtension(); + else if (file.hasFileExtension ("html;htm")) return "text.html"; + else if (file.hasFileExtension ("txt;rtf")) return "text" + file.getFileExtension(); + else if (file.hasFileExtension ("plist")) return "text.plist.xml"; + else if (file.hasFileExtension ("app")) return "wrapper.application"; + else if (file.hasFileExtension ("component;vst;plugin")) return "wrapper.cfbundle"; + else if (file.hasFileExtension ("xcodeproj")) return "wrapper.pb-project"; + else if (file.hasFileExtension ("a")) return "archive.ar"; + + return "file" + file.getFileExtension(); + } + + const String addFile (const RelativePath& path, bool shouldBeCompiled, bool inhibitWarnings) + { + if (shouldBeCompiled) + addBuildFile (path, true, inhibitWarnings); + else if (path.hasFileExtension (".r")) + rezFileIDs.add (addBuildFile (path, false, inhibitWarnings)); + + return addFileReference (path); + } + + const String addProjectItem (const Project::Item& projectItem) + { + if (projectItem.isGroup()) + { + StringArray childIDs; + for (int i = 0; i < projectItem.getNumChildren(); ++i) + { + const String childID (addProjectItem (projectItem.getChild(i))); + + if (childID.isNotEmpty()) + childIDs.add (childID); + } + + return addGroup (projectItem, childIDs); + } + else + { + if (projectItem.shouldBeAddedToTargetProject()) + { + const RelativePath path (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder); + return addFile (path, projectItem.shouldBeCompiled(), false); + } + } + + return String::empty; + } + + void addFramework (const String& frameworkName) + { + const RelativePath path ("System/Library/Frameworks/" + frameworkName + ".framework", RelativePath::unknown); + const String fileRefID (createID (path)); + addFileReference (path, "SDKROOT", getFileType (path), fileRefID); + frameworkIDs.add (addBuildFile (path, fileRefID, false, false)); + frameworkFileIDs.add (fileRefID); + } + + void addGroup (const String& groupID, const String& groupName, const StringArray& childIDs) + { + ValueTree* v = new ValueTree (groupID); + v->setProperty ("isa", "PBXGroup", 0); + v->setProperty ("children", "(" + indentList (childIDs, ",") + " )", 0); + v->setProperty (Ids::name, groupName, 0); + v->setProperty ("sourceTree", "<group>", 0); + groups.add (v); + } + + const String createGroup (const Array<RelativePath>& files, const String& groupName, const String& groupIDName, bool inhibitWarnings) + { + StringArray fileIDs; + + for (int i = 0; i < files.size(); ++i) + { + addFile (files.getReference(i), shouldFileBeCompiledByDefault (files.getReference(i)), inhibitWarnings); + fileIDs.add (createID (files.getReference(i))); + } + + const String groupID (createID (groupIDName)); + addGroup (groupID, groupName, fileIDs); + return groupID; + } + + const String addGroup (const Project::Item& item, StringArray& childIDs) + { + String groupName (item.getName().toString()); + + if (item.isMainGroup()) + { + groupName = "Source"; + + // Add 'Juce Library Code' group + if (juceWrapperFiles.size() > 0) + childIDs.add (createGroup (juceWrapperFiles, project.getJuceCodeGroupName(), "__jucelibfiles", false)); + + if (isVST()) + childIDs.add (createGroup (getVSTFilesRequired(), "Juce VST Wrapper", "__jucevstfiles", false)); + + if (isAU()) + childIDs.add (createAUWrappersGroup()); + + if (isRTAS()) + childIDs.add (createGroup (getRTASFilesRequired(), "Juce RTAS Wrapper", "__jucertasfiles", true)); + + { // Add 'resources' group + String resourcesGroupID (createID ("__resources")); + addGroup (resourcesGroupID, "Resources", resourceFileRefs); + childIDs.add (resourcesGroupID); + } + + { // Add 'frameworks' group + String frameworksGroupID (createID ("__frameworks")); + addGroup (frameworksGroupID, "Frameworks", frameworkFileIDs); + childIDs.add (frameworksGroupID); + } + + { // Add 'products' group + String productsGroupID (createID ("__products")); + StringArray products; + products.add (createID ("__productFileID")); + addGroup (productsGroupID, "Products", products); + childIDs.add (productsGroupID); + } + } + + String groupID (getIDForGroup (item)); + addGroup (groupID, groupName, childIDs); + return groupID; + } + + void addBuildProduct (const String& fileType, const String& binaryName) + { + ValueTree* v = new ValueTree (createID ("__productFileID")); + v->setProperty ("isa", "PBXFileReference", 0); + v->setProperty ("explicitFileType", fileType, 0); + v->setProperty ("includeInIndex", (int) 0, 0); + v->setProperty ("path", sanitisePath (binaryName), 0); + v->setProperty ("sourceTree", "BUILT_PRODUCTS_DIR", 0); + pbxFileReferences.add (v); + } + + void addTargetConfig (const String& configName, const StringArray& buildSettings) + { + ValueTree* v = new ValueTree (createID ("targetconfigid_" + configName)); + v->setProperty ("isa", "XCBuildConfiguration", 0); + v->setProperty ("buildSettings", "{" + indentList (buildSettings, ";") + " }", 0); + v->setProperty (Ids::name, configName, 0); + targetConfigs.add (v); + } + + void addProjectConfig (const String& configName, const StringArray& buildSettings) + { + ValueTree* v = new ValueTree (createID ("projectconfigid_" + configName)); + v->setProperty ("isa", "XCBuildConfiguration", 0); + v->setProperty ("buildSettings", "{" + indentList (buildSettings, ";") + " }", 0); + v->setProperty (Ids::name, configName, 0); + projectConfigs.add (v); + } + + void addConfigList (const OwnedArray <ValueTree>& configsToUse, const String& listID) + { + StringArray configIDs; + + for (int i = 0; i < configsToUse.size(); ++i) + configIDs.add (configsToUse[i]->getType().toString()); + + ValueTree* v = new ValueTree (listID); + v->setProperty ("isa", "XCConfigurationList", 0); + v->setProperty ("buildConfigurations", "(" + indentList (configIDs, ",") + " )", 0); + v->setProperty ("defaultConfigurationIsVisible", (int) 0, 0); + + if (configsToUse[0] != 0) + v->setProperty ("defaultConfigurationName", configsToUse[0]->getProperty (Ids::name), 0); + + misc.add (v); + } + + ValueTree* addBuildPhase (const String& phaseType, const StringArray& fileIds) + { + String phaseId (createID (phaseType + "resbuildphase")); + buildPhaseIDs.add (phaseId); + + ValueTree* v = new ValueTree (phaseId); + v->setProperty ("isa", phaseType, 0); + v->setProperty ("buildActionMask", "2147483647", 0); + v->setProperty ("files", "(" + indentList (fileIds, ",") + " )", 0); + v->setProperty ("runOnlyForDeploymentPostprocessing", (int) 0, 0); + misc.add (v); + return v; + } + + void addTargetObject() + { + ValueTree* v = new ValueTree (createID ("__target")); + v->setProperty ("isa", "PBXNativeTarget", 0); + v->setProperty ("buildConfigurationList", createID ("__configList"), 0); + v->setProperty ("buildPhases", "(" + indentList (buildPhaseIDs, ",") + " )", 0); + v->setProperty ("buildRules", "( )", 0); + v->setProperty ("dependencies", "( )", 0); + v->setProperty (Ids::name, project.getDocumentTitle(), 0); + v->setProperty ("productName", project.getDocumentTitle(), 0); + v->setProperty ("productReference", createID ("__productFileID"), 0); + + if (project.isGUIApplication()) + { + v->setProperty ("productInstallPath", "$(HOME)/Applications", 0); + v->setProperty ("productType", "com.apple.product-type.application", 0); + } + else if (project.isCommandLineApp()) + { + v->setProperty ("productInstallPath", "/usr/bin", 0); + v->setProperty ("productType", "com.apple.product-type.tool", 0); + } + else if (project.isAudioPlugin() || project.isBrowserPlugin()) + { + v->setProperty ("productInstallPath", "$(HOME)/Library/Audio/Plug-Ins/Components/", 0); + v->setProperty ("productType", "com.apple.product-type.bundle", 0); + } + else if (project.isLibrary()) + { + v->setProperty ("productType", "com.apple.product-type.library.static", 0); + } + else + jassertfalse; //xxx + + misc.add (v); + } + + void addProjectObject() + { + ValueTree* v = new ValueTree (createID ("__root")); + v->setProperty ("isa", "PBXProject", 0); + v->setProperty ("buildConfigurationList", createID ("__projList"), 0); + v->setProperty ("compatibilityVersion", "Xcode 3.0", 0); + v->setProperty ("hasScannedForEncodings", (int) 0, 0); + v->setProperty ("mainGroup", getIDForGroup (project.getMainGroup()), 0); + v->setProperty ("projectDirPath", "\"\"", 0); + v->setProperty ("projectRoot", "\"\"", 0); + v->setProperty ("targets", "( " + createID ("__target") + " )", 0); + misc.add (v); + } + + void addPluginShellScriptPhase() + { + ValueTree* v = addBuildPhase ("PBXShellScriptBuildPhase", StringArray()); + v->setProperty (Ids::name, "Copy to the different plugin folders", 0); + v->setProperty ("shellPath", "/bin/sh", 0); + v->setProperty ("shellScript", String::fromUTF8 (BinaryData::AudioPluginXCodeScript_txt, BinaryData::AudioPluginXCodeScript_txtSize) + .replace ("\\", "\\\\") + .replace ("\"", "\\\"") + .replace ("\r\n", "\\n") + .replace ("\n", "\\n"), 0); + } + + //============================================================================== + static const String indentList (const StringArray& list, const String& separator) + { + if (list.size() == 0) + return " "; + + return "\n\t\t\t\t" + list.joinIntoString (separator + "\n\t\t\t\t") + + (separator == ";" ? separator : String::empty); + } + + const String createID (const RelativePath& path) const + { + return createID (path.toUnixStyle()); + } + + const String createID (const String& rootString) const + { + static const char digits[] = "0123456789ABCDEF"; + char n[24]; + Random ran (projectIDSalt + hashCode64 (rootString)); + + for (int i = 0; i < numElementsInArray (n); ++i) + n[i] = digits [ran.nextInt (16)]; + + return String (n, numElementsInArray (n)); + } + + const String getIDForGroup (const Project::Item& item) const + { + return createID (item.getID()); + } + + bool shouldFileBeCompiledByDefault (const RelativePath& file) const + { + return file.hasFileExtension (sourceFileExtensions); + } + + //============================================================================== + const Array<RelativePath> getRTASFilesRequired() const + { + Array<RelativePath> s; + if (isRTAS()) + { + const char* files[] = { "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode1.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode2.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode3.cpp", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_DigiCode_Header.h", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_MacResources.r", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm", + "extras/audio plugins/wrapper/RTAS/juce_RTAS_Wrapper.cpp" }; + + for (int i = 0; i < numElementsInArray (files); ++i) + s.add (getJucePathFromTargetFolder().getChildFile (files[i])); + } + + return s; + } + + const String createAUWrappersGroup() + { + Array<RelativePath> auWrappers; + + const char* files[] = { "extras/audio plugins/wrapper/AU/juce_AU_Resources.r", + "extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm" }; + int i; + for (i = 0; i < numElementsInArray (files); ++i) + auWrappers.add (getJucePathFromTargetFolder().getChildFile (files[i])); + + const char* appleAUFiles[] = { "Extras/CoreAudio/PublicUtility/CADebugMacros.h", + "Extras/CoreAudio/PublicUtility/CAAUParameter.cpp", + "Extras/CoreAudio/PublicUtility/CAAUParameter.h", + "Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp", + "Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.h", + "Extras/CoreAudio/PublicUtility/CAMutex.cpp", + "Extras/CoreAudio/PublicUtility/CAMutex.h", + "Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp", + "Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.h", + "Extras/CoreAudio/PublicUtility/CAVectorUnitTypes.h", + "Extras/CoreAudio/PublicUtility/CAVectorUnit.cpp", + "Extras/CoreAudio/PublicUtility/CAVectorUnit.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUDebugDispatcher.cpp", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUDebugDispatcher.h", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h", + "Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h" }; + + StringArray fileIDs, appleFileIDs; + + for (i = 0; i < auWrappers.size(); ++i) + { + addFile (auWrappers.getReference(i), shouldFileBeCompiledByDefault (auWrappers.getReference(i)), false); + fileIDs.add (createID (auWrappers.getReference(i))); + } + + for (i = 0; i < numElementsInArray (appleAUFiles); ++i) + { + RelativePath file (appleAUFiles[i], RelativePath::unknown); + const String fileRefID (createID (file)); + + addFileReference (file, "DEVELOPER_DIR", getFileType (file), fileRefID); + + if (shouldFileBeCompiledByDefault (file)) + addBuildFile (file, fileRefID, true, true); + + appleFileIDs.add (fileRefID); + } + + const String appleGroupID (createID ("__juceappleaufiles")); + addGroup (appleGroupID, "Apple AU Files", appleFileIDs); + fileIDs.add (appleGroupID); + + const String groupID (createID ("__juceaufiles")); + addGroup (groupID, "Juce AU Wrapper", fileIDs); + return groupID; + } +}; + + +#endif // __JUCER_PROJECTEXPORT_XCODE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.cpp new file mode 100755 index 000000000..0798663e0 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.cpp @@ -0,0 +1,214 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_ProjectExporter.h" +#include "jucer_ProjectExport_Make.h" +#include "jucer_ProjectExport_MSVC.h" +#include "jucer_ProjectExport_XCode.h" + + +//============================================================================== +ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) + : project (project_), settings (settings_) +{ +} + +ProjectExporter::~ProjectExporter() +{ +} + +//============================================================================== +int ProjectExporter::getNumExporters() +{ + return 6; +} + +const StringArray ProjectExporter::getExporterNames() +{ + StringArray s; + s.add (XCodeProjectExporter::getNameMac()); + s.add (XCodeProjectExporter::getNameiOS()); + s.add (MSVCProjectExporterVC6::getName()); + s.add (MSVCProjectExporterVC2005::getName()); + s.add (MSVCProjectExporterVC2008::getName()); + s.add (MSVCProjectExporterVC2010::getName()); + s.add (MakefileProjectExporter::getNameLinux()); + return s; +} + +ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int index) +{ + ProjectExporter* exp = 0; + + 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 MSVCProjectExporterVC6 (project, ValueTree (MSVCProjectExporterVC6::getValueTreeTypeName())); break; + case 3: exp = new MSVCProjectExporterVC2005 (project, ValueTree (MSVCProjectExporterVC2005::getValueTreeTypeName())); break; + case 4: exp = new MSVCProjectExporterVC2008 (project, ValueTree (MSVCProjectExporterVC2008::getValueTreeTypeName())); break; + case 5: exp = new MSVCProjectExporterVC2010 (project, ValueTree (MSVCProjectExporterVC2010::getValueTreeTypeName())); break; + case 6: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter::getValueTreeTypeName())); break; + default: jassertfalse; return 0; + } + + File juceFolder (StoredSettings::getInstance()->getLastKnownJuceFolder()); + File target (exp->getTargetFolder()); + + if (FileHelpers::shouldPathsBeRelative (juceFolder.getFullPathName(), project.getFile().getFullPathName())) + exp->getJuceFolder() = juceFolder.getRelativePathFrom (project.getFile().getParentDirectory()); + else + exp->getJuceFolder() = juceFolder.getFullPathName(); + + return exp; +} + +ProjectExporter* ProjectExporter::createExporter (Project& project, const ValueTree& settings) +{ + ProjectExporter* exp = MSVCProjectExporterVC6::createForSettings (project, settings); + if (exp == 0) exp = MSVCProjectExporterVC2005::createForSettings (project, settings); + if (exp == 0) exp = MSVCProjectExporterVC2008::createForSettings (project, settings); + if (exp == 0) exp = MSVCProjectExporterVC2010::createForSettings (project, settings); + if (exp == 0) exp = XCodeProjectExporter::createForSettings (project, settings); + if (exp == 0) exp = MakefileProjectExporter::createForSettings (project, settings); + + jassert (exp != 0); + return exp; +} + +ProjectExporter* ProjectExporter::createPlatformDefaultExporter (Project& project) +{ + for (int i = 0; i < project.getNumExporters(); ++i) + { + ScopedPointer <ProjectExporter> exp (project.createExporter (i)); + + if (exp->isDefaultFormatForCurrentOS()) + return exp.release(); + } + + return 0; +} + +const File ProjectExporter::getTargetFolder() const +{ + return project.resolveFilename (getTargetLocation().toString()); +} + +const String ProjectExporter::getIncludePathForFileInJuceFolder (const String& pathFromJuceFolder, const File& targetIncludeFile) const +{ + String juceFolderPath (getJuceFolder().toString()); + + if (juceFolderPath.startsWithChar ('<')) + { + juceFolderPath = FileHelpers::unixStylePath (File::addTrailingSeparator (juceFolderPath.substring (1).dropLastCharacters(1))); + if (juceFolderPath == "/") + juceFolderPath = String::empty; + + return "<" + juceFolderPath + pathFromJuceFolder + ">"; + } + else + { + const RelativePath juceFromProject (juceFolderPath, RelativePath::projectFolder); + const RelativePath fileFromProject (juceFromProject.getChildFile (pathFromJuceFolder)); + const RelativePath fileFromHere (fileFromProject.rebased (project.getFile().getParentDirectory(), + targetIncludeFile.getParentDirectory(), RelativePath::unknown)); + return fileFromHere.toUnixStyle().quoted(); + } +} + +const RelativePath ProjectExporter::getJucePathFromTargetFolder() const +{ + return rebaseFromProjectFolderToBuildTarget (RelativePath (getJuceFolder().toString(), RelativePath::projectFolder)); +} + +const RelativePath ProjectExporter::rebaseFromProjectFolderToBuildTarget (const RelativePath& path) const +{ + return path.rebased (project.getFile().getParentDirectory(), getTargetFolder(), RelativePath::buildTargetFolder); +} + +bool ProjectExporter::shouldFileBeCompiledByDefault (const RelativePath& file) const +{ + return file.hasFileExtension ("cpp;cc;c;cxx"); +} + +void ProjectExporter::createPropertyEditors (Array <PropertyComponent*>& props) +{ + props.add (new TextPropertyComponent (getTargetLocation(), "Target Project Folder", 1024, false)); + props.getLast()->setTooltip ("The location of the folder in which the " + name + " project will be created. This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); + + props.add (new TextPropertyComponent (getJuceFolder(), "Juce Location", 1024, false)); + props.getLast()->setTooltip ("The location of the Juce library folder that the " + name + " project will use to when compiling. This can be an absolute path, or relative to the jucer project folder, but it must be valid on the filesystem of the machine you use to actually do the compiling."); + + if (project.isAudioPlugin()) + { + if (project.shouldAddVSTFolderToPath()) + { + props.add (new TextPropertyComponent (getVSTFolder(), "VST Folder", 1024, false)); + props.getLast()->setTooltip ("If you're building a VST, this must be the folder containing the VST SDK. This should be an absolute path."); + } + + if (isRTAS()) + { + props.add (new TextPropertyComponent (getRTASFolder(), "RTAS Folder", 1024, false)); + props.getLast()->setTooltip ("If you're building an RTAS, this must be the folder containing the RTAS SDK. This should be an absolute path."); + } + } + + props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, false)); + props.getLast()->setTooltip ("Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); + + props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, false)); + props.getLast()->setTooltip ("Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the form ${NAME_OF_DEFINITION}, which will be replaced with their values."); + props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, false)); + props.getLast()->setTooltip ("Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); +} + +const Array<RelativePath> ProjectExporter::getVSTFilesRequired() const +{ + Array<RelativePath> s; + if (isVST()) + { + const char* files[] = { "extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp", + "extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm" }; + + for (int i = 0; i < numElementsInArray (files); ++i) + s.add (getJucePathFromTargetFolder().getChildFile (files[i])); + } + + return s; +} + +const StringPairArray ProjectExporter::getAllPreprocessorDefs (const Project::BuildConfiguration& config) const +{ + StringPairArray defs (mergePreprocessorDefs (config.getAllPreprocessorDefs(), + parsePreprocessorDefs (getExporterPreprocessorDefs().toString()))); + defs.set (getExporterIdentifierMacro(), "1"); + return defs; +} + +const String ProjectExporter::replacePreprocessorTokens (const Project::BuildConfiguration& config, const String& sourceString) const +{ + return replacePreprocessorDefs (getAllPreprocessorDefs (config), sourceString); +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.h new file mode 100755 index 000000000..914ad97e9 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectExporter.h @@ -0,0 +1,126 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTEXPORTER_JUCEHEADER__ +#define __JUCER_PROJECTEXPORTER_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "jucer_Project.h" + + +//============================================================================== +class ProjectExporter +{ +protected: + //============================================================================== + ProjectExporter (Project& project, const ValueTree& settings); + +public: + virtual ~ProjectExporter(); + + static int getNumExporters(); + static const StringArray getExporterNames(); + static ProjectExporter* createNewExporter (Project& project, const int index); + + static ProjectExporter* createExporter (Project& project, const ValueTree& settings); + static ProjectExporter* createPlatformDefaultExporter (Project& project); + + //============================================================================= + virtual bool isDefaultFormatForCurrentOS() = 0; + virtual bool isPossibleForCurrentProject() = 0; + virtual bool usesMMFiles() const = 0; + virtual void createPropertyEditors (Array <PropertyComponent*>& props); + virtual void launchProject() = 0; + virtual const String create() = 0; + virtual bool shouldFileBeCompiledByDefault (const RelativePath& path) const; + + //============================================================================== + const String getName() const { return name; } + const File getTargetFolder() const; + + const ValueTree& getSettings() const { return settings; } + Value getSetting (const Identifier& name_) const { return settings.getPropertyAsValue (name_, project.getUndoManagerFor (settings)); } + + Value getJuceFolder() const { return getSetting (Ids::juceFolder); } + Value getTargetLocation() const { return getSetting (Ids::targetFolder); } + + Value getVSTFolder() const { return getSetting (Ids::vstFolder); } + Value getRTASFolder() const { return getSetting (Ids::rtasFolder); } + Value getAUFolder() const { return getSetting (Ids::auFolder); } + + bool isVST() const { return (bool) project.isAudioPlugin() && (bool) project.shouldBuildVST().getValue(); } + bool isRTAS() const { return (bool) project.isAudioPlugin() && (bool) project.shouldBuildRTAS().getValue(); } + bool isAU() const { return (bool) project.isAudioPlugin() && (bool) project.shouldBuildAU().getValue(); } + + Value getExtraCompilerFlags() const { return getSetting (Ids::extraCompilerFlags); } + Value getExtraLinkerFlags() const { return getSetting (Ids::extraLinkerFlags); } + + Value getExporterPreprocessorDefs() const { return getSetting (Ids::extraDefs); } + const StringPairArray getAllPreprocessorDefs (const Project::BuildConfiguration& config) const; // includes inherited ones.. + + const String replacePreprocessorTokens (const Project::BuildConfiguration& config, + const String& sourceString) const; + + // This adds the quotes, and may return angle-brackets, eg: <foo/bar.h> or normal quotes. + const String getIncludePathForFileInJuceFolder (const String& pathFromJuceFolder, const File& targetIncludeFile) const; + + const String getExporterIdentifierMacro() const + { + return "JUCER_" + settings.getType() + "_" + + String::toHexString (settings [Ids::targetFolder].toString().hashCode()).toUpperCase(); + } + + Array<RelativePath> juceWrapperFiles; + RelativePath juceWrapperFolder; + +protected: + //============================================================================== + Project& project; + ValueTree settings; + String name; + + const RelativePath getJucePathFromTargetFolder() const; + + const String getDefaultBuildsRootFolder() const { return "Builds/"; } + + const Array<RelativePath> getVSTFilesRequired() const; + + static const String getLibbedFilename (String name) + { + if (! name.startsWith ("lib")) + name = "lib" + name; + if (! name.endsWithIgnoreCase (".a")) + name = name + ".a"; + return name; + } + + const RelativePath rebaseFromProjectFolderToBuildTarget (const RelativePath& path) const; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectExporter); +}; + + +#endif // __JUCER_PROJECTEXPORTER_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.cpp new file mode 100755 index 000000000..02fc828b7 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.cpp @@ -0,0 +1,391 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Created for JUCE version: JUCE v1.52.97 + + ------------------------------------------------------------------------------ + + JUCE and the Jucer are copyright 2004-10 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[CppHeaders] You can add your own extra header files here... +#include "jucer_ProjectExporter.h" +//[/CppHeaders] + +#include "jucer_ProjectInformationComponent.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +class PropertiesWithHelpComponent : public PropertyPanelWithTooltips +{ +public: + PropertiesWithHelpComponent (Project& project_, int tabIndex_) + : project (project_), tabIndex (tabIndex_) + { + } + + ~PropertiesWithHelpComponent() + { + } + + void rebuildProperties() + { + getPanel().clear(); + Array <PropertyComponent*> props; + + if (tabIndex == 0) + { + // The main project tab... + project.createPropertyEditors (props); + } + else if (tabIndex == 1) + { + // The Juce options tab... + OwnedArray <Project::JuceConfigFlag> flags; + project.getJuceConfigFlags (flags); + + StringArray possibleValues; + possibleValues.add ("(Use default from juce_Config.h)"); + possibleValues.add ("Enabled"); + possibleValues.add ("Disabled"); + + Array<var> mappings; + mappings.add (Project::configFlagDefault); + mappings.add (Project::configFlagEnabled); + mappings.add (Project::configFlagDisabled); + + for (int i = 0; i < flags.size(); ++i) + { + ChoicePropertyComponent* c = new ChoicePropertyComponent (flags[i]->value, flags[i]->symbol, possibleValues, mappings); + c->setTooltip (flags[i]->description); + c->setPreferredHeight (22); + props.add (c); + } + } + else if (tabIndex < 2 + project.getNumConfigurations()) + { + // A config tab.. + project.getConfiguration (tabIndex - 2).createPropertyEditors (props); + } + else + { + // An export tab.. + ScopedPointer <ProjectExporter> exp (project.createExporter (tabIndex - (2 + project.getNumConfigurations()))); + + if (exp != 0) + exp->createPropertyEditors (props); + + for (int i = props.size(); --i >= 0;) + props.getUnchecked(i)->setPreferredHeight (22); + } + + getPanel().addProperties (props); + } + + void visibilityChanged() + { + if (isVisible()) + rebuildProperties(); + } + +private: + Project& project; + int tabIndex; +}; +//[/MiscUserDefs] + +//============================================================================== +ProjectInformationComponent::ProjectInformationComponent (Project& project_) + : project (project_), + configTabBox (TabbedButtonBar::TabsAtTop) +{ + addAndMakeVisible (&configTabBox); + addAndMakeVisible (&editConfigsButton); + editConfigsButton.setButtonText ("Add/Remove Configurations..."); + editConfigsButton.addListener (this); + addAndMakeVisible (&openProjectButton); + openProjectButton.setButtonText ("Open Project in "); + openProjectButton.addListener (this); + addAndMakeVisible (&editExportersButton); + editExportersButton.setButtonText ("Add/Remove Exporters..."); + editExportersButton.addListener (this); + addAndMakeVisible (&saveAndOpenButton); + saveAndOpenButton.setButtonText ("Save And Open in"); + saveAndOpenButton.addListener (this); + + //[UserPreSize] + rebuildConfigTabs(); + +#if JUCE_MAC || JUCE_WINDOWS + openProjectButton.setCommandToTrigger (commandManager, CommandIDs::openInIDE, true); + openProjectButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::openInIDE)); + + saveAndOpenButton.setCommandToTrigger (commandManager, CommandIDs::saveAndOpenInIDE, true); + saveAndOpenButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::saveAndOpenInIDE)); +#else + openProjectButton.setVisible (false); + saveAndOpenButton.setVisible (false); +#endif + //[/UserPreSize] + + setSize (859, 479); + + //[Constructor] You can add your own custom stuff here.. + configTabBox.setOutline (1); + configTabBox.setColour (TabbedComponent::outlineColourId, Colours::black.withAlpha (0.3f)); + + editConfigsButton.setTriggeredOnMouseDown (true); + + project.addChangeListener (this); + //[/Constructor] +} + +ProjectInformationComponent::~ProjectInformationComponent() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + project.removeChangeListener (this); + //[/Destructor_pre] + + + + //[Destructor]. You can add your own custom destruction code here.. + //[/Destructor] +} + +//============================================================================== +void ProjectInformationComponent::resized() +{ + //[Userresized_Pre] + //[/Userresized_Pre] + + configTabBox.setBounds (Rectangle<int>::leftTopRightBottom (8, 0, (int) ((8.0 + getWidth()) - 16.0), + (int) ((0.0 + getHeight()) - 36.0))); + editConfigsButton.setBounds (Rectangle<int>::leftTopRightBottom (8, (int) (getHeight() - 30.0), (int) (8.0 + 192.0), + (int) (getHeight() - 30.0 + 22.0))); + openProjectButton.setBounds (Rectangle<int>::leftTopRightBottom (608, (int) (getHeight() - 30.0), (int) (608.0 + 208.0), + (int) (getHeight() - 30.0 + 22.0))); + editExportersButton.setBounds (Rectangle<int>::leftTopRightBottom (208, (int) (getHeight() - 30.0), + (int) (208.0 + 160.0), (int) (getHeight() - 30.0 + 22.0))); + saveAndOpenButton.setBounds (Rectangle<int>::leftTopRightBottom (391, (int) (getHeight() - 30.0), (int) (391.0 + 208.0), + (int) (getHeight() - 30.0 + 22.0))); + + //[Userresized_Post] + //[/Userresized_Post] +} + +void ProjectInformationComponent::buttonClicked (Button* buttonThatWasClicked) +{ + //[UserbuttonClicked_Pre] + //[/UserbuttonClicked_Pre] + + if (buttonThatWasClicked == &editConfigsButton) + { + //[UserButtonCode_b6625dfcdb1f4755] -- add your button handler code here.. + showConfigMenu(); + //[/UserButtonCode_b6625dfcdb1f4755] + } + else if (buttonThatWasClicked == &openProjectButton) + { + //[UserButtonCode_a550a652e2666ee7] -- add your button handler code here.. + //[/UserButtonCode_a550a652e2666ee7] + } + else if (buttonThatWasClicked == &editExportersButton) + { + //[UserButtonCode_c1f6e5f9811b307e] -- add your button handler code here.. + showExporterMenu(); + //[/UserButtonCode_c1f6e5f9811b307e] + } + else if (buttonThatWasClicked == &saveAndOpenButton) + { + //[UserButtonCode_dRGMyYx] -- add your button handler code here.. + //[/UserButtonCode_dRGMyYx] + } + + //[UserbuttonClicked_Post] + //[/UserbuttonClicked_Post] +} + +void ProjectInformationComponent::paint (Graphics& g) +{ + //[UserPaint] Add your own custom painting code here.. + g.setTiledImageFill (ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize), + 0, 0, 1.0f); + g.fillAll(); + drawRecessedShadows (g, getWidth(), getHeight(), 14); + //[/UserPaint] +} + + + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +void ProjectInformationComponent::rebuildConfigTabs() +{ + configTabBox.clearTabs(); + + int index = 0; + PropertiesWithHelpComponent* panel = new PropertiesWithHelpComponent (project, index++); + configTabBox.addTab ("Project Settings", Colours::lightslategrey, panel, true, -1); + + panel = new PropertiesWithHelpComponent (project, index++); + configTabBox.addTab ("Juce Flags", Colours::lightblue, panel, true, -1); + + int i; + for (i = 0; i < project.getNumConfigurations(); ++i) + { + panel = new PropertiesWithHelpComponent (project, index++); + Project::BuildConfiguration config (project.getConfiguration (i)); + configTabBox.addTab (config.getName().toString(), Colour::greyLevel (0.65f), panel, true, -1); + } + + for (i = 0; i < project.getNumExporters(); ++i) + { + ScopedPointer <ProjectExporter> exp (project.createExporter (i)); + + if (exp != 0) + { + panel = new PropertiesWithHelpComponent (project, index++); + configTabBox.addTab (exp->getName(), Colours::lightsteelblue, panel, true, -1); + } + } + + lastProjectType = project.getProjectType().getValue(); +} + +void ProjectInformationComponent::updateConfigTabs() +{ + if (configTabBox.getNumTabs() != project.getNumConfigurations() + project.getNumExporters() + 2 + || lastProjectType != project.getProjectType().getValue()) + { + rebuildConfigTabs(); + } + else + { + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + configTabBox.setTabName (i + 2, config.getName().toString()); + } + } +} + +void ProjectInformationComponent::showConfigMenu() +{ + PopupMenu m; + m.addItem (1, "Add a new empty configuration"); + + PopupMenu createCopyMenu, removeMenu; + + for (int i = 0; i < project.getNumConfigurations(); ++i) + { + Project::BuildConfiguration config (project.getConfiguration (i)); + createCopyMenu.addItem (i + 10000, "Create a copy of '" + config.getName().toString() + "'"); + removeMenu.addItem (i + 20000, "Delete configuration '" + config.getName().toString() + "'"); + } + + m.addSubMenu ("Add a copy of an existing configuration", createCopyMenu); + m.addSubMenu ("Remove configuration", removeMenu); + + const int r = m.showAt (&editConfigsButton); + + if (r >= 20000) + { + project.deleteConfiguration (r - 20000); + } + else if (r >= 10000) + { + Project::BuildConfiguration configToCopy (project.getConfiguration (r - 10000)); + project.addNewConfiguration (&configToCopy); + } + else if (r == 1) + { + project.addNewConfiguration (0); + } +} + +void ProjectInformationComponent::showExporterMenu() +{ + PopupMenu m; + + PopupMenu createMenu, removeMenu; + + int i; + for (i = 0; i < project.getNumExporters(); ++i) + { + ScopedPointer<ProjectExporter> exp (project.createExporter (i)); + + if (exp != 0) + removeMenu.addItem (i + 20000, "Delete " + exp->getName()); + } + + StringArray exporters (ProjectExporter::getExporterNames()); + + for (i = 0; i < exporters.size(); ++i) + createMenu.addItem (i + 10000, "Create a new " + exporters[i] + " target"); + + m.addSubMenu ("Create new export target", createMenu); + m.addSubMenu ("Remove export target", removeMenu); + + const int r = m.showAt (&editExportersButton); + + if (r >= 20000) + project.deleteExporter (r - 20000); + else if (r >= 10000) + project.addNewExporter (r - 10000); +} + +void ProjectInformationComponent::changeListenerCallback (ChangeBroadcaster*) +{ + updateConfigTabs(); +} +//[/MiscUserCode] + + + +//============================================================================== +//======================= Jucer Information Section ========================== +//============================================================================== +#if 0 +/* This section stores the Jucer's metadata - edit it at your own risk! + +JUCER_COMPONENT_METADATA_START + +<COMPONENT id="tO9EG1a" className="ProjectInformationComponent" width="859" + height="479" background="f6f9ff" parentClasses="public Component, public ChangeListener" + constructorParams="Project& project_" memberInitialisers="project (project_)"> + <COMPONENTS> + <TABBEDCOMPONENT id="962c1575c4142253" memberName="configTabBox" focusOrder="0" + position="8, 0, configTabBox.left + parent.right - 16, configTabBox.top + parent.bottom - 36"/> + <TEXTBUTTON id="b6625dfcdb1f4755" memberName="editConfigsButton" focusOrder="0" + text="Add/Remove Configurations..." createCallback="1" radioGroup="0" + connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0" + backgroundColour="" textColour="" backgroundColourOn="" textColourOn="" + position="8, parent.bottom - 30, editConfigsButton.left + 192, editConfigsButton.top + 22"/> + <TEXTBUTTON id="a550a652e2666ee7" memberName="openProjectButton" focusOrder="0" + text="Open Project in " createCallback="1" radioGroup="0" connectedLeft="0" + connectedRight="0" connectedTop="0" connectedBottom="0" backgroundColour="" + textColour="" backgroundColourOn="" textColourOn="" position="608, parent.bottom - 30, openProjectButton.left + 208, openProjectButton.top + 22"/> + <TEXTBUTTON id="c1f6e5f9811b307e" memberName="editExportersButton" focusOrder="0" + text="Add/Remove Exporters..." createCallback="1" radioGroup="0" + connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0" + backgroundColour="" textColour="" backgroundColourOn="" textColourOn="" + position="208, parent.bottom - 30, editExportersButton.left + 160, editExportersButton.top + 22"/> + <TEXTBUTTON id="dRGMyYx" name="" memberName="saveAndOpenButton" position="391, parent.bottom - 30, saveAndOpenButton.left + 208, saveAndOpenButton.top + 22" + text="Save And Open in" createCallback="1" radioGroup="0" connectedLeft="0" + connectedRight="0" connectedTop="0" connectedBottom="0"/> + </COMPONENTS> + <MARKERS_X/> + <MARKERS_Y/> + <METHODS/> +</COMPONENT> + +JUCER_COMPONENT_METADATA_END +*/ +#endif diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.h new file mode 100755 index 000000000..8b8510334 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectInformationComponent.h @@ -0,0 +1,77 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Created for JUCE version: JUCE v1.52.97 + + ------------------------------------------------------------------------------ + + JUCE and the Jucer are copyright 2004-10 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTINFORMATIONCOMPONENT_H_2F89B0AC__ +#define __JUCER_PROJECTINFORMATIONCOMPONENT_H_2F89B0AC__ + +//[Headers] -- You can add your own extra header files here -- +#include "jucer_ProjectExporter.h" +//[/Headers] + + + +//============================================================================== +/** + //[Comments] + Holds the tabs containing all the project info. + //[/Comments] +*/ +class ProjectInformationComponent : public Component, + public ChangeListener, + public Button::Listener +{ +public: + //============================================================================== + ProjectInformationComponent (Project& project_); + ~ProjectInformationComponent(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + void changeListenerCallback (ChangeBroadcaster*); + void rebuildConfigTabs(); + //[/UserMethods] + + void resized(); + void buttonClicked (Button* buttonThatWasClicked); + void paint (Graphics& g); + + +private: + //============================================================================== + //[UserVariables] -- You can add your own custom variables in this section. + Project& project; + + var lastProjectType; + void updateConfigTabs(); + void showConfigMenu(); + void showExporterMenu(); + //[/UserVariables] + + //============================================================================== + TabbedComponent configTabBox; + TextButton editConfigsButton; + TextButton openProjectButton; + TextButton editExportersButton; + TextButton saveAndOpenButton; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectInformationComponent); +}; + + +#endif // __JUCER_PROJECTINFORMATIONCOMPONENT_H_2F89B0AC__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectSaver.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectSaver.h new file mode 100755 index 000000000..98da02b57 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectSaver.h @@ -0,0 +1,543 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTSAVER_JUCEHEADER__ +#define __JUCER_PROJECTSAVER_JUCEHEADER__ + + +//============================================================================== +class ProjectSaver +{ +public: + ProjectSaver (Project& project_, const File& projectFile_) + : project (project_), projectFile (projectFile_), resourceFile (project_) + { + } + + const String save() + { + const File oldFile (project.getFile()); + project.setFile (projectFile); + + const String linkageMode (project.getJuceLinkageMode()); + + if (linkageMode == Project::notLinkedToJuce) + { + hasAppHeaderFile = ! project.isLibrary(); + hasAppConfigFile = false; + numJuceSourceFiles = 0; + } + else if (linkageMode == Project::useAmalgamatedJuce + || linkageMode == Project::useAmalgamatedJuceViaSingleTemplate) + { + hasAppHeaderFile = true; + hasAppConfigFile = true; + numJuceSourceFiles = 1; + } + else if (linkageMode == Project::useAmalgamatedJuceViaMultipleTemplates) + { + hasAppHeaderFile = true; + hasAppConfigFile = true; + numJuceSourceFiles = project.getNumSeparateAmalgamatedFiles(); + } + else if (linkageMode == Project::useLinkedJuce) + { + hasAppHeaderFile = true; + hasAppConfigFile = true; + numJuceSourceFiles = 0; + } + else + { + jassertfalse; + } + + hasResources = (resourceFile.getNumFiles() > 0); + + writeMainProjectFile(); + + if (errors.size() == 0) + writeJuceSourceWrappers(); + + if (errors.size() == 0) + writeProjects(); + + if (errors.size() > 0) + project.setFile (oldFile); + + return errors[0]; + } + +private: + Project& project; + const File& projectFile; + ResourceFile resourceFile; + StringArray errors; + + File appConfigFile, juceHeaderFile, binaryDataCpp, pluginCharacteristicsFile; + bool hasAppHeaderFile, hasAppConfigFile, hasResources; + int numJuceSourceFiles; + + void writeMainProjectFile() + { + ScopedPointer <XmlElement> xml (project.getProjectRoot().createXml()); + jassert (xml != 0); + + if (xml != 0) + { + #if JUCE_DEBUG + { + MemoryOutputStream mo; + project.getProjectRoot().writeToStream (mo); + + MemoryInputStream mi (mo.getData(), mo.getDataSize(), false); + ValueTree v = ValueTree::readFromStream (mi); + ScopedPointer <XmlElement> xml2 (v.createXml()); + + // This bit just tests that ValueTree save/load works reliably.. Let me know if this asserts for you! + jassert (xml->isEquivalentTo (xml2, true)); + } + #endif + + MemoryOutputStream mo; + xml->writeToStream (mo, String::empty); + + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (projectFile, mo)) + errors.add ("Couldn't write to the target file!"); + } + } + + void writeJucerComment (OutputStream& out) + { + out << "/*" << newLine << newLine + << " IMPORTANT! This file is auto-generated by the Jucer each time you save your" << newLine + << " project - if you alter its contents, your changes may be overwritten!" << newLine + << newLine; + } + + void writeAppConfig (OutputStream& out) + { + writeJucerComment (out); + out << " If you want to change any of these values, use the Jucer to do so, rather than" << newLine + << " editing this file directly!" << newLine + << newLine + << " Any commented-out settings will fall back to using the default values that" << newLine + << " they are given in juce_Config.h" << newLine + << newLine + << "*/" << newLine << newLine; + + bool notActive = project.getJuceLinkageMode() == Project::useLinkedJuce + || project.getJuceLinkageMode() == Project::notLinkedToJuce; + if (notActive) + out << "/* NOTE: These configs aren't available when you're linking to the juce library statically!" << newLine + << " If you need to set a configuration that differs from the default, you'll need" << newLine + << " to include the amalgamated Juce files." << newLine << newLine; + + OwnedArray <Project::JuceConfigFlag> flags; + project.getJuceConfigFlags (flags); + + for (int i = 0; i < flags.size(); ++i) + { + const Project::JuceConfigFlag* const f = flags[i]; + const String value (f->value.toString()); + + if (value != Project::configFlagEnabled && value != Project::configFlagDisabled) + out << "//#define "; + else + out << "#define "; + + out << f->symbol; + + if (value == Project::configFlagEnabled) + out << " 1"; + else if (value == Project::configFlagDisabled) + out << " 0"; + + out << newLine; + } + + if (notActive) + out << newLine << "*/" << newLine; + } + + void writeSourceWrapper (OutputStream& out, int fileNumber) + { + writeJucerComment (out); + out << " This file pulls in all the Juce source code, and builds it using the settings" << newLine + << " defined in " << appConfigFile.getFileName() << "." << newLine + << newLine + << " If you want to change the method by which Juce is linked into your app, use the" << newLine + << " Jucer to change it, rather than trying to edit this file directly." << newLine + << newLine + << "*/" + << newLine << newLine + << CodeHelpers::createIncludeStatement (appConfigFile, appConfigFile) << newLine; + + if (fileNumber == 0) + writeInclude (out, project.isUsingFullyAmalgamatedFile() ? "juce_amalgamated.cpp" + : "amalgamation/juce_amalgamated_template.cpp"); + else + writeInclude (out, "amalgamation/juce_amalgamated" + String (fileNumber) + ".cpp"); + } + + void writeAppHeader (OutputStream& out) + { + writeJucerComment (out); + out << " This is the header file that your files should include in order to get all the" << newLine + << " Juce library headers. You should NOT include juce.h or juce_amalgamated.h directly in" << newLine + << " your own source files, because that wouldn't pick up the correct Juce configuration" << newLine + << " options for your app." << newLine + << newLine + << "*/" << newLine << newLine; + + String headerGuard ("__APPHEADERFILE_" + String::toHexString (juceHeaderFile.hashCode()).toUpperCase() + "__"); + out << "#ifndef " << headerGuard << newLine + << "#define " << headerGuard << newLine << newLine; + + if (hasAppConfigFile) + out << CodeHelpers::createIncludeStatement (appConfigFile, appConfigFile) << newLine; + + if (project.getJuceLinkageMode() != Project::notLinkedToJuce) + { + writeInclude (out, (project.isUsingSingleTemplateFile() || project.isUsingMultipleTemplateFiles()) + ? "juce_amalgamated.h" // could use "amalgamation/juce_amalgamated_template.h", but it's slower.. + : (project.isUsingFullyAmalgamatedFile() + ? "juce_amalgamated.h" + : "juce.h")); + } + + if (binaryDataCpp.exists()) + out << CodeHelpers::createIncludeStatement (binaryDataCpp.withFileExtension (".h"), appConfigFile) << newLine; + + out << newLine + << "namespace ProjectInfo" << newLine + << "{" << newLine + << " const char* const projectName = " << CodeHelpers::addEscapeChars (project.getProjectName().toString()).quoted() << ";" << newLine + << " const char* const versionString = " << CodeHelpers::addEscapeChars (project.getVersion().toString()).quoted() << ";" << newLine + << " const int versionNumber = " << createVersionCode (project.getVersion().toString()) << ";" << newLine + << "}" << newLine + << newLine + << "#endif // " << headerGuard << newLine; + } + + void writeInclude (OutputStream& out, const String& pathFromJuceFolder) + { + StringArray paths, guards; + + for (int i = project.getNumExporters(); --i >= 0;) + { + ScopedPointer <ProjectExporter> exporter (project.createExporter (i)); + + if (exporter != 0) + { + paths.add (exporter->getIncludePathForFileInJuceFolder (pathFromJuceFolder, juceHeaderFile)); + guards.add ("defined (" + exporter->getExporterIdentifierMacro() + ")"); + } + } + + StringArray uniquePaths (paths); + uniquePaths.removeDuplicates (false); + + if (uniquePaths.size() == 1) + { + out << "#include " << paths[0] << newLine; + } + else + { + int i = paths.size(); + for (; --i >= 0;) + { + for (int j = i; --j >= 0;) + { + if (paths[i] == paths[j] && guards[i] == guards[j]) + { + paths.remove (i); + guards.remove (i); + } + } + } + + for (i = 0; i < paths.size(); ++i) + { + out << (i == 0 ? "#if " : "#elif ") << guards[i] << newLine + << " #include " << paths[i] << newLine; + } + + out << "#endif" << newLine; + } + } + + static int countMaxPluginChannels (const String& configString, bool isInput) + { + StringArray configs; + configs.addTokens (configString, ", {}", String::empty); + configs.trim(); + configs.removeEmptyStrings(); + jassert ((configs.size() & 1) == 0); // looks like a syntax error in the configs? + + int maxVal = 0; + for (int i = (isInput ? 0 : 1); i < configs.size(); i += 2) + maxVal = jmax (maxVal, configs[i].getIntValue()); + + return maxVal; + } + + static const String createVersionCode (const String& version) + { + StringArray configs; + configs.addTokens (version, ",.", String::empty); + configs.trim(); + configs.removeEmptyStrings(); + + int value = (configs[0].getIntValue() << 16) + (configs[1].getIntValue() << 8) + configs[2].getIntValue(); + + if (configs.size() >= 4) + value = (value << 8) + configs[3].getIntValue(); + + return "0x" + String::toHexString (value); + } + + void writePluginCharacteristics (OutputStream& out) + { + String headerGuard ("__PLUGINCHARACTERISTICS_" + String::toHexString (pluginCharacteristicsFile.hashCode()).toUpperCase() + "__"); + + writeJucerComment (out); + out << " This header file contains configuration options for the plug-in. If you need to change any of" << newLine + << " these, it'd be wise to do so using the Jucer, rather than editing this file directly..." << newLine + << newLine + << "*/" << newLine + << newLine + << "#ifndef " << headerGuard << newLine + << "#define " << headerGuard << newLine + << newLine + << "#define JucePlugin_Build_VST " << ((bool) project.shouldBuildVST().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine + << "#define JucePlugin_Build_AU " << ((bool) project.shouldBuildAU().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine + << "#define JucePlugin_Build_RTAS " << ((bool) project.shouldBuildRTAS().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine + << newLine + << "#define JucePlugin_Name " << project.getPluginName().toString().quoted() << newLine + << "#define JucePlugin_Desc " << project.getPluginDesc().toString().quoted() << newLine + << "#define JucePlugin_Manufacturer " << project.getPluginManufacturer().toString().quoted() << newLine + << "#define JucePlugin_ManufacturerCode '" << project.getPluginManufacturerCode().toString().trim().substring (0, 4) << "'" << newLine + << "#define JucePlugin_PluginCode '" << project.getPluginCode().toString().trim().substring (0, 4) << "'" << newLine + << "#define JucePlugin_MaxNumInputChannels " << countMaxPluginChannels (project.getPluginChannelConfigs().toString(), true) << newLine + << "#define JucePlugin_MaxNumOutputChannels " << countMaxPluginChannels (project.getPluginChannelConfigs().toString(), false) << newLine + << "#define JucePlugin_PreferredChannelConfigurations " << project.getPluginChannelConfigs().toString() << newLine + << "#define JucePlugin_IsSynth " << ((bool) project.getPluginIsSynth().getValue() ? 1 : 0) << newLine + << "#define JucePlugin_WantsMidiInput " << ((bool) project.getPluginWantsMidiInput().getValue() ? 1 : 0) << newLine + << "#define JucePlugin_ProducesMidiOutput " << ((bool) project.getPluginProducesMidiOut().getValue() ? 1 : 0) << newLine + << "#define JucePlugin_SilenceInProducesSilenceOut " << ((bool) project.getPluginSilenceInProducesSilenceOut().getValue() ? 1 : 0) << newLine + << "#define JucePlugin_TailLengthSeconds " << (double) project.getPluginTailLengthSeconds().getValue() << newLine + << "#define JucePlugin_EditorRequiresKeyboardFocus " << ((bool) project.getPluginEditorNeedsKeyFocus().getValue() ? 1 : 0) << newLine + << "#define JucePlugin_VersionCode " << createVersionCode (project.getVersion().toString()) << newLine + << "#define JucePlugin_VersionString " << project.getVersion().toString().quoted() << newLine + << "#define JucePlugin_VSTUniqueID JucePlugin_PluginCode" << newLine + << "#define JucePlugin_VSTCategory " << ((bool) project.getPluginIsSynth().getValue() ? "kPlugCategSynth" : "kPlugCategEffect") << newLine + << "#define JucePlugin_AUMainType " << ((bool) project.getPluginIsSynth().getValue() ? "kAudioUnitType_MusicDevice" : "kAudioUnitType_Effect") << newLine + << "#define JucePlugin_AUSubType JucePlugin_PluginCode" << newLine + << "#define JucePlugin_AUExportPrefix " << project.getPluginAUExportPrefix().toString() << newLine + << "#define JucePlugin_AUExportPrefixQuoted " << project.getPluginAUExportPrefix().toString().quoted() << newLine + << "#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode" << newLine + << "#define JucePlugin_CFBundleIdentifier " << project.getBundleIdentifier().toString() << newLine + << "#define JucePlugin_AUCocoaViewClassName " << project.getPluginAUCocoaViewClassName().toString() << newLine + << "#define JucePlugin_RTASCategory " << ((bool) project.getPluginIsSynth().getValue() ? "ePlugInCategory_SWGenerators" : "ePlugInCategory_None") << newLine + << "#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode" << newLine + << "#define JucePlugin_RTASProductId JucePlugin_PluginCode" << newLine; + + if (project.getObjectiveCClassSuffix().toString().isNotEmpty()) + out << "#define JUCE_ObjCExtraSuffix " << project.getObjectiveCClassSuffix().toString() << newLine; + + out << "#define JUCE_USE_VSTSDK_2_4 1" << newLine + << newLine + << "#endif // " << headerGuard << newLine; + } + + bool replaceFileIfDifferent (const File& f, const MemoryOutputStream& newData) + { + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (f, newData)) + { + errors.add ("Can't write to file: " + f.getFullPathName()); + return false; + } + + return true; + } + + void writeJuceSourceWrappers() + { + const File wrapperFolder (project.getWrapperFolder()); + + appConfigFile = wrapperFolder.getChildFile (project.getAppConfigFilename()); + pluginCharacteristicsFile = wrapperFolder.getChildFile (project.getPluginCharacteristicsFilename()); + + juceHeaderFile = project.getAppIncludeFile(); + binaryDataCpp = wrapperFolder.getChildFile ("BinaryData.cpp"); + + if (resourceFile.getNumFiles() > 0) + { + if (! wrapperFolder.createDirectory()) + { + errors.add ("Couldn't create folder: " + wrapperFolder.getFullPathName()); + return; + } + + //resourceFile.setJuceHeaderToInclude (juceHeaderFile); + resourceFile.setClassName ("BinaryData"); + + if (! resourceFile.write (binaryDataCpp)) + errors.add ("Can't create binary resources file: " + binaryDataCpp.getFullPathName()); + } + else + { + binaryDataCpp.deleteFile(); + binaryDataCpp.withFileExtension ("h").deleteFile(); + } + + if (project.isLibrary()) + return; + + if (! wrapperFolder.createDirectory()) + { + errors.add ("Couldn't create folder: " + wrapperFolder.getFullPathName()); + return; + } + + if (hasAppConfigFile) + { + MemoryOutputStream mem; + writeAppConfig (mem); + replaceFileIfDifferent (appConfigFile, mem); + } + else + { + appConfigFile.deleteFile(); + } + + if (project.isAudioPlugin()) + { + MemoryOutputStream mem; + writePluginCharacteristics (mem); + replaceFileIfDifferent (pluginCharacteristicsFile, mem); + } + + for (int i = 0; i <= project.getNumSeparateAmalgamatedFiles(); ++i) + { + const File sourceWrapperCpp (getSourceWrapperCpp (i)); + const File sourceWrapperMM (sourceWrapperCpp.withFileExtension (".mm")); + + if (numJuceSourceFiles > 0 + && ((i == 0 && numJuceSourceFiles == 1) || (i != 0 && numJuceSourceFiles > 1))) + { + MemoryOutputStream mem; + writeSourceWrapper (mem, i); + replaceFileIfDifferent (sourceWrapperCpp, mem); + replaceFileIfDifferent (sourceWrapperMM, mem); + } + else + { + sourceWrapperMM.deleteFile(); + sourceWrapperCpp.deleteFile(); + } + } + + if (hasAppHeaderFile) + { + MemoryOutputStream mem; + writeAppHeader (mem); + replaceFileIfDifferent (juceHeaderFile, mem); + } + else + { + juceHeaderFile.deleteFile(); + } + } + + void writeProjects() + { + for (int i = project.getNumExporters(); --i >= 0;) + { + ScopedPointer <ProjectExporter> exporter (project.createExporter (i)); + std::cout << "Writing files for: " << exporter->getName() << std::endl; + + const File targetFolder (exporter->getTargetFolder()); + + if (targetFolder.createDirectory()) + { + exporter->juceWrapperFolder = RelativePath (project.getWrapperFolder(), targetFolder, RelativePath::buildTargetFolder); + + if (hasAppConfigFile) + exporter->juceWrapperFiles.add (RelativePath (appConfigFile, targetFolder, RelativePath::buildTargetFolder)); + + if (hasAppHeaderFile) + exporter->juceWrapperFiles.add (RelativePath (juceHeaderFile, targetFolder, RelativePath::buildTargetFolder)); + + if (hasResources) + { + exporter->juceWrapperFiles.add (RelativePath (binaryDataCpp, targetFolder, RelativePath::buildTargetFolder)); + exporter->juceWrapperFiles.add (RelativePath (binaryDataCpp, targetFolder, RelativePath::buildTargetFolder) + .withFileExtension (".h")); + } + + if (numJuceSourceFiles > 0) + { + for (int j = 0; j <= project.getNumSeparateAmalgamatedFiles(); ++j) + { + const File sourceWrapperCpp (getSourceWrapperCpp (j)); + const File sourceWrapperMM (sourceWrapperCpp.withFileExtension (".mm")); + + if ((j == 0 && numJuceSourceFiles == 1) || (j != 0 && numJuceSourceFiles > 1)) + { + if (exporter->usesMMFiles()) + exporter->juceWrapperFiles.add (RelativePath (sourceWrapperMM, targetFolder, RelativePath::buildTargetFolder)); + else + exporter->juceWrapperFiles.add (RelativePath (sourceWrapperCpp, targetFolder, RelativePath::buildTargetFolder)); + } + } + } + + if (project.isAudioPlugin()) + exporter->juceWrapperFiles.add (RelativePath (pluginCharacteristicsFile, targetFolder, RelativePath::buildTargetFolder)); + + String error = exporter->create(); + + if (error.isNotEmpty()) + errors.add (error); + } + else + { + errors.add ("Can't create folder: " + exporter->getTargetFolder().getFullPathName()); + } + } + } + + const File getSourceWrapperCpp (int fileIndex) const + { + return project.getWrapperFolder().getChildFile (project.getJuceSourceFilenameRoot() + (fileIndex != 0 ? String (fileIndex) : String::empty)) + .withFileExtension (".cpp"); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectSaver); +}; + + +#endif diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.cpp new file mode 100755 index 000000000..2ffb154cb --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.cpp @@ -0,0 +1,482 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_ProjectTreeViewBase.h" +#include "../Application/jucer_OpenDocumentManager.h" + + +//============================================================================== +ProjectTreeViewBase::ProjectTreeViewBase (const Project::Item& item_) + : item (item_), isFileMissing (false) +{ + item.getNode().addListener (this); +} + +ProjectTreeViewBase::~ProjectTreeViewBase() +{ + item.getNode().removeListener (this); +} + +//============================================================================== +const String ProjectTreeViewBase::getDisplayName() const +{ + return item.getName().toString(); +} + +void ProjectTreeViewBase::setName (const String& newName) +{ + if (item.isMainGroup()) + item.getProject().setTitle (newName); + else + item.getName() = newName; +} + +//============================================================================== +const File ProjectTreeViewBase::getFile() const +{ + return item.getFile(); +} + +void ProjectTreeViewBase::browseToAddExistingFiles() +{ + const File location (item.isGroup() ? item.determineGroupFolder() : getFile()); + FileChooser fc ("Add Files to Jucer Project", location, String::empty, false); + + if (fc.browseForMultipleFilesOrDirectories()) + { + StringArray files; + + for (int i = 0; i < fc.getResults().size(); ++i) + files.add (fc.getResults().getReference(i).getFullPathName()); + + addFiles (files, 0); + } +} + +void ProjectTreeViewBase::addFiles (const StringArray& files, int insertIndex) +{ + ProjectTreeViewBase* p = dynamic_cast <ProjectTreeViewBase*> (getParentItem()); + + if (p != 0) + p->addFiles (files, insertIndex); +} + +void ProjectTreeViewBase::moveSelectedItemsTo (OwnedArray <Project::Item>& selectedNodes, int insertIndex) +{ + jassertfalse; +} + +//============================================================================== +ProjectTreeViewBase* ProjectTreeViewBase::findTreeViewItem (const Project::Item& itemToFind) +{ + if (item == itemToFind) + { + return this; + } + else + { + const bool wasOpen = isOpen(); + setOpen (true); + + for (int i = getNumSubItems(); --i >= 0;) + { + ProjectTreeViewBase* pg = dynamic_cast <ProjectTreeViewBase*> (getSubItem(i)); + + if (pg != 0) + { + pg = pg->findTreeViewItem (itemToFind); + + if (pg != 0) + return pg; + } + } + + setOpen (wasOpen); + } + + return 0; +} + +//============================================================================== +void ProjectTreeViewBase::triggerAsyncRename (const Project::Item& itemToRename) +{ + class RenameMessage : public CallbackMessage + { + public: + RenameMessage (TreeView* const tree_, const Project::Item& itemToRename_) + : tree (tree_), itemToRename (itemToRename_) {} + + void messageCallback() + { + if (tree != 0) + { + ProjectTreeViewBase* pg = dynamic_cast <ProjectTreeViewBase*> (tree->getRootItem()); + + if (pg != 0) + { + pg = pg->findTreeViewItem (itemToRename); + + if (pg != 0) + pg->showRenameBox(); + } + } + } + + private: + Component::SafePointer<TreeView> tree; + Project::Item itemToRename; + }; + + (new RenameMessage (getOwnerView(), itemToRename))->post(); +} + +//============================================================================== +void ProjectTreeViewBase::checkFileStatus() +{ + const File file (getFile()); + const bool nowMissing = file != File::nonexistent && ! file.exists(); + + if (nowMissing != isFileMissing) + { + isFileMissing = nowMissing; + repaintItem(); + } +} + +void ProjectTreeViewBase::revealInFinder() const +{ + getFile().revealToUser(); +} + +void ProjectTreeViewBase::deleteItem() +{ + item.removeItemFromProject(); +} + +void ProjectTreeViewBase::deleteAllSelectedItems() +{ + TreeView* tree = getOwnerView(); + const int numSelected = tree->getNumSelectedItems(); + OwnedArray <File> filesToTrash; + OwnedArray <Project::Item> itemsToRemove; + + int i; + for (i = 0; i < numSelected; ++i) + { + const ProjectTreeViewBase* const p = dynamic_cast <ProjectTreeViewBase*> (tree->getSelectedItem (i)); + + if (p != 0) + { + itemsToRemove.add (new Project::Item (p->item)); + + if (p->getFile().existsAsFile()) + filesToTrash.add (new File (p->getFile())); + } + } + + if (filesToTrash.size() > 0) + { + String fileList; + const int maxFilesToList = 10; + for (i = jmin (maxFilesToList, filesToTrash.size()); --i >= 0;) + fileList << filesToTrash.getUnchecked(i)->getFullPathName() << "\n"; + + if (filesToTrash.size() > maxFilesToList) + fileList << "\n...plus " << (filesToTrash.size() - maxFilesToList) << " more files..."; + + int r = AlertWindow::showYesNoCancelBox (AlertWindow::NoIcon, "Delete Project Items", + "As well as removing the selected item(s) from the project, do you also want to move their files to the trash:\n\n" + + fileList, + "Just remove references", + "Also move files to Trash", + "Cancel", + tree->getTopLevelComponent()); + + if (r == 0) + return; + + if (r != 2) + filesToTrash.clear(); + } + + ProjectTreeViewBase* treeRootItem = dynamic_cast <ProjectTreeViewBase*> (tree->getRootItem()); + jassert (treeRootItem != 0); + + if (treeRootItem != 0) + { + for (i = filesToTrash.size(); --i >= 0;) + { + const File f (*filesToTrash.getUnchecked(i)); + + OpenDocumentManager::getInstance()->closeFile (f, false); + + if (! f.moveToTrash()) + { + // xxx + } + } + + for (i = itemsToRemove.size(); --i >= 0;) + { + ProjectTreeViewBase* itemToRemove = treeRootItem->findTreeViewItem (*itemsToRemove.getUnchecked(i)); + + if (itemToRemove != 0) + { + OpenDocumentManager::getInstance()->closeFile (itemToRemove->getFile(), false); + itemToRemove->deleteItem(); + } + } + } +} + +static int indexOfNode (const ValueTree& parent, const ValueTree& child) +{ + for (int i = parent.getNumChildren(); --i >= 0;) + if (parent.getChild (i) == child) + return i; + + return -1; +} + +void ProjectTreeViewBase::moveItems (OwnedArray <Project::Item>& selectedNodes, + Project::Item destNode, int insertIndex) +{ + int i; + for (i = selectedNodes.size(); --i >= 0;) + { + Project::Item* const n = selectedNodes.getUnchecked(i); + + if (destNode == *n || destNode.getNode().isAChildOf (n->getNode())) // Check for recursion. + return; + + if (! destNode.canContain (*n)) + selectedNodes.remove (i); + } + + // Don't include any nodes that are children of other selected nodes.. + for (i = selectedNodes.size(); --i >= 0;) + { + Project::Item* const n = selectedNodes.getUnchecked(i); + + for (int j = selectedNodes.size(); --j >= 0;) + { + if (j != i && n->getNode().isAChildOf (selectedNodes.getUnchecked(j)->getNode())) + { + selectedNodes.remove (i); + break; + } + } + } + + // Remove and re-insert them one at a time.. + for (i = 0; i < selectedNodes.size(); ++i) + { + Project::Item* selectedNode = selectedNodes.getUnchecked(i); + + if (selectedNode->getNode().getParent() == destNode.getNode() + && indexOfNode (destNode.getNode(), selectedNode->getNode()) < insertIndex) + --insertIndex; + + selectedNode->removeItemFromProject(); + destNode.addChild (*selectedNode, insertIndex++); + } +} + +//============================================================================== +bool ProjectTreeViewBase::isInterestedInFileDrag (const StringArray& files) +{ + return acceptsFileDrop (files); +} + +void ProjectTreeViewBase::filesDropped (const StringArray& files, int insertIndex) +{ + addFiles (files, insertIndex); +} + +static void getAllSelectedNodesInTree (Component* componentInTree, OwnedArray <Project::Item>& selectedNodes) +{ + TreeView* tree = dynamic_cast <TreeView*> (componentInTree); + + if (tree == 0) + tree = componentInTree->findParentComponentOfClass ((TreeView*) 0); + + if (tree != 0) + { + const int numSelected = tree->getNumSelectedItems(); + + for (int i = 0; i < numSelected; ++i) + { + const ProjectTreeViewBase* const p = dynamic_cast <ProjectTreeViewBase*> (tree->getSelectedItem (i)); + + if (p != 0) + selectedNodes.add (new Project::Item (p->item)); + } + } +} + +bool ProjectTreeViewBase::isInterestedInDragSource (const String& sourceDescription, Component* sourceComponent) +{ + if (sourceDescription != projectItemDragType) + return false; + + OwnedArray <Project::Item> selectedNodes; + getAllSelectedNodesInTree (sourceComponent, selectedNodes); + + return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes); +} + +void ProjectTreeViewBase::itemDropped (const String& sourceDescription, Component* sourceComponent, int insertIndex) +{ + OwnedArray <Project::Item> selectedNodes; + getAllSelectedNodesInTree (sourceComponent, selectedNodes); + + if (selectedNodes.size() > 0) + { + TreeView* tree = getOwnerView(); + ScopedPointer <XmlElement> oldOpenness (tree->getOpennessState (false)); + + moveSelectedItemsTo (selectedNodes, insertIndex); + + if (oldOpenness != 0) + tree->restoreOpennessState (*oldOpenness); + } +} + +//============================================================================== +void ProjectTreeViewBase::valueTreePropertyChanged (ValueTree& tree, const Identifier& property) +{ + if (tree == item.getNode()) + repaintItem(); +} + +void ProjectTreeViewBase::valueTreeChildrenChanged (ValueTree& tree) +{ + if (tree == item.getNode()) + { + refreshSubItems(); + treeHasChanged(); + setOpen (true); + } +} + +void ProjectTreeViewBase::valueTreeParentChanged (ValueTree& tree) +{ +} + +//============================================================================== +bool ProjectTreeViewBase::mightContainSubItems() +{ + return item.getNumChildren() > 0; +} + +const String ProjectTreeViewBase::getUniqueName() const +{ + jassert (item.getID().isNotEmpty()); + return item.getID(); +} + +void ProjectTreeViewBase::itemOpennessChanged (bool isNowOpen) +{ + if (isNowOpen) + refreshSubItems(); +} + +void ProjectTreeViewBase::addSubItems() +{ + for (int i = 0; i < item.getNumChildren(); ++i) + { + ProjectTreeViewBase* p = createSubItem (item.getChild(i)); + + if (p != 0) + addSubItem (p); + } +} + +void ProjectTreeViewBase::refreshSubItems() +{ + ScopedPointer <XmlElement> oldOpenness (getOpennessState()); + + clearSubItems(); + addSubItems(); + + if (oldOpenness != 0) + restoreOpennessState (*oldOpenness); +} + +void ProjectTreeViewBase::showMultiSelectionPopupMenu() +{ + PopupMenu m; + m.addItem (6, "Delete"); + + switch (m.show()) + { + case 6: deleteAllSelectedItems(); break; + default: break; + } +} + +void ProjectTreeViewBase::itemDoubleClicked (const MouseEvent& e) +{ + showDocument(); +} + +void ProjectTreeViewBase::itemSelectionChanged (bool isNowSelected) +{ + if (isNowSelected) + showDocument(); +} + +const String ProjectTreeViewBase::getTooltip() +{ + return String::empty; +} + +const String ProjectTreeViewBase::getDragSourceDescription() +{ + return projectItemDragType; +} + +//============================================================================== +ProjectTreeViewBase* ProjectTreeViewBase::getParentProjectItem() const +{ + return dynamic_cast <ProjectTreeViewBase*> (getParentItem()); +} + +ProjectContentComponent* ProjectTreeViewBase::getProjectContentComponent() const +{ + Component* c = getOwnerView(); + + while (c != 0) + { + ProjectContentComponent* pcc = dynamic_cast <ProjectContentComponent*> (c); + + if (pcc != 0) + return pcc; + + c = c->getParentComponent(); + } + + return 0; +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.h b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.h new file mode 100755 index 000000000..c3d7fecb8 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ProjectTreeViewBase.h @@ -0,0 +1,116 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__ +#define __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "../Utility/jucer_JucerTreeViewBase.h" +#include "jucer_Project.h" +#include "jucer_ResourceFile.h" +#include "jucer_ProjectContentComponent.h" + + +//============================================================================== +class ProjectTreeViewBase : public JucerTreeViewBase, + public ValueTree::Listener +{ +protected: + //============================================================================== + ProjectTreeViewBase (const Project::Item& item); + ~ProjectTreeViewBase(); + +public: + //============================================================================== + virtual bool isRoot() const { return false; } + virtual bool acceptsFileDrop (const StringArray& files) const = 0; + virtual bool acceptsDragItems (const OwnedArray <Project::Item>& selectedNodes) = 0; + + //============================================================================== + virtual const String getDisplayName() const; + virtual const String getRenamingName() const { return getDisplayName(); } + virtual void setName (const String& newName); + virtual bool isMissing() { return isFileMissing; } + virtual const File getFile() const; + + virtual void deleteItem(); + virtual void deleteAllSelectedItems(); + virtual void revealInFinder() const; + virtual void showDocument() = 0; + virtual void browseToAddExistingFiles(); + virtual void checkFileStatus(); // (recursive) + + virtual void addFiles (const StringArray& files, int insertIndex); + virtual void moveSelectedItemsTo (OwnedArray <Project::Item>& selectedNodes, int insertIndex); + virtual void showMultiSelectionPopupMenu(); + + virtual ProjectTreeViewBase* findTreeViewItem (const Project::Item& itemToFind); + + //============================================================================== + void valueTreePropertyChanged (ValueTree& tree, const Identifier& property); + void valueTreeChildrenChanged (ValueTree& tree); + void valueTreeParentChanged (ValueTree& tree); + + //============================================================================== + // TreeViewItem stuff.. + bool mightContainSubItems(); + const String getUniqueName() const; + void itemOpennessChanged (bool isNowOpen); + void refreshSubItems(); + bool canBeSelected() const { return true; } + void itemDoubleClicked (const MouseEvent& e); + void itemSelectionChanged (bool isNowSelected); + const String getTooltip(); + const String getDragSourceDescription(); + + //============================================================================== + // Drag-and-drop stuff.. + bool isInterestedInFileDrag (const StringArray& files); + void filesDropped (const StringArray& files, int insertIndex); + bool isInterestedInDragSource (const String& sourceDescription, Component* sourceComponent); + void itemDropped (const String& sourceDescription, Component* sourceComponent, int insertIndex); + + //============================================================================== + Project::Item item; + +protected: + bool isFileMissing; + + //============================================================================== + virtual void addSubItems(); + virtual ProjectTreeViewBase* createSubItem (const Project::Item& node) = 0; + const Drawable* getIcon() const { return item.getIcon(); } + + //============================================================================== + void triggerAsyncRename (const Project::Item& itemToRename); + static void moveItems (OwnedArray <Project::Item>& selectedNodes, + Project::Item destNode, int insertIndex); + + ProjectContentComponent* getProjectContentComponent() const; + ProjectTreeViewBase* getParentProjectItem() const; +}; + + +#endif // __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.cpp new file mode 100755 index 000000000..63639555d --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.cpp @@ -0,0 +1,217 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_ResourceFile.h" +#include "jucer_ProjectTreeViewBase.h" +#include "../Application/jucer_OpenDocumentManager.h" + +static const char* resourceFileIdentifierString = "JUCER_BINARY_RESOURCE"; + + +//============================================================================== +ResourceFile::ResourceFile (Project& project_) + : project (project_), + className ("BinaryData") +{ + addResourcesFromProjectItem (project.getMainGroup()); +} + +ResourceFile::~ResourceFile() +{ +} + +bool ResourceFile::isResourceFile (const File& file) +{ + if (file.hasFileExtension ("cpp;cc;h")) + { + ScopedPointer <InputStream> in (file.createInputStream()); + + if (in != 0) + { + MemoryBlock mb; + in->readIntoMemoryBlock (mb, 256); + return mb.toString().contains (resourceFileIdentifierString); + } + } + + return false; +} + +//============================================================================== +void ResourceFile::addResourcesFromProjectItem (const Project::Item& projectItem) +{ + if (projectItem.isGroup()) + { + for (int i = 0; i < projectItem.getNumChildren(); ++i) + addResourcesFromProjectItem (projectItem.getChild(i)); + } + else + { + if (projectItem.shouldBeAddedToBinaryResources()) + addFile (projectItem.getFile()); + } +} + +//============================================================================== +void ResourceFile::setJuceHeaderToInclude (const File& header) +{ + juceHeader = header; +} + +void ResourceFile::setClassName (const String& className_) +{ + className = className_; +} + +void ResourceFile::addFile (const File& file) +{ + files.add (new File (file)); +} + +int64 ResourceFile::getTotalDataSize() const +{ + int64 total = 0; + + for (int i = 0; i < files.size(); ++i) + total += files.getUnchecked(i)->getSize(); + + return total; +} + +bool ResourceFile::write (const File& cppFile, OutputStream& cpp, OutputStream& header) +{ + String comment; + comment << newLine << newLine + << " This is an auto-generated file, created by " << JUCEApplication::getInstance()->getApplicationName() << newLine + << " Do not edit anything in this file!" << newLine << newLine + << "*/" << newLine << newLine; + + header << "/* =========================================================================================" + << comment; + + cpp << "/* ==================================== " << resourceFileIdentifierString << " ====================================" + << comment; + + if (juceHeader.exists()) + header << CodeHelpers::createIncludeStatement (juceHeader, cppFile) << newLine; + + const String namespaceName (className); + StringArray variableNames, returnCodes; + + int i; + for (i = 0; i < files.size(); ++i) + { + String variableNameRoot (CodeHelpers::makeValidIdentifier (files.getUnchecked(i)->getFileName() + .replaceCharacters (" .", "__") + .retainCharacters ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789"), + false, true, false)); + String variableName (variableNameRoot); + + int suffix = 2; + while (variableNames.contains (variableName)) + variableName = variableNameRoot + String (suffix++); + + variableNames.add (variableName); + returnCodes.add ("numBytes = " + namespaceName + "::" + variableName + "Size; return " + + namespaceName + "::" + variableName + ";"); + } + + cpp << CodeHelpers::createIncludeStatement (cppFile.withFileExtension (".h"), cppFile) << newLine + << newLine + << newLine + << "const char* " << namespaceName << "::getNamedResource (const char* resourceNameUTF8, int& numBytes) throw()" << newLine + << "{" << newLine; + + CodeHelpers::createStringMatcher (cpp, "resourceNameUTF8", variableNames, returnCodes, 4); + + cpp << " numBytes = 0;" << newLine + << " return 0;" << newLine + << "}" << newLine + << newLine; + + header << "namespace " << namespaceName << newLine << "{" << newLine; + + for (i = 0; i < files.size(); ++i) + { + const File file (*files.getUnchecked(i)); + const int64 dataSize = file.getSize(); + + ScopedPointer <InputStream> fileStream (file.createInputStream()); + jassert (fileStream != 0); + + if (fileStream != 0) + { + const String variableName (variableNames[i]); + const String tempVariable ("temp_" + String::toHexString (file.hashCode())); + + header << " extern const char* " << variableName << ";" << newLine; + header << " const int " << variableName << "Size = " << (int) dataSize << ";" << newLine << newLine; + + cpp << newLine << "//================== " << file.getFileName() << " ==================" << newLine + << "static const unsigned char " << tempVariable + << "[] =" << newLine; + + { + MemoryBlock data; + fileStream->readIntoMemoryBlock (data); + CodeHelpers::writeDataAsCppLiteral (data, cpp); + } + + cpp << newLine << newLine + << "const char* " << namespaceName << "::" << variableName << " = (const char*) " + << tempVariable << ";" << newLine; + } + } + + header << " // If you provide the name of one of the binary resource variables above, this function will" << newLine + << " // return the corresponding data and its size (or a null pointer if the name isn't found)." << newLine + << " const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw();" << newLine + << "}" << newLine; + + return true; +} + +bool ResourceFile::write (const File& cppFile) +{ + TemporaryFile tempH (cppFile.withFileExtension (".h"), TemporaryFile::useHiddenFile); + TemporaryFile tempCpp (cppFile, TemporaryFile::useHiddenFile); + + ScopedPointer <FileOutputStream> cppOut (tempCpp.getFile().createOutputStream (32768)); + ScopedPointer <FileOutputStream> hppOut (tempH.getFile().createOutputStream (32768)); + + if (cppOut != 0 && hppOut != 0) + { + if (write (cppFile, *cppOut, *hppOut)) + { + cppOut = 0; + hppOut = 0; + + return (tempCpp.getFile().hasIdenticalContentTo (tempCpp.getTargetFile()) || tempCpp.overwriteTargetFileWithTemporary()) + && (tempH.getFile().hasIdenticalContentTo (tempH.getTargetFile()) || tempH.overwriteTargetFileWithTemporary()); + } + } + + return false; +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.h b/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.h new file mode 100755 index 000000000..2cd84cdec --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_ResourceFile.h @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_RESOURCEFILE_JUCEHEADER__ +#define __JUCER_RESOURCEFILE_JUCEHEADER__ + +#include "../jucer_Headers.h" +#include "jucer_Project.h" + + +//============================================================================== +class ResourceFile +{ +public: + //============================================================================== + ResourceFile (Project& project); + ~ResourceFile(); + + //============================================================================== + static bool isResourceFile (const File& file); + + //============================================================================== + void setJuceHeaderToInclude (const File& header); + void setClassName (const String& className); + void addFile (const File& file); + + int getNumFiles() const { return files.size(); } + int64 getTotalDataSize() const; + + bool write (const File& cppFile); + bool write (const File& cppFile, OutputStream& cpp, OutputStream& header); + + //============================================================================== +private: + OwnedArray <File> files; + Project& project; + File juceHeader; + String className; + + void addResourcesFromProjectItem (const Project::Item& node); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResourceFile); +}; + + +#endif // __JUCER_RESOURCEFILE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.cpp b/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.cpp new file mode 100755 index 000000000..7a1f7b988 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.cpp @@ -0,0 +1,282 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_TreeViewTypes.h" +#include "jucer_ProjectInformationComponent.h" +#include "jucer_GroupInformationComponent.h" +#include "../Application/jucer_OpenDocumentManager.h" +#include "../Code Editor/jucer_SourceCodeEditor.h" +#include "jucer_NewFileWizard.h" + + +//============================================================================== +GroupTreeViewItem::GroupTreeViewItem (const Project::Item& item_) + : ProjectTreeViewBase (item_) +{ +} + +GroupTreeViewItem::~GroupTreeViewItem() +{ +} + +void GroupTreeViewItem::addNewGroup() +{ + Project::Item group (item.getProject().createNewGroup()); + item.addChild (group, 0); + triggerAsyncRename (group); +} + +bool GroupTreeViewItem::acceptsDragItems (const OwnedArray <Project::Item>& selectedNodes) +{ + for (int i = selectedNodes.size(); --i >= 0;) + if (item.canContain (*selectedNodes.getUnchecked(i))) + return true; + + return false; +} + +void GroupTreeViewItem::addFiles (const StringArray& files, int insertIndex) +{ + for (int i = 0; i < files.size(); ++i) + { + const File file (files[i]); + + if (item.addFile (file, insertIndex)) + ++insertIndex; + } +} + +void GroupTreeViewItem::moveSelectedItemsTo (OwnedArray <Project::Item>& selectedNodes, int insertIndex) +{ + moveItems (selectedNodes, item, insertIndex); +} + +void GroupTreeViewItem::checkFileStatus() +{ + for (int i = 0; i < getNumSubItems(); ++i) + { + ProjectTreeViewBase* p = dynamic_cast <ProjectTreeViewBase*> (getSubItem(i)); + + if (p != 0) + p->checkFileStatus(); + } +} + +ProjectTreeViewBase* GroupTreeViewItem::createSubItem (const Project::Item& child) +{ + if (child.isGroup()) + return new GroupTreeViewItem (child); + + if (child.isFile()) + return new SourceFileTreeViewItem (child); + + jassertfalse + return 0; +} + +void GroupTreeViewItem::showDocument() +{ + ProjectContentComponent* pcc = getProjectContentComponent(); + + if (pcc != 0) + { + if (isRoot()) + pcc->setEditorComponent (new ProjectInformationComponent (item.getProject()), 0); + else + pcc->setEditorComponent (new GroupInformationComponent (item), 0); + } +} + +void GroupTreeViewItem::showPopupMenu() +{ + PopupMenu m; + addCreateFileMenuItems (m); + m.addSeparator(); + m.addItem (3, "Sort Contents Alphabetically"); + m.addSeparator(); + m.addItem (1, "Rename..."); + + if (! isRoot()) + m.addItem (2, "Delete"); + + const int res = m.show(); + switch (res) + { + case 1: triggerAsyncRename (item); break; + case 2: deleteAllSelectedItems(); break; + case 3: item.sortAlphabetically(); break; + default: processCreateFileMenuItem (res); break; + } +} + +void GroupTreeViewItem::addCreateFileMenuItems (PopupMenu& m) +{ + m.addItem (1001, "Add New Group"); + m.addItem (1002, "Add Existing Files..."); + + m.addSeparator(); + NewFileWizard::getInstance()->addWizardsToMenu (m); +} + +void GroupTreeViewItem::processCreateFileMenuItem (int menuID) +{ + switch (menuID) + { + case 1001: addNewGroup(); break; + case 1002: browseToAddExistingFiles(); break; + + default: + NewFileWizard::getInstance()->runWizardFromMenu (menuID, item); + break; + } +} + +//============================================================================== +//============================================================================== +SourceFileTreeViewItem::SourceFileTreeViewItem (const Project::Item& item_) + : ProjectTreeViewBase (item_) +{ +} + +SourceFileTreeViewItem::~SourceFileTreeViewItem() +{ +} + +const String SourceFileTreeViewItem::getDisplayName() const +{ + return getFile().getFileName(); +} + +static const File findCorrespondingHeaderOrCpp (const File& f) +{ + if (f.hasFileExtension (sourceFileExtensions)) + return f.withFileExtension (".h"); + else if (f.hasFileExtension (headerFileExtensions)) + return f.withFileExtension (".cpp"); + + return File::nonexistent; +} + +void SourceFileTreeViewItem::setName (const String& newName) +{ + if (newName != File::createLegalFileName (newName)) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", + "That filename contained some illegal characters!"); + triggerAsyncRename (item); + return; + } + + File oldFile (getFile()); + File newFile (oldFile.getSiblingFile (newName)); + File correspondingFile (findCorrespondingHeaderOrCpp (oldFile)); + + if (correspondingFile.exists() && newFile.hasFileExtension (oldFile.getFileExtension())) + { + Project::Item correspondingItem (item.getProject().getMainGroup().findItemForFile (correspondingFile)); + + if (correspondingItem.isValid()) + { + if (AlertWindow::showOkCancelBox (AlertWindow::NoIcon, "File Rename", + "Do you also want to rename the corresponding file \"" + correspondingFile.getFileName() + + "\" to match?")) + { + if (! item.renameFile (newFile)) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", + "Failed to rename \"" + oldFile.getFullPathName() + "\"!\n\nCheck your file permissions!"); + return; + } + + if (! correspondingItem.renameFile (newFile.withFileExtension (correspondingFile.getFileExtension()))) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", + "Failed to rename \"" + correspondingFile.getFullPathName() + "\"!\n\nCheck your file permissions!"); + } + } + } + } + + if (! item.renameFile (newFile)) + { + AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", + "Failed to rename the file!\n\nCheck your file permissions!"); + } +} + +ProjectTreeViewBase* SourceFileTreeViewItem::createSubItem (const Project::Item& child) +{ + jassertfalse + return 0; +} + +void SourceFileTreeViewItem::showDocument() +{ + ProjectContentComponent* pcc = getProjectContentComponent(); + const File f (getFile()); + + if (pcc != 0 && f.exists()) + pcc->showEditorForFile (f); +} + +void SourceFileTreeViewItem::showPopupMenu() +{ + GroupTreeViewItem* parentGroup = dynamic_cast <GroupTreeViewItem*> (getParentProjectItem()); + + PopupMenu m; + + if (parentGroup != 0) + { + parentGroup->addCreateFileMenuItems (m); + m.addSeparator(); + } + + m.addItem (1, "Open in external editor"); + m.addItem (2, +#if JUCE_MAC + "Reveal in Finder"); +#else + "Reveal in Explorer"); +#endif + + m.addItem (4, "Rename File..."); + m.addSeparator(); + m.addItem (3, "Delete"); + + const int res = m.show(); + switch (res) + { + case 1: getFile().startAsProcess(); break; + case 2: revealInFinder(); break; + case 3: deleteAllSelectedItems(); break; + case 4: triggerAsyncRename (item); break; + + default: + if (parentGroup != 0) + parentGroup->processCreateFileMenuItem (res); + + break; + } +} diff --git a/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.h b/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.h new file mode 100755 index 000000000..35102fd97 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Project/jucer_TreeViewTypes.h @@ -0,0 +1,74 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_TREEVIEWTYPES_JUCEHEADER__ +#define __JUCER_TREEVIEWTYPES_JUCEHEADER__ + +#include "jucer_ProjectTreeViewBase.h" + + +//============================================================================== +class SourceFileTreeViewItem : public ProjectTreeViewBase +{ +public: + SourceFileTreeViewItem (const Project::Item& item); + ~SourceFileTreeViewItem(); + + bool acceptsFileDrop (const StringArray& files) const { return false; } + bool acceptsDragItems (const OwnedArray <Project::Item>& selectedNodes) { return false; } + ProjectTreeViewBase* createSubItem (const Project::Item& child); + void createLeftEdgeComponents (Array<Component*>& components) {} + void showDocument(); + void showPopupMenu(); + const String getDisplayName() const; + void setName (const String& newName); +}; + +//============================================================================== +class GroupTreeViewItem : public ProjectTreeViewBase +{ +public: + GroupTreeViewItem (const Project::Item& item); + ~GroupTreeViewItem(); + + bool isRoot() const { return item.isMainGroup(); } + bool acceptsFileDrop (const StringArray& files) const { return true; } + bool acceptsDragItems (const OwnedArray <Project::Item>& selectedNodes); + void checkFileStatus(); + void moveSelectedItemsTo (OwnedArray <Project::Item>& selectedNodes, int insertIndex); + ProjectTreeViewBase* createSubItem (const Project::Item& child); + void createLeftEdgeComponents (Array<Component*>& components) {} + void showDocument(); + void showPopupMenu(); + + void addFiles (const StringArray& files, int insertIndex); + void addNewGroup(); + + void addCreateFileMenuItems (PopupMenu& m); + void processCreateFileMenuItem (int item); +}; + + +#endif // __JUCER_TREEVIEWTYPES_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.cpp b/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.cpp new file mode 100755 index 000000000..fa5340be1 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.cpp @@ -0,0 +1,487 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_CodeHelpers.h" + + +//============================================================================== +namespace CodeHelpers +{ + const String indent (const String& code, const int numSpaces, bool indentFirstLine) + { + if (numSpaces == 0) + return code; + + const String space (String::repeatedString (" ", numSpaces)); + + StringArray lines; + lines.addLines (code); + + for (int i = (indentFirstLine ? 0 : 1); i < lines.size(); ++i) + { + String s (lines[i].trimEnd()); + if (s.isNotEmpty()) + s = space + s; + + lines.set (i, s); + } + + return lines.joinIntoString (newLine); + } + + const String makeValidIdentifier (String s, bool capitalise, bool removeColons, bool allowTemplates) + { + if (s.isEmpty()) + return "unknown"; + + if (removeColons) + s = s.replaceCharacters (".,;:/@", "______"); + else + s = s.replaceCharacters (".,;/@", "_____"); + + int i; + for (i = s.length(); --i > 0;) + if (CharacterFunctions::isLetter (s[i]) + && CharacterFunctions::isLetter (s[i - 1]) + && CharacterFunctions::isUpperCase (s[i]) + && ! CharacterFunctions::isUpperCase (s[i - 1])) + s = s.substring (0, i) + " " + s.substring (i); + + String allowedChars ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ 0123456789"); + if (allowTemplates) + allowedChars += "<>"; + + if (! removeColons) + allowedChars += ":"; + + StringArray words; + words.addTokens (s.retainCharacters (allowedChars), false); + words.trim(); + + String n (words[0]); + + if (capitalise) + n = n.toLowerCase(); + + for (i = 1; i < words.size(); ++i) + { + if (capitalise && words[i].length() > 1) + n << words[i].substring (0, 1).toUpperCase() + << words[i].substring (1).toLowerCase(); + else + n << words[i]; + } + + if (CharacterFunctions::isDigit (n[0])) + n = "_" + n; + + if (CPlusPlusCodeTokeniser::isReservedKeyword (n)) + n << '_'; + + return n; + } + + template <class CharType> + static void writeEscapeChars (OutputStream& out, const CharType* data, const int numChars, + const int maxCharsOnLine, const bool breakAtNewLines, const bool replaceSingleQuotes) + { + int charsOnLine = 0; + bool lastWasHexEscapeCode = false; + + for (int i = 0; i < numChars || numChars < 0; ++i) + { + const CharType c = data[i]; + bool startNewLine = false; + + switch (c) + { + case '\t': out << "\\t"; lastWasHexEscapeCode = false; break; + case '\r': out << "\\r"; lastWasHexEscapeCode = false; break; + case '\n': out << "\\n"; lastWasHexEscapeCode = false; startNewLine = breakAtNewLines; break; + case '\\': out << "\\\\"; lastWasHexEscapeCode = false; break; + case '\"': out << "\\\""; lastWasHexEscapeCode = false; break; + + case 0: + if (numChars < 0) + return; + + out << "\\0"; + lastWasHexEscapeCode = true; + break; + + case '\'': + if (replaceSingleQuotes) + { + out << "\\\'"; + lastWasHexEscapeCode = false; + break; + } + + // deliberate fall-through... + + default: + if (c >= 32 && c < 127 && ! (lastWasHexEscapeCode // (have to avoid following a hex escape sequence with a valid hex digit) + && ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))) + { + out << (char) c; + lastWasHexEscapeCode = false; + } + else + { + out << (c < 16 ? "\\x0" : "\\x") << String::toHexString ((int) (unsigned int) c); + lastWasHexEscapeCode = true; + } + + break; + } + + if ((startNewLine || (maxCharsOnLine > 0 && ++charsOnLine >= maxCharsOnLine)) + && (numChars < 0 || i < numChars - 1)) + { + charsOnLine = 0; + out << "\"" << newLine << "\""; + } + } + } + + const String addEscapeChars (const String& s) + { + MemoryOutputStream out; + writeEscapeChars (out, (const juce_wchar*) s, -1, -1, false, true); + return out.toUTF8(); + } + + const String createIncludeStatement (const File& includeFile, const File& targetFile) + { + return "#include \"" + FileHelpers::unixStylePath (includeFile.getRelativePathFrom (targetFile.getParentDirectory())) + "\""; + } + + const String makeHeaderGuardName (const File& file) + { + return "__" + file.getFileName().toUpperCase() + .replaceCharacters (" .", "__") + .retainCharacters ("_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + + "_" + String::toHexString (file.hashCode()).toUpperCase() + "__"; + } + + const String stringLiteral (const String& text) + { + if (text.isEmpty()) + return "String::empty"; + + return CodeHelpers::addEscapeChars (text).quoted(); + } + + const String boolLiteral (const bool b) + { + return b ? "true" : "false"; + } + + const String floatLiteral (float v) + { + String s ((double) v, 4); + + if (s.containsChar ('.')) + { + s = s.trimCharactersAtEnd ("0"); + if (s.endsWithChar ('.')) + s << '0'; + + s << 'f'; + } + else + { + s << ".0f"; + } + + return s; + } + + const String doubleLiteral (double v) + { + String s (v, 7); + + if (s.containsChar ('.')) + { + s = s.trimCharactersAtEnd ("0"); + if (s.endsWithChar ('.')) + s << '0'; + } + else + { + s << ".0"; + } + + return s; + } + + const String alignFunctionCallParams (const String& call, const StringArray& parameters, const int maxLineLength) + { + String result, currentLine (call); + + for (int i = 0; i < parameters.size(); ++i) + { + if (currentLine.length() >= maxLineLength) + { + result += currentLine.trimEnd() + newLine; + currentLine = String::repeatedString (" ", call.length()) + parameters[i]; + } + else + { + currentLine += parameters[i]; + } + + if (i < parameters.size() - 1) + currentLine << ", "; + } + + return result + currentLine.trimEnd() + ")"; + } + + const String colourToCode (const Colour& col) + { + const Colour colours[] = + { + #define COL(col) Colours::col, + #include "jucer_Colours.h" + #undef COL + Colours::transparentBlack + }; + + static const char* colourNames[] = + { + #define COL(col) #col, + #include "jucer_Colours.h" + #undef COL + 0 + }; + + for (int i = 0; i < numElementsInArray (colourNames) - 1; ++i) + if (col == colours[i]) + return "Colours::" + String (colourNames[i]); + + return "Colour (0x" + hexString8Digits ((int) col.getARGB()) + ')'; + } + + const String justificationToCode (const Justification& justification) + { + switch (justification.getFlags()) + { + case Justification::centred: return "Justification::centred"; + case Justification::centredLeft: return "Justification::centredLeft"; + case Justification::centredRight: return "Justification::centredRight"; + case Justification::centredTop: return "Justification::centredTop"; + case Justification::centredBottom: return "Justification::centredBottom"; + case Justification::topLeft: return "Justification::topLeft"; + case Justification::topRight: return "Justification::topRight"; + case Justification::bottomLeft: return "Justification::bottomLeft"; + case Justification::bottomRight: return "Justification::bottomRight"; + case Justification::left: return "Justification::left"; + case Justification::right: return "Justification::right"; + case Justification::horizontallyCentred: return "Justification::horizontallyCentred"; + case Justification::top: return "Justification::top"; + case Justification::bottom: return "Justification::bottom"; + case Justification::verticallyCentred: return "Justification::verticallyCentred"; + case Justification::horizontallyJustified: return "Justification::horizontallyJustified"; + default: jassertfalse; break; + } + + return "Justification (" + String (justification.getFlags()) + ")"; + } + + const String fontToCode (const Font& font) + { + String s ("Font ("); + String name (font.getTypefaceName()); + + if (name != Font::getDefaultSansSerifFontName()) + { + if (name == Font::getDefaultSerifFontName()) + name = "Font::getDefaultSerifFontName()"; + else if (name == Font::getDefaultMonospacedFontName()) + name = "Font::getDefaultMonospacedFontName()"; + else + name = stringLiteral (font.getTypefaceName()); + + s << name << ", "; + } + + s << floatLiteral (font.getHeight()); + + if (font.isBold() && font.isItalic()) + s << ", Font::bold | Font::italic"; + else if (font.isBold()) + s << ", Font::bold"; + else if (font.isItalic()) + s << ", Font::italic"; + + return s + ")"; + } + + const String castToFloat (const String& expression) + { + if (expression.containsOnly ("0123456789.f")) + { + String s (expression.getFloatValue()); + + if (s.containsChar (T('.'))) + return s + "f"; + + return s + ".0f"; + } + + return "(float) (" + expression + ")"; + } + + const String castToInt (const String& expression) + { + if (expression.containsOnly ("0123456789.")) + return String ((int) expression.getFloatValue()); + + return "(int) (" + expression + ")"; + } + + void writeDataAsCppLiteral (const MemoryBlock& mb, OutputStream& out) + { + const int maxCharsOnLine = 250; + + const unsigned char* data = (const unsigned char*) mb.getData(); + int charsOnLine = 0; + + bool canUseStringLiteral = mb.getSize() < 32768; // MS compilers can't handle big string literals.. + + if (canUseStringLiteral) + { + unsigned int numEscaped = 0; + + for (size_t i = 0; i < mb.getSize(); ++i) + { + const unsigned int num = (unsigned int) data[i]; + if (! ((num >= 32 && num < 127) || num == '\t' || num == '\r' || num == '\n')) + { + if (++numEscaped > mb.getSize() / 4) + { + canUseStringLiteral = false; + break; + } + } + } + } + + if (! canUseStringLiteral) + { + out << "{ "; + + for (size_t i = 0; i < mb.getSize(); ++i) + { + const int num = (int) (unsigned int) data[i]; + out << num << ','; + + charsOnLine += 2; + if (num >= 10) + ++charsOnLine; + if (num >= 100) + ++charsOnLine; + + if (charsOnLine >= maxCharsOnLine) + { + charsOnLine = 0; + out << newLine; + } + } + + out << "0,0 };"; + } + else + { + out << "\""; + writeEscapeChars (out, data, (int) mb.getSize(), maxCharsOnLine, true, false); + out << "\";"; + } + } + + static int calculateHash (const String& s, const int hashMultiplier) + { + const char* t = s.toUTF8(); + int hash = 0; + while (*t != 0) + hash = hashMultiplier * hash + *t++; + + return hash; + } + + static int findBestHashMultiplier (const StringArray& strings) + { + int v = 31; + + for (;;) + { + SortedSet <int> hashes; + bool collision = false; + for (int i = strings.size(); --i >= 0;) + { + const int hash = calculateHash (strings[i], v); + if (hashes.contains (hash)) + { + collision = true; + break; + } + + hashes.add (hash); + } + + if (! collision) + break; + + v += 2; + } + + return v; + } + + void createStringMatcher (OutputStream& out, const String& utf8PointerVariable, + const StringArray& strings, const StringArray& codeToExecute, const int indentLevel) + { + jassert (strings.size() == codeToExecute.size()); + const String indent (String::repeatedString (" ", indentLevel)); + const int hashMultiplier = findBestHashMultiplier (strings); + + out << indent << "int hash = 0;" << newLine + << indent << "if (" << utf8PointerVariable << " != 0)" << newLine + << indent << " while (*" << utf8PointerVariable << " != 0)" << newLine + << indent << " hash = " << hashMultiplier << " * hash + *" << utf8PointerVariable << "++;" << newLine + << newLine + << indent << "switch (hash)" << newLine + << indent << "{" << newLine; + + for (int i = 0; i < strings.size(); ++i) + out << indent << " case 0x" << hexString8Digits (calculateHash (strings[i], hashMultiplier)) + << ": " << codeToExecute[i] << newLine; + + out << indent << " default: break;" << newLine + << indent << "}" << newLine << newLine; + } +} diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.h b/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.h new file mode 100755 index 000000000..797389a2b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_CodeHelpers.h @@ -0,0 +1,59 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_CODEUTILITIES_H_B86AA5D2__ +#define __JUCER_CODEUTILITIES_H_B86AA5D2__ + + +//============================================================================== +namespace CodeHelpers +{ + const String indent (const String& code, const int numSpaces, bool indentFirstLine); + const String makeValidIdentifier (String s, bool capitalise, bool removeColons, bool allowTemplates); + const String addEscapeChars (const String& text); + const String createIncludeStatement (const File& includeFile, const File& targetFile); + const String makeHeaderGuardName (const File& file); + + const String stringLiteral (const String& text); + const String boolLiteral (bool b); + const String floatLiteral (float v); + const String doubleLiteral (double v); + + const String colourToCode (const Colour& col); + const String justificationToCode (const Justification& justification); + const String castToFloat (const String& expression); + const String castToInt (const String& expression); + const String fontToCode (const Font& font); + const String alignFunctionCallParams (const String& call, const StringArray& parameters, int maxLineLength); + + void writeDataAsCppLiteral (const MemoryBlock& data, OutputStream& out); + + void createStringMatcher (OutputStream& out, const String& utf8PointerVariable, + const StringArray& strings, const StringArray& codeToExecute, const int indentLevel); + +} + + +#endif // __JUCER_CODEUTILITIES_H_B86AA5D2__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_Colours.h b/JuceLibraryCode/jucer/Source/Utility/jucer_Colours.h new file mode 100755 index 000000000..e2a75ba8c --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_Colours.h @@ -0,0 +1,162 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +COL(black) +COL(white) +COL(blue) +COL(grey) +COL(green) +COL(red) +COL(yellow) +COL(aliceblue) +COL(antiquewhite) +COL(aqua) +COL(aquamarine) +COL(azure) +COL(beige) +COL(bisque) +COL(blanchedalmond) +COL(blueviolet) +COL(brown) +COL(burlywood) +COL(cadetblue) +COL(chartreuse) +COL(chocolate) +COL(coral) +COL(cornflowerblue) +COL(cornsilk) +COL(crimson) +COL(cyan) +COL(darkblue) +COL(darkcyan) +COL(darkgoldenrod) +COL(darkgrey) +COL(darkgreen) +COL(darkkhaki) +COL(darkmagenta) +COL(darkolivegreen) +COL(darkorange) +COL(darkorchid) +COL(darkred) +COL(darksalmon) +COL(darkseagreen) +COL(darkslateblue) +COL(darkslategrey) +COL(darkturquoise) +COL(darkviolet) +COL(deeppink) +COL(deepskyblue) +COL(dimgrey) +COL(dodgerblue) +COL(firebrick) +COL(floralwhite) +COL(forestgreen) +COL(fuchsia) +COL(gainsboro) +COL(gold) +COL(goldenrod) +COL(greenyellow) +COL(honeydew) +COL(hotpink) +COL(indianred) +COL(indigo) +COL(ivory) +COL(khaki) +COL(lavender) +COL(lavenderblush) +COL(lemonchiffon) +COL(lightblue) +COL(lightcoral) +COL(lightcyan) +COL(lightgoldenrodyellow) +COL(lightgreen) +COL(lightgrey) +COL(lightpink) +COL(lightsalmon) +COL(lightseagreen) +COL(lightskyblue) +COL(lightslategrey) +COL(lightsteelblue) +COL(lightyellow) +COL(lime) +COL(limegreen) +COL(linen) +COL(magenta) +COL(maroon) +COL(mediumaquamarine) +COL(mediumblue) +COL(mediumorchid) +COL(mediumpurple) +COL(mediumseagreen) +COL(mediumslateblue) +COL(mediumspringgreen) +COL(mediumturquoise) +COL(mediumvioletred) +COL(midnightblue) +COL(mintcream) +COL(mistyrose) +COL(navajowhite) +COL(navy) +COL(oldlace) +COL(olive) +COL(olivedrab) +COL(orange) +COL(orangered) +COL(orchid) +COL(palegoldenrod) +COL(palegreen) +COL(paleturquoise) +COL(palevioletred) +COL(papayawhip) +COL(peachpuff) +COL(peru) +COL(pink) +COL(plum) +COL(powderblue) +COL(purple) +COL(rosybrown) +COL(royalblue) +COL(saddlebrown) +COL(salmon) +COL(sandybrown) +COL(seagreen) +COL(seashell) +COL(sienna) +COL(silver) +COL(skyblue) +COL(slateblue) +COL(slategrey) +COL(snow) +COL(springgreen) +COL(steelblue) +COL(tan) +COL(teal) +COL(thistle) +COL(tomato) +COL(turquoise) +COL(violet) +COL(wheat) +COL(whitesmoke) +COL(yellowgreen) diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.cpp b/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.cpp new file mode 100755 index 000000000..cf2d5252c --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.cpp @@ -0,0 +1,177 @@ +/* + ============================================================================== + + jucer_FileUtilities.cpp + Created: 14 May 2010 11:24:09pm + Author: Julian Storer + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_CodeHelpers.h" + + +//============================================================================== +namespace FileHelpers +{ + int64 calculateStreamHashCode (InputStream& in) + { + int64 t = 0; + + const int bufferSize = 4096; + HeapBlock <uint8> buffer; + buffer.malloc (bufferSize); + + for (;;) + { + const int num = in.read (buffer, bufferSize); + + if (num <= 0) + break; + + for (int i = 0; i < num; ++i) + t = t * 65599 + buffer[i]; + } + + return t; + } + + int64 calculateFileHashCode (const File& file) + { + ScopedPointer <FileInputStream> stream (file.createInputStream()); + return stream != 0 ? calculateStreamHashCode (*stream) : 0; + } + + bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, int numBytes) + { + if (file.getSize() == numBytes) + { + MemoryInputStream newStream (data, numBytes, false); + + if (calculateStreamHashCode (newStream) == calculateFileHashCode (file)) + return true; + } + + TemporaryFile temp (file); + + return temp.getFile().appendData (data, numBytes) + && temp.overwriteTargetFileWithTemporary(); + } + + bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData) + { + return overwriteFileWithNewDataIfDifferent (file, newData.getData(), newData.getDataSize()); + } + + bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData) + { + return overwriteFileWithNewDataIfDifferent (file, newData.toUTF8(), strlen ((const char*) newData.toUTF8())); + } + + bool containsAnyNonHiddenFiles (const File& folder) + { + DirectoryIterator di (folder, false); + + while (di.next()) + if (! di.getFile().isHidden()) + return true; + + return false; + } + + const String unixStylePath (const String& path) + { + return path.replaceCharacter ('\\', '/'); + } + + const String windowsStylePath (const String& path) + { + return path.replaceCharacter ('/', '\\'); + } + + const String appendPath (const String& path, const String& subpath) + { + if (File::isAbsolutePath (subpath) + || subpath.startsWithChar ('$') + || subpath.startsWithChar ('~') + || (CharacterFunctions::isLetter (subpath[0]) && subpath[1] == ':')) + return subpath.replaceCharacter ('\\', '/'); + + String path1 (path.replaceCharacter ('\\', '/')); + if (! path1.endsWithChar ('/')) + path1 << '/'; + + return path1 + subpath.replaceCharacter ('\\', '/'); + } + + bool shouldPathsBeRelative (String path1, String path2) + { + path1 = unixStylePath (path1); + path2 = unixStylePath (path2); + + const int len = jmin (path1.length(), path2.length()); + int commonBitLength = 0; + + for (int i = 0; i < len; ++i) + { + if (CharacterFunctions::toLowerCase (path1[i]) != CharacterFunctions::toLowerCase (path2[i])) + break; + + ++commonBitLength; + } + + return path1.substring (0, commonBitLength).removeCharacters ("/:").isNotEmpty(); + } + + //============================================================================== + bool isJuceFolder (const File& folder) + { + return folder.getFileName().containsIgnoreCase ("juce") + && folder.getChildFile ("juce.h").exists() + && folder.getChildFile ("juce_Config.h").exists(); + } + + static const File lookInFolderForJuceFolder (const File& folder) + { + for (DirectoryIterator di (folder, false, "*juce*", File::findDirectories); di.next();) + { + if (isJuceFolder (di.getFile())) + return di.getFile(); + } + + return File::nonexistent; + } + + const File findParentJuceFolder (const File& file) + { + File f (file); + + while (f.exists() && f.getParentDirectory() != f) + { + if (isJuceFolder (f)) + return f; + + File found = lookInFolderForJuceFolder (f); + if (found.exists()) + return found; + + f = f.getParentDirectory(); + } + + return File::nonexistent; + } + + const File findDefaultJuceFolder() + { + File f = findParentJuceFolder (File::getSpecialLocation (File::currentApplicationFile)); + + if (! f.exists()) + f = lookInFolderForJuceFolder (File::getSpecialLocation (File::userHomeDirectory)); + + if (! f.exists()) + f = lookInFolderForJuceFolder (File::getSpecialLocation (File::userDocumentsDirectory)); + + return f; + } +} diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.h b/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.h new file mode 100755 index 000000000..6baa12f3c --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_FileHelpers.h @@ -0,0 +1,86 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_FILEUTILITIES_H_EEE25EE3__ +#define __JUCER_FILEUTILITIES_H_EEE25EE3__ + + +//============================================================================== +namespace FileHelpers +{ + int64 calculateStreamHashCode (InputStream& stream); + int64 calculateFileHashCode (const File& file); + + bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, int numBytes); + bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData); + bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData); + + bool containsAnyNonHiddenFiles (const File& folder); + + const String unixStylePath (const String& path); + const String windowsStylePath (const String& path); + + bool shouldPathsBeRelative (String path1, String path2); + + //============================================================================== + bool isJuceFolder (const File& folder); + const File findParentJuceFolder (const File& file); + const File findDefaultJuceFolder(); +} + +//============================================================================== +class FileModificationDetector +{ +public: + FileModificationDetector (const File& file_) + : file (file_) + { + } + + const File& getFile() const { return file; } + void fileHasBeenRenamed (const File& newFile) { file = newFile; } + + bool hasBeenModified() const + { + return fileModificationTime != file.getLastModificationTime() + && (fileSize != file.getSize() + || FileHelpers::calculateFileHashCode (file) != fileHashCode); + } + + void updateHash() + { + fileModificationTime = file.getLastModificationTime(); + fileSize = file.getSize(); + fileHashCode = FileHelpers::calculateFileHashCode (file); + } + +private: + File file; + Time fileModificationTime; + int64 fileHashCode, fileSize; +}; + + +#endif // __JUCER_FILEUTILITIES_H_EEE25EE3__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.cpp b/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.cpp new file mode 100755 index 000000000..f5dd7b1f5 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.cpp @@ -0,0 +1,153 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "jucer_JucerTreeViewBase.h" + + +//============================================================================== +JucerTreeViewBase::JucerTreeViewBase() + : numLeftHandComps (0) +{ + setLinesDrawnForSubItems (false); +} + +JucerTreeViewBase::~JucerTreeViewBase() +{ +} + +const Font JucerTreeViewBase::getFont() const +{ + return Font (getItemHeight() * 0.6f); +} + +int JucerTreeViewBase::getTextX() const +{ + return (numLeftHandComps + 1) * getItemHeight() + 8; +} + +void JucerTreeViewBase::paintItem (Graphics& g, int width, int height) +{ + if (isSelected()) + g.fillAll (Colour (0x401111ee)); + + const int x = getTextX(); + + g.setColour (Colours::black); + + getIcon()->drawWithin (g, Rectangle<float> (0.0f, 2.0f, height + 6.0f, height - 4.0f), + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, 1.0f); + + g.setFont (getFont()); + g.setColour (isMissing() ? Colours::red : Colours::black); + g.drawFittedText (getDisplayName(), x, 0, width - x, height, Justification::centredLeft, 1, 0.8f); +} + +void JucerTreeViewBase::paintOpenCloseButton (Graphics& g, int width, int height, bool isMouseOver) +{ + Path p; + + if (isOpen()) + p.addTriangle (width * 0.2f, height * 0.25f, width * 0.8f, height * 0.25f, width * 0.5f, height * 0.75f); + else + p.addTriangle (width * 0.25f, height * 0.25f, width * 0.8f, height * 0.5f, width * 0.25f, height * 0.75f); + + g.setColour (Colours::lightgrey); + g.fillPath (p); +} + +//============================================================================== +class TreeLeftHandButtonHolderComponent : public Component +{ +public: + TreeLeftHandButtonHolderComponent (const Array<Component*>& comps) + { + components.addArray (comps); + setInterceptsMouseClicks (false, true); + + for (int i = 0; i < comps.size(); ++i) + addAndMakeVisible (comps.getUnchecked(i)); + } + + void resized() + { + const int edge = 1; + const int itemSize = getHeight() - edge * 2; + + for (int i = 0; i < components.size(); ++i) + components.getUnchecked(i)->setBounds (5 + (i + 1) * getHeight(), edge, itemSize, itemSize); + } + +private: + OwnedArray<Component> components; +}; + +Component* JucerTreeViewBase::createItemComponent() +{ + Array<Component*> components; + createLeftEdgeComponents (components); + numLeftHandComps = components.size(); + + return numLeftHandComps == 0 ? 0 : new TreeLeftHandButtonHolderComponent (components); +} + +//============================================================================== +void JucerTreeViewBase::showRenameBox() +{ + TextEditor ed (String::empty); + ed.setMultiLine (false, false); + ed.setPopupMenuEnabled (false); + ed.setSelectAllWhenFocused (true); + ed.setFont (getFont()); + ed.addListener (this); + ed.setText (getRenamingName()); + + Rectangle<int> r (getItemPosition (true)); + r.setLeft (r.getX() + getTextX()); + r.setHeight (getItemHeight()); + ed.setBounds (r); + getOwnerView()->addAndMakeVisible (&ed); + + if (ed.runModalLoop() != 0) + setName (ed.getText()); +} + +void JucerTreeViewBase::itemClicked (const MouseEvent& e) +{ + if (e.mods.isPopupMenu()) + { + if (getOwnerView()->getNumSelectedItems() > 1) + showMultiSelectionPopupMenu(); + else + showPopupMenu(); + } +} + +void JucerTreeViewBase::showPopupMenu() +{ +} + +void JucerTreeViewBase::showMultiSelectionPopupMenu() +{ +} diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.h b/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.h new file mode 100755 index 000000000..fdd06701e --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_JucerTreeViewBase.h @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_JUCERTREEVIEWBASE_JUCEHEADER__ +#define __JUCER_JUCERTREEVIEWBASE_JUCEHEADER__ + +#include "../jucer_Headers.h" + + +//============================================================================== +class JucerTreeViewBase : public TreeViewItem, + public TextEditorListener +{ +protected: + //============================================================================== + JucerTreeViewBase(); + ~JucerTreeViewBase(); + +public: + //============================================================================== + int getItemWidth() const { return -1; } + int getItemHeight() const { return 20; } + + void paintItem (Graphics& g, int width, int height); + void paintOpenCloseButton (Graphics& g, int width, int height, bool isMouseOver); + Component* createItemComponent(); + void itemClicked (const MouseEvent& e); + + //============================================================================== + virtual const String getRenamingName() const = 0; + virtual const String getDisplayName() const = 0; + virtual void setName (const String& newName) = 0; + virtual bool isMissing() = 0; + virtual const Drawable* getIcon() const = 0; + virtual void createLeftEdgeComponents (Array<Component*>& components) = 0; + + virtual void showPopupMenu(); + virtual void showMultiSelectionPopupMenu(); + + virtual void showRenameBox(); + + // Text editor listener for renaming.. + void textEditorTextChanged (TextEditor& editor) {} + void textEditorReturnKeyPressed (TextEditor& editor) { editor.exitModalState (1); } + void textEditorEscapeKeyPressed (TextEditor& editor) { editor.exitModalState (0); } + void textEditorFocusLost (TextEditor& editor) { editor.exitModalState (0); } + + //============================================================================== +private: + int numLeftHandComps; + const Font getFont() const; + int getTextX() const; +}; + + +#endif // __JUCER_JUCERTREEVIEWBASE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.cpp b/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.cpp new file mode 100755 index 000000000..a0c71ce1d --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.cpp @@ -0,0 +1,478 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" + + +//============================================================================== +const int64 hashCode64 (const String& s) +{ + return s.hashCode64() + s.length() * s.hashCode() + s.toUpperCase().hashCode(); +} + +const String createAlphaNumericUID() +{ + String uid; + static const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + Random r (Random::getSystemRandom().nextInt64()); + + for (int i = 7; --i >= 0;) + { + r.setSeedRandomly(); + uid << chars [r.nextInt (numElementsInArray (chars))]; + } + + return uid; +} + +const String randomHexString (Random& random, int numChars) +{ + String s; + const char hexChars[] = "0123456789ABCDEF"; + + while (--numChars >= 0) + s << hexChars [random.nextInt (16)]; + + return s; +} + +const String hexString8Digits (int value) +{ + return String::toHexString (value).paddedLeft ('0', 8); +} + +const String createGUID (const String& seed) +{ + String guid; + Random r (hashCode64 (seed + "_jucersalt")); + guid << "{" << randomHexString (r, 8); // (written as separate statements to enforce the order of execution) + guid << "-" << randomHexString (r, 4); + guid << "-" << randomHexString (r, 4); + guid << "-" << randomHexString (r, 4); + guid << "-" << randomHexString (r, 12) << "}"; + return guid; +} + +//============================================================================== +static void skipWhitespace (const String& s, int& i) +{ + while (CharacterFunctions::isWhitespace (s[i])) + ++i; +} + +const StringPairArray parsePreprocessorDefs (const String& s) +{ + StringPairArray result; + int i = 0; + + while (s[i] != 0) + { + String token, value; + skipWhitespace (s, i); + + while (s[i] != 0 && s[i] != '=' && ! CharacterFunctions::isWhitespace (s[i])) + token << s[i++]; + + skipWhitespace (s, i); + + if (s[i] == '=') + { + ++i; + + skipWhitespace (s, i); + + while (s[i] != 0 && ! CharacterFunctions::isWhitespace (s[i])) + { + if (s[i] == ',') + { + ++i; + break; + } + + if (s[i] == '\\' && (s[i + 1] == ' ' || s[i + 1] == ',')) + ++i; + + value << s[i++]; + } + } + + if (token.isNotEmpty()) + result.set (token, value); + } + + return result; +} + +const StringPairArray mergePreprocessorDefs (StringPairArray inheritedDefs, const StringPairArray& overridingDefs) +{ + for (int i = 0; i < overridingDefs.size(); ++i) + inheritedDefs.set (overridingDefs.getAllKeys()[i], overridingDefs.getAllValues()[i]); + + return inheritedDefs; +} + +const String replacePreprocessorDefs (const StringPairArray& definitions, String sourceString) +{ + for (int i = 0; i < definitions.size(); ++i) + { + const String key (definitions.getAllKeys()[i]); + const String value (definitions.getAllValues()[i]); + + sourceString = sourceString.replace ("${" + key + "}", value); + } + + return sourceString; +} + +//============================================================================== +void autoScrollForMouseEvent (const MouseEvent& e, bool scrollX, bool scrollY) +{ + Viewport* const viewport = e.eventComponent->findParentComponentOfClass ((Viewport*) 0); + + if (viewport != 0) + { + const MouseEvent e2 (e.getEventRelativeTo (viewport)); + viewport->autoScroll (scrollX ? e2.x : 20, scrollY ? e2.y : 20, 8, 16); + } +} + +void drawComponentPlaceholder (Graphics& g, int w, int h, const String& text) +{ + g.fillAll (Colours::white.withAlpha (0.4f)); + g.setColour (Colours::grey); + g.drawRect (0, 0, w, h); + + g.drawLine (0.5f, 0.5f, w - 0.5f, h - 0.5f); + g.drawLine (0.5f, h - 0.5f, w - 0.5f, 0.5f); + + g.setColour (Colours::black); + g.setFont (11.0f); + g.drawFittedText (text, 2, 2, w - 4, h - 4, Justification::centredTop, 2); +} + +void drawRecessedShadows (Graphics& g, int w, int h, int shadowSize) +{ + ColourGradient cg (Colours::black.withAlpha (0.15f), 0, 0, + Colours::transparentBlack, 0, (float) shadowSize, false); + cg.addColour (0.4, Colours::black.withAlpha (0.07f)); + cg.addColour (0.6, Colours::black.withAlpha (0.02f)); + + g.setGradientFill (cg); + g.fillRect (0, 0, w, shadowSize); + + cg.point1.setXY (0.0f, (float) h); + cg.point2.setXY (0.0f, (float) h - shadowSize); + g.setGradientFill (cg); + g.fillRect (0, h - shadowSize, w, shadowSize); + + cg.point1.setXY (0.0f, 0.0f); + cg.point2.setXY ((float) shadowSize, 0.0f); + g.setGradientFill (cg); + g.fillRect (0, 0, shadowSize, h); + + cg.point1.setXY ((float) w, 0.0f); + cg.point2.setXY ((float) w - shadowSize, 0.0f); + g.setGradientFill (cg); + g.fillRect (w - shadowSize, 0, shadowSize, h); +} + +//============================================================================== +int indexOfLineStartingWith (const StringArray& lines, const String& text, int startIndex) +{ + startIndex = jmax (0, startIndex); + + while (startIndex < lines.size()) + { + if (lines[startIndex].trimStart().startsWithIgnoreCase (text)) + return startIndex; + + ++startIndex; + } + + return -1; +} + + +//============================================================================== +PropertyPanelWithTooltips::PropertyPanelWithTooltips() + : lastComp (0) +{ + addAndMakeVisible (&panel); + startTimer (150); +} + +PropertyPanelWithTooltips::~PropertyPanelWithTooltips() +{ +} + +void PropertyPanelWithTooltips::paint (Graphics& g) +{ + g.setColour (Colour::greyLevel (0.15f)); + g.setFont (13.0f); + + TextLayout tl; + tl.appendText (lastTip, Font (14.0f)); + tl.layout (getWidth() - 10, Justification::left, true); // try to make it look nice + if (tl.getNumLines() > 3) + tl.layout (getWidth() - 10, Justification::left, false); // too big, so just squash it in.. + + tl.drawWithin (g, 5, panel.getBottom() + 2, getWidth() - 10, + getHeight() - panel.getBottom() - 4, + Justification::centredLeft); +} + +void PropertyPanelWithTooltips::resized() +{ + panel.setBounds (0, 0, getWidth(), jmax (getHeight() - 60, proportionOfHeight (0.6f))); +} + +void PropertyPanelWithTooltips::timerCallback() +{ + Component* newComp = Desktop::getInstance().getMainMouseSource().getComponentUnderMouse(); + + if (newComp != 0 && newComp->getTopLevelComponent() != getTopLevelComponent()) + newComp = 0; + + if (newComp != lastComp) + { + lastComp = newComp; + + String newTip (findTip (newComp)); + + if (newTip != lastTip) + { + lastTip = newTip; + repaint (0, panel.getBottom(), getWidth(), getHeight()); + } + } +} + +const String PropertyPanelWithTooltips::findTip (Component* c) +{ + while (c != 0 && c != this) + { + TooltipClient* const tc = dynamic_cast <TooltipClient*> (c); + if (tc != 0) + { + const String tip (tc->getTooltip()); + + if (tip.isNotEmpty()) + return tip; + } + + c = c->getParentComponent(); + } + + return String::empty; +} + +//============================================================================== +FloatingLabelComponent::FloatingLabelComponent() + : font (10.0f) +{ + setInterceptsMouseClicks (false, false); +} + +void FloatingLabelComponent::remove() +{ + if (getParentComponent() != 0) + getParentComponent()->removeChildComponent (this); +} + +void FloatingLabelComponent::update (Component* parent, const String& text, const Colour& textColour, int x, int y, bool toRight, bool below) +{ + colour = textColour; + + Rectangle<int> r; + + if (text != getName()) + { + setName (text); + glyphs.clear(); + glyphs.addJustifiedText (font, text, 0, 0, 200.0f, Justification::left); + glyphs.justifyGlyphs (0, std::numeric_limits<int>::max(), 0, 0, 1000, 1000, Justification::topLeft); + + r = glyphs.getBoundingBox (0, std::numeric_limits<int>::max(), false) + .getSmallestIntegerContainer().expanded (1, 1); + } + else + { + r = getLocalBounds(); + } + + r.setPosition (x + (toRight ? 3 : -(r.getWidth() + 3)), y + (below ? 2 : -(r.getHeight() + 2))); + setBounds (r); + parent->addAndMakeVisible (this); +} + +void FloatingLabelComponent::paint (Graphics& g) +{ + g.setFont (font); + g.setColour (Colours::white.withAlpha (0.5f)); + g.fillRoundedRectangle (0, 0, (float) getWidth(), (float) getHeight(), 3); + + g.setColour (colour); + glyphs.draw (g, AffineTransform::translation (1.0f, 1.0f)); +} + +//============================================================================== +RelativeRectangleLayoutManager::RelativeRectangleLayoutManager (Component* parentComponent) + : parent (parentComponent) +{ + parent->addComponentListener (this); +} + +RelativeRectangleLayoutManager::~RelativeRectangleLayoutManager() +{ + parent->removeComponentListener (this); + + for (int i = components.size(); --i >= 0;) + components.getUnchecked(i)->component->removeComponentListener (this); +} + +void RelativeRectangleLayoutManager::setMarker (const String& name, const RelativeCoordinate& coord) +{ + for (int i = markers.size(); --i >= 0;) + { + MarkerPosition* m = markers.getUnchecked(i); + if (m->markerName == name) + { + m->position = coord; + applyLayout(); + return; + } + } + + markers.add (new MarkerPosition (name, coord)); + applyLayout(); +} + +void RelativeRectangleLayoutManager::setComponentBounds (Component* comp, const String& name, const RelativeRectangle& coords) +{ + jassert (comp != 0); + + // All the components that this layout manages must be inside the parent component.. + jassert (parent->isParentOf (comp)); + + for (int i = components.size(); --i >= 0;) + { + ComponentPosition* c = components.getUnchecked(i); + if (c->component == comp) + { + c->name = name; + c->coords = coords; + triggerAsyncUpdate(); + return; + } + } + + components.add (new ComponentPosition (comp, name, coords)); + comp->addComponentListener (this); + triggerAsyncUpdate(); +} + +void RelativeRectangleLayoutManager::applyLayout() +{ + for (int i = components.size(); --i >= 0;) + { + ComponentPosition* c = components.getUnchecked(i); + + // All the components that this layout manages must be inside the parent component.. + jassert (parent->isParentOf (c->component)); + + c->component->setBounds (c->coords.resolve (this).getSmallestIntegerContainer()); + } +} + +const Expression RelativeRectangleLayoutManager::getSymbolValue (const String& objectName, const String& edge) const +{ + if (objectName == RelativeCoordinate::Strings::parent) + { + if (edge == RelativeCoordinate::Strings::right) return Expression ((double) parent->getWidth()); + if (edge == RelativeCoordinate::Strings::bottom) return Expression ((double) parent->getHeight()); + } + + if (objectName.isNotEmpty() && edge.isNotEmpty()) + { + for (int i = components.size(); --i >= 0;) + { + ComponentPosition* c = components.getUnchecked(i); + + if (c->name == objectName) + { + if (edge == RelativeCoordinate::Strings::left) return c->coords.left.getExpression(); + if (edge == RelativeCoordinate::Strings::right) return c->coords.right.getExpression(); + if (edge == RelativeCoordinate::Strings::top) return c->coords.top.getExpression(); + if (edge == RelativeCoordinate::Strings::bottom) return c->coords.bottom.getExpression(); + } + } + } + + for (int i = markers.size(); --i >= 0;) + { + MarkerPosition* m = markers.getUnchecked(i); + + if (m->markerName == objectName) + return m->position.getExpression(); + } + + return Expression(); +} + +void RelativeRectangleLayoutManager::componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) +{ + triggerAsyncUpdate(); + + if (parent == &component) + handleUpdateNowIfNeeded(); +} + +void RelativeRectangleLayoutManager::componentBeingDeleted (Component& component) +{ + for (int i = components.size(); --i >= 0;) + { + ComponentPosition* c = components.getUnchecked(i); + if (c->component == &component) + { + components.remove (i); + break; + } + } +} + +void RelativeRectangleLayoutManager::handleAsyncUpdate() +{ + applyLayout(); +} + +RelativeRectangleLayoutManager::MarkerPosition::MarkerPosition (const String& name, const RelativeCoordinate& coord) + : markerName (name), position (coord) +{ +} + +RelativeRectangleLayoutManager::ComponentPosition::ComponentPosition (Component* component_, const String& name_, const RelativeRectangle& coords_) + : component (component_), name (name_), coords (coords_) +{ +} diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.h b/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.h new file mode 100755 index 000000000..99def0402 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_MiscUtilities.h @@ -0,0 +1,259 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + + +//============================================================================== +// String::hashCode64 actually hit some dupes, so this is a more powerful version. +const int64 hashCode64 (const String& s); +const String randomHexString (Random& random, int numChars); +const String hexString8Digits (int value); + +const String createAlphaNumericUID(); +const String createGUID (const String& seed); // Turns a seed into a windows GUID + +const StringPairArray parsePreprocessorDefs (const String& defs); +const StringPairArray mergePreprocessorDefs (StringPairArray inheritedDefs, const StringPairArray& overridingDefs); +const String replacePreprocessorDefs (const StringPairArray& definitions, String sourceString); + +//============================================================================== +int indexOfLineStartingWith (const StringArray& lines, const String& text, int startIndex); + +void autoScrollForMouseEvent (const MouseEvent& e, bool scrollX = true, bool scrollY = true); + +void drawComponentPlaceholder (Graphics& g, int w, int h, const String& text); +void drawRecessedShadows (Graphics& g, int w, int h, int shadowSize); + + +//============================================================================== +class PropertyPanelWithTooltips : public Component, + public Timer +{ +public: + PropertyPanelWithTooltips(); + ~PropertyPanelWithTooltips(); + + PropertyPanel& getPanel() throw() { return panel; } + + void paint (Graphics& g); + void resized(); + void timerCallback(); + +private: + PropertyPanel panel; + TextLayout layout; + Component* lastComp; + String lastTip; + + const String findTip (Component* c); +}; + +//============================================================================== +class FloatingLabelComponent : public Component +{ +public: + FloatingLabelComponent(); + + void remove(); + void update (Component* parent, const String& text, const Colour& textColour, int x, int y, bool toRight, bool below); + void paint (Graphics& g); + +private: + Font font; + Colour colour; + GlyphArrangement glyphs; +}; + +//============================================================================== +class JucerToolbarButton : public ToolbarItemComponent +{ +public: + //============================================================================== + JucerToolbarButton (int itemId_, const String& labelText) + : ToolbarItemComponent (itemId_, labelText, true) + { + setClickingTogglesState (false); + } + + ~JucerToolbarButton() + { + } + + //============================================================================== + bool getToolbarItemSizes (int toolbarDepth, bool isToolbarVertical, int& preferredSize, int& minSize, int& maxSize) + { + preferredSize = minSize = maxSize = 50; + return true; + } + + void paintButton (Graphics& g, bool over, bool down) + { + Path p; + p.addRoundedRectangle (1.5f, 2.5f, getWidth() - 3.0f, getHeight() - 5.0f, 3.0f); + + if (getToggleState()) + { + g.setColour (Colours::grey.withAlpha (0.5f)); + g.fillPath (p); + } + + g.setColour (Colours::darkgrey.withAlpha (0.3f)); + g.strokePath (p, PathStrokeType (1.0f)); + + g.setFont (11.0f); + g.setColour (Colours::black.withAlpha ((over || down) ? 1.0f : 0.7f)); + g.drawFittedText (getButtonText(), 2, 2, getWidth() - 4, getHeight() - 4, Justification::centred, 2); + } + + void paintButtonArea (Graphics& g, int width, int height, bool isMouseOver, bool isMouseDown) + { + } + + void contentAreaChanged (const Rectangle<int>& newBounds) + { + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JucerToolbarButton); +}; + + +//============================================================================== +class DrawableComponent : public Component, + public ValueTree::Listener +{ +public: + DrawableComponent (const ValueTree& drawable_) + { + setDrawable (drawable_); + } + + ~DrawableComponent() + { + } + + void setDrawable (const ValueTree& newDrawable) + { + drawable.removeListener (this); + drawable = newDrawable; + drawable.addListener (this); + drawableObject = Drawable::createFromValueTree (drawable, 0); // xxx image provider missing + addAndMakeVisible (drawableObject); + resized(); + repaint(); + } + + void resized() + { +/* DrawableComposite* dc = dynamic_cast <DrawableComposite*> (static_cast <Drawable*> (drawableObject)); + + if (dc != 0) + { + const RelativeCoordinate origin, right (getWidth()), bottom (getHeight()); + + dc->setContentArea (RelativeRectangle (origin, right, origin, bottom)); + //dc->resetBoundingBoxToContentArea(); + }*/ + } + + void valueTreePropertyChanged (ValueTree&, const Identifier&) { updateGraphics(); } + void valueTreeChildrenChanged (ValueTree&) { updateGraphics(); } + void valueTreeParentChanged (ValueTree&) { updateGraphics(); } + +private: + ValueTree drawable; + ScopedPointer<Drawable> drawableObject; + + void updateGraphics() + { + if (drawableObject != 0) + drawableObject->refreshFromValueTree (drawable, 0); + } +}; + + +//============================================================================== +/** +*/ +class RelativeRectangleLayoutManager : public ComponentListener, + public Expression::EvaluationContext, + public AsyncUpdater +{ +public: + //============================================================================== + /** + */ + RelativeRectangleLayoutManager (Component* parentComponent); + + /** Destructor. */ + ~RelativeRectangleLayoutManager(); + + //============================================================================== + /** + */ + void setMarker (const String& name, const RelativeCoordinate& coord); + + /** + */ + void setComponentBounds (Component* component, const String& componentName, const RelativeRectangle& bounds); + + /** + */ + void applyLayout(); + + //============================================================================== + /** @internal */ + const Expression getSymbolValue (const String& symbol, const String& member) const; + /** @internal */ + void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized); + /** @internal */ + void componentBeingDeleted (Component& component); + /** @internal */ + void handleAsyncUpdate(); + +private: + //============================================================================== + struct ComponentPosition + { + ComponentPosition (Component* component, const String& name, const RelativeRectangle& coords); + + Component* component; + String name; + RelativeRectangle coords; + }; + + struct MarkerPosition + { + MarkerPosition (const String& name, const RelativeCoordinate& coord); + + String markerName; + RelativeCoordinate position; + }; + + Component* parent; + OwnedArray <ComponentPosition> components; + OwnedArray <MarkerPosition> markers; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RelativeRectangleLayoutManager); +}; diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_PresetIDs.h b/JuceLibraryCode/jucer/Source/Utility/jucer_PresetIDs.h new file mode 100755 index 000000000..b8eb086e0 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_PresetIDs.h @@ -0,0 +1,118 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_PRESETIDS_H_40E9E82E__ +#define __JUCER_PRESETIDS_H_40E9E82E__ + + +// Handy list of static Identifiers.. +namespace Ids +{ + #define DECLARE_ID(name) const Identifier name (#name) + + DECLARE_ID (text); + DECLARE_ID (name); + DECLARE_ID (file); + DECLARE_ID (font); + DECLARE_ID (mode); + DECLARE_ID (type); + DECLARE_ID (version); + DECLARE_ID (position); + DECLARE_ID (source); + DECLARE_ID (readOnly); + DECLARE_ID (editMode); + DECLARE_ID (justification); + DECLARE_ID (items); + DECLARE_ID (editable); + DECLARE_ID (textJustification); + DECLARE_ID (unselectedText); + DECLARE_ID (noItemsText); + DECLARE_ID (min); + DECLARE_ID (max); + DECLARE_ID (width); + DECLARE_ID (height); + DECLARE_ID (background); + DECLARE_ID (interval); + DECLARE_ID (textBoxPos); + DECLARE_ID (textBoxWidth); + DECLARE_ID (textBoxHeight); + DECLARE_ID (skew); + DECLARE_ID (scrollBarV); + DECLARE_ID (scrollBarH); + DECLARE_ID (scrollbarWidth); + DECLARE_ID (initialState); + DECLARE_ID (scrollbarsShown); + DECLARE_ID (caretVisible); + DECLARE_ID (popupMenuEnabled); + DECLARE_ID (radioGroup); + DECLARE_ID (connectedLeft); + DECLARE_ID (connectedRight); + DECLARE_ID (connectedTop); + DECLARE_ID (connectedBottom); + DECLARE_ID (juceFolder); + DECLARE_ID (targetFolder); + DECLARE_ID (vstFolder); + DECLARE_ID (rtasFolder); + DECLARE_ID (auFolder); + DECLARE_ID (extraCompilerFlags); + DECLARE_ID (extraLinkerFlags); + DECLARE_ID (extraDefs); + DECLARE_ID (libraryName_Debug); + DECLARE_ID (libraryName_Release); + DECLARE_ID (libraryType); + DECLARE_ID (isDebug); + DECLARE_ID (targetName); + DECLARE_ID (binaryPath); + DECLARE_ID (optimisation); + DECLARE_ID (defines); + DECLARE_ID (headerPath); + DECLARE_ID (osxSDK); + DECLARE_ID (osxCompatibility); + DECLARE_ID (jucerVersion); + DECLARE_ID (projectType); + DECLARE_ID (juceLinkage); + DECLARE_ID (buildVST); + DECLARE_ID (bundleIdentifier); + DECLARE_ID (compile); + DECLARE_ID (resource); + DECLARE_ID (className); + DECLARE_ID (classDesc); + DECLARE_ID (controlPoint); + DECLARE_ID (createCallback); + DECLARE_ID (parentClasses); + DECLARE_ID (constructorParams); + DECLARE_ID (memberInitialisers); + DECLARE_ID (lossOfFocusDiscardsChanges); + DECLARE_ID (url); + DECLARE_ID (rootItemVisible); + DECLARE_ID (openByDefault); + DECLARE_ID (locked); + const Identifier class_ ("class"); + const Identifier id_ ("id"); + + #undef DECLARE_ID +} + +#endif // __JUCER_PRESETIDS_H_40E9E82E__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_RelativePath.h b/JuceLibraryCode/jucer/Source/Utility/jucer_RelativePath.h new file mode 100755 index 000000000..fca49da2b --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_RelativePath.h @@ -0,0 +1,126 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_RELATIVEPATH_JUCEHEADER__ +#define __JUCER_RELATIVEPATH_JUCEHEADER__ + + +//============================================================================== +/** Manipulates a cross-platform partial file path. (Needed because File is designed + for absolute paths on the active OS) +*/ +class RelativePath +{ +public: + //============================================================================== + enum RootFolder + { + unknown, + projectFolder, + buildTargetFolder + }; + + //============================================================================== + RelativePath() + : root (unknown) + {} + + RelativePath (const String& path_, const RootFolder root_) + : path (path_.replaceCharacter ('\\', '/')), root (root_) + { + } + + RelativePath (const File& file, const File& rootFolder, const RootFolder root_) + : path (file.getRelativePathFrom (rootFolder).replaceCharacter ('\\', '/')), root (root_) + { + } + + RootFolder getRoot() const { return root; } + + const String toUnixStyle() const { return FileHelpers::unixStylePath (path); } + const String toWindowsStyle() const { return FileHelpers::windowsStylePath (path); } + + const String getFileName() const { return getFakeFile().getFileName(); } + const String getFileNameWithoutExtension() const { return getFakeFile().getFileNameWithoutExtension(); } + + const String getFileExtension() const { return getFakeFile().getFileExtension(); } + bool hasFileExtension (const String& extension) const { return getFakeFile().hasFileExtension (extension); } + bool isAbsolute() const { return isAbsolute (path); } + + const RelativePath withFileExtension (const String& extension) const + { + return RelativePath (path.upToLastOccurrenceOf (".", ! extension.startsWithChar ('.'), false) + extension, root); + } + + const RelativePath getParentDirectory() const + { + String p (path); + if (path.endsWithChar ('/')) + p = p.dropLastCharacters (1); + + return RelativePath (p.upToLastOccurrenceOf ("/", false, false), root); + } + + const RelativePath getChildFile (const String& subpath) const + { + if (isAbsolute (subpath)) + return RelativePath (subpath, root); + + String p (toUnixStyle()); + if (! p.endsWithChar ('/')) + p << '/'; + + return RelativePath (p + subpath, root); + } + + const RelativePath rebased (const File& originalRoot, const File& newRoot, const RootFolder newRootType) const + { + if (isAbsolute()) + return RelativePath (path, newRootType); + + return RelativePath (originalRoot.getChildFile (toUnixStyle()).getRelativePathFrom (newRoot), newRootType); + } + +private: + //============================================================================== + String path; + RootFolder root; + + const File getFakeFile() const + { + return File::getCurrentWorkingDirectory().getChildFile (path); + } + + static bool isAbsolute (const String& path) + { + return File::isAbsolutePath (path) + || path.startsWithChar ('$') + || path.startsWithChar ('~') + || (CharacterFunctions::isLetter (path[0]) && path[1] == ':'); + } +}; + + +#endif // __JUCER_RELATIVEPATH_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.cpp b/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.cpp new file mode 100755 index 000000000..7f27b76e9 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.cpp @@ -0,0 +1,205 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#include "../jucer_Headers.h" +#include "jucer_StoredSettings.h" + + +//============================================================================== +StoredSettings::StoredSettings() + : props (0) +{ + flush(); +} + +StoredSettings::~StoredSettings() +{ + flush(); + props = 0; + clearSingletonInstance(); +} + +juce_ImplementSingleton (StoredSettings); + + +//============================================================================== +PropertiesFile& StoredSettings::getProps() +{ + jassert (props != 0); + return *props; +} + +void StoredSettings::flush() +{ + if (props != 0) + { + props->setValue ("recentFiles", recentFiles.toString()); + + props->removeValue ("keyMappings"); + + if (commandManager != 0) + { + ScopedPointer <XmlElement> keys (commandManager->getKeyMappings()->createXml (true)); + + if (keys != 0) + props->setValue ("keyMappings", (XmlElement*) keys); + } + } + + props = 0; + props = PropertiesFile::createDefaultAppPropertiesFile ("Jucer2", "settings", String::empty, + false, 3000, PropertiesFile::storeAsXML); + + // recent files... + recentFiles.restoreFromString (props->getValue ("recentFiles")); + recentFiles.removeNonExistentFiles(); + + // swatch colours... + swatchColours.clear(); + + #define COL(col) Colours::col, + + const Colour colours[] = + { + #include "jucer_Colours.h" + Colours::transparentBlack + }; + + #undef COL + + const int numSwatchColours = 24; + + for (int i = 0; i < numSwatchColours; ++i) + { + Colour defaultCol (colours [2 + i]); + swatchColours.add (Colour (props->getValue ("swatchColour" + String (i), + hexString8Digits (defaultCol.getARGB())).getHexValue32())); + } +} + +const Array<File> StoredSettings::getLastProjects() const +{ + StringArray s; + s.addTokens (props->getValue ("lastProjects"), "|", ""); + + Array<File> f; + for (int i = 0; i < s.size(); ++i) + f.add (File (s[i])); + + return f; +} + +void StoredSettings::setLastProjects (const Array<File>& files) +{ + StringArray s; + for (int i = 0; i < files.size(); ++i) + s.add (files.getReference(i).getFullPathName()); + + props->setValue ("lastProjects", s.joinIntoString ("|")); +} + +const File StoredSettings::getLastKnownJuceFolder() const +{ + File defaultJuceFolder (FileHelpers::findDefaultJuceFolder()); + File f (props->getValue ("lastJuceFolder", defaultJuceFolder.getFullPathName())); + + if ((! FileHelpers::isJuceFolder (f)) && FileHelpers::isJuceFolder (defaultJuceFolder)) + f = defaultJuceFolder; + + return f; +} + +void StoredSettings::setLastKnownJuceFolder (const File& file) +{ + jassert (FileHelpers::isJuceFolder (file)); + props->setValue ("lastJuceFolder", file.getFullPathName()); +} + +const StringArray& StoredSettings::getFontNames() +{ + if (fontNames.size() == 0) + fontNames = Font::findAllTypefaceNames(); + + return fontNames; +} + +const Image StoredSettings::getFallbackImage() +{ + if (fallbackImage.isNull()) + fallbackImage = ImageFileFormat::loadFrom (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize); + + return fallbackImage; +} + +const Drawable* StoredSettings::getImageFileIcon() +{ + if (imageFileIcon == 0) + { + static const unsigned char data[] = + { 120,218,197,90,75,111,28,199,17,158,181,60,146,98,36,135,28,98,58,185,100,175,1,164,65,87,117,87,63,142,74,156,228,34,3,129,125,80,146,27,37,46,229,141,41,238,130,92,37,240,191,207,87,61,59,195,158,215,138,176,44,154,132,128,209,246,199,154,238,122,126, + 85,189,95,127,251,226,213,139,63,191,252,107,181,250,236,250,252,221,166,90,125,81,127,125,115,254,191,243,215,87,155,106,123,81,173,126,85,111,94,191,124,241,54,189,170,86,171,191,223,236,222,239,171,213,231,237,231,251,237,155,195,251,155,77,117,216, + 237,95,110,46,15,213,234,113,109,158,173,141,254,255,219,237,219,239,241,193,211,154,156,215,143,94,239,14,135,221,187,22,245,84,81,36,161,90,61,234,94,116,91,85,171,223,252,227,252,240,125,181,170,85,246,231,245,158,170,219,195,205,238,135,205,171,237, + 133,126,252,168,54,213,127,118,219,235,195,119,135,31,177,177,213,147,250,221,246,176,185,169,222,156,239,143,159,60,174,95,191,63,28,170,235,221,245,191,55,55,187,87,219,235,139,237,245,219,246,15,87,143,254,182,189,186,194,1,15,63,238,243,223,222,238, + 174,240,154,55,187,171,221,251,27,61,240,229,241,167,170,190,203,47,61,9,53,249,167,170,242,126,171,213,111,191,217,253,23,200,21,118,188,250,170,246,13,73,178,209,134,240,108,237,26,203,137,99,114,174,170,94,110,175,23,64,212,24,31,133,3,159,0,133,208, + 68,19,130,79,241,4,136,200,53,226,124,74,97,0,58,27,130,132,26,142,158,221,8,99,83,227,99,48,108,121,25,19,108,195,176,167,55,126,25,67,198,55,193,177,53,39,228,144,51,13,99,159,206,46,97,190,26,98,230,15,54,4,45,170,168,4,45,42,187,220,246,162,217,202, + 243,47,130,74,69,222,207,1,10,208,95,174,118,183,155,234,232,90,125,40,240,39,8,133,199,173,127,127,81,191,189,57,191,216,110,174,15,213,94,69,182,202,160,38,89,130,74,212,206,46,53,28,34,65,173,25,192,173,182,98,35,49,101,64,108,44,162,33,5,23,90,128, + 173,86,127,168,159,7,110,60,25,39,209,61,91,63,79,190,97,235,196,113,172,244,101,231,87,237,86,218,152,186,173,86,127,172,205,154,98,27,86,235,226,145,214,249,223,199,7,165,52,6,30,0,195,37,248,73,67,222,82,8,46,141,108,82,130,156,133,195,57,120,165, + 61,1,10,169,73,236,77,136,241,4,136,200,67,65,65,232,36,72,160,174,24,147,151,177,51,197,134,76,226,228,78,129,2,53,148,112,40,161,19,32,24,3,118,180,41,240,41,144,13,141,21,111,77,188,47,104,233,116,37,104,81,79,37,104,81,227,229,198,23,109,87,170,96, + 17,84,42,243,94,94,80,130,230,35,211,62,104,100,158,105,100,26,49,212,38,96,131,51,123,230,97,96,166,134,92,100,118,186,123,235,162,177,209,15,3,211,54,206,5,246,226,219,192,180,49,37,18,121,176,192,124,58,8,76,215,24,103,77,138,78,158,173,125,227,67, + 18,253,133,182,223,191,222,190,193,102,166,40,17,192,140,75,142,170,61,143,23,213,87,188,39,235,83,5,211,140,23,197,54,94,152,133,39,242,99,19,9,90,109,213,218,163,90,249,9,142,25,130,137,193,13,23,109,235,193,72,127,206,225,143,79,201,31,160,16,49,145, + 225,232,246,40,191,92,212,72,73,193,24,242,51,242,17,33,228,147,245,217,27,135,242,25,158,106,61,170,200,179,181,53,77,116,72,222,62,118,242,73,144,205,57,228,60,131,180,13,112,114,210,201,135,194,2,57,138,81,245,15,119,50,54,240,68,190,70,151,4,242, + 34,3,84,43,31,49,236,177,99,118,110,184,104,167,246,93,146,63,68,113,18,84,139,126,255,35,23,161,32,40,229,243,242,11,255,153,141,86,247,208,117,20,17,234,93,48,214,181,60,135,16,64,68,125,184,158,229,112,13,198,167,160,187,183,170,157,148,252,32,90, + 157,146,35,129,74,218,104,21,39,72,152,241,23,138,86,139,228,163,101,92,112,30,129,223,176,3,113,11,99,107,14,80,162,73,8,249,202,117,222,82,44,170,243,37,112,32,215,69,211,96,81,16,202,148,172,184,153,104,69,94,19,120,241,0,213,71,171,210,18,242,60, + 92,60,70,83,106,172,69,238,11,167,228,15,80,164,89,84,108,144,62,90,239,22,163,105,76,64,132,70,158,145,239,184,9,32,69,134,220,92,180,34,125,145,109,163,21,92,52,56,203,125,180,194,200,98,189,215,132,21,64,73,1,12,161,143,86,65,32,146,83,38,43,13,50, + 127,226,224,105,46,90,81,12,157,102,179,2,213,71,171,137,62,58,26,45,218,169,125,231,229,127,57,66,89,142,196,50,99,93,228,105,49,46,166,56,47,189,240,158,217,88,149,113,172,218,79,28,171,172,52,35,136,102,66,43,72,147,6,217,42,148,165,21,121,46,128, + 16,133,108,25,52,27,96,188,142,250,96,205,172,25,159,91,31,89,73,49,130,26,122,182,11,133,245,5,66,245,242,242,226,92,127,215,250,184,241,155,139,75,89,27,120,91,66,23,18,2,62,187,36,253,69,232,226,209,232,111,241,120,143,96,22,247,129,70,21,189,12,168, + 64,219,241,8,122,44,229,58,147,62,165,0,161,81,19,36,171,9,67,43,65,80,76,2,163,128,22,78,128,180,159,67,25,160,144,78,129,144,48,157,122,234,76,131,133,148,97,98,180,39,64,218,170,193,4,54,156,146,148,155,62,5,209,41,16,218,71,139,131,19,223,23,180, + 116,186,18,180,168,167,18,180,168,241,114,227,139,182,43,85,176,8,42,149,121,63,47,40,64,243,145,235,135,145,251,235,154,80,227,242,143,124,178,9,142,66,238,83,222,186,41,207,49,34,158,12,34,130,160,11,2,127,32,117,7,237,122,41,57,166,177,234,75,16,18, + 69,0,57,156,206,37,24,140,82,172,245,246,36,8,213,34,137,120,16,51,208,188,192,160,118,51,150,86,80,108,199,50,247,218,83,1,154,183,79,120,216,193,154,243,231,198,249,159,66,62,38,214,17,147,12,19,18,52,19,158,37,177,113,83,77,244,32,85,124,212,104,157, + 132,24,163,198,6,84,200,112,18,4,78,77,100,116,128,1,230,29,65,145,131,153,54,213,40,106,70,43,254,61,247,84,130,230,173,19,31,214,58,233,226,117,188,224,159,215,58,232,50,200,163,97,178,147,185,95,1,10,220,216,144,144,71,198,244,69,192,80,80,69,179, + 226,193,176,160,226,36,177,163,47,72,155,72,135,168,144,202,33,24,84,207,68,209,201,148,237,236,10,137,33,128,219,40,113,78,100,65,178,102,236,202,198,26,29,2,104,242,3,69,129,188,153,168,67,215,159,103,215,11,167,89,62,242,200,174,63,151,57,169,58,122, + 72,234,237,250,100,194,103,74,123,93,128,84,156,95,148,195,3,156,138,157,201,222,234,144,86,36,89,20,178,130,225,192,59,209,108,122,227,242,58,131,28,39,229,182,119,12,167,16,160,195,20,73,1,133,161,96,56,116,199,112,126,151,25,14,118,177,201,29,200, + 197,70,29,232,167,248,217,227,161,159,149,91,64,13,245,65,71,187,19,138,77,26,213,134,181,62,22,168,125,127,204,94,13,232,169,29,99,145,122,31,162,82,71,110,65,126,129,66,139,19,18,163,191,14,69,195,221,189,220,155,187,151,79,84,88,44,142,229,27,110, + 60,80,146,134,34,218,22,39,180,18,212,131,203,151,219,241,226,242,254,7,168,66,5,60,126,121,169,60,123,82,255,211,100,86,215,123,50,15,60,31,211,1,10,82,123,30,151,184,198,120,147,64,210,123,23,255,125,109,181,133,214,190,70,251,105,214,153,161,14,87, + 6,45,55,154,118,70,163,30,180,41,215,150,27,117,28,84,46,205,243,248,63,29,189,252,242,114,221,63,208,186,227,25,197,227,199,123,62,91,164,36,43,185,255,80,74,65,62,121,55,105,190,129,178,32,125,41,98,247,12,20,154,87,244,112,217,178,103,122,122,171, + 7,214,106,229,149,50,132,40,157,227,248,136,180,139,150,47,14,23,199,142,147,154,104,13,229,137,69,41,226,24,88,172,212,213,90,176,30,112,155,200,228,189,239,123,87,244,87,54,55,85,153,215,10,72,77,30,8,143,3,43,207,127,140,250,158,128,191,34,243,27, + 238,122,123,56,187,4,70,3,25,115,84,4,168,0,213,161,235,46,209,44,163,179,69,139,140,69,189,82,138,50,179,127,228,236,232,116,32,209,162,162,17,72,236,186,87,236,16,205,182,13,202,218,156,52,58,85,50,174,219,255,162,250,231,29,159,30,120,212,20,116,242, + 224,19,114,118,158,34,162,109,128,147,251,34,185,227,67,176,80,177,33,182,39,199,57,197,187,34,185,51,142,239,35,34,27,166,181,214,193,206,17,93,200,47,224,246,163,9,177,105,144,138,216,233,76,69,139,186,183,54,40,75,30,145,6,109,154,24,150,109,81,228, + 29,142,215,77,88,241,65,162,200,94,237,234,161,27,155,151,187,132,201,13,115,66,33,139,121,209,193,251,252,204,76,8,105,79,28,194,42,101,148,231,32,46,246,51,27,104,206,72,240,161,165,53,232,234,28,219,126,194,138,40,116,158,144,69,242,206,208,8,228, + 217,230,140,223,71,239,13,41,202,99,255,160,41,161,159,224,66,4,44,155,179,90,68,110,70,124,128,33,21,242,103,22,39,84,5,145,97,80,41,50,72,4,137,111,142,167,6,23,225,213,54,31,3,239,103,33,63,73,48,202,192,24,57,147,243,121,172,42,246,184,211,179,154, + 213,243,18,54,211,154,193,122,182,253,248,103,209,144,243,1,244,208,119,158,72,31,200,87,129,36,95,125,121,24,148,193,37,203,0,114,141,179,14,231,213,249,15,234,191,179,17,233,163,100,71,122,243,11,39,99,37,29,120,78,1,52,211,127,40,128,138,16,42,34, + 167,127,248,120,102,142,173,226,32,236,244,114,64,251,21,34,47,60,113,240,5,212,113,172,7,143,116,46,5,27,219,163,91,75,137,219,161,234,89,237,242,169,93,202,189,110,22,35,60,33,245,222,54,200,54,240,11,237,80,89,239,134,241,219,230,221,47,107,56,27, + 251,200,89,184,105,34,226,32,117,247,31,209,42,20,65,147,187,109,3,207,69,53,155,220,15,37,4,184,119,49,146,94,113,232,109,63,154,53,246,69,85,74,2,183,204,34,80,1,125,76,49,22,116,79,172,51,217,234,90,47,209,105,207,221,175,160,15,33,145,246,62,87,64, + 27,36,24,62,250,60,18,136,55,150,218,105,49,195,199,19,42,224,81,55,17,137,33,161,25,207,45,2,105,213,160,56,202,93,224,44,40,107,17,154,33,157,103,147,182,251,168,208,157,230,5,205,10,146,186,214,43,149,174,49,25,186,205,91,164,113,44,145,38,189,118, + 34,132,99,79,82,11,235,85,189,69,57,208,61,24,232,151,196,248,254,242,9,245,80,144,191,212,103,83,196,65,208,231,186,78,62,103,130,20,114,69,80,159,128,253,88,75,246,40,82,39,119,160,252,169,39,181,232,16,117,39,46,143,200,197,171,167,74,17,169,9,238, + 11,47,130,11,128,68,32,11,33,55,139,12,57,94,66,124,195,39,148,102,60,207,151,98,193,161,113,188,231,172,182,123,252,148,179,218,122,216,245,232,197,66,55,20,228,187,161,224,216,77,145,126,201,199,60,194,214,76,28,57,223,36,246,23,11,240,46,67,109,223, + 11,237,224,252,254,232,167,234,61,185,124,102,110,134,196,6,41,83,241,38,232,69,98,214,59,66,81,121,152,187,187,197,52,232,7,29,106,135,70,153,215,111,192,32,87,250,226,222,162,27,87,202,210,144,113,241,140,199,250,240,205,249,205,15,155,155,219,127, + 66,57,159,181,207,253,23,214,30,215,87,250,197,178,253,238,118,123,216,238,174,143,227,192,17,232,73,125,147,191,147,118,135,170,245,203,105,189,224,127,205,8,174,235,195,110,255,1,185,79,235,246,187,109,67,193,74,61,255,15,229,51,49,67,0,0 }; + + imageFileIcon = LookAndFeel::loadDrawableFromData (data, sizeof (data)); + } + + return imageFileIcon; +} diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.h b/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.h new file mode 100755 index 000000000..ab5251fc5 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_StoredSettings.h @@ -0,0 +1,88 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_STOREDSETTINGS_JUCEHEADER__ +#define __JUCER_STOREDSETTINGS_JUCEHEADER__ + + +//============================================================================== +/** + A singleton to hold the jucer's persistent settings, and to save them in a + suitable PropertiesFile. +*/ +class StoredSettings +{ +public: + //============================================================================== + StoredSettings(); + ~StoredSettings(); + + juce_DeclareSingleton (StoredSettings, false); + + PropertiesFile& getProps(); + void flush(); + + //============================================================================== + RecentlyOpenedFilesList recentFiles; + + const Array<File> getLastProjects() const; + void setLastProjects (const Array<File>& files); + + const File getLastKnownJuceFolder() const; + void setLastKnownJuceFolder (const File& file); + + const StringArray& getFontNames(); + + //============================================================================== + Array <Colour> swatchColours; + + class ColourSelectorWithSwatches : public ColourSelector + { + public: + ColourSelectorWithSwatches() {} + + int getNumSwatches() const { return StoredSettings::getInstance()->swatchColours.size(); } + const Colour getSwatchColour (int index) const { return StoredSettings::getInstance()->swatchColours [index]; } + void setSwatchColour (int index, const Colour& newColour) const { StoredSettings::getInstance()->swatchColours.set (index, newColour); } + }; + + + //============================================================================== + const Image getFallbackImage(); + const Drawable* getImageFileIcon(); + + +private: + ScopedPointer<PropertiesFile> props; + StringArray fontNames; + + ScopedPointer<Drawable> imageFileIcon; + Image fallbackImage; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StoredSettings); +}; + + +#endif // __JUCER_STOREDSETTINGS_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/Utility/jucer_ValueSourceHelpers.h b/JuceLibraryCode/jucer/Source/Utility/jucer_ValueSourceHelpers.h new file mode 100755 index 000000000..7d3db1a99 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/Utility/jucer_ValueSourceHelpers.h @@ -0,0 +1,63 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_VALUEREMAPPERSOURCE_JUCEHEADER__ +#define __JUCER_VALUEREMAPPERSOURCE_JUCEHEADER__ + + +//============================================================================== +/** +*/ +template <typename Type> +class NumericValueSource : public Value::ValueSource, + public Value::Listener +{ +public: + NumericValueSource (const Value& sourceValue_) + : sourceValue (sourceValue_) + { + sourceValue.addListener (this); + } + + void valueChanged (Value&) { sendChangeMessage (true); } + const var getValue() const { return (Type) sourceValue.getValue(); } + + void setValue (const var& newValue) + { + const Type newVal = (Type) newValue; + + if (newVal != (Type) getValue()) // this test is important, because if a property is missing, it won't + sourceValue = newVal; // create it (causing an unwanted undo action) when a control sets it to 0 + } + + //============================================================================== +protected: + Value sourceValue; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NumericValueSource); +}; + + +#endif // __JUCER_VALUEREMAPPERSOURCE_JUCEHEADER__ diff --git a/JuceLibraryCode/jucer/Source/jucer_Headers.h b/JuceLibraryCode/jucer/Source/jucer_Headers.h new file mode 100755 index 000000000..446e0df52 --- /dev/null +++ b/JuceLibraryCode/jucer/Source/jucer_Headers.h @@ -0,0 +1,38 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADERS_JUCEHEADER__ +#define __JUCER_HEADERS_JUCEHEADER__ + +#ifdef _MSC_VER + #pragma warning (disable: 4100 4505) +#endif + +//============================================================================== +#include "../JuceLibraryCode/JuceHeader.h" +#include "Application/jucer_CommonHeaders.h" + + +#endif // __JUCER_HEADERS_JUCEHEADER__ -- GitLab