1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-11 23:54:18 +00:00
JUCE/extras/Projucer/Source/LiveBuildEngine/projucer_CompileEngineClient.h

171 lines
5.8 KiB
C++

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2015 - ROLI Ltd.
Permission is granted to use this software under the terms of either:
a) the GPL v2 (or any later version)
b) the Affero GPL v3
Details of these licenses can be found 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.juce.com for more information.
==============================================================================
*/
#ifndef __PROJUCER_CLANGCLIENT_H_5AE7396F__
#define __PROJUCER_CLANGCLIENT_H_5AE7396F__
#include "projucer_ActivityList.h"
#include "projucer_ErrorList.h"
class Project;
//==============================================================================
class CompileEngineChildProcess : public ReferenceCountedObject,
private OpenDocumentManager::DocumentCloseListener
{
public:
CompileEngineChildProcess (Project&);
~CompileEngineChildProcess();
bool openedOk() const { return process != nullptr; }
void editorOpened (const File& file, CodeDocument& document);
bool documentAboutToClose (OpenDocumentManager::Document*) override;
void cleanAll();
void openPreview (const ClassDatabase::Class&);
void reinstantiatePreviews();
void processActivationChanged (bool isForeground);
bool canLaunchApp() const;
void launchApp();
bool canKillApp() const;
void killApp();
const ClassDatabase::ClassList& getComponentList() const { return lastComponentList; }
void setContinuousRebuild (bool continuousBuild);
void flushEditorChanges();
static void cleanAllCachedFilesForProject (Project&);
Project& project;
ActivityList activityList;
ErrorList errorList;
std::function<void (const String&)> crashHandler;
//==============================================================================
// from server..
void handleNewDiagnosticList (const ValueTree& newList);
void handleClearErrors();
void handleActivityListChanged (const StringArray&);
void handleClassListChanged (const ValueTree& newList);
void handleBuildFailed();
void handleChangeCode (const SourceCodeRange& location, const String& newText);
void handleAppLaunched();
void handleAppQuit();
void handleHighlightCode (const SourceCodeRange& location);
void handlePing();
void handleCrash (const String& message);
void handleCloseIDE();
void handleKeyPress (const String& className, const KeyPress& key);
void handleUndoInEditor (const String& className);
void handleRedoInEditor (const String& className);
void handleMissingSystemHeaders();
typedef ReferenceCountedObjectPtr<CompileEngineChildProcess> Ptr;
private:
//==============================================================================
class ChildProcess;
ScopedPointer<ChildProcess> process, runningAppProcess;
ClassDatabase::ClassList lastComponentList;
bool continuousRebuild;
struct Editor;
OwnedArray<Editor> editors;
void updateAllEditors();
void createProcess();
Editor* getOrOpenEditorFor (const File&);
ProjectContentComponent* findProjectContentComponent() const;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CompileEngineChildProcess)
};
//==============================================================================
struct ChildProcessCache
{
ChildProcessCache() {}
CompileEngineChildProcess::Ptr getExisting (Project& project) const noexcept
{
for (CompileEngineChildProcess* p : processes)
if (&(p->project) == &project)
return p;
return nullptr;
}
CompileEngineChildProcess::Ptr getOrCreate (Project& project)
{
CompileEngineChildProcess::Ptr p (getExisting (project));
if (p == nullptr)
{
p = new CompileEngineChildProcess (project);
tellNewProcessAboutExistingEditors (p);
processes.add (p);
}
return p;
}
static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess* process)
{
OpenDocumentManager& odm = ProjucerApplication::getApp().openDocumentManager;
for (int i = odm.getNumOpenDocuments(); --i >= 0;)
if (SourceCodeDocument* d = dynamic_cast<SourceCodeDocument*> (odm.getOpenDocument (i)))
process->editorOpened (d->getFile(), d->getCodeDocument());
}
void removeOrphans()
{
for (int i = processes.size(); --i >= 0;)
if (processes.getObjectPointerUnchecked (i)->getReferenceCount() <= 1)
processes.remove (i);
}
private:
ReferenceCountedArray<CompileEngineChildProcess> processes;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessCache)
};
//==============================================================================
struct LiveBuildProjectSettings
{
static void getLiveSettings (Project&, PropertyListBuilder&);
static void updateNewlyOpenedProject (Project& p);
static bool isBuildDisabled (Project&);
static void setBuildDisabled (Project&, bool);
static bool areWarningsDisabled (Project&);
static void setWarningsDisabled (Project&, bool);
};
#endif // __PROJUCER_CLANGCLIENT_H_5AE7396F__