diff --git a/extras/Introjucer/Source/Project/jucer_JuceLibraryModule.h b/extras/Introjucer/Source/Project/jucer_JuceLibraryModule.h index 3b04ab5cf3..5fdd52ebee 100644 --- a/extras/Introjucer/Source/Project/jucer_JuceLibraryModule.h +++ b/extras/Introjucer/Source/Project/jucer_JuceLibraryModule.h @@ -133,6 +133,8 @@ public: File moduleFile, moduleFolder; private: + mutable Array sourceFiles; + File getInclude() const { return moduleFolder.getChildFile (moduleInfo ["include"]); @@ -171,11 +173,10 @@ private: Array tempList; + FileSorter sorter; while (iter.next()) - tempList.add (iter.getFile()); + tempList.addSorted (sorter, iter.getFile()); - FileSorter sorter; - tempList.sort (sorter); result.addArray (tempList); } @@ -202,7 +203,7 @@ private: else { if (! group.findItemForFile (file).isValid()) - group.addFile (file, -1, false); + group.addFileUnchecked (file, -1, false); } } @@ -255,15 +256,15 @@ private: void addIncludedCode (ProjectExporter& exporter, const Array& compiled) const { - Array files; - getAllSourceFiles (files); + if (sourceFiles.size() == 0) + getAllSourceFiles (sourceFiles); Project::Item sourceGroup (Project::Item::createGroup (exporter.getProject(), getID(), "__mainsourcegroup" + getID())); int i; - for (i = 0; i < files.size(); ++i) - addFileWithGroups (sourceGroup, files.getReference(i), - files.getReference(i).getRelativePathFrom (moduleFolder)); + for (i = 0; i < sourceFiles.size(); ++i) + addFileWithGroups (sourceGroup, sourceFiles.getReference(i), + sourceFiles.getReference(i).getRelativePathFrom (moduleFolder)); sourceGroup.addFile (moduleFile, -1, false); sourceGroup.addFile (getInclude(), -1, false); diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index a1022fa4d6..4bb116bccc 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -716,19 +716,7 @@ bool Project::Item::addFile (const File& file, int insertIndex, const bool shoul else if (file.existsAsFile()) { if (! getProject().getMainGroup().findItemForFile (file).isValid()) - { - Item item (getProject(), ValueTree (Tags::file)); - item.initialiseNodeValues(); - item.getName() = file.getFileName(); - item.getShouldCompileValue() = shouldCompile && file.hasFileExtension ("cpp;mm;c;m;cc;cxx;r"); - item.getShouldAddToResourceValue() = getProject().shouldBeAddedToBinaryResourcesByDefault (file); - - if (canContain (item)) - { - item.setFile (file); - addChild (item, insertIndex); - } - } + addFileUnchecked (file, insertIndex, shouldCompile); } else { @@ -738,6 +726,21 @@ bool Project::Item::addFile (const File& file, int insertIndex, const bool shoul return true; } +void Project::Item::addFileUnchecked (const File& file, int insertIndex, const bool shouldCompile) +{ + Item item (getProject(), ValueTree (Tags::file)); + item.initialiseNodeValues(); + item.getName() = file.getFileName(); + item.getShouldCompileValue() = shouldCompile && file.hasFileExtension ("cpp;mm;c;m;cc;cxx;r"); + item.getShouldAddToResourceValue() = getProject().shouldBeAddedToBinaryResourcesByDefault (file); + + if (canContain (item)) + { + item.setFile (file); + addChild (item, insertIndex); + } +} + bool Project::Item::addRelativeFile (const RelativePath& file, int insertIndex, bool shouldCompile) { Item item (getProject(), ValueTree (Tags::file)); @@ -858,6 +861,14 @@ void Project::removeModule (const String& moduleID) modules.removeChild (i, getUndoManagerFor (modules)); } + +void Project::createRequiredModules (const ModuleList& availableModules, OwnedArray& modules) const +{ + for (int i = 0; i < availableModules.modules.size(); ++i) + if (isModuleEnabled (availableModules.modules.getUnchecked(i)->uid)) + modules.add (availableModules.modules.getUnchecked(i)->create()); +} + //============================================================================== ValueTree Project::getConfigurations() const { diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h index af6a3346e3..71ae5fa10c 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.h +++ b/extras/Introjucer/Source/Project/jucer_Project.h @@ -29,6 +29,8 @@ #include "../jucer_Headers.h" class ProjectExporter; class ProjectType; +class ModuleList; +class LibraryModule; //============================================================================== class Project : public FileBasedDocument, @@ -162,6 +164,7 @@ public: Item getOrCreateSubGroup (const String& name); void addChild (const Item& newChild, int insertIndex); bool addFile (const File& file, int insertIndex, bool shouldCompile); + void addFileUnchecked (const File& file, int insertIndex, bool shouldCompile); bool addRelativeFile (const RelativePath& file, int insertIndex, bool shouldCompile); void removeItemFromProject(); void sortAlphabetically (bool keepGroupsAtStart); @@ -271,6 +274,8 @@ public: void addModule (const String& moduleID); void removeModule (const String& moduleID); + void createRequiredModules (const ModuleList& availableModules, OwnedArray& modules) const; + //============================================================================== String getFileTemplate (const String& templateName); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project/jucer_ProjectExporter.cpp index 467b79edea..be2e5fd622 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectExporter.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectExporter.cpp @@ -210,7 +210,7 @@ void ProjectExporter::createPropertyEditors (Array & props) 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."); OwnedArray modules; - project.getProjectType().createRequiredModules (project, ModuleList::getInstance(), modules); + project.createRequiredModules (ModuleList::getInstance(), modules); for (int i = 0; i < modules.size(); ++i) modules.getUnchecked(i)->createPropertyEditors (*this, props); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp index 38335afd7b..65f0647028 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp @@ -18,6 +18,7 @@ //[CppHeaders] You can add your own extra header files here... #include "jucer_ProjectExporter.h" +#include "jucer_Module.h" //[/CppHeaders] #include "jucer_ProjectInformationComponent.h" diff --git a/extras/Introjucer/Source/Project/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project/jucer_ProjectSaver.h index e2ca1741c4..8b5f7e043d 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectSaver.h @@ -27,6 +27,7 @@ #define __JUCER_PROJECTSAVER_JUCEHEADER__ #include "jucer_ResourceFile.h" +#include "jucer_Module.h" //============================================================================== @@ -214,7 +215,7 @@ private: << "*/" << newLine << newLine; OwnedArray modules; - project.getProjectType().createRequiredModules (project, ModuleList::getInstance(), modules); + project.createRequiredModules (ModuleList::getInstance(), modules); bool anyFlags = false; for (int j = 0; j < modules.size(); ++j) @@ -291,7 +292,7 @@ private: { OwnedArray modules; - project.getProjectType().createRequiredModules (project, ModuleList::getInstance(), modules); + project.createRequiredModules (ModuleList::getInstance(), modules); for (int i = 0; i < modules.size(); ++i) modules.getUnchecked(i)->writeIncludes (project, out); @@ -384,7 +385,7 @@ private: const ValueTree originalGeneratedGroup (generatedFilesGroup.getNode().createCopy()); OwnedArray modules; - project.getProjectType().createRequiredModules (project, ModuleList::getInstance(), modules); + project.createRequiredModules (ModuleList::getInstance(), modules); for (int i = project.getNumExporters(); --i >= 0;) { @@ -400,7 +401,6 @@ private: modules.getUnchecked(j)->prepareExporter (*exporter, *this); sortGroupRecursively (generatedFilesGroup); - exporter->groups.add (generatedFilesGroup); try diff --git a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp index 232567df57..fa1b68f4df 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp @@ -59,13 +59,6 @@ const ProjectType* ProjectType::findType (const String& typeCode) return nullptr; } -void ProjectType::createRequiredModules (Project& project, const ModuleList& availableModules, OwnedArray& modules) const -{ - for (int i = 0; i < availableModules.modules.size(); ++i) - if (project.isModuleEnabled (availableModules.modules.getUnchecked(i)->uid)) - modules.add (availableModules.modules.getUnchecked(i)->create()); -} - //============================================================================== class ProjectType_GUIApp : public ProjectType { diff --git a/extras/Introjucer/Source/Project/jucer_ProjectType.h b/extras/Introjucer/Source/Project/jucer_ProjectType.h index bf77f09c9d..0a509b1a35 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectType.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectType.h @@ -27,8 +27,8 @@ #define __JUCER_PROJECTTYPE_JUCEHEADER__ #include "../jucer_Headers.h" -#include "jucer_Module.h" - +class Project; +class ProjectExporter; //============================================================================== class ProjectType @@ -58,8 +58,6 @@ public: virtual void setMissingProjectProperties (Project&) const = 0; virtual void createPropertyEditors (const Project&, Array &) const = 0; virtual void prepareExporter (ProjectExporter&) const = 0; - virtual void createRequiredModules (Project&, const ModuleList& availableModules, - OwnedArray& modules) const; protected: ProjectType (const String& type, const String& desc); diff --git a/extras/Introjucer/Source/Utility/jucer_FileHelpers.cpp b/extras/Introjucer/Source/Utility/jucer_FileHelpers.cpp index b2429384c6..0bb5edce30 100644 --- a/extras/Introjucer/Source/Utility/jucer_FileHelpers.cpp +++ b/extras/Introjucer/Source/Utility/jucer_FileHelpers.cpp @@ -30,6 +30,16 @@ //============================================================================== namespace FileHelpers { + int64 calculateMemoryHashCode (const void* data, const int numBytes) + { + int64 t = 0; + + for (int i = 0; i < numBytes; ++i) + t = t * 65599 + static_cast (data)[i]; + + return t; + } + int64 calculateStreamHashCode (InputStream& in) { int64 t = 0; @@ -60,18 +70,14 @@ namespace FileHelpers 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(); + if (file.getSize() == numBytes + && calculateMemoryHashCode (data, numBytes) == calculateFileHashCode (file)) + return true; + + if (file.exists()) + return file.replaceWithData (data, numBytes); + else + return file.appendData (data, numBytes); } bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData) @@ -144,8 +150,7 @@ namespace FileHelpers bool isJuceFolder (const File& folder) { return folder.getFileName().containsIgnoreCase ("juce") - && folder.getChildFile ("juce.h").exists() - && folder.getChildFile ("modules").exists(); + && folder.getChildFile ("modules").isDirectory(); } static File lookInFolderForJuceFolder (const File& folder) diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp index 53a9f54872..7daf08129c 100644 --- a/modules/juce_core/files/juce_File.cpp +++ b/modules/juce_core/files/juce_File.cpp @@ -689,12 +689,10 @@ bool File::appendData (const void* const dataToAppend, { if (numberOfBytes > 0) { - const ScopedPointer out (createOutputStream()); + FileOutputStream out (*this, 8192); - if (out == 0) - return false; - - out->write (dataToAppend, numberOfBytes); + return (! out.failedToOpen()) + && out.write (dataToAppend, numberOfBytes); } return true;