1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-06 04:00:08 +00:00

Minor additions to OptionalScopedPointer. Internal introjucer tweaks.

This commit is contained in:
jules 2012-06-12 11:54:32 +01:00
parent 451046e990
commit f2426cc7de
7 changed files with 119 additions and 82 deletions

View file

@ -159,6 +159,8 @@ public:
}
virtual void doExtraInitialisation() {}
virtual void projectOpened (Project*) {}
virtual void projectClosed (Project*) {}
static JucerApplication* getApp()
{

View file

@ -27,80 +27,9 @@
#include "jucer_FilePreviewComponent.h"
#include "../Code Editor/jucer_SourceCodeEditor.h"
//==============================================================================
class SourceCodeDocument : public OpenDocumentManager::Document
{
public:
//==============================================================================
SourceCodeDocument (Project* project_, const File& file_)
: modDetector (file_), project (project_)
{
codeDoc = new CodeDocument();
reloadFromFile();
}
Component* SourceCodeDocument::createEditor() { return SourceCodeEditor::createFor (this, *codeDoc); }
//==============================================================================
struct Type : public OpenDocumentManager::DocumentType
{
bool canOpenFile (const File& file) { return file.hasFileExtension ("cpp;h;hpp;mm;m;c;cc;cxx;txt;xml;plist;rtf;html;htm;php;py;rb;cs"); }
Document* openFile (Project* project, const File& file) { return new SourceCodeDocument (project, file); }
};
//==============================================================================
bool loadedOk() const { return true; }
bool isForFile (const File& file) const { return getFile() == file; }
bool isForNode (const ValueTree& node) const { return false; }
bool refersToProject (Project& p) const { return project == &p; }
Project* getProject() const { return project; }
bool canSaveAs() const { return true; }
String getName() const { return getFile().getFileName(); }
String getType() const { return getFile().getFileExtension() + " file"; }
File getFile() const { return modDetector.getFile(); }
bool needsSaving() const { return codeDoc != nullptr && 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 != nullptr)
codeDoc->loadFromStream (*in);
}
bool save()
{
TemporaryFile temp (modDetector.getFile());
ScopedPointer <FileOutputStream> out (temp.getFile().createOutputStream());
if (out == nullptr || ! codeDoc->writeToStream (*out))
return false;
out = nullptr;
if (! temp.overwriteTargetFileWithTemporary())
return false;
modDetector.updateHash();
return true;
}
bool saveAs()
{
jassertfalse; //xxx todo
return false;
}
Component* createEditor() { return SourceCodeEditor::createFor (this, *codeDoc); }
Component* createViewer() { return createEditor(); }
private:
FileModificationDetector modDetector;
ScopedPointer <CodeDocument> codeDoc;
Project* project;
};
//==============================================================================
class UnknownDocument : public OpenDocumentManager::Document

View file

@ -28,7 +28,6 @@
#include "../Project/jucer_Project.h"
//==============================================================================
/**
*/
@ -120,5 +119,78 @@ private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenDocumentManager);
};
//==============================================================================
class SourceCodeDocument : public OpenDocumentManager::Document
{
public:
//==============================================================================
SourceCodeDocument (Project* project_, const File& file_)
: modDetector (file_), project (project_)
{
codeDoc = new CodeDocument();
reloadFromFile();
}
//==============================================================================
struct Type : public OpenDocumentManager::DocumentType
{
bool canOpenFile (const File& file) { return file.hasFileExtension ("cpp;h;hpp;mm;m;c;cc;cxx;txt;xml;plist;rtf;html;htm;php;py;rb;cs"); }
Document* openFile (Project* project, const File& file) { return new SourceCodeDocument (project, file); }
};
//==============================================================================
bool loadedOk() const { return true; }
bool isForFile (const File& file) const { return getFile() == file; }
bool isForNode (const ValueTree& node) const { return false; }
bool refersToProject (Project& p) const { return project == &p; }
Project* getProject() const { return project; }
bool canSaveAs() const { return true; }
String getName() const { return getFile().getFileName(); }
String getType() const { return getFile().getFileExtension() + " file"; }
File getFile() const { return modDetector.getFile(); }
bool needsSaving() const { return codeDoc != nullptr && 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 != nullptr)
codeDoc->loadFromStream (*in);
}
bool save()
{
TemporaryFile temp (modDetector.getFile());
ScopedPointer <FileOutputStream> out (temp.getFile().createOutputStream());
if (out == nullptr || ! codeDoc->writeToStream (*out))
return false;
out = nullptr;
if (! temp.overwriteTargetFileWithTemporary())
return false;
modDetector.updateHash();
return true;
}
bool saveAs()
{
jassertfalse; //xxx todo
return false;
}
Component* createEditor();
Component* createViewer() { return createEditor(); }
protected:
FileModificationDetector modDetector;
ScopedPointer <CodeDocument> codeDoc;
Project* project;
};
#endif // __JUCER_OPENDOCUMENTMANAGER_JUCEHEADER__

View file

@ -57,16 +57,20 @@ void SourceCodeEditor::resized()
editor.setBounds (getLocalBounds());
}
CodeTokeniser* SourceCodeEditor::getTokeniserFor (const File& file)
{
if (file.hasFileExtension (sourceOrHeaderFileExtensions))
{
static CPlusPlusCodeTokeniser cppTokeniser;
return &cppTokeniser;
}
return nullptr;
}
SourceCodeEditor* SourceCodeEditor::createFor (OpenDocumentManager::Document* document,
CodeDocument& codeDocument)
{
CodeTokeniser* tokeniser = nullptr;
if (document->getFile().hasFileExtension (sourceOrHeaderFileExtensions))
{
static CPlusPlusCodeTokeniser cppTokeniser;
tokeniser = &cppTokeniser;
}
return new SourceCodeEditor (document, codeDocument, tokeniser);
return new SourceCodeEditor (document, codeDocument,
getTokeniserFor (document->getFile()));
}

View file

@ -46,6 +46,8 @@ public:
static SourceCodeEditor* createFor (OpenDocumentManager::Document* document,
CodeDocument& codeDocument);
static CodeTokeniser* getTokeniserFor (const File& file);
//==============================================================================
void resized();

View file

@ -28,6 +28,7 @@
#include "../Project Saving/jucer_ProjectExporter.h"
#include "../Project Saving/jucer_ProjectSaver.h"
#include "../Application/jucer_OpenDocumentManager.h"
#include "../Application/jucer_Application.h"
//==============================================================================
@ -62,10 +63,14 @@ Project::Project (const File& file_)
mainProjectIcon.setImage (ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize));
projectRoot.addListener (this);
JucerApplication::getApp()->projectOpened (this);
}
Project::~Project()
{
JucerApplication::getApp()->projectClosed (this);
projectRoot.removeListener (this);
OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*this, false);
}
@ -228,7 +233,9 @@ Result Project::loadDocument (const File& file)
return Result::fail ("The document contains errors and couldn't be parsed!");
registerRecentFile (file);
JucerApplication::getApp()->projectClosed (this);
projectRoot = newTree;
JucerApplication::getApp()->projectOpened (this);
removeDefunctExporters();
setMissingDefaultValues();

View file

@ -106,6 +106,9 @@ public:
/** Returns the object that this pointer is managing. */
inline operator ObjectType*() const noexcept { return object; }
/** Returns the object that this pointer is managing. */
inline ObjectType* get() const noexcept { return object; }
/** Returns the object that this pointer is managing. */
inline ObjectType& operator*() const noexcept { return *object; }
@ -127,6 +130,24 @@ public:
object.release();
}
/** Makes this OptionalScopedPointer point at a new object, specifying whether the
OptionalScopedPointer will take ownership of the object.
If takeOwnership is true, then the OptionalScopedPointer will act like a ScopedPointer,
deleting the object when it is itself deleted. If this parameter is false, then the
OptionalScopedPointer just holds a normal pointer to the object, and won't delete it.
*/
void set (ObjectType* newObject, bool takeOwnership)
{
if (object != newObject)
{
clear();
object = newObject;
}
shouldDelete = takeOwnership;
}
/** Returns true if the target object will be deleted when this pointer
object is deleted.
*/