diff --git a/src/antidote/org/apache/tools/ant/gui/Main.java b/src/antidote/org/apache/tools/ant/gui/Main.java index aedb960ae..a847dc887 100644 --- a/src/antidote/org/apache/tools/ant/gui/Main.java +++ b/src/antidote/org/apache/tools/ant/gui/Main.java @@ -81,11 +81,16 @@ public class Main { Antidote gui = new Antidote(context); f.setDefaultCloseOperation(3 /*JFrame.EXIT_ON_CLOSE*/); - f.setJMenuBar(context.getActions().createMenuBar()); + JMenuBar menu = context.getActions().createMenuBar(); + f.setJMenuBar(menu); f.getContentPane().add(BorderLayout.CENTER, gui); f.getContentPane().add(BorderLayout.NORTH, context.getActions().createToolBar()); + // Add the project selection menu. + ProjectSelectionMenu ps = new ProjectSelectionMenu(context); + ps.insertInto(menu); + ImageIcon icon = context.getResources().loadImageIcon("icon-small.gif"); if(icon != null) { diff --git a/src/antidote/org/apache/tools/ant/gui/command/LoadFileCmd.java b/src/antidote/org/apache/tools/ant/gui/command/LoadFileCmd.java index d199c534c..bf1289fde 100644 --- a/src/antidote/org/apache/tools/ant/gui/command/LoadFileCmd.java +++ b/src/antidote/org/apache/tools/ant/gui/command/LoadFileCmd.java @@ -54,7 +54,7 @@ package org.apache.tools.ant.gui.command; import org.apache.tools.ant.gui.core.AppContext; import org.apache.tools.ant.gui.event.ErrorEvent; -import org.apache.tools.ant.gui.event.ProjectSelectedEvent; +import org.apache.tools.ant.gui.event.NewProjectEvent; import org.apache.tools.ant.gui.acs.ACSProjectElement; import java.io.File; import java.io.IOException; @@ -104,7 +104,7 @@ public class LoadFileCmd extends AbstractCommand { ACSProjectElement project = getContext().getProjectManager().open(_file); getContext().getEventBus().postEvent( - new ProjectSelectedEvent(getContext(), project)); + new NewProjectEvent(getContext(), project)); } catch(Exception ex) { String message = getContext().getResources().getMessage( diff --git a/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java b/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java new file mode 100644 index 000000000..0bff54835 --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java @@ -0,0 +1,93 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.gui.command; +import org.apache.tools.ant.gui.core.AppContext; + +/** + * Command for creating a new project. + * + * @version $Revision$ + * @author Simeon Fitch + */ +public class NewProjectCmd extends AbstractCommand { + /** + * Standard ctor. + * + * @param context Application context. + */ + public NewProjectCmd(AppContext context) { + super(context); + } + + /** + * Display a dialog asking the user to select a file to open. + * If one is selected then an event is posted requesting the open + * operation be completed. + * + */ + public void run() { +/* + FileFilter filter = new XMLFileFilter(getContext().getResources()); + + JFileChooser chooser = new JFileChooser(); + chooser.addChoosableFileFilter(filter); + int val = chooser.showOpenDialog(getContext().getParentFrame()); + if(val == JFileChooser.APPROVE_OPTION) { + File selected = chooser.getSelectedFile(); + getContext().getEventBus().postEvent( + new OpenRequestEvent(getContext(), selected)); + } +*/ + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/core/ProjectSelectionMenu.java b/src/antidote/org/apache/tools/ant/gui/core/ProjectSelectionMenu.java new file mode 100644 index 000000000..4fe53c8ac --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/core/ProjectSelectionMenu.java @@ -0,0 +1,171 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.gui.core; + +import org.apache.tools.ant.gui.event.*; +import org.apache.tools.ant.gui.acs.ACSProjectElement; +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.*; +/** + * Specialization of JMenu providing selectability of the currently + * open projects. + * + * @version $Revision$ + * @author Simeon Fitch + */ +public class ProjectSelectionMenu extends JMenu { + /** Application context. */ + private AppContext _context = null; + /** Current set of menus. */ + private Map _menus = new HashMap(); + + + /** + * Standard ctor. + * + * @param context Application context. + */ + public ProjectSelectionMenu(AppContext context) { + super(context.getResources().getString( + ProjectSelectionMenu.class, "name"), true); + _context = context; + _context.getEventBus().addMember( + EventBus.MONITORING, new ProjectListener()); + setMnemonic(getText().charAt(0)); + } + + /** + * Replace or add the JMenu called "Projects" with this. + * + * @param menuBar Menu bar to insert into. + */ + public void insertInto(JMenuBar menuBar) { + // Iterate of the menu items looking for the one with the same name + // as ours. + int count = menuBar.getComponentCount(); + for(int i = 0; i < count; i++) { + JMenuItem menu = (JMenuItem) menuBar.getComponent(i); + if(menu.getText().equals(getText())) { + menuBar.remove(menu); + menuBar.add(this, i); + return; + } + } + + // Getting here we didn't find a menu with the same name. + add(this); + } + + + /** Listener for updating the contents of the menu. */ + private class ProjectListener implements BusMember { + /** Event filter. */ + private final Filter _filter = new Filter(); + /** Action handler. */ + private final ActionHandler _handler = new ActionHandler(); + /** + * Get the filter to that is used to determine if an event should + * to to the member. + * + * @return Filter to use. + */ + public BusFilter getBusFilter() { + return _filter; + } + + /** + * Called when an event is to be posed to the member. + * + * @param event Event to post. + * @return true if event should be propogated, false if + * it should be cancelled. + */ + public boolean eventPosted(EventObject event) { + // Clear out our existing members + removeAll(); + _menus.clear(); + + ACSProjectElement[] projects = + _context.getProjectManager().getOpen(); + for(int i = 0; i < projects.length; i++) { + JMenuItem menu = new JMenuItem(projects[i].getName()); + menu.addActionListener(_handler); + _menus.put(menu, projects[i]); + add(menu); + } + return true; + } + } + + /** Filter for project related events. */ + private static class Filter implements BusFilter { + public boolean accept(EventObject event) { + return event instanceof ProjectSelectedEvent || + event instanceof ProjectClosedEvent; + } + } + + /** Handler for selecting the project. */ + private class ActionHandler implements ActionListener { + public void actionPerformed(ActionEvent e) { + ACSProjectElement project = + (ACSProjectElement) _menus.get(e.getSource()); + _context.getEventBus().postEvent( + new ProjectSelectedEvent(_context, project)); + } + } + +} diff --git a/src/antidote/org/apache/tools/ant/gui/event/NewProjectEvent.java b/src/antidote/org/apache/tools/ant/gui/event/NewProjectEvent.java new file mode 100644 index 000000000..b5961a3c7 --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/event/NewProjectEvent.java @@ -0,0 +1,81 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.gui.event; +import org.apache.tools.ant.gui.core.AppContext; +import org.apache.tools.ant.gui.acs.ACSProjectElement; +import org.apache.tools.ant.gui.acs.ACSElement; + +/** + * Event providing notification that a new project has been + * created or opened and selected. NB: Still not convinced that + * subclassing ProjectSelectedEvent is the correct thing to + * do, but it saves some time right now. It basically + * assumes that any new project added to the project manager + * is then selected. + * + * @version $Revision$ + * @author Simeon Fitch + */ +public class NewProjectEvent extends ProjectSelectedEvent { + + /** + * Standard ctor. + * + * @param context application context. + */ + public NewProjectEvent( + AppContext context, ACSProjectElement project) { + super(context, project); + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/resources/action.properties b/src/antidote/org/apache/tools/ant/gui/resources/action.properties index 8ea583a30..414a71905 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/action.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/action.properties @@ -1,14 +1,20 @@ # Define the primary menubar items. -menus=File, Build, Help +menus=File, Build, Projects, Help # Declare the list of known actions. actions=\ open, save, saveas, close, exit, about, \ newTarget, newTask, newProperty \ - startBuild, stopBuild, \ - notifyEmacs + startBuild, stopBuild # Configure the decalred actions. +new.name=New Project... +new.shortDescription=Create a new project +new.parentMenuName=File +new.icon=new-project.gif +new.accelerator=control N +new.enabled=true +new.command=org.apache.tools.ant.gui.command.NewProjectCmd open.name=Open... open.shortDescription=Open an existing project @@ -30,6 +36,7 @@ save.disableOn= \ org.apache.tools.ant.gui.event.BuildStartedEvent save.enableOn= \ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent, \ org.apache.tools.ant.gui.event.BuildFinishedEvent saveas.name=Save As... @@ -42,6 +49,7 @@ saveas.disableOn= \ org.apache.tools.ant.gui.event.BuildStartedEvent saveas.enableOn= \ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent, \ org.apache.tools.ant.gui.event.BuildFinishedEvent close.name=Close @@ -54,6 +62,7 @@ close.disableOn= \ org.apache.tools.ant.gui.event.BuildStartedEvent close.enableOn= \ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent, \ org.apache.tools.ant.gui.event.BuildFinishedEvent exit.name=Exit @@ -80,6 +89,7 @@ startBuild.command=org.apache.tools.ant.gui.command.BuildCmd startBuild.enabled=false startBuild.enableOn=\ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent, \ org.apache.tools.ant.gui.event.BuildFinishedEvent startBuild.disableOn=\ org.apache.tools.ant.gui.event.BuildStartedEvent, \ @@ -102,7 +112,8 @@ newTarget.icon=new-target.gif newTarget.enabled=false newTarget.separator=true newTarget.enableOn=\ - org.apache.tools.ant.gui.event.ProjectSelectedEvent + org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent newTarget.disableOn=\ org.apache.tools.ant.gui.event.TargetSelectionEvent, \ org.apache.tools.ant.gui.event.TaskSelectionEvent, \ @@ -127,6 +138,7 @@ newProperty.icon=new-property.gif newProperty.enabled=false newProperty.enableOn=\ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ + org.apache.tools.ant.gui.event.NewProjectEvent, \ org.apache.tools.ant.gui.event.TargetSelectionEvent, \ org.apache.tools.ant.gui.event.TaskSelectionEvent newProperty.disableOn=\ diff --git a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties index d87461d12..61e84576c 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties @@ -32,12 +32,17 @@ org.apache.tools.ant.gui.modules.TargetMonitor.name=Selected Target(s) org.apache.tools.ant.gui.modules.TargetMonitor.defText=[none] org.apache.tools.ant.gui.modules.console.BuildConsole.name=Console -org.apache.tools.ant.gui.modules.console.BuildConsole.logLevel=Log message level: +org.apache.tools.ant.gui.modules.console.BuildConsole.logLevel=\ + Log message level: org.apache.tools.ant.gui.core.XMLFileFilter.description=XML Files -org.apache.tools.ant.gui.command.LoadFileCmd.noFile=The file "{0}" was not found. -org.apache.tools.ant.gui.command.LoadFileCmd.loadError=The file "{0}" could not be loaded. +org.apache.tools.ant.gui.core.ProjectSelectionMenu.name=Projects + +org.apache.tools.ant.gui.command.LoadFileCmd.noFile=\ + The file "{0}" was not found. +org.apache.tools.ant.gui.command.LoadFileCmd.loadError=\ + The file "{0}" could not be loaded. org.apache.tools.ant.gui.command.DisplayErrorCmd.title=Antidote Error... org.apache.tools.ant.gui.command.DisplayErrorCmd.expand=Details >>