/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. 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 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-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_MainWindow.h" #include "../Project/jucer_Module.h" #include "jucer_AutoUpdater.h" #include "../CodeEditor/jucer_SourceCodeEditor.h" #include "../Utility/UI/jucer_ProjucerLookAndFeel.h" #include "../Licenses/jucer_LicenseController.h" #if JUCE_MODULE_AVAILABLE_juce_analytics #include "jucer_ProjucerAnalytics.h" #endif struct ChildProcessCache; //============================================================================== class ProjucerApplication : public JUCEApplication, private AsyncUpdater, private LicenseController::StateChangedCallback { public: ProjucerApplication(); static ProjucerApplication& getApp(); static ApplicationCommandManager& getCommandManager(); //============================================================================== void initialise (const String& commandLine) override; void initialiseBasics(); bool initialiseLogger (const char* filePrefix); void initialiseWindows (const String& commandLine); void shutdown() override; void systemRequestedQuit() override; void deleteLogger(); //============================================================================== const String getApplicationName() override { return "Projucer"; } const String getApplicationVersion() override { return ProjectInfo::versionString; } String getVersionDescription() const; bool moreThanOneInstanceAllowed() override { return true; } // this is handled manually in initialise() void anotherInstanceStarted (const String& commandLine) override; //============================================================================== MenuBarModel* getMenuModel(); StringArray getMenuNames(); void createMenu (PopupMenu&, const String& menuName); void createFileMenu (PopupMenu&); void createEditMenu (PopupMenu&); void createViewMenu (PopupMenu&); void createBuildMenu (PopupMenu&); void createColourSchemeItems (PopupMenu&); void createWindowMenu (PopupMenu&); void createDocumentMenu (PopupMenu&); void createToolsMenu (PopupMenu&); void createHelpMenu (PopupMenu&); void createExtraAppleMenuItems (PopupMenu&); void handleMainMenuCommand (int menuItemID); //============================================================================== void getAllCommands (Array&) override; void getCommandInfo (CommandID commandID, ApplicationCommandInfo&) override; bool perform (const InvocationInfo&) override; //============================================================================== void createNewProject(); void createNewProjectFromClipboard(); void createNewPIP(); void askUserToOpenFile(); bool openFile (const File&); void saveAllDocuments(); bool closeAllDocuments (bool askUserToSave); bool closeAllMainWindows(); void closeAllMainWindowsAndQuitIfNeeded(); void clearRecentFiles(); PropertiesFile::Options getPropertyFileOptionsFor (const String& filename, bool isProjectSettings); //============================================================================== void showUTF8ToolWindow(); void showSVGPathDataToolWindow(); void showAboutWindow(); void showApplicationUsageDataAgreementPopup(); void dismissApplicationUsageDataAgreementPopup(); void showPathsWindow (bool highlightJUCEPath = false); void showEditorColourSchemeWindow(); void showPIPCreatorWindow(); void launchForumBrowser(); void launchModulesBrowser(); void launchClassesBrowser(); void launchTutorialsBrowser(); void updateAllBuildTabs(); //============================================================================== void licenseStateChanged (const LicenseState&) override; void doLogout(); bool isPaidOrGPL() const { return licenseController == nullptr || licenseController->getState().isPaidOrGPL(); } //============================================================================== void selectEditorColourSchemeWithName (const String& schemeName); static bool isEditorColourSchemeADefaultScheme (const StringArray& schemes, int editorColourSchemeIndex); static int getEditorColourSchemeForGUIColourScheme (const StringArray& schemes, int guiColourSchemeIndex); //============================================================================== void setAnalyticsEnabled (bool); //============================================================================== void rescanJUCEPathModules(); void rescanUserPathModules(); AvailableModuleList& getJUCEPathModuleList() { return jucePathModuleList; } AvailableModuleList& getUserPathsModuleList() { return userPathsModuleList; } //============================================================================== ProjucerLookAndFeel lookAndFeel; std::unique_ptr settings; std::unique_ptr icons; struct MainMenuModel; std::unique_ptr menuModel; MainWindowList mainWindowList; OpenDocumentManager openDocumentManager; std::unique_ptr commandManager; std::unique_ptr utf8Window, svgPathWindow, aboutWindow, applicationUsageDataWindow, pathsWindow, editorColourSchemeWindow, pipCreatorWindow; std::unique_ptr logger; bool isRunningCommandLine; std::unique_ptr childProcessCache; std::unique_ptr licenseController; private: //============================================================================== void handleAsyncUpdate() override; void initCommandManager(); void createExamplesPopupMenu (PopupMenu&) noexcept; Array getSortedExampleDirectories() noexcept; Array getSortedExampleFilesInDirectory (const File&) const noexcept; bool findWindowAndOpenPIP (const File&); void findAndLaunchExample (int); void checkIfGlobalJUCEPathHasChanged(); File tryToFindDemoRunnerExecutable(); File tryToFindDemoRunnerProject(); void launchDemoRunner(); void resetAnalytics() noexcept; void setupAnalytics(); void showSetJUCEPathAlert(); void setColourScheme (int index, bool saveSetting); void setEditorColourScheme (int index, bool saveSetting); void updateEditorColourSchemeIfNeeded(); //============================================================================== void* server = nullptr; TooltipWindow tooltipWindow; AvailableModuleList jucePathModuleList, userPathsModuleList; int numExamples = 0; std::unique_ptr demoRunnerAlert; std::unique_ptr pathAlert; bool hasScannedForDemoRunnerExecutable = false, hasScannedForDemoRunnerProject = false; File lastJUCEPath, lastDemoRunnerExectuableFile, lastDemoRunnerProjectFile; #if JUCE_LINUX ChildProcess makeProcess; #endif int selectedColourSchemeIndex = 0, selectedEditorColourSchemeIndex = 0; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjucerApplication) };