| @@ -28,8 +28,7 @@ | |||||
| #include "../jucer_Headers.h" | #include "../jucer_Headers.h" | ||||
| #include "jucer_MainWindow.h" | #include "jucer_MainWindow.h" | ||||
| ApplicationCommandManager* commandManager = 0; | |||||
| #include "../Project/jucer_NewProjectWizard.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -57,22 +56,41 @@ public: | |||||
| commandManager = new ApplicationCommandManager(); | commandManager = new ApplicationCommandManager(); | ||||
| commandManager->registerAllCommandsForTarget (this); | commandManager->registerAllCommandsForTarget (this); | ||||
| theMainWindow = new MainWindow(); | |||||
| menuModel = new MainMenuModel(); | |||||
| MainWindow* main = createNewMainWindow (false); | |||||
| doExtraInitialisation(); | doExtraInitialisation(); | ||||
| ImageCache::setCacheTimeout (30 * 1000); | ImageCache::setCacheTimeout (30 * 1000); | ||||
| if (commandLine.trim().isNotEmpty() && ! commandLine.trim().startsWithChar ('-')) | if (commandLine.trim().isNotEmpty() && ! commandLine.trim().startsWithChar ('-')) | ||||
| { | |||||
| anotherInstanceStarted (commandLine); | anotherInstanceStarted (commandLine); | ||||
| } | |||||
| else | |||||
| { | |||||
| Array<File> projects (StoredSettings::getInstance()->getLastProjects()); | |||||
| theMainWindow->reloadLastProject(); | |||||
| for (int i = 0; i < projects.size(); ++ i) | |||||
| openFile (projects.getReference(i)); | |||||
| } | |||||
| #if JUCE_MAC | |||||
| MenuBarModel::setMacMainMenu (menuModel); | |||||
| #endif | |||||
| theMainWindow->getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack); | |||||
| main->setVisible (true); | |||||
| } | } | ||||
| void shutdown() | void shutdown() | ||||
| { | { | ||||
| theMainWindow = 0; | |||||
| #if JUCE_MAC | |||||
| MenuBarModel::setMacMainMenu (0); | |||||
| #endif | |||||
| menuModel = 0; | |||||
| StoredSettings::deleteInstance(); | |||||
| mainWindows.clear(); | |||||
| OpenDocumentManager::deleteInstance(); | OpenDocumentManager::deleteInstance(); | ||||
| deleteAndZero (commandManager); | deleteAndZero (commandManager); | ||||
| @@ -81,13 +99,28 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| void systemRequestedQuit() | 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) | void anotherInstanceStarted (const String& commandLine) | ||||
| { | { | ||||
| if (theMainWindow != 0) | |||||
| theMainWindow->openFile (commandLine.unquoted()); | |||||
| openFile (commandLine.unquoted()); | |||||
| } | } | ||||
| virtual void doExtraInitialisation() {} | 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: | 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 undo = 0x200090; | ||||
| static const int redo = 0x2000a0; | static const int redo = 0x2000a0; | ||||
| static const int closeWindow = 0x201001; | |||||
| static const int closeAllDocuments = 0x201000; | static const int closeAllDocuments = 0x201000; | ||||
| static const int test = 0x202090; | static const int test = 0x202090; | ||||
| @@ -54,6 +55,13 @@ namespace CommandIDs | |||||
| static const int showOrHideMarkers = 0x2030b2; | static const int showOrHideMarkers = 0x2030b2; | ||||
| static const int toggleSnapping = 0x2030b3; | 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 group = 0x202170; | ||||
| static const int ungroup = 0x202180; | static const int ungroup = 0x202180; | ||||
| @@ -24,11 +24,14 @@ | |||||
| */ | */ | ||||
| #include "../jucer_Headers.h" | #include "../jucer_Headers.h" | ||||
| #include "jucer_Application.h" | |||||
| #include "jucer_MainWindow.h" | #include "jucer_MainWindow.h" | ||||
| #include "jucer_OpenDocumentManager.h" | #include "jucer_OpenDocumentManager.h" | ||||
| #include "../Code Editor/jucer_SourceCodeEditor.h" | #include "../Code Editor/jucer_SourceCodeEditor.h" | ||||
| #include "../Project/jucer_NewProjectWizard.h" | #include "../Project/jucer_NewProjectWizard.h" | ||||
| ApplicationCommandManager* commandManager = 0; | |||||
| //============================================================================== | //============================================================================== | ||||
| MainWindow::MainWindow() | MainWindow::MainWindow() | ||||
| @@ -39,22 +42,15 @@ MainWindow::MainWindow() | |||||
| setUsingNativeTitleBar (true); | setUsingNativeTitleBar (true); | ||||
| setContentComponent (new ProjectContentComponent()); | 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 | #endif | ||||
| setResizable (true, false); | setResizable (true, false); | ||||
| centreWithSize (700, 600); | centreWithSize (700, 600); | ||||
| // restore the last size and position from our settings file.. | |||||
| restoreWindowStateFromString (StoredSettings::getInstance()->getProps() | |||||
| .getValue ("lastMainWindowPos")); | |||||
| // Register all the app commands.. | // Register all the app commands.. | ||||
| { | { | ||||
| commandManager->registerAllCommandsForTarget (this); | commandManager->registerAllCommandsForTarget (this); | ||||
| @@ -80,15 +76,12 @@ MainWindow::MainWindow() | |||||
| setWantsKeyboardFocus (false); | setWantsKeyboardFocus (false); | ||||
| //getPeer()->setCurrentRenderingEngine (0); | //getPeer()->setCurrentRenderingEngine (0); | ||||
| setVisible (true); | |||||
| getLookAndFeel().setColour (ColourSelector::backgroundColourId, Colours::transparentBlack); | |||||
| } | } | ||||
| MainWindow::~MainWindow() | MainWindow::~MainWindow() | ||||
| { | { | ||||
| #if JUCE_MAC | |||||
| setMacMainMenu (0); | |||||
| #else | |||||
| #if ! JUCE_MAC | |||||
| setMenuBar (0); | setMenuBar (0); | ||||
| #endif | #endif | ||||
| @@ -109,7 +102,11 @@ ProjectContentComponent* MainWindow::getProjectContentComponent() const | |||||
| void MainWindow::closeButtonPressed() | void MainWindow::closeButtonPressed() | ||||
| { | { | ||||
| JUCEApplication::getInstance()->systemRequestedQuit(); | |||||
| if (! closeCurrentProject()) | |||||
| return; | |||||
| JucerApplication* jucer = static_cast<JucerApplication*> (JUCEApplication::getInstance()); | |||||
| jucer->closeWindow (this); | |||||
| } | } | ||||
| bool MainWindow::closeProject (Project* project) | bool MainWindow::closeProject (Project* project) | ||||
| @@ -119,6 +116,9 @@ bool MainWindow::closeProject (Project* project) | |||||
| if (project == 0) | if (project == 0) | ||||
| return true; | return true; | ||||
| StoredSettings::getInstance()->getProps() | |||||
| .setValue (getProjectWindowPosName(), getWindowStateAsString()); | |||||
| if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) | if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) | ||||
| return false; | return false; | ||||
| @@ -138,41 +138,29 @@ bool MainWindow::closeCurrentProject() | |||||
| return currentProject == 0 || closeProject (currentProject); | 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) | void MainWindow::setProject (Project* newProject) | ||||
| { | { | ||||
| if (newProject != 0) | |||||
| StoredSettings::getInstance()->setLastProject (newProject->getFile()); | |||||
| getProjectContentComponent()->setProject (newProject); | getProjectContentComponent()->setProject (newProject); | ||||
| currentProject = newProject; | currentProject = newProject; | ||||
| commandManager->commandStatusChanged(); | commandManager->commandStatusChanged(); | ||||
| } | |||||
| void MainWindow::reloadLastProject() | |||||
| { | |||||
| openFile (StoredSettings::getInstance()->getLastProject()); | |||||
| // (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::askUserToOpenFile() | |||||
| void MainWindow::restoreWindowPosition() | |||||
| { | { | ||||
| FileChooser fc ("Open File"); | |||||
| String windowState; | |||||
| if (currentProject != 0) | |||||
| windowState = StoredSettings::getInstance()->getProps().getValue (getProjectWindowPosName()); | |||||
| if (windowState.isEmpty()) | |||||
| windowState = StoredSettings::getInstance()->getProps().getValue ("lastMainWindowPos"); | |||||
| if (fc.browseForFileToOpen()) | |||||
| openFile (fc.getResult()); | |||||
| restoreWindowStateFromString (windowState); | |||||
| } | } | ||||
| bool MainWindow::canOpenFile (const File& file) const | bool MainWindow::canOpenFile (const File& file) const | ||||
| @@ -205,14 +193,6 @@ bool MainWindow::openFile (const File& file) | |||||
| return false; | return false; | ||||
| } | } | ||||
| void MainWindow::createNewProject() | |||||
| { | |||||
| ScopedPointer <Project> newProj (NewProjectWizard::runNewProjectWizard (this)); | |||||
| if (newProj != 0 && closeCurrentProject()) | |||||
| setProject (newProj.release()); | |||||
| } | |||||
| bool MainWindow::isInterestedInFileDrag (const StringArray& filenames) | bool MainWindow::isInterestedInFileDrag (const StringArray& filenames) | ||||
| { | { | ||||
| for (int i = filenames.size(); --i >= 0;) | for (int i = filenames.size(); --i >= 0;) | ||||
| @@ -252,140 +232,6 @@ void MainWindow::updateTitle (const String& documentName) | |||||
| setName (name); | 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() | ApplicationCommandTarget* MainWindow::getNextCommandTarget() | ||||
| @@ -395,11 +241,7 @@ ApplicationCommandTarget* MainWindow::getNextCommandTarget() | |||||
| void MainWindow::getAllCommands (Array <CommandID>& commands) | 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)); | commands.addArray (ids, numElementsInArray (ids)); | ||||
| } | } | ||||
| @@ -408,39 +250,9 @@ void MainWindow::getCommandInfo (const CommandID commandID, ApplicationCommandIn | |||||
| { | { | ||||
| switch (commandID) | 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; | break; | ||||
| default: | default: | ||||
| @@ -452,28 +264,12 @@ bool MainWindow::perform (const InvocationInfo& info) | |||||
| { | { | ||||
| switch (info.commandID) | switch (info.commandID) | ||||
| { | { | ||||
| case CommandIDs::newProject: | |||||
| createNewProject(); | |||||
| 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; | |||||
| case CommandIDs::closeWindow: | |||||
| closeButtonPressed(); | |||||
| break; | |||||
| default: | |||||
| return false; | |||||
| default: | |||||
| return false; | |||||
| } | } | ||||
| return true; | return true; | ||||
| @@ -34,7 +34,6 @@ | |||||
| The big top-level window where everything happens. | The big top-level window where everything happens. | ||||
| */ | */ | ||||
| class MainWindow : public DocumentWindow, | class MainWindow : public DocumentWindow, | ||||
| public MenuBarModel, | |||||
| public ApplicationCommandTarget, | public ApplicationCommandTarget, | ||||
| public FileDragAndDropTarget, | public FileDragAndDropTarget, | ||||
| public DragAndDropContainer | public DragAndDropContainer | ||||
| @@ -48,16 +47,14 @@ public: | |||||
| void closeButtonPressed(); | void closeButtonPressed(); | ||||
| //============================================================================== | //============================================================================== | ||||
| void askUserToOpenFile(); | |||||
| bool canOpenFile (const File& file) const; | bool canOpenFile (const File& file) const; | ||||
| bool openFile (const File& file); | bool openFile (const File& file); | ||||
| void createNewProject(); | |||||
| void setProject (Project* newProject); | void setProject (Project* newProject); | ||||
| void reloadLastProject(); | |||||
| Project* getProject() const { return currentProject; } | |||||
| void restoreWindowPosition(); | |||||
| bool closeProject (Project* project); | bool closeProject (Project* project); | ||||
| bool closeCurrentProject(); | bool closeCurrentProject(); | ||||
| bool closeAllDocuments (bool askUserToSave); | |||||
| bool isInterestedInFileDrag (const StringArray& files); | bool isInterestedInFileDrag (const StringArray& files); | ||||
| void filesDropped (const StringArray& filenames, int mouseX, int mouseY); | void filesDropped (const StringArray& filenames, int mouseX, int mouseY); | ||||
| @@ -66,10 +63,7 @@ public: | |||||
| void updateTitle (const String& documentName); | 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(); | ApplicationCommandTarget* getNextCommandTarget(); | ||||
| @@ -83,7 +77,14 @@ public: | |||||
| private: | private: | ||||
| ScopedPointer <Project> currentProject; | 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; | break; | ||||
| case CommandIDs::closeProject: | case CommandIDs::closeProject: | ||||
| if (((MainWindow*) getParentComponent())->closeCurrentProject()) | |||||
| StoredSettings::getInstance()->setLastProject (File::nonexistent); | |||||
| { | |||||
| MainWindow* mw = Component::findParentComponentOfClass ((MainWindow*) 0); | |||||
| if (mw != 0) | |||||
| mw->closeCurrentProject(); | |||||
| } | |||||
| break; | 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 | const File StoredSettings::getLastKnownJuceFolder() const | ||||
| @@ -47,8 +47,8 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| RecentlyOpenedFilesList recentFiles; | 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; | const File getLastKnownJuceFolder() const; | ||||
| void setLastKnownJuceFolder (const File& file); | void setLastKnownJuceFolder (const File& file); | ||||
| @@ -64,7 +64,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 28 | |||||
| #define JUCE_BUILDNUMBER 29 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -33,7 +33,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 28 | |||||
| #define JUCE_BUILDNUMBER 29 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||