1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-29 02:40:05 +00:00

Introjucer: avoided problems when closing a GUI comp which is a sub-component of another currently-loaded GUI component.

This commit is contained in:
jules 2013-10-15 20:53:28 +01:00
parent 59b9b0ccaf
commit 8e4825e7bd
11 changed files with 38 additions and 17 deletions

View file

@ -39,7 +39,7 @@ DocumentEditorComponent::~DocumentEditorComponent()
IntrojucerApp::getApp().openDocumentManager.removeListener (this);
}
void DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc)
bool DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc)
{
if (document == closingDoc)
{
@ -48,6 +48,8 @@ void DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Documen
if (ProjectContentComponent* pcc = findParentComponentOfClass<ProjectContentComponent>())
pcc->hideDocument (document);
}
return true;
}
void DocumentEditorComponent::setEditedState (bool /*hasBeenEdited*/)

View file

@ -41,7 +41,7 @@ public:
OpenDocumentManager::Document* getDocument() const { return document; }
void documentAboutToClose (OpenDocumentManager::Document*) override;
bool documentAboutToClose (OpenDocumentManager::Document*) override;
protected:
OpenDocumentManager::Document* document;

View file

@ -195,8 +195,14 @@ bool OpenDocumentManager::closeDocument (int index, bool saveIfNeeded)
if (saveIfNeededAndUserAgrees (doc) != FileBasedDocument::savedOk)
return false;
bool canClose = true;
for (int i = listeners.size(); --i >= 0;)
listeners.getUnchecked(i)->documentAboutToClose (doc);
if (! listeners.getUnchecked(i)->documentAboutToClose (doc))
canClose = false;
if (! canClose)
return false;
documents.remove (index);
IntrojucerApp::getCommandManager().commandStatusChanged();
@ -359,13 +365,15 @@ OpenDocumentManager::Document* RecentDocumentList::getClosestPreviousDocOtherTha
return nullptr;
}
void RecentDocumentList::documentAboutToClose (OpenDocumentManager::Document* document)
bool RecentDocumentList::documentAboutToClose (OpenDocumentManager::Document* document)
{
previousDocs.removeAllInstancesOf (document);
nextDocs.removeAllInstancesOf (document);
jassert (! previousDocs.contains (document));
jassert (! nextDocs.contains (document));
return true;
}
static void restoreDocList (Project& project, Array <OpenDocumentManager::Document*>& list, const XmlElement* xml)

View file

@ -90,7 +90,8 @@ public:
DocumentCloseListener() {}
virtual ~DocumentCloseListener() {}
virtual void documentAboutToClose (Document* document) = 0;
// return false to force it to stop.
virtual bool documentAboutToClose (Document* document) = 0;
};
void addListener (DocumentCloseListener*);
@ -143,7 +144,7 @@ public:
XmlElement* createXML() const;
private:
void documentAboutToClose (OpenDocumentManager::Document*);
bool documentAboutToClose (OpenDocumentManager::Document*);
Array <OpenDocumentManager::Document*> previousDocs, nextDocs;
};

View file

@ -37,7 +37,7 @@ class JucerComponentHandler : public ComponentTypeHandler
{
public:
JucerComponentHandler()
: ComponentTypeHandler ("Jucer Component", "xxx",
: ComponentTypeHandler ("Introjucer Component", "xxx",
typeid (TestComponent), 300, 200)
{}
@ -145,11 +145,11 @@ public:
static void setJucerComponentFile (JucerDocument& document, TestComponent* comp, const String& newFilename)
{
jassert (comp != 0);
jassert (comp != nullptr);
if (comp != 0)
if (comp != nullptr)
document.perform (new JucerCompFileChangeAction (comp, *document.getComponentLayout(), newFilename),
"Change Jucer component file");
"Change Introjucer component file");
}
private:

View file

@ -498,7 +498,7 @@ private:
document.perform (new JucerCompFileChangeAction (component, *document.getComponentLayout(),
newFile.getRelativePathFrom (document.getCppFile().getParentDirectory())
.replaceCharacter ('\\', '/')),
"Change Jucer component file");
"Change Introjucer component file");
}
File getFile() const

View file

@ -54,10 +54,12 @@ JucerDocument::JucerDocument (SourceCodeDocument* c)
IntrojucerApp::getCommandManager().commandStatusChanged();
cpp->getCodeDocument().addListener (this);
IntrojucerApp::getApp().openDocumentManager.addListener (this);
}
JucerDocument::~JucerDocument()
{
IntrojucerApp::getApp().openDocumentManager.removeListener (this);
cpp->getCodeDocument().removeListener (this);
IntrojucerApp::getCommandManager().commandStatusChanged();
}
@ -78,6 +80,11 @@ struct UserDocChangeTimer : public Timer
JucerDocument& doc;
};
bool JucerDocument::documentAboutToClose (OpenDocumentManager::Document* doc)
{
return doc != cpp;
}
void JucerDocument::userEditedCpp()
{
if (userDocChangeTimer == nullptr)
@ -656,8 +663,8 @@ JucerDocument* JucerDocument::createForCppFile (Project* p, const File& file)
{
OpenDocumentManager& odm = IntrojucerApp::getApp().openDocumentManager;
if (SourceCodeDocument* cpp = dynamic_cast <SourceCodeDocument*> (odm.openFile (p, file)))
if (dynamic_cast <SourceCodeDocument*> (odm.openFile (p, file.withFileExtension (".h"))) != nullptr)
if (SourceCodeDocument* cpp = dynamic_cast<SourceCodeDocument*> (odm.openFile (p, file)))
if (dynamic_cast<SourceCodeDocument*> (odm.openFile (p, file.withFileExtension (".h"))) != nullptr)
return createDocument (cpp);
return nullptr;

View file

@ -35,7 +35,8 @@
//==============================================================================
class JucerDocument : public ChangeBroadcaster,
private Timer,
private CodeDocument::Listener
private CodeDocument::Listener,
private OpenDocumentManager::DocumentCloseListener
{
public:
JucerDocument (SourceCodeDocument* cpp);
@ -167,6 +168,7 @@ private:
void codeDocumentTextInserted (const String& newText, int insertIndex) override;
void codeDocumentTextDeleted (int startIndex, int endIndex) override;
void userEditedCpp();
bool documentAboutToClose (OpenDocumentManager::Document*) override;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JucerDocument);
};

View file

@ -146,7 +146,7 @@ void TestComponent::paint (Graphics& g)
g.drawLine (0.0f, (float) getHeight(), (float) getWidth(), 0.0f);
g.setFont (14.0f);
g.drawText ("Jucer Component",
g.drawText ("Introjucer Component",
0, 0, getWidth(), getHeight() / 2,
Justification::centred, true);
g.drawText ("(no file loaded)",

View file

@ -357,9 +357,10 @@ void ProjectContentComponent::reloadLastOpenDocuments()
}
}
void ProjectContentComponent::documentAboutToClose (OpenDocumentManager::Document* document)
bool ProjectContentComponent::documentAboutToClose (OpenDocumentManager::Document* document)
{
hideDocument (document);
return true;
}
void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster*)

View file

@ -118,7 +118,7 @@ protected:
ComponentBoundsConstrainer treeSizeConstrainer;
BubbleMessageComponent bubbleMessage;
void documentAboutToClose (OpenDocumentManager::Document*) override;
bool documentAboutToClose (OpenDocumentManager::Document*) override;
void changeListenerCallback (ChangeBroadcaster*) override;
void showTranslationTool();