|  | /*
  ==============================================================================
   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"
ScopedPointer<ApplicationCommandManager> commandManager;
//==============================================================================
MainWindow::MainWindow()
    : DocumentWindow (JucerApplication::getApp()->getApplicationName(),
                      Colour::greyLevel (0.6f),
                      DocumentWindow::allButtons,
                      false)
{
    setUsingNativeTitleBar (true);
    createProjectContentCompIfNeeded();
   #if ! JUCE_MAC
    setMenuBar (JucerApplication::getApp()->menuModel);
   #endif
    setResizable (true, false);
    centreWithSize (800, 600);
    // Register all the app commands..
    {
        commandManager->registerAllCommandsForTarget (this);
        commandManager->registerAllCommandsForTarget (getProjectContentComponent());
        // use some temporary objects to harvest their commands..
        DocumentEditorComponent dec (nullptr);
        commandManager->registerAllCommandsForTarget (&dec);
    }
    // update key mappings..
    {
        commandManager->getKeyMappings()->resetToDefaultMappings();
        ScopedPointer <XmlElement> 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::createProjectContentCompIfNeeded()
{
    if (getProjectContentComponent() == nullptr)
    {
        clearContentComponent();
        setContentOwned (new ProjectContentComponent(), false);
    }
}
void MainWindow::makeVisible()
{
    setVisible (true);
    restoreWindowPosition();
    addToDesktop();
    getContentComponent()->grabKeyboardFocus();
}
ProjectContentComponent* MainWindow::getProjectContentComponent() const
{
    return dynamic_cast <ProjectContentComponent*> (getContentComponent());
}
void MainWindow::closeButtonPressed()
{
    if (! closeCurrentProject())
        return;
    JucerApplication::getApp()->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)
{
    createProjectContentCompIfNeeded();
    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)
        JucerApplication::getApp()->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)
{
    createProjectContentCompIfNeeded();
    if (file.hasFileExtension (Project::projectFileExtension))
    {
        ScopedPointer <Project> 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 (JucerApplication::getApp()->getApplicationName());
    if (currentProject != nullptr)
        name = currentProject->getDocumentTitle() + " - " + name;
    if (documentName.isNotEmpty())
        name = documentName + " - " + name;
    setName (name);
}
void MainWindow::showNewProjectWizard()
{
    jassert (currentProject == nullptr);
    setContentOwned (NewProjectWizard::createComponent(), true);
    makeVisible();
}
//==============================================================================
ApplicationCommandTarget* MainWindow::getNextCommandTarget()
{
    return 0;
}
void MainWindow::getAllCommands (Array <CommandID>& 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;
}
 |