migrating to the latest JUCE version
This commit is contained in:
@ -1,65 +1,65 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../Application/jucer_Headers.h"
|
||||
#include "jucer_DocumentEditorComponent.h"
|
||||
#include "../Application/jucer_Application.h"
|
||||
#include "../Project/UI/jucer_ProjectContentComponent.h"
|
||||
|
||||
//==============================================================================
|
||||
DocumentEditorComponent::DocumentEditorComponent (OpenDocumentManager::Document* doc)
|
||||
: document (doc)
|
||||
{
|
||||
ProjucerApplication::getApp().openDocumentManager.addListener (this);
|
||||
}
|
||||
|
||||
DocumentEditorComponent::~DocumentEditorComponent()
|
||||
{
|
||||
ProjucerApplication::getApp().openDocumentManager.removeListener (this);
|
||||
}
|
||||
|
||||
bool DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc)
|
||||
{
|
||||
if (document == closingDoc)
|
||||
{
|
||||
jassert (document != nullptr);
|
||||
|
||||
if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())
|
||||
pcc->hideDocument (document);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DocumentEditorComponent::setEditedState (bool hasBeenEdited)
|
||||
{
|
||||
if (hasBeenEdited != lastEditedState)
|
||||
{
|
||||
if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())
|
||||
pcc->refreshProjectTreeFileStatuses();
|
||||
|
||||
lastEditedState = hasBeenEdited;
|
||||
}
|
||||
}
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
||||
Agreement and JUCE Privacy Policy.
|
||||
|
||||
End User License Agreement: www.juce.com/juce-7-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../Application/jucer_Headers.h"
|
||||
#include "jucer_DocumentEditorComponent.h"
|
||||
#include "../Application/jucer_Application.h"
|
||||
#include "../Project/UI/jucer_ProjectContentComponent.h"
|
||||
|
||||
//==============================================================================
|
||||
DocumentEditorComponent::DocumentEditorComponent (OpenDocumentManager::Document* doc)
|
||||
: document (doc)
|
||||
{
|
||||
ProjucerApplication::getApp().openDocumentManager.addListener (this);
|
||||
}
|
||||
|
||||
DocumentEditorComponent::~DocumentEditorComponent()
|
||||
{
|
||||
ProjucerApplication::getApp().openDocumentManager.removeListener (this);
|
||||
}
|
||||
|
||||
bool DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc)
|
||||
{
|
||||
if (document == closingDoc)
|
||||
{
|
||||
jassert (document != nullptr);
|
||||
|
||||
if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())
|
||||
pcc->hideDocument (document);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DocumentEditorComponent::setEditedState (bool hasBeenEdited)
|
||||
{
|
||||
if (hasBeenEdited != lastEditedState)
|
||||
{
|
||||
if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())
|
||||
pcc->refreshProjectTreeFileStatuses();
|
||||
|
||||
lastEditedState = hasBeenEdited;
|
||||
}
|
||||
}
|
||||
|
@ -1,51 +1,51 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "jucer_OpenDocumentManager.h"
|
||||
|
||||
//==============================================================================
|
||||
class DocumentEditorComponent : public Component,
|
||||
private OpenDocumentManager::DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
DocumentEditorComponent (OpenDocumentManager::Document* document);
|
||||
~DocumentEditorComponent() override;
|
||||
|
||||
OpenDocumentManager::Document* getDocument() const { return document; }
|
||||
|
||||
protected:
|
||||
OpenDocumentManager::Document* document;
|
||||
bool lastEditedState = false;
|
||||
|
||||
void setEditedState (bool hasBeenEdited);
|
||||
|
||||
private:
|
||||
bool documentAboutToClose (OpenDocumentManager::Document*) override;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DocumentEditorComponent)
|
||||
};
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
||||
Agreement and JUCE Privacy Policy.
|
||||
|
||||
End User License Agreement: www.juce.com/juce-7-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "jucer_OpenDocumentManager.h"
|
||||
|
||||
//==============================================================================
|
||||
class DocumentEditorComponent : public Component,
|
||||
private OpenDocumentManager::DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
DocumentEditorComponent (OpenDocumentManager::Document* document);
|
||||
~DocumentEditorComponent() override;
|
||||
|
||||
OpenDocumentManager::Document* getDocument() const { return document; }
|
||||
|
||||
protected:
|
||||
OpenDocumentManager::Document* document;
|
||||
bool lastEditedState = false;
|
||||
|
||||
void setEditedState (bool hasBeenEdited);
|
||||
|
||||
private:
|
||||
bool documentAboutToClose (OpenDocumentManager::Document*) override;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DocumentEditorComponent)
|
||||
};
|
||||
|
@ -1,117 +1,117 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class ItemPreviewComponent : public Component
|
||||
{
|
||||
public:
|
||||
ItemPreviewComponent (const File& f) : file (f)
|
||||
{
|
||||
setOpaque (true);
|
||||
tryToLoadImage();
|
||||
}
|
||||
|
||||
void paint (Graphics& g) override
|
||||
{
|
||||
g.fillAll (findColour (backgroundColourId));
|
||||
|
||||
if (drawable != nullptr)
|
||||
{
|
||||
auto contentBounds = drawable->getDrawableBounds();
|
||||
|
||||
if (auto* dc = dynamic_cast<DrawableComposite*> (drawable.get()))
|
||||
{
|
||||
auto r = dc->getContentArea();
|
||||
|
||||
if (! r.isEmpty())
|
||||
contentBounds = r;
|
||||
}
|
||||
|
||||
auto area = RectanglePlacement (RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize)
|
||||
.appliedTo (contentBounds, Rectangle<float> (4.0f, 22.0f, (float) getWidth() - 8.0f, (float) getHeight() - 26.0f));
|
||||
|
||||
Path p;
|
||||
p.addRectangle (area);
|
||||
DropShadow (Colours::black.withAlpha (0.5f), 6, Point<int> (0, 1)).drawForPath (g, p);
|
||||
|
||||
g.fillCheckerBoard (area, 24.0f, 24.0f, Colour (0xffffffff), Colour (0xffeeeeee));
|
||||
|
||||
drawable->draw (g, 1.0f, RectanglePlacement (RectanglePlacement::stretchToFit)
|
||||
.getTransformToFit (contentBounds, area.toFloat()));
|
||||
}
|
||||
|
||||
g.setFont (Font (14.0f, Font::bold));
|
||||
g.setColour (findColour (defaultTextColourId));
|
||||
g.drawMultiLineText (facts.joinIntoString ("\n"), 10, 15, getWidth() - 16);
|
||||
}
|
||||
|
||||
private:
|
||||
StringArray facts;
|
||||
File file;
|
||||
std::unique_ptr<Drawable> drawable;
|
||||
|
||||
void tryToLoadImage()
|
||||
{
|
||||
facts.clear();
|
||||
facts.add (file.getFullPathName());
|
||||
drawable.reset();
|
||||
|
||||
if (auto input = std::unique_ptr<FileInputStream> (file.createInputStream()))
|
||||
{
|
||||
auto totalSize = input->getTotalLength();
|
||||
String formatName;
|
||||
|
||||
if (auto* format = ImageFileFormat::findImageFormatForStream (*input))
|
||||
formatName = " " + format->getFormatName();
|
||||
|
||||
input.reset();
|
||||
|
||||
auto image = ImageCache::getFromFile (file);
|
||||
|
||||
if (image.isValid())
|
||||
{
|
||||
auto* d = new DrawableImage();
|
||||
d->setImage (image);
|
||||
drawable.reset (d);
|
||||
|
||||
facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);
|
||||
}
|
||||
|
||||
if (totalSize > 0)
|
||||
facts.add (File::descriptionOfSizeInBytes (totalSize));
|
||||
}
|
||||
|
||||
if (drawable == nullptr)
|
||||
if (auto svg = parseXML (file))
|
||||
drawable = Drawable::createFromSVG (*svg);
|
||||
|
||||
facts.removeEmptyStrings (true);
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ItemPreviewComponent)
|
||||
};
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
||||
Agreement and JUCE Privacy Policy.
|
||||
|
||||
End User License Agreement: www.juce.com/juce-7-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class ItemPreviewComponent : public Component
|
||||
{
|
||||
public:
|
||||
ItemPreviewComponent (const File& f) : file (f)
|
||||
{
|
||||
setOpaque (true);
|
||||
tryToLoadImage();
|
||||
}
|
||||
|
||||
void paint (Graphics& g) override
|
||||
{
|
||||
g.fillAll (findColour (backgroundColourId));
|
||||
|
||||
if (drawable != nullptr)
|
||||
{
|
||||
auto contentBounds = drawable->getDrawableBounds();
|
||||
|
||||
if (auto* dc = dynamic_cast<DrawableComposite*> (drawable.get()))
|
||||
{
|
||||
auto r = dc->getContentArea();
|
||||
|
||||
if (! r.isEmpty())
|
||||
contentBounds = r;
|
||||
}
|
||||
|
||||
auto area = RectanglePlacement (RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize)
|
||||
.appliedTo (contentBounds, Rectangle<float> (4.0f, 22.0f, (float) getWidth() - 8.0f, (float) getHeight() - 26.0f));
|
||||
|
||||
Path p;
|
||||
p.addRectangle (area);
|
||||
DropShadow (Colours::black.withAlpha (0.5f), 6, Point<int> (0, 1)).drawForPath (g, p);
|
||||
|
||||
g.fillCheckerBoard (area, 24.0f, 24.0f, Colour (0xffffffff), Colour (0xffeeeeee));
|
||||
|
||||
drawable->draw (g, 1.0f, RectanglePlacement (RectanglePlacement::stretchToFit)
|
||||
.getTransformToFit (contentBounds, area.toFloat()));
|
||||
}
|
||||
|
||||
g.setFont (Font (14.0f, Font::bold));
|
||||
g.setColour (findColour (defaultTextColourId));
|
||||
g.drawMultiLineText (facts.joinIntoString ("\n"), 10, 15, getWidth() - 16);
|
||||
}
|
||||
|
||||
private:
|
||||
StringArray facts;
|
||||
File file;
|
||||
std::unique_ptr<Drawable> drawable;
|
||||
|
||||
void tryToLoadImage()
|
||||
{
|
||||
facts.clear();
|
||||
facts.add (file.getFullPathName());
|
||||
drawable.reset();
|
||||
|
||||
if (auto input = std::unique_ptr<FileInputStream> (file.createInputStream()))
|
||||
{
|
||||
auto totalSize = input->getTotalLength();
|
||||
String formatName;
|
||||
|
||||
if (auto* format = ImageFileFormat::findImageFormatForStream (*input))
|
||||
formatName = " " + format->getFormatName();
|
||||
|
||||
input.reset();
|
||||
|
||||
auto image = ImageCache::getFromFile (file);
|
||||
|
||||
if (image.isValid())
|
||||
{
|
||||
auto* d = new DrawableImage();
|
||||
d->setImage (image);
|
||||
drawable.reset (d);
|
||||
|
||||
facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);
|
||||
}
|
||||
|
||||
if (totalSize > 0)
|
||||
facts.add (File::descriptionOfSizeInBytes (totalSize));
|
||||
}
|
||||
|
||||
if (drawable == nullptr)
|
||||
if (auto svg = parseXML (file))
|
||||
drawable = Drawable::createFromSVG (*svg);
|
||||
|
||||
facts.removeEmptyStrings (true);
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ItemPreviewComponent)
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,167 +1,167 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../Project/jucer_Project.h"
|
||||
|
||||
//==============================================================================
|
||||
class OpenDocumentManager
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
OpenDocumentManager();
|
||||
~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 Project* getProject() const = 0;
|
||||
virtual String getName() const = 0;
|
||||
virtual String getType() const = 0;
|
||||
virtual File getFile() const = 0;
|
||||
virtual bool needsSaving() const = 0;
|
||||
virtual bool saveSyncWithoutAsking() = 0;
|
||||
virtual void saveAsync (std::function<void (bool)>) = 0;
|
||||
virtual void saveAsAsync (std::function<void (bool)>) = 0;
|
||||
virtual bool hasFileBeenModifiedExternally() = 0;
|
||||
virtual void reloadFromFile() = 0;
|
||||
virtual std::unique_ptr<Component> createEditor() = 0;
|
||||
virtual std::unique_ptr<Component> createViewer() = 0;
|
||||
virtual void fileHasBeenRenamed (const File& newFile) = 0;
|
||||
virtual String getState() const = 0;
|
||||
virtual void restoreState (const String& state) = 0;
|
||||
virtual File getCounterpartFile() const { return {}; }
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
int getNumOpenDocuments() const;
|
||||
Document* getOpenDocument (int index) const;
|
||||
void clear();
|
||||
|
||||
enum class SaveIfNeeded { no, yes };
|
||||
|
||||
bool canOpenFile (const File& file);
|
||||
Document* openFile (Project* project, const File& file);
|
||||
|
||||
void closeDocumentAsync (Document* document, SaveIfNeeded saveIfNeeded, std::function<void (bool)> callback);
|
||||
bool closeDocumentWithoutSaving (Document* document);
|
||||
|
||||
void closeAllAsync (SaveIfNeeded askUserToSave, std::function<void (bool)> callback);
|
||||
void closeAllDocumentsUsingProjectAsync (Project& project, SaveIfNeeded askUserToSave, std::function<void (bool)> callback);
|
||||
void closeAllDocumentsUsingProjectWithoutSaving (Project& project);
|
||||
|
||||
void closeFileWithoutSaving (const File& f);
|
||||
bool anyFilesNeedSaving() const;
|
||||
|
||||
void saveAllSyncWithoutAsking();
|
||||
void saveIfNeededAndUserAgrees (Document* doc, std::function<void (FileBasedDocument::SaveResult)>);
|
||||
|
||||
void reloadModifiedFiles();
|
||||
void fileHasBeenRenamed (const File& oldFile, const File& newFile);
|
||||
|
||||
//==============================================================================
|
||||
class DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
DocumentCloseListener() {}
|
||||
virtual ~DocumentCloseListener() {}
|
||||
|
||||
// return false to force it to stop.
|
||||
virtual bool documentAboutToClose (Document* document) = 0;
|
||||
};
|
||||
|
||||
void addListener (DocumentCloseListener*);
|
||||
void removeListener (DocumentCloseListener*);
|
||||
|
||||
//==============================================================================
|
||||
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, int index = -1);
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
void closeLastDocumentUsingProjectRecursive (WeakReference<OpenDocumentManager>,
|
||||
Project*,
|
||||
SaveIfNeeded,
|
||||
std::function<void (bool)>);
|
||||
|
||||
//==============================================================================
|
||||
OwnedArray<DocumentType> types;
|
||||
OwnedArray<Document> documents;
|
||||
Array<DocumentCloseListener*> listeners;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenDocumentManager)
|
||||
JUCE_DECLARE_WEAK_REFERENCEABLE (OpenDocumentManager)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class RecentDocumentList : private OpenDocumentManager::DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
RecentDocumentList();
|
||||
~RecentDocumentList();
|
||||
|
||||
void clear();
|
||||
|
||||
void newDocumentOpened (OpenDocumentManager::Document* document);
|
||||
|
||||
OpenDocumentManager::Document* getCurrentDocument() const { return previousDocs.getLast(); }
|
||||
|
||||
bool canGoToPrevious() const;
|
||||
bool canGoToNext() const;
|
||||
|
||||
bool contains (const File&) const;
|
||||
|
||||
OpenDocumentManager::Document* getPrevious();
|
||||
OpenDocumentManager::Document* getNext();
|
||||
|
||||
OpenDocumentManager::Document* getClosestPreviousDocOtherThan (OpenDocumentManager::Document* oneToAvoid) const;
|
||||
|
||||
void restoreFromXML (Project& project, const XmlElement& xml);
|
||||
std::unique_ptr<XmlElement> createXML() const;
|
||||
|
||||
private:
|
||||
bool documentAboutToClose (OpenDocumentManager::Document*);
|
||||
|
||||
Array<OpenDocumentManager::Document*> previousDocs, nextDocs;
|
||||
};
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
||||
Agreement and JUCE Privacy Policy.
|
||||
|
||||
End User License Agreement: www.juce.com/juce-7-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../Project/jucer_Project.h"
|
||||
|
||||
//==============================================================================
|
||||
class OpenDocumentManager
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
OpenDocumentManager();
|
||||
~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 Project* getProject() const = 0;
|
||||
virtual String getName() const = 0;
|
||||
virtual String getType() const = 0;
|
||||
virtual File getFile() const = 0;
|
||||
virtual bool needsSaving() const = 0;
|
||||
virtual bool saveSyncWithoutAsking() = 0;
|
||||
virtual void saveAsync (std::function<void (bool)>) = 0;
|
||||
virtual void saveAsAsync (std::function<void (bool)>) = 0;
|
||||
virtual bool hasFileBeenModifiedExternally() = 0;
|
||||
virtual void reloadFromFile() = 0;
|
||||
virtual std::unique_ptr<Component> createEditor() = 0;
|
||||
virtual std::unique_ptr<Component> createViewer() = 0;
|
||||
virtual void fileHasBeenRenamed (const File& newFile) = 0;
|
||||
virtual String getState() const = 0;
|
||||
virtual void restoreState (const String& state) = 0;
|
||||
virtual File getCounterpartFile() const { return {}; }
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
int getNumOpenDocuments() const;
|
||||
Document* getOpenDocument (int index) const;
|
||||
void clear();
|
||||
|
||||
enum class SaveIfNeeded { no, yes };
|
||||
|
||||
bool canOpenFile (const File& file);
|
||||
Document* openFile (Project* project, const File& file);
|
||||
|
||||
void closeDocumentAsync (Document* document, SaveIfNeeded saveIfNeeded, std::function<void (bool)> callback);
|
||||
bool closeDocumentWithoutSaving (Document* document);
|
||||
|
||||
void closeAllAsync (SaveIfNeeded askUserToSave, std::function<void (bool)> callback);
|
||||
void closeAllDocumentsUsingProjectAsync (Project& project, SaveIfNeeded askUserToSave, std::function<void (bool)> callback);
|
||||
void closeAllDocumentsUsingProjectWithoutSaving (Project& project);
|
||||
|
||||
void closeFileWithoutSaving (const File& f);
|
||||
bool anyFilesNeedSaving() const;
|
||||
|
||||
void saveAllSyncWithoutAsking();
|
||||
void saveIfNeededAndUserAgrees (Document* doc, std::function<void (FileBasedDocument::SaveResult)>);
|
||||
|
||||
void reloadModifiedFiles();
|
||||
void fileHasBeenRenamed (const File& oldFile, const File& newFile);
|
||||
|
||||
//==============================================================================
|
||||
class DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
DocumentCloseListener() {}
|
||||
virtual ~DocumentCloseListener() {}
|
||||
|
||||
// return false to force it to stop.
|
||||
virtual bool documentAboutToClose (Document* document) = 0;
|
||||
};
|
||||
|
||||
void addListener (DocumentCloseListener*);
|
||||
void removeListener (DocumentCloseListener*);
|
||||
|
||||
//==============================================================================
|
||||
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, int index = -1);
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
void closeLastDocumentUsingProjectRecursive (WeakReference<OpenDocumentManager>,
|
||||
Project*,
|
||||
SaveIfNeeded,
|
||||
std::function<void (bool)>);
|
||||
|
||||
//==============================================================================
|
||||
OwnedArray<DocumentType> types;
|
||||
OwnedArray<Document> documents;
|
||||
Array<DocumentCloseListener*> listeners;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenDocumentManager)
|
||||
JUCE_DECLARE_WEAK_REFERENCEABLE (OpenDocumentManager)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class RecentDocumentList : private OpenDocumentManager::DocumentCloseListener
|
||||
{
|
||||
public:
|
||||
RecentDocumentList();
|
||||
~RecentDocumentList();
|
||||
|
||||
void clear();
|
||||
|
||||
void newDocumentOpened (OpenDocumentManager::Document* document);
|
||||
|
||||
OpenDocumentManager::Document* getCurrentDocument() const { return previousDocs.getLast(); }
|
||||
|
||||
bool canGoToPrevious() const;
|
||||
bool canGoToNext() const;
|
||||
|
||||
bool contains (const File&) const;
|
||||
|
||||
OpenDocumentManager::Document* getPrevious();
|
||||
OpenDocumentManager::Document* getNext();
|
||||
|
||||
OpenDocumentManager::Document* getClosestPreviousDocOtherThan (OpenDocumentManager::Document* oneToAvoid) const;
|
||||
|
||||
void restoreFromXML (Project& project, const XmlElement& xml);
|
||||
std::unique_ptr<XmlElement> createXML() const;
|
||||
|
||||
private:
|
||||
bool documentAboutToClose (OpenDocumentManager::Document*);
|
||||
|
||||
Array<OpenDocumentManager::Document*> previousDocs, nextDocs;
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,245 +1,245 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "jucer_DocumentEditorComponent.h"
|
||||
|
||||
//==============================================================================
|
||||
class SourceCodeDocument : public OpenDocumentManager::Document
|
||||
{
|
||||
public:
|
||||
SourceCodeDocument (Project*, const File&);
|
||||
|
||||
bool loadedOk() const override { return true; }
|
||||
bool isForFile (const File& file) const override { return getFile() == file; }
|
||||
bool isForNode (const ValueTree&) const override { return false; }
|
||||
bool refersToProject (Project& p) const override { return project == &p; }
|
||||
Project* getProject() const override { return project; }
|
||||
String getName() const override { return getFile().getFileName(); }
|
||||
String getType() const override { return getFile().getFileExtension() + " file"; }
|
||||
File getFile() const override { return modDetector.getFile(); }
|
||||
bool needsSaving() const override { return codeDoc != nullptr && codeDoc->hasChangedSinceSavePoint(); }
|
||||
bool hasFileBeenModifiedExternally() override { return modDetector.hasBeenModified(); }
|
||||
void fileHasBeenRenamed (const File& newFile) override { modDetector.fileHasBeenRenamed (newFile); }
|
||||
String getState() const override { return lastState != nullptr ? lastState->toString() : String(); }
|
||||
void restoreState (const String& state) override { lastState.reset (new CodeEditorComponent::State (state)); }
|
||||
|
||||
File getCounterpartFile() const override
|
||||
{
|
||||
auto file = getFile();
|
||||
|
||||
if (file.hasFileExtension (sourceFileExtensions))
|
||||
{
|
||||
static const char* extensions[] = { "h", "hpp", "hxx", "hh", nullptr };
|
||||
return findCounterpart (file, extensions);
|
||||
}
|
||||
|
||||
if (file.hasFileExtension (headerFileExtensions))
|
||||
{
|
||||
static const char* extensions[] = { "cpp", "mm", "cc", "cxx", "c", "m", nullptr };
|
||||
return findCounterpart (file, extensions);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
static File findCounterpart (const File& file, const char** extensions)
|
||||
{
|
||||
while (*extensions != nullptr)
|
||||
{
|
||||
auto f = file.withFileExtension (*extensions++);
|
||||
|
||||
if (f.existsAsFile())
|
||||
return f;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
void reloadFromFile() override;
|
||||
bool saveSyncWithoutAsking() override;
|
||||
void saveAsync (std::function<void (bool)>) override;
|
||||
void saveAsAsync (std::function<void (bool)>) override;
|
||||
|
||||
std::unique_ptr<Component> createEditor() override;
|
||||
std::unique_ptr<Component> createViewer() override { return createEditor(); }
|
||||
|
||||
void updateLastState (CodeEditorComponent&);
|
||||
void applyLastState (CodeEditorComponent&) const;
|
||||
|
||||
CodeDocument& getCodeDocument();
|
||||
|
||||
//==============================================================================
|
||||
struct Type : public OpenDocumentManager::DocumentType
|
||||
{
|
||||
bool canOpenFile (const File& file) override
|
||||
{
|
||||
if (file.hasFileExtension (sourceOrHeaderFileExtensions)
|
||||
|| file.hasFileExtension ("txt;inc;tcc;xml;plist;rtf;html;htm;php;py;rb;cs"))
|
||||
return true;
|
||||
|
||||
MemoryBlock mb;
|
||||
if (file.loadFileAsData (mb)
|
||||
&& seemsToBeText (static_cast<const char*> (mb.getData()), (int) mb.getSize())
|
||||
&& ! file.hasFileExtension ("svg"))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool seemsToBeText (const char* const chars, const int num) noexcept
|
||||
{
|
||||
for (int i = 0; i < num; ++i)
|
||||
{
|
||||
const char c = chars[i];
|
||||
if ((c < 32 && c != '\t' && c != '\r' && c != '\n') || chars[i] > 126)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Document* openFile (Project* p, const File& file) override { return new SourceCodeDocument (p, file); }
|
||||
};
|
||||
|
||||
protected:
|
||||
FileModificationDetector modDetector;
|
||||
std::unique_ptr<CodeDocument> codeDoc;
|
||||
Project* project;
|
||||
|
||||
std::unique_ptr<CodeEditorComponent::State> lastState;
|
||||
|
||||
void reloadInternal();
|
||||
|
||||
private:
|
||||
std::unique_ptr<FileChooser> chooser;
|
||||
};
|
||||
|
||||
class GenericCodeEditorComponent;
|
||||
|
||||
//==============================================================================
|
||||
class SourceCodeEditor : public DocumentEditorComponent,
|
||||
private ValueTree::Listener,
|
||||
private CodeDocument::Listener
|
||||
{
|
||||
public:
|
||||
SourceCodeEditor (OpenDocumentManager::Document*, CodeDocument&);
|
||||
SourceCodeEditor (OpenDocumentManager::Document*, GenericCodeEditorComponent*);
|
||||
~SourceCodeEditor() override;
|
||||
|
||||
void scrollToKeepRangeOnScreen (Range<int> range);
|
||||
void highlight (Range<int> range, bool cursorAtStart);
|
||||
|
||||
std::unique_ptr<GenericCodeEditorComponent> editor;
|
||||
|
||||
private:
|
||||
void resized() override;
|
||||
void lookAndFeelChanged() override;
|
||||
|
||||
void valueTreePropertyChanged (ValueTree&, const Identifier&) override;
|
||||
void valueTreeChildAdded (ValueTree&, ValueTree&) override;
|
||||
void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override;
|
||||
void valueTreeChildOrderChanged (ValueTree&, int, int) override;
|
||||
void valueTreeParentChanged (ValueTree&) override;
|
||||
void valueTreeRedirected (ValueTree&) override;
|
||||
|
||||
void codeDocumentTextInserted (const String&, int) override;
|
||||
void codeDocumentTextDeleted (int, int) override;
|
||||
|
||||
void setEditor (GenericCodeEditorComponent*);
|
||||
void updateColourScheme();
|
||||
void checkSaveState();
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceCodeEditor)
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class GenericCodeEditorComponent : public CodeEditorComponent
|
||||
{
|
||||
public:
|
||||
GenericCodeEditorComponent (const File&, CodeDocument&, CodeTokeniser*);
|
||||
~GenericCodeEditorComponent() override;
|
||||
|
||||
void addPopupMenuItems (PopupMenu&, const MouseEvent*) override;
|
||||
void performPopupMenuAction (int menuItemID) override;
|
||||
|
||||
void getAllCommands (Array<CommandID>&) override;
|
||||
void getCommandInfo (CommandID, ApplicationCommandInfo&) override;
|
||||
bool perform (const InvocationInfo&) override;
|
||||
|
||||
void showFindPanel();
|
||||
void hideFindPanel();
|
||||
void findSelection();
|
||||
void findNext (bool forwards, bool skipCurrentSelection);
|
||||
void handleEscapeKey() override;
|
||||
void editorViewportPositionChanged() override;
|
||||
|
||||
void resized() override;
|
||||
|
||||
static String getSearchString() { return getAppSettings().getGlobalProperties().getValue ("searchString"); }
|
||||
static void setSearchString (const String& s) { getAppSettings().getGlobalProperties().setValue ("searchString", s); }
|
||||
static bool isCaseSensitiveSearch() { return getAppSettings().getGlobalProperties().getBoolValue ("searchCaseSensitive"); }
|
||||
static void setCaseSensitiveSearch (bool b) { getAppSettings().getGlobalProperties().setValue ("searchCaseSensitive", b); }
|
||||
|
||||
struct Listener
|
||||
{
|
||||
virtual ~Listener() {}
|
||||
virtual void codeEditorViewportMoved (CodeEditorComponent&) = 0;
|
||||
};
|
||||
|
||||
void addListener (Listener* listener);
|
||||
void removeListener (Listener* listener);
|
||||
|
||||
private:
|
||||
File file;
|
||||
class FindPanel;
|
||||
std::unique_ptr<FindPanel> findPanel;
|
||||
ListenerList<Listener> listeners;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericCodeEditorComponent)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class CppCodeEditorComponent : public GenericCodeEditorComponent
|
||||
{
|
||||
public:
|
||||
CppCodeEditorComponent (const File&, CodeDocument&);
|
||||
~CppCodeEditorComponent() override;
|
||||
|
||||
void addPopupMenuItems (PopupMenu&, const MouseEvent*) override;
|
||||
void performPopupMenuAction (int menuItemID) override;
|
||||
|
||||
void handleReturnKey() override;
|
||||
void insertTextAtCaret (const String& newText) override;
|
||||
|
||||
private:
|
||||
void insertComponentClass();
|
||||
|
||||
std::unique_ptr<AlertWindow> asyncAlertWindow;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CppCodeEditorComponent)
|
||||
};
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
||||
Agreement and JUCE Privacy Policy.
|
||||
|
||||
End User License Agreement: www.juce.com/juce-7-licence
|
||||
Privacy Policy: www.juce.com/juce-privacy-policy
|
||||
|
||||
Or: You may also use this code under the terms of the GPL v3 (see
|
||||
www.gnu.org/licenses).
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "jucer_DocumentEditorComponent.h"
|
||||
|
||||
//==============================================================================
|
||||
class SourceCodeDocument : public OpenDocumentManager::Document
|
||||
{
|
||||
public:
|
||||
SourceCodeDocument (Project*, const File&);
|
||||
|
||||
bool loadedOk() const override { return true; }
|
||||
bool isForFile (const File& file) const override { return getFile() == file; }
|
||||
bool isForNode (const ValueTree&) const override { return false; }
|
||||
bool refersToProject (Project& p) const override { return project == &p; }
|
||||
Project* getProject() const override { return project; }
|
||||
String getName() const override { return getFile().getFileName(); }
|
||||
String getType() const override { return getFile().getFileExtension() + " file"; }
|
||||
File getFile() const override { return modDetector.getFile(); }
|
||||
bool needsSaving() const override { return codeDoc != nullptr && codeDoc->hasChangedSinceSavePoint(); }
|
||||
bool hasFileBeenModifiedExternally() override { return modDetector.hasBeenModified(); }
|
||||
void fileHasBeenRenamed (const File& newFile) override { modDetector.fileHasBeenRenamed (newFile); }
|
||||
String getState() const override { return lastState != nullptr ? lastState->toString() : String(); }
|
||||
void restoreState (const String& state) override { lastState.reset (new CodeEditorComponent::State (state)); }
|
||||
|
||||
File getCounterpartFile() const override
|
||||
{
|
||||
auto file = getFile();
|
||||
|
||||
if (file.hasFileExtension (sourceFileExtensions))
|
||||
{
|
||||
static const char* extensions[] = { "h", "hpp", "hxx", "hh", nullptr };
|
||||
return findCounterpart (file, extensions);
|
||||
}
|
||||
|
||||
if (file.hasFileExtension (headerFileExtensions))
|
||||
{
|
||||
static const char* extensions[] = { "cpp", "mm", "cc", "cxx", "c", "m", nullptr };
|
||||
return findCounterpart (file, extensions);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
static File findCounterpart (const File& file, const char** extensions)
|
||||
{
|
||||
while (*extensions != nullptr)
|
||||
{
|
||||
auto f = file.withFileExtension (*extensions++);
|
||||
|
||||
if (f.existsAsFile())
|
||||
return f;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
void reloadFromFile() override;
|
||||
bool saveSyncWithoutAsking() override;
|
||||
void saveAsync (std::function<void (bool)>) override;
|
||||
void saveAsAsync (std::function<void (bool)>) override;
|
||||
|
||||
std::unique_ptr<Component> createEditor() override;
|
||||
std::unique_ptr<Component> createViewer() override { return createEditor(); }
|
||||
|
||||
void updateLastState (CodeEditorComponent&);
|
||||
void applyLastState (CodeEditorComponent&) const;
|
||||
|
||||
CodeDocument& getCodeDocument();
|
||||
|
||||
//==============================================================================
|
||||
struct Type : public OpenDocumentManager::DocumentType
|
||||
{
|
||||
bool canOpenFile (const File& file) override
|
||||
{
|
||||
if (file.hasFileExtension (sourceOrHeaderFileExtensions)
|
||||
|| file.hasFileExtension ("txt;inc;tcc;xml;plist;rtf;html;htm;php;py;rb;cs"))
|
||||
return true;
|
||||
|
||||
MemoryBlock mb;
|
||||
if (file.loadFileAsData (mb)
|
||||
&& seemsToBeText (static_cast<const char*> (mb.getData()), (int) mb.getSize())
|
||||
&& ! file.hasFileExtension ("svg"))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool seemsToBeText (const char* const chars, const int num) noexcept
|
||||
{
|
||||
for (int i = 0; i < num; ++i)
|
||||
{
|
||||
const char c = chars[i];
|
||||
if ((c < 32 && c != '\t' && c != '\r' && c != '\n') || chars[i] > 126)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Document* openFile (Project* p, const File& file) override { return new SourceCodeDocument (p, file); }
|
||||
};
|
||||
|
||||
protected:
|
||||
FileModificationDetector modDetector;
|
||||
std::unique_ptr<CodeDocument> codeDoc;
|
||||
Project* project;
|
||||
|
||||
std::unique_ptr<CodeEditorComponent::State> lastState;
|
||||
|
||||
void reloadInternal();
|
||||
|
||||
private:
|
||||
std::unique_ptr<FileChooser> chooser;
|
||||
};
|
||||
|
||||
class GenericCodeEditorComponent;
|
||||
|
||||
//==============================================================================
|
||||
class SourceCodeEditor : public DocumentEditorComponent,
|
||||
private ValueTree::Listener,
|
||||
private CodeDocument::Listener
|
||||
{
|
||||
public:
|
||||
SourceCodeEditor (OpenDocumentManager::Document*, CodeDocument&);
|
||||
SourceCodeEditor (OpenDocumentManager::Document*, GenericCodeEditorComponent*);
|
||||
~SourceCodeEditor() override;
|
||||
|
||||
void scrollToKeepRangeOnScreen (Range<int> range);
|
||||
void highlight (Range<int> range, bool cursorAtStart);
|
||||
|
||||
std::unique_ptr<GenericCodeEditorComponent> editor;
|
||||
|
||||
private:
|
||||
void resized() override;
|
||||
void lookAndFeelChanged() override;
|
||||
|
||||
void valueTreePropertyChanged (ValueTree&, const Identifier&) override;
|
||||
void valueTreeChildAdded (ValueTree&, ValueTree&) override;
|
||||
void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override;
|
||||
void valueTreeChildOrderChanged (ValueTree&, int, int) override;
|
||||
void valueTreeParentChanged (ValueTree&) override;
|
||||
void valueTreeRedirected (ValueTree&) override;
|
||||
|
||||
void codeDocumentTextInserted (const String&, int) override;
|
||||
void codeDocumentTextDeleted (int, int) override;
|
||||
|
||||
void setEditor (GenericCodeEditorComponent*);
|
||||
void updateColourScheme();
|
||||
void checkSaveState();
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceCodeEditor)
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class GenericCodeEditorComponent : public CodeEditorComponent
|
||||
{
|
||||
public:
|
||||
GenericCodeEditorComponent (const File&, CodeDocument&, CodeTokeniser*);
|
||||
~GenericCodeEditorComponent() override;
|
||||
|
||||
void addPopupMenuItems (PopupMenu&, const MouseEvent*) override;
|
||||
void performPopupMenuAction (int menuItemID) override;
|
||||
|
||||
void getAllCommands (Array<CommandID>&) override;
|
||||
void getCommandInfo (CommandID, ApplicationCommandInfo&) override;
|
||||
bool perform (const InvocationInfo&) override;
|
||||
|
||||
void showFindPanel();
|
||||
void hideFindPanel();
|
||||
void findSelection();
|
||||
void findNext (bool forwards, bool skipCurrentSelection);
|
||||
void handleEscapeKey() override;
|
||||
void editorViewportPositionChanged() override;
|
||||
|
||||
void resized() override;
|
||||
|
||||
static String getSearchString() { return getAppSettings().getGlobalProperties().getValue ("searchString"); }
|
||||
static void setSearchString (const String& s) { getAppSettings().getGlobalProperties().setValue ("searchString", s); }
|
||||
static bool isCaseSensitiveSearch() { return getAppSettings().getGlobalProperties().getBoolValue ("searchCaseSensitive"); }
|
||||
static void setCaseSensitiveSearch (bool b) { getAppSettings().getGlobalProperties().setValue ("searchCaseSensitive", b); }
|
||||
|
||||
struct Listener
|
||||
{
|
||||
virtual ~Listener() {}
|
||||
virtual void codeEditorViewportMoved (CodeEditorComponent&) = 0;
|
||||
};
|
||||
|
||||
void addListener (Listener* listener);
|
||||
void removeListener (Listener* listener);
|
||||
|
||||
private:
|
||||
File file;
|
||||
class FindPanel;
|
||||
std::unique_ptr<FindPanel> findPanel;
|
||||
ListenerList<Listener> listeners;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericCodeEditorComponent)
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class CppCodeEditorComponent : public GenericCodeEditorComponent
|
||||
{
|
||||
public:
|
||||
CppCodeEditorComponent (const File&, CodeDocument&);
|
||||
~CppCodeEditorComponent() override;
|
||||
|
||||
void addPopupMenuItems (PopupMenu&, const MouseEvent*) override;
|
||||
void performPopupMenuAction (int menuItemID) override;
|
||||
|
||||
void handleReturnKey() override;
|
||||
void insertTextAtCaret (const String& newText) override;
|
||||
|
||||
private:
|
||||
void insertComponentClass();
|
||||
|
||||
std::unique_ptr<AlertWindow> asyncAlertWindow;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CppCodeEditorComponent)
|
||||
};
|
||||
|
Reference in New Issue
Block a user