mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-16 00:34:19 +00:00
Made the new jucer support multiple windows.
This commit is contained in:
parent
5d5aa37475
commit
d3cf0870d9
9 changed files with 449 additions and 275 deletions
|
|
@ -28,8 +28,7 @@
|
|||
|
||||
#include "../jucer_Headers.h"
|
||||
#include "jucer_MainWindow.h"
|
||||
|
||||
ApplicationCommandManager* commandManager = 0;
|
||||
#include "../Project/jucer_NewProjectWizard.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -57,22 +56,41 @@ public:
|
|||
commandManager = new ApplicationCommandManager();
|
||||
commandManager->registerAllCommandsForTarget (this);
|
||||
|
||||
theMainWindow = new MainWindow();
|
||||
menuModel = new MainMenuModel();
|
||||
|
||||
MainWindow* main = createNewMainWindow (false);
|
||||
doExtraInitialisation();
|
||||
|
||||
ImageCache::setCacheTimeout (30 * 1000);
|
||||
|
||||
if (commandLine.trim().isNotEmpty() && ! commandLine.trim().startsWithChar ('-'))
|
||||
{
|
||||
anotherInstanceStarted (commandLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
Array<File> projects (StoredSettings::getInstance()->getLastProjects());
|
||||
|
||||
theMainWindow->reloadLastProject();
|
||||
for (int i = 0; i < projects.size(); ++ i)
|
||||
openFile (projects.getReference(i));
|
||||
}
|
||||
|
||||
theMainWindow->getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);
|
||||
#if JUCE_MAC
|
||||
MenuBarModel::setMacMainMenu (menuModel);
|
||||
#endif
|
||||
|
||||
main->setVisible (true);
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
theMainWindow = 0;
|
||||
#if JUCE_MAC
|
||||
MenuBarModel::setMacMainMenu (0);
|
||||
#endif
|
||||
menuModel = 0;
|
||||
|
||||
StoredSettings::deleteInstance();
|
||||
mainWindows.clear();
|
||||
|
||||
OpenDocumentManager::deleteInstance();
|
||||
deleteAndZero (commandManager);
|
||||
|
|
@ -81,13 +99,28 @@ public:
|
|||
//==============================================================================
|
||||
void systemRequestedQuit()
|
||||
{
|
||||
if (theMainWindow == 0 || theMainWindow->closeCurrentProject())
|
||||
while (mainWindows.size() > 0)
|
||||
{
|
||||
theMainWindow = 0;
|
||||
StoredSettings::deleteInstance();
|
||||
if (! mainWindows[0]->closeCurrentProject())
|
||||
return;
|
||||
|
||||
quit();
|
||||
mainWindows.remove (0);
|
||||
}
|
||||
|
||||
quit();
|
||||
}
|
||||
|
||||
void closeWindow (MainWindow* w)
|
||||
{
|
||||
jassert (mainWindows.contains (w));
|
||||
mainWindows.removeObject (w);
|
||||
|
||||
#if ! JUCE_MAC
|
||||
if (mainWindows.size() == 0)
|
||||
systemRequestedQuit();
|
||||
#endif
|
||||
|
||||
updateRecentProjectList();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -112,14 +145,335 @@ public:
|
|||
|
||||
void anotherInstanceStarted (const String& commandLine)
|
||||
{
|
||||
if (theMainWindow != 0)
|
||||
theMainWindow->openFile (commandLine.unquoted());
|
||||
openFile (commandLine.unquoted());
|
||||
}
|
||||
|
||||
virtual void doExtraInitialisation() {}
|
||||
|
||||
//==============================================================================
|
||||
class MainMenuModel : public MenuBarModel
|
||||
{
|
||||
public:
|
||||
MainMenuModel()
|
||||
{
|
||||
setApplicationCommandManagerToWatch (commandManager);
|
||||
}
|
||||
|
||||
const StringArray getMenuBarNames()
|
||||
{
|
||||
const char* const names[] = { "File", "Edit", "View", "Window", 0 };
|
||||
return StringArray ((const char**) names);
|
||||
}
|
||||
|
||||
const PopupMenu getMenuForIndex (int topLevelMenuIndex, const String& menuName)
|
||||
{
|
||||
PopupMenu menu;
|
||||
|
||||
if (topLevelMenuIndex == 0) // "File" menu
|
||||
{
|
||||
menu.addCommandItem (commandManager, CommandIDs::newProject);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::open);
|
||||
|
||||
PopupMenu recentFiles;
|
||||
StoredSettings::getInstance()->recentFiles.createPopupMenuItems (recentFiles, 100, true, true);
|
||||
menu.addSubMenu ("Open recent file", recentFiles);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeDocument);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveDocument);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveDocumentAs);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeProject);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveProject);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveProjectAs);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::openProjectInIDE);
|
||||
|
||||
#if ! JUCE_MAC
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit);
|
||||
#endif
|
||||
}
|
||||
else if (topLevelMenuIndex == 1) // "Edit" menu
|
||||
{
|
||||
menu.addCommandItem (commandManager, CommandIDs::undo);
|
||||
menu.addCommandItem (commandManager, CommandIDs::redo);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::cut);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::copy);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::paste);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::del);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::selectAll);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::deselectAll);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::toFront);
|
||||
menu.addCommandItem (commandManager, CommandIDs::toBack);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::group);
|
||||
menu.addCommandItem (commandManager, CommandIDs::ungroup);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::bringBackLostItems);
|
||||
}
|
||||
else if (topLevelMenuIndex == 2) // "View" menu
|
||||
{
|
||||
menu.addCommandItem (commandManager, CommandIDs::showProjectSettings);
|
||||
menu.addSeparator();
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::test);
|
||||
menu.addSeparator();
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::showGrid);
|
||||
menu.addCommandItem (commandManager, CommandIDs::enableSnapToGrid);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomIn);
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomOut);
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomNormal);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::useTabbedWindows);
|
||||
}
|
||||
else if (topLevelMenuIndex == 3) // "Window" menu
|
||||
{
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeWindow);
|
||||
menu.addSeparator();
|
||||
|
||||
const int numDocs = jmin (50, OpenDocumentManager::getInstance()->getNumOpenDocuments());
|
||||
|
||||
for (int i = 0; i < numDocs; ++i)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument(i);
|
||||
|
||||
menu.addItem (300 + i, doc->getName());
|
||||
}
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeAllDocuments);
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
void menuItemSelected (int menuItemID, int topLevelMenuIndex)
|
||||
{
|
||||
if (menuItemID >= 100 && menuItemID < 200)
|
||||
{
|
||||
// open a file from the "recent files" menu
|
||||
const File file (StoredSettings::getInstance()->recentFiles.getFile (menuItemID - 100));
|
||||
|
||||
getApp()->openFile (file);
|
||||
}
|
||||
else if (menuItemID >= 300 && menuItemID < 400)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (menuItemID - 300);
|
||||
getApp()->getOrCreateFrontmostWindow (true)->getProjectContentComponent()->showDocument (doc);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
JucerApplication* getApp() const
|
||||
{
|
||||
return static_cast<JucerApplication*> (JUCEApplication::getInstance());
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
void getAllCommands (Array <CommandID>& commands)
|
||||
{
|
||||
JUCEApplication::getAllCommands (commands);
|
||||
|
||||
const CommandID ids[] = { CommandIDs::newProject,
|
||||
CommandIDs::open,
|
||||
CommandIDs::showPrefs,
|
||||
CommandIDs::closeAllDocuments,
|
||||
CommandIDs::saveAll };
|
||||
|
||||
commands.addArray (ids, numElementsInArray (ids));
|
||||
}
|
||||
|
||||
void getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result)
|
||||
{
|
||||
switch (commandID)
|
||||
{
|
||||
case CommandIDs::newProject:
|
||||
result.setInfo ("New Project...", "Creates a new Jucer project", CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::open:
|
||||
result.setInfo ("Open...", "Opens a Jucer project", CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::showPrefs:
|
||||
result.setInfo ("Preferences...", "Shows the preferences panel.", CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress (',', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::closeAllDocuments:
|
||||
result.setInfo ("Close All Documents", "Closes all open documents", CommandCategories::general, 0);
|
||||
result.setActive (OpenDocumentManager::getInstance()->getNumOpenDocuments() > 0);
|
||||
break;
|
||||
|
||||
case CommandIDs::saveAll:
|
||||
result.setInfo ("Save All", "Saves all open documents", CommandCategories::general, 0);
|
||||
result.setActive (OpenDocumentManager::getInstance()->anyFilesNeedSaving());
|
||||
break;
|
||||
|
||||
default:
|
||||
JUCEApplication::getCommandInfo (commandID, result);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool perform (const InvocationInfo& info)
|
||||
{
|
||||
switch (info.commandID)
|
||||
{
|
||||
case CommandIDs::newProject: createNewProject(); break;
|
||||
case CommandIDs::open: askUserToOpenFile(); break;
|
||||
case CommandIDs::showPrefs: showPrefsPanel(); break;
|
||||
case CommandIDs::saveAll: OpenDocumentManager::getInstance()->saveAll(); break;
|
||||
case CommandIDs::closeAllDocuments: closeAllDocuments (true); break;
|
||||
default: return JUCEApplication::perform (info);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void showPrefsPanel()
|
||||
{
|
||||
jassertfalse;
|
||||
}
|
||||
|
||||
void createNewProject()
|
||||
{
|
||||
MainWindow* mw = createNewMainWindow (false);
|
||||
ScopedPointer <Project> newProj (NewProjectWizard::runNewProjectWizard (mw));
|
||||
|
||||
if (newProj != 0)
|
||||
mw->setProject (newProj.release());
|
||||
else
|
||||
closeWindow (mw);
|
||||
|
||||
mw->setVisible (true);
|
||||
}
|
||||
|
||||
void askUserToOpenFile()
|
||||
{
|
||||
FileChooser fc ("Open File");
|
||||
|
||||
if (fc.browseForFileToOpen())
|
||||
openFile (fc.getResult());
|
||||
}
|
||||
|
||||
bool openFile (const File& file)
|
||||
{
|
||||
if (file.hasFileExtension (Project::projectFileExtension))
|
||||
{
|
||||
ScopedPointer <Project> newDoc (new Project (file));
|
||||
|
||||
if (file == File::nonexistent ? newDoc->loadFromUserSpecifiedFile (true)
|
||||
: newDoc->loadFrom (file, true))
|
||||
{
|
||||
MainWindow* w = getOrCreateEmptyWindow (false);
|
||||
w->setProject (newDoc.release());
|
||||
w->restoreWindowPosition();
|
||||
w->setVisible (true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (file.exists())
|
||||
{
|
||||
return getOrCreateFrontmostWindow (true)->openFile (file);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool closeAllDocuments (bool askUserToSave)
|
||||
{
|
||||
for (int i = OpenDocumentManager::getInstance()->getNumOpenDocuments(); --i >= 0;)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (i);
|
||||
|
||||
for (int j = mainWindows.size(); --j >= 0;)
|
||||
mainWindows.getUnchecked(j)->getProjectContentComponent()->hideDocument (doc);
|
||||
|
||||
if (! OpenDocumentManager::getInstance()->closeDocument (i, askUserToSave))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void updateRecentProjectList()
|
||||
{
|
||||
Array<File> projects;
|
||||
|
||||
for (int i = 0; i < mainWindows.size(); ++i)
|
||||
{
|
||||
MainWindow* mw = mainWindows[i];
|
||||
|
||||
if (mw != 0 && mw->getProject() != 0)
|
||||
projects.add (mw->getProject()->getFile());
|
||||
}
|
||||
|
||||
StoredSettings::getInstance()->setLastProjects (projects);
|
||||
}
|
||||
|
||||
private:
|
||||
ScopedPointer <MainWindow> theMainWindow;
|
||||
OwnedArray <MainWindow> mainWindows;
|
||||
ScopedPointer<MainMenuModel> menuModel;
|
||||
|
||||
MainWindow* createNewMainWindow (bool makeVisible)
|
||||
{
|
||||
MainWindow* mw = new MainWindow();
|
||||
|
||||
for (int i = mainWindows.size(); --i >= 0;)
|
||||
if (mw->getBounds() == mainWindows.getUnchecked(i)->getBounds())
|
||||
mw->setBounds (mw->getBounds().translated (20, 20));
|
||||
|
||||
mainWindows.add (mw);
|
||||
|
||||
if (makeVisible)
|
||||
mw->setVisible (true);
|
||||
|
||||
mw->restoreWindowPosition();
|
||||
return mw;
|
||||
}
|
||||
|
||||
MainWindow* getOrCreateFrontmostWindow (bool makeVisible)
|
||||
{
|
||||
if (mainWindows.size() == 0)
|
||||
return createNewMainWindow (makeVisible);
|
||||
|
||||
for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;)
|
||||
{
|
||||
MainWindow* mw = dynamic_cast <MainWindow*> (Desktop::getInstance().getComponent (i));
|
||||
if (mainWindows.contains (mw))
|
||||
return mw;
|
||||
}
|
||||
|
||||
return mainWindows.getLast();
|
||||
}
|
||||
|
||||
MainWindow* getOrCreateEmptyWindow (bool makeVisible)
|
||||
{
|
||||
if (mainWindows.size() == 0)
|
||||
return createNewMainWindow (makeVisible);
|
||||
|
||||
for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;)
|
||||
{
|
||||
MainWindow* mw = dynamic_cast <MainWindow*> (Desktop::getInstance().getComponent (i));
|
||||
if (mainWindows.contains (mw) && mw->getProject() == 0)
|
||||
return mw;
|
||||
}
|
||||
|
||||
return createNewMainWindow (makeVisible);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ namespace CommandIDs
|
|||
static const int undo = 0x200090;
|
||||
static const int redo = 0x2000a0;
|
||||
|
||||
static const int closeWindow = 0x201001;
|
||||
static const int closeAllDocuments = 0x201000;
|
||||
|
||||
static const int test = 0x202090;
|
||||
|
|
@ -54,6 +55,13 @@ namespace CommandIDs
|
|||
static const int showOrHideMarkers = 0x2030b2;
|
||||
static const int toggleSnapping = 0x2030b3;
|
||||
|
||||
static const int makeLineSegment = 0x2030c0;
|
||||
static const int makeCubicSegment = 0x2030c1;
|
||||
static const int breakSegment = 0x2030c2;
|
||||
static const int pointModeCorner = 0x2030c3;
|
||||
static const int pointModeRounded = 0x2030c4;
|
||||
static const int pointModeSymmetric = 0x2030c5;
|
||||
|
||||
static const int group = 0x202170;
|
||||
static const int ungroup = 0x202180;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,11 +24,14 @@
|
|||
*/
|
||||
|
||||
#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 = 0;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
MainWindow::MainWindow()
|
||||
|
|
@ -39,22 +42,15 @@ MainWindow::MainWindow()
|
|||
setUsingNativeTitleBar (true);
|
||||
setContentComponent (new ProjectContentComponent());
|
||||
|
||||
setApplicationCommandManagerToWatch (commandManager);
|
||||
|
||||
#if JUCE_MAC
|
||||
setMacMainMenu (this);
|
||||
#else
|
||||
setMenuBar (this);
|
||||
#if ! JUCE_MAC
|
||||
JucerApplication* app = static_cast<JucerApplication*> (JUCEApplication::getInstance());
|
||||
setMenuBar (app);
|
||||
#endif
|
||||
|
||||
setResizable (true, false);
|
||||
|
||||
centreWithSize (700, 600);
|
||||
|
||||
// restore the last size and position from our settings file..
|
||||
restoreWindowStateFromString (StoredSettings::getInstance()->getProps()
|
||||
.getValue ("lastMainWindowPos"));
|
||||
|
||||
// Register all the app commands..
|
||||
{
|
||||
commandManager->registerAllCommandsForTarget (this);
|
||||
|
|
@ -80,15 +76,12 @@ MainWindow::MainWindow()
|
|||
setWantsKeyboardFocus (false);
|
||||
|
||||
//getPeer()->setCurrentRenderingEngine (0);
|
||||
|
||||
setVisible (true);
|
||||
getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
setMacMainMenu (0);
|
||||
#else
|
||||
#if ! JUCE_MAC
|
||||
setMenuBar (0);
|
||||
#endif
|
||||
|
||||
|
|
@ -109,7 +102,11 @@ ProjectContentComponent* MainWindow::getProjectContentComponent() const
|
|||
|
||||
void MainWindow::closeButtonPressed()
|
||||
{
|
||||
JUCEApplication::getInstance()->systemRequestedQuit();
|
||||
if (! closeCurrentProject())
|
||||
return;
|
||||
|
||||
JucerApplication* jucer = static_cast<JucerApplication*> (JUCEApplication::getInstance());
|
||||
jucer->closeWindow (this);
|
||||
}
|
||||
|
||||
bool MainWindow::closeProject (Project* project)
|
||||
|
|
@ -119,6 +116,9 @@ bool MainWindow::closeProject (Project* project)
|
|||
if (project == 0)
|
||||
return true;
|
||||
|
||||
StoredSettings::getInstance()->getProps()
|
||||
.setValue (getProjectWindowPosName(), getWindowStateAsString());
|
||||
|
||||
if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true))
|
||||
return false;
|
||||
|
||||
|
|
@ -138,41 +138,29 @@ bool MainWindow::closeCurrentProject()
|
|||
return currentProject == 0 || closeProject (currentProject);
|
||||
}
|
||||
|
||||
bool MainWindow::closeAllDocuments (bool askUserToSave)
|
||||
{
|
||||
for (int i = OpenDocumentManager::getInstance()->getNumOpenDocuments(); --i >= 0;)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (i);
|
||||
getProjectContentComponent()->hideDocument (doc);
|
||||
|
||||
if (! OpenDocumentManager::getInstance()->closeDocument (i, askUserToSave))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MainWindow::setProject (Project* newProject)
|
||||
{
|
||||
if (newProject != 0)
|
||||
StoredSettings::getInstance()->setLastProject (newProject->getFile());
|
||||
|
||||
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 != 0)
|
||||
static_cast<JucerApplication*> (JUCEApplication::getInstance())->updateRecentProjectList();
|
||||
}
|
||||
|
||||
void MainWindow::reloadLastProject()
|
||||
void MainWindow::restoreWindowPosition()
|
||||
{
|
||||
openFile (StoredSettings::getInstance()->getLastProject());
|
||||
}
|
||||
String windowState;
|
||||
|
||||
void MainWindow::askUserToOpenFile()
|
||||
{
|
||||
FileChooser fc ("Open File");
|
||||
if (currentProject != 0)
|
||||
windowState = StoredSettings::getInstance()->getProps().getValue (getProjectWindowPosName());
|
||||
|
||||
if (fc.browseForFileToOpen())
|
||||
openFile (fc.getResult());
|
||||
if (windowState.isEmpty())
|
||||
windowState = StoredSettings::getInstance()->getProps().getValue ("lastMainWindowPos");
|
||||
|
||||
restoreWindowStateFromString (windowState);
|
||||
}
|
||||
|
||||
bool MainWindow::canOpenFile (const File& file) const
|
||||
|
|
@ -205,14 +193,6 @@ bool MainWindow::openFile (const File& file)
|
|||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::createNewProject()
|
||||
{
|
||||
ScopedPointer <Project> newProj (NewProjectWizard::runNewProjectWizard (this));
|
||||
|
||||
if (newProj != 0 && closeCurrentProject())
|
||||
setProject (newProj.release());
|
||||
}
|
||||
|
||||
bool MainWindow::isInterestedInFileDrag (const StringArray& filenames)
|
||||
{
|
||||
for (int i = filenames.size(); --i >= 0;)
|
||||
|
|
@ -252,140 +232,6 @@ void MainWindow::updateTitle (const String& documentName)
|
|||
setName (name);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const StringArray MainWindow::getMenuBarNames()
|
||||
{
|
||||
const char* const names[] = { "File", "Edit", "View", "Window", 0 };
|
||||
return StringArray ((const char**) names);
|
||||
}
|
||||
|
||||
const PopupMenu MainWindow::getMenuForIndex (int topLevelMenuIndex,
|
||||
const String& menuName)
|
||||
{
|
||||
PopupMenu menu;
|
||||
|
||||
if (topLevelMenuIndex == 0)
|
||||
{
|
||||
// "File" menu
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::newProject);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::open);
|
||||
|
||||
PopupMenu recentFiles;
|
||||
StoredSettings::getInstance()->recentFiles.createPopupMenuItems (recentFiles, 100, true, true);
|
||||
menu.addSubMenu ("Open recent file", recentFiles);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeDocument);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveDocument);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveDocumentAs);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeProject);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveProject);
|
||||
menu.addCommandItem (commandManager, CommandIDs::saveProjectAs);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::openProjectInIDE);
|
||||
|
||||
#if ! JUCE_MAC
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit);
|
||||
#endif
|
||||
}
|
||||
else if (topLevelMenuIndex == 1)
|
||||
{
|
||||
// "Edit" menu
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::undo);
|
||||
menu.addCommandItem (commandManager, CommandIDs::redo);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::cut);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::copy);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::paste);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::del);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::selectAll);
|
||||
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::deselectAll);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::toFront);
|
||||
menu.addCommandItem (commandManager, CommandIDs::toBack);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::group);
|
||||
menu.addCommandItem (commandManager, CommandIDs::ungroup);
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::bringBackLostItems);
|
||||
}
|
||||
else if (topLevelMenuIndex == 2)
|
||||
{
|
||||
// "View" menu
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::showProjectSettings);
|
||||
menu.addSeparator();
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::test);
|
||||
menu.addSeparator();
|
||||
|
||||
menu.addCommandItem (commandManager, CommandIDs::showGrid);
|
||||
menu.addCommandItem (commandManager, CommandIDs::enableSnapToGrid);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomIn);
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomOut);
|
||||
menu.addCommandItem (commandManager, CommandIDs::zoomNormal);
|
||||
|
||||
/* menu.addSeparator();
|
||||
PopupMenu overlays;
|
||||
overlays.addCommandItem (commandManager, CommandIDs::compOverlay0);
|
||||
overlays.addCommandItem (commandManager, CommandIDs::compOverlay33);
|
||||
overlays.addCommandItem (commandManager, CommandIDs::compOverlay66);
|
||||
overlays.addCommandItem (commandManager, CommandIDs::compOverlay100);
|
||||
menu.addSubMenu ("Component Overlay", overlays,
|
||||
getActiveDocument() != 0 && getActiveDocument()->getComponentLayout() != 0);*/
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::useTabbedWindows);
|
||||
//menu.addSeparator();
|
||||
//menu.addCommandItem (commandManager, CommandIDs::showPrefs);
|
||||
}
|
||||
else if (topLevelMenuIndex == 3)
|
||||
{
|
||||
// "Window" menu
|
||||
|
||||
const int numDocs = jmin (50, OpenDocumentManager::getInstance()->getNumOpenDocuments());
|
||||
|
||||
for (int i = 0; i < numDocs; ++i)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument(i);
|
||||
|
||||
menu.addItem (300 + i, doc->getName());
|
||||
}
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addCommandItem (commandManager, CommandIDs::closeAllDocuments);
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
void MainWindow::menuItemSelected (int menuItemID,
|
||||
int topLevelMenuIndex)
|
||||
{
|
||||
if (menuItemID >= 100 && menuItemID < 200)
|
||||
{
|
||||
// open a file from the "recent files" menu
|
||||
const File file (StoredSettings::getInstance()->recentFiles.getFile (menuItemID - 100));
|
||||
|
||||
openFile (file);
|
||||
}
|
||||
else if (menuItemID == 201)
|
||||
{
|
||||
LookAndFeel::setDefaultLookAndFeel (0);
|
||||
}
|
||||
else if (menuItemID >= 300 && menuItemID < 400)
|
||||
{
|
||||
OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (menuItemID - 300);
|
||||
getProjectContentComponent()->showDocument (doc);
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
ApplicationCommandTarget* MainWindow::getNextCommandTarget()
|
||||
|
|
@ -395,11 +241,7 @@ ApplicationCommandTarget* MainWindow::getNextCommandTarget()
|
|||
|
||||
void MainWindow::getAllCommands (Array <CommandID>& commands)
|
||||
{
|
||||
const CommandID ids[] = { CommandIDs::newProject,
|
||||
CommandIDs::open,
|
||||
CommandIDs::showPrefs,
|
||||
CommandIDs::closeAllDocuments,
|
||||
CommandIDs::saveAll };
|
||||
const CommandID ids[] = { CommandIDs::closeWindow };
|
||||
|
||||
commands.addArray (ids, numElementsInArray (ids));
|
||||
}
|
||||
|
|
@ -408,39 +250,9 @@ void MainWindow::getCommandInfo (const CommandID commandID, ApplicationCommandIn
|
|||
{
|
||||
switch (commandID)
|
||||
{
|
||||
case CommandIDs::newProject:
|
||||
result.setInfo ("New Project...",
|
||||
"Creates a new Jucer project",
|
||||
CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::open:
|
||||
result.setInfo ("Open...",
|
||||
"Opens a Jucer project",
|
||||
CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress ('o', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::showPrefs:
|
||||
result.setInfo ("Preferences...",
|
||||
"Shows the preferences panel.",
|
||||
CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress (',', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
case CommandIDs::closeAllDocuments:
|
||||
result.setInfo ("Close All Documents",
|
||||
"Closes all open documents",
|
||||
CommandCategories::general, 0);
|
||||
result.setActive (OpenDocumentManager::getInstance()->getNumOpenDocuments() > 0);
|
||||
break;
|
||||
|
||||
case CommandIDs::saveAll:
|
||||
result.setInfo ("Save All",
|
||||
"Saves all open documents",
|
||||
CommandCategories::general, 0);
|
||||
result.setActive (OpenDocumentManager::getInstance()->anyFilesNeedSaving());
|
||||
case CommandIDs::closeWindow:
|
||||
result.setInfo ("Close Window", "Closes the current window", CommandCategories::general, 0);
|
||||
result.defaultKeypresses.add (KeyPress ('w', ModifierKeys::commandModifier, 0));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -452,28 +264,12 @@ bool MainWindow::perform (const InvocationInfo& info)
|
|||
{
|
||||
switch (info.commandID)
|
||||
{
|
||||
case CommandIDs::newProject:
|
||||
createNewProject();
|
||||
break;
|
||||
case CommandIDs::closeWindow:
|
||||
closeButtonPressed();
|
||||
break;
|
||||
|
||||
case CommandIDs::open:
|
||||
askUserToOpenFile();
|
||||
break;
|
||||
|
||||
case CommandIDs::showPrefs:
|
||||
// PrefsPanel::show();
|
||||
break;
|
||||
|
||||
case CommandIDs::saveAll:
|
||||
OpenDocumentManager::getInstance()->saveAll();
|
||||
break;
|
||||
|
||||
case CommandIDs::closeAllDocuments:
|
||||
closeAllDocuments (true);
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
The big top-level window where everything happens.
|
||||
*/
|
||||
class MainWindow : public DocumentWindow,
|
||||
public MenuBarModel,
|
||||
public ApplicationCommandTarget,
|
||||
public FileDragAndDropTarget,
|
||||
public DragAndDropContainer
|
||||
|
|
@ -48,16 +47,14 @@ public:
|
|||
void closeButtonPressed();
|
||||
|
||||
//==============================================================================
|
||||
void askUserToOpenFile();
|
||||
bool canOpenFile (const File& file) const;
|
||||
bool openFile (const File& file);
|
||||
void createNewProject();
|
||||
void setProject (Project* newProject);
|
||||
void reloadLastProject();
|
||||
Project* getProject() const { return currentProject; }
|
||||
|
||||
void restoreWindowPosition();
|
||||
bool closeProject (Project* project);
|
||||
bool closeCurrentProject();
|
||||
bool closeAllDocuments (bool askUserToSave);
|
||||
|
||||
bool isInterestedInFileDrag (const StringArray& files);
|
||||
void filesDropped (const StringArray& filenames, int mouseX, int mouseY);
|
||||
|
|
@ -66,10 +63,7 @@ public:
|
|||
|
||||
void updateTitle (const String& documentName);
|
||||
|
||||
//==============================================================================
|
||||
const StringArray getMenuBarNames();
|
||||
const PopupMenu getMenuForIndex (int topLevelMenuIndex, const String& menuName);
|
||||
void menuItemSelected (int menuItemID, int topLevelMenuIndex);
|
||||
ProjectContentComponent* getProjectContentComponent() const;
|
||||
|
||||
//==============================================================================
|
||||
ApplicationCommandTarget* getNextCommandTarget();
|
||||
|
|
@ -83,7 +77,14 @@ public:
|
|||
private:
|
||||
ScopedPointer <Project> currentProject;
|
||||
|
||||
ProjectContentComponent* getProjectContentComponent() const;
|
||||
const String getProjectWindowPosName() const
|
||||
{
|
||||
jassert (currentProject != 0);
|
||||
if (currentProject == 0)
|
||||
return String::empty;
|
||||
|
||||
return "projectWindowPos_" + currentProject->getProjectUID();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -281,8 +281,12 @@ bool ProjectContentComponent::perform (const InvocationInfo& info)
|
|||
break;
|
||||
|
||||
case CommandIDs::closeProject:
|
||||
if (((MainWindow*) getParentComponent())->closeCurrentProject())
|
||||
StoredSettings::getInstance()->setLastProject (File::nonexistent);
|
||||
{
|
||||
MainWindow* mw = Component::findParentComponentOfClass ((MainWindow*) 0);
|
||||
|
||||
if (mw != 0)
|
||||
mw->closeCurrentProject();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -102,14 +102,25 @@ void StoredSettings::flush()
|
|||
}
|
||||
}
|
||||
|
||||
const File StoredSettings::getLastProject() const
|
||||
const Array<File> StoredSettings::getLastProjects() const
|
||||
{
|
||||
return props->getValue ("lastProject");
|
||||
StringArray s;
|
||||
s.addTokens (props->getValue ("lastProjects"), "|", "");
|
||||
|
||||
Array<File> f;
|
||||
for (int i = 0; i < s.size(); ++i)
|
||||
f.add (File (s[i]));
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
void StoredSettings::setLastProject (const File& file)
|
||||
void StoredSettings::setLastProjects (const Array<File>& files)
|
||||
{
|
||||
props->setValue ("lastProject", file.getFullPathName());
|
||||
StringArray s;
|
||||
for (int i = 0; i < files.size(); ++i)
|
||||
s.add (files.getReference(i).getFullPathName());
|
||||
|
||||
props->setValue ("lastProjects", s.joinIntoString ("|"));
|
||||
}
|
||||
|
||||
const File StoredSettings::getLastKnownJuceFolder() const
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ public:
|
|||
//==============================================================================
|
||||
RecentlyOpenedFilesList recentFiles;
|
||||
|
||||
const File getLastProject() const;
|
||||
void setLastProject (const File& file);
|
||||
const Array<File> getLastProjects() const;
|
||||
void setLastProjects (const Array<File>& files);
|
||||
|
||||
const File getLastKnownJuceFolder() const;
|
||||
void setLastKnownJuceFolder (const File& file);
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@
|
|||
*/
|
||||
#define JUCE_MAJOR_VERSION 1
|
||||
#define JUCE_MINOR_VERSION 52
|
||||
#define JUCE_BUILDNUMBER 28
|
||||
#define JUCE_BUILDNUMBER 29
|
||||
|
||||
/** Current Juce version number.
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
#define JUCE_MAJOR_VERSION 1
|
||||
#define JUCE_MINOR_VERSION 52
|
||||
#define JUCE_BUILDNUMBER 28
|
||||
#define JUCE_BUILDNUMBER 29
|
||||
|
||||
/** Current Juce version number.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue