package com.yoursway.ide.application; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import com.yoursway.ide.application.view.impl.ApplicationCommands; import com.yoursway.ide.application.view.impl.CommandExecutor; import com.yoursway.ide.application.view.impl.MenuBuilder; import com.yoursway.ide.application.view.impl.ApplicationCommands.NopCommand; public class ApplicationMenu { private static final NopCommand NOP = new ApplicationCommands.NopCommand(); private final Menu menu; public ApplicationMenu(Display display, CommandExecutor target) { this(new Shell(display), target); } public ApplicationMenu(Shell shell, CommandExecutor target) { if (target == null) throw new NullPointerException("target is null"); MenuBuilder m = new MenuBuilder(shell, target); createFileMenu(m.submenu("File")); createEditMenu(m.submenu("Edit")); createHistoryMenu(m.submenu("History")); createAddMenu(m.submenu("Add")); createViewMenu(m.submenu("View")); createGoToMenu(m.submenu("Go To")); createRunMenu(m.submenu("Run")); createDebugMenu(m.submenu("Debug")); createWindowMenu(m.submenu("Window")); createHelpMenu(m.submenu("Help")); menu = m.getMenu(); } private void createHelpMenu(MenuBuilder m) { m.item("YourSway IDE Help", "M1+?", NOP); m.item("Using YS IDE from Terminal", NOP); m.separator(); MenuBuilder m1 = m.submenu("Ruby Resources"); m1.item("Ruby", NOP); m1.item("Ruby on Rails", NOP); MenuBuilder m2 = m.submenu("Python Resources"); m2.item("Python", NOP); m2.item("Django", NOP); m2.item("Google App Engine", NOP); MenuBuilder m3 = m.submenu("PHP Resources"); m3.item("PHP", NOP); m3.item("Cake PHP", NOP); m3.item("Comparison of PHP Web Frameworks", NOP); MenuBuilder m4 = m.submenu("Web Design Resources"); m4.item("HTML Reference", NOP); m4.item("CSS Reference", NOP); m4.item("Introduction to Grid Layouts", NOP); m4.item("Blueprint CSS Framework", NOP); m.separator(); m.item("Latest News on YourSway Web Site", NOP); m.item("Send Feedback�", NOP); } private void createWindowMenu(MenuBuilder m) { m.item("Minimize", "M1+M", NOP); m.item("Zoom", "M1+M4+Z", NOP); m.separator(); m.item("New Window Of �builder� On Another Screen", "M1+M4+ALT+N", NOP); m.item("Next Window Of �builder�", "M4+`", NOP); m.item("Previous Window Of �builder�", "M4+SHIFT+`", NOP); m.separator(); m.checkbox("Pin �app/views/admin/users/_details.rhtml�", "M1+K", NOP); m.separator(); m.item("Bring All to Front", NOP); } private void createDebugMenu(MenuBuilder m) { m.item("Show Debugger", "M1+M4+ALT+D", NOP); m.separator(); m.item("Step Into", "F5", NOP); m.item("Step Over", "F6", NOP); m.item("Step Out", "F7", NOP); m.separator(); m.item("Resume", "F8", NOP); m.item("Run To Line", "SHIFT+F5", NOP); m.item("Restart", "M1+SHIFT+F7", NOP); m.separator(); m.item("Toggle Breakpoint", "M1+SHIFT+B", NOP); m.separator(); m.item("Inspect Variable", "M1+J", NOP); } private void createRunMenu(MenuBuilder m) { m.item("Run �builder/server� in Mongrel", "M1+ALT+1", NOP); createRailsEnvironmentsMenu(m.submenu("Environment")); m.checkbox("Enable Debugging And Breakpoints", NOP).setSelection(true); m.separator(); m.item("Migrate �builder/server�'s Schema", NOP); createRakeTasksMenu(m.submenu("Other Rake Tasks")); m.separator(); m.item("Run �builder/client/main.py� in Python", "M1+ALT+2", NOP); createCommandLineArgumentsMenu(m.submenu("Set Command Line Arguments")); createWorkingDirectoryMenu(m.submenu("Set Working Directory"), "builder/client"); m.item("Change Environment Variables�", NOP); m.checkbox("Enable Debugging And Breakpoints", NOP).setSelection(true); m.separator(); m.item("Run �builder/pinger/main.py� in Python", "M1+ALT+3", NOP); createCommandLineArgumentsMenu(m.submenu("Set Command Line Arguments")); createWorkingDirectoryMenu(m.submenu("Set Working Directory"), "builder/pinger"); m.item("Change Environment Variables�", NOP); m.checkbox("Enable Debugging And Breakpoints", NOP).setSelection(true); m.separator(); createRubyVersionsMenu(m.submenu("Use Ruby Version")); createRailsVersionsMenu(m.submenu("Use Rails Version")); createPythonVersionsMenu(m.submenu("Use Python Version")); createRubyWebServersMenu(m.submenu("Run Ruby Web Applications In")); } private void createRubyWebServersMenu(MenuBuilder m) { m.radio("Mongrel", NOP).setSelection(true); m.radio("WEBrick", NOP); m.radio("Thin", NOP); m.radio("Phusion Passenger", NOP); } private void createPythonVersionsMenu(MenuBuilder m) { m.radio("Python 2.5", NOP).setSelection(true); m.radio("Python 2.4", NOP); } private void createRailsVersionsMenu(MenuBuilder m) { m.radio("Rails 2.2", NOP).setSelection(true); m.radio("Rails 2.1.2", NOP); m.radio("Rails 2.1.1", NOP); m.separator(); m.item("Install Edge Rails", NOP); } private void createRubyVersionsMenu(MenuBuilder m) { m.radio("Ruby 1.8.6 in /usr/bin", NOP).setSelection(true); m.radio("Ruby 1.8.5 in /usr/local/bin", NOP); m.radio("Ruby 1.9.0 in /opt/local/bin", NOP); m.radio("Ruby 1.7.3 in /sw/ruby/bin", NOP); } private void createWorkingDirectoryMenu(MenuBuilder m, String name) { m.radio("Script's Directory (" + name + ")", NOP).setSelection(true); m.separator(); m.item("Other�", NOP); } private void createCommandLineArgumentsMenu(MenuBuilder m) { m.radio("None", NOP); m.separator(); m.radio("-h builder.yoursway.com", NOP).setSelection(true); m.radio("-h localhost", NOP); m.separator(); m.item("Other�", NOP); } private void createRakeTasksMenu(MenuBuilder m) { m.item("db:schema:dump", NOP); m.item("db:schema:load", NOP); m.item("routes", NOP); } private void createRailsEnvironmentsMenu(MenuBuilder m) { m.item("development", NOP); m.item("production", NOP); m.item("test", NOP); } private void createGoToMenu(MenuBuilder m) { m.item("Go To Line�", "M1+L", NOP); m.separator(); m.item("Go To Declaration", "F3", NOP); m.item("Go To Super Implementation", "M4+S", NOP); m.item("Show All References to �foo�", "M1+R", NOP); m.separator(); m.item("Open �foo.rb� in Single File Editor", "M1+E", NOP); m.separator(); m.item("All Errors", "M1+ALT+M4+E", NOP); m.item("All Warnings", "M1+ALT+M4+W", NOP); m.item("All Test Failures", "M1+ALT+M4+F", NOP); m.separator(); m.item("Project Editor", "M1+ALT+M4+P", NOP); m.item("URL Routing Editor", "M1+ALT+M4+U", NOP); m.item("Log Viewer", "M1+ALT+M4+L", NOP); m.item("Type Hierarchy", "M1+ALT+M4+T", NOP); m.separator(); m.item("Older File In History", "ALT+`", NOP); m.item("Newer File In History", "ALT+SHIFT+`", NOP); } private void createViewMenu(MenuBuilder m) { m.checkbox("Soft Wrap Long Lines", "M1+ALT+W", NOP).setSelection(true); m.checkbox("Show Invisibles", "M1+ALT+I", NOP); m.separator(); m.item("Bird's Eye View � hold to activate", "F1", NOP); m.item("Collapsed View � hold to activate", "F4", NOP); m.separator(); m.item("Popup Type Hierarchy On Selected Item", "M1+T", NOP); m.separator(); m.item("Switch HTML Source <-> Editable Preview", "M1+SHIFT+U", NOP); m.checkbox("Show Both Source And Editable Preview", "M1+ALT+SHIFT+U", NOP).setSelection(true); m.separator(); m.radio("1 Full-Size Editor", "M1+SHIFT+1", NOP).setSelection(true); m.radio("2 Full-Size Editors Left To Right", "M1+SHIFT+2", NOP); m.radio("2 Full-Size Editors Top To Bottom", "M1+SHIFT+2 M1+SHIFT+2", NOP); m.radio("4 Full-Size Editors", "M1+SHIFT+4", NOP); m.separator(); m.radio("Other Editors Are Small", "M1+SHIFT+E", NOP) .setSelection(true); m.radio("Other Editors Are Tiny", "M1+SHIFT+E", NOP); } private void createAddMenu(MenuBuilder m) { m.item("New File", "M1+N", NOP); m.separator(); m.item("New Controller", "CTRL+ALT+SHIFT+C", NOP); m.item("New Action", "CTRL+ALT+SHIFT+A", NOP); m.item("New Model", "CTRL+ALT+SHIFT+M", NOP); m.item("New View", "CTRL+ALT+SHIFT+V", NOP); m.item("New Test", "CTRL+ALT+SHIFT+T", NOP); } private void createHistoryMenu(MenuBuilder m) { m.item("Undo", "M1+Z", NOP); m.item("Redo", "M1+SHIFT+Z", NOP); m.item("Show History", "M1+Y", NOP); m.separator(); m.item("Review && Commit Changes", "M1+SHIFT+C", NOP); m.separator(); createSwitchToBranchMenu(m.submenu("Switch to Branch")); createMergeChangesFromBranchMenu(m.submenu("Merge Changes from Branch")); m.separator(); createPullMenu(m.submenu("Pull && Review Changes from")); createPullMenu(m.submenu("Push To")); m.separator(); m.item("�git clone� as Project�", NOP); } private void createSwitchToBranchMenu(MenuBuilder m) { m.radio("master", NOP).setSelection(true); m.radio("ide-toolbar", NOP); m.radio("buttons-fix", NOP); m.separator(); m.item("Create new branch from �master��", "M1+ALT+B", NOP); } private void createMergeChangesFromBranchMenu(MenuBuilder m) { m.item("master", NOP); m.item("ide-toolbar", NOP); m.item("buttons-fix", NOP); } private void createPullMenu(MenuBuilder m) { m.item("origin", NOP); m.item("fourdman", NOP); m.item("leontiy", NOP); m.item("burchik", NOP); } void createFileMenu(final MenuBuilder m) { m.item("New", "M1+N", new ApplicationCommands.NewDocumentCommand()); m.item("Open�", NOP); createRecentFilesMenu(m.submenu("Open Recent")); m.item("Close", "M1+W", new ApplicationCommands.CloseDocumentCommand()); m.item("Close All", "M1+SHIFT+W", NOP); m.separator(); m.item("Rename/Move", "M1+SHIFT+R", NOP); m.item("Duplicate", "M1+SHIFT+D", NOP); m.separator(); m.item("Reveal �foo_controller.rb� in Finder", "M1+M4+R", NOP); m.separator(); createNewProjectMenu(m); m.separator(); m.item("Open Project...", "M1+M4+O", new ApplicationCommands.OpenProjectCommand()); createRecentProjectsMenu(m.submenu("Open Recent Project")); m.item("Close Project", "M1+M4+W", new ApplicationCommands.CloseProjectCommand()); m.separator(); m.item("Save All Changes To Disk", "M1+S", new ApplicationCommands.SaveFileAsCommand()); m.separator(); m.item("Page Setup�", "M1+SHIFT+P", NOP); m.item("Print�", "M1+P", NOP); } void createEditMenu(final MenuBuilder m) { m.item("Cut", "M1+X", NOP); m.item("Copy", "M1+C", NOP); m.item("Paste", "M1+V", NOP); m.item("Paste Previous", "M1+SHIFT+V", NOP); m.separator(); m.item("Delete Line", "M1+D", NOP); m.item("Edit Each Line In Selection", "M1+ALT+A", NOP); m.item("Comment/Uncomment Line", "M1+/", NOP); m.separator(); m.item("Move Line Up", "M1+M4+ARROW_UP", NOP); m.item("Move Line Down", "M1+M4+ARROW_DOWN", NOP); m.item("Duplicate Line Above", "M1+ALT+M4+ARROW_UP", NOP); m.item("Duplicate Line Below", "M1+ALT+M4+ARROW_DOWN", NOP); m.separator(); m.item("15 Lines Up / Previous Snippet", "M1+ARROW_UP", NOP); m.item("15 Lines Down / Next Snippet", "M1+ARROW_DOWN", NOP); m.separator(); m.item("Select Word", "M4+W", NOP); m.item("Select All", "M1+A", NOP); m.separator(); m.item("Indent", "M1+]", NOP); m.item("Dedent", "M1+[", NOP); m.item("Reindent Line", "M1+I", NOP); m.item("Reformat", "M1+SHIFT+F", NOP); m.checkbox("Reformat As You Type", "M1+SHIFT+ALT+F", NOP).setSelection( true); m.separator(); m.item("Complete Word", "TAB", NOP); m.separator(); m.item("Filter Through OS Command�", "M1+ALT+R", NOP); m.separator(); m.item("File/Text Search & Replace", "M1+F", NOP); createFindMenu(m.submenu("Find")); } private void createFindMenu(MenuBuilder m) { m.item("Find Next", "M1+G", NOP); m.item("Find Previous", "M1+SHIFT+G", NOP); m.item("Use Selection for Find", "M1+E", NOP); } private void createNewProjectMenu(final MenuBuilder m) { MenuBuilder submenu = m.submenu("New Project", "M1+SHIFT+N"); submenu.item("Rails Web Application", NOP); submenu.item("Rails Plugin", NOP); submenu.item("Ruby Application", NOP); submenu.separator(); submenu.item("Django Web Application", NOP); submenu.item("Pylons Web Application (???)", NOP); submenu.item("Google App Engine Application", NOP); submenu.item("Python Application", NOP); submenu.separator(); submenu.item("PHP Web Application", NOP); submenu.item("Cake PHP Web Application", NOP); submenu.separator(); submenu.item("HTML/CSS Web Site", NOP); } private void createRecentFilesMenu(final MenuBuilder m) { m.item("~/TODO.txt", NOP); m.separator(); m.item("Clear Menu", NOP); } private void createRecentProjectsMenu(final MenuBuilder m) { m.item("~/Projects/builder", NOP); m.item("~/Projects/site", NOP); m.separator(); m.item("Clear Menu", NOP); } public Menu getMenu() { return menu; } }