/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-11 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online 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.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "../jucer_Headers.h" #include "jucer_Application.h" #include "jucer_MainWindow.h" #include "jucer_OpenDocumentManager.h" #include "../Code Editor/jucer_SourceCodeEditor.h" #include "../Project/jucer_NewProjectWizard.h" ApplicationCommandManager* commandManager = nullptr; //============================================================================== MainWindow::MainWindow() : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(), Colour::greyLevel (0.6f), DocumentWindow::allButtons, false) { setUsingNativeTitleBar (true); setContentOwned (new ProjectContentComponent(), false); #if ! JUCE_MAC JucerApplication* app = static_cast (JUCEApplication::getInstance()); setMenuBar (app->menuModel); #endif setResizable (true, false); centreWithSize (700, 600); // Register all the app commands.. { commandManager->registerAllCommandsForTarget (this); // use some temporary objects to harvest their commands.. DocumentEditorComponent dec (nullptr); commandManager->registerAllCommandsForTarget (&dec); ProjectContentComponent pcc; commandManager->registerAllCommandsForTarget (&pcc); } commandManager->getKeyMappings()->resetToDefaultMappings(); ScopedPointer keys (StoredSettings::getInstance()->getProps().getXmlValue ("keyMappings")); if (keys != nullptr) commandManager->getKeyMappings()->restoreFromXml (*keys); addKeyListener (commandManager->getKeyMappings()); // don't want the window to take focus when the title-bar is clicked.. setWantsKeyboardFocus (false); //getPeer()->setCurrentRenderingEngine (0); getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack); } MainWindow::~MainWindow() { #if ! JUCE_MAC setMenuBar (nullptr); #endif removeKeyListener (commandManager->getKeyMappings()); // save the current size and position to our settings file.. StoredSettings::getInstance()->getProps() .setValue ("lastMainWindowPos", getWindowStateAsString()); clearContentComponent(); currentProject = nullptr; } void MainWindow::makeVisible() { setVisible (true); restoreWindowPosition(); addToDesktop(); getContentComponent()->grabKeyboardFocus(); } ProjectContentComponent* MainWindow::getProjectContentComponent() const { return dynamic_cast (getContentComponent()); } void MainWindow::closeButtonPressed() { if (! closeCurrentProject()) return; JucerApplication* jucer = static_cast (JUCEApplication::getInstance()); jucer->closeWindow (this); } bool MainWindow::closeProject (Project* project) { jassert (project == currentProject && project != nullptr); if (project == nullptr) return true; StoredSettings::getInstance()->getProps() .setValue (getProjectWindowPosName(), getWindowStateAsString()); if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) return false; FileBasedDocument::SaveResult r = project->saveIfNeededAndUserAgrees(); if (r == FileBasedDocument::savedOk) { setProject (nullptr); return true; } return false; } bool MainWindow::closeCurrentProject() { return currentProject == nullptr || closeProject (currentProject); } void MainWindow::setProject (Project* newProject) { getProjectContentComponent()->setProject (newProject); currentProject = newProject; commandManager->commandStatusChanged(); // (mustn't do this when the project is 0, because that'll happen on shutdown, // which will erase the list of recent projects) if (newProject != nullptr) static_cast (JUCEApplication::getInstance())->updateRecentProjectList(); } void MainWindow::restoreWindowPosition() { String windowState; if (currentProject != nullptr) windowState = StoredSettings::getInstance()->getProps().getValue (getProjectWindowPosName()); if (windowState.isEmpty()) windowState = StoredSettings::getInstance()->getProps().getValue ("lastMainWindowPos"); restoreWindowStateFromString (windowState); } bool MainWindow::canOpenFile (const File& file) const { return file.hasFileExtension (Project::projectFileExtension) || OpenDocumentManager::getInstance()->canOpenFile (file); } bool MainWindow::openFile (const File& file) { if (file.hasFileExtension (Project::projectFileExtension)) { ScopedPointer newDoc (new Project (file)); if (newDoc->loadFrom (file, true) && closeCurrentProject()) { setProject (newDoc.release()); return true; } } else if (file.exists()) { return getProjectContentComponent()->showEditorForFile (file); } return false; } bool MainWindow::isInterestedInFileDrag (const StringArray& filenames) { for (int i = filenames.size(); --i >= 0;) if (canOpenFile (filenames[i])) return true; return false; } void MainWindow::filesDropped (const StringArray& filenames, int mouseX, int mouseY) { for (int i = filenames.size(); --i >= 0;) { const File f (filenames[i]); if (canOpenFile (f) && openFile (f)) break; } } void MainWindow::activeWindowStatusChanged() { DocumentWindow::activeWindowStatusChanged(); if (getProjectContentComponent() != nullptr) getProjectContentComponent()->updateMissingFileStatuses(); OpenDocumentManager::getInstance()->reloadModifiedFiles(); } void MainWindow::updateTitle (const String& documentName) { String name (JUCEApplication::getInstance()->getApplicationName()); if (currentProject != nullptr) name = currentProject->getDocumentTitle() + " - " + name; if (documentName.isNotEmpty()) name = documentName + " - " + name; setName (name); } //============================================================================== ApplicationCommandTarget* MainWindow::getNextCommandTarget() { return 0; } void MainWindow::getAllCommands (Array & commands) { const CommandID ids[] = { CommandIDs::closeWindow }; commands.addArray (ids, numElementsInArray (ids)); } void MainWindow::getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) { switch (commandID) { case CommandIDs::closeWindow: result.setInfo ("Close Window", "Closes the current window", CommandCategories::general, 0); result.defaultKeypresses.add (KeyPress ('w', ModifierKeys::commandModifier, 0)); break; default: break; } } bool MainWindow::perform (const InvocationInfo& info) { switch (info.commandID) { case CommandIDs::closeWindow: closeButtonPressed(); break; default: return false; } return true; }