@@ -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. | ||||