/* * This file is part of the OSMembrane project. * More informations under www.osmembrane.de * * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0. * for more details about the license see http://www.osmembrane.de/license/ * * Source: $HeadURL$ ($Revision$) * Last changed: $Date$ */ package de.osmembrane.controller; import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.Observable; import java.util.Observer; import javax.swing.Action; import de.osmembrane.controller.actions.AddConnectionAction; import de.osmembrane.controller.actions.AddFunctionAction; import de.osmembrane.controller.actions.ArrangePipelineAction; import de.osmembrane.controller.actions.ChangePipelineSettingsAction; import de.osmembrane.controller.actions.ChangeSettingsAction; import de.osmembrane.controller.actions.DeleteSelectionAction; import de.osmembrane.controller.actions.DuplicateFunctionAction; import de.osmembrane.controller.actions.EditBoundingBoxPropertyAction; import de.osmembrane.controller.actions.EditDirectoryPropertyAction; import de.osmembrane.controller.actions.EditFilePropertyAction; import de.osmembrane.controller.actions.EditListPropertyAction; import de.osmembrane.controller.actions.EditPropertyAction; import de.osmembrane.controller.actions.ExecutePipelineAction; import de.osmembrane.controller.actions.ExitAction; import de.osmembrane.controller.actions.ExportPipelineAction; import de.osmembrane.controller.actions.GeneratePipelineAction; import de.osmembrane.controller.actions.ImportPipelineAction; import de.osmembrane.controller.actions.LoadFunctionPresetAction; import de.osmembrane.controller.actions.LoadPipelineAction; import de.osmembrane.controller.actions.MoveFunctionAction; import de.osmembrane.controller.actions.NewPipelineAction; import de.osmembrane.controller.actions.PreviewPipelineAction; import de.osmembrane.controller.actions.RedoAction; import de.osmembrane.controller.actions.ResetViewAction; import de.osmembrane.controller.actions.SaveAsPipelineAction; import de.osmembrane.controller.actions.SaveFunctionPresetAction; import de.osmembrane.controller.actions.SavePipelineAction; import de.osmembrane.controller.actions.ShowAboutAction; import de.osmembrane.controller.actions.ShowHelpAction; import de.osmembrane.controller.actions.ShowQuickstartAction; import de.osmembrane.controller.actions.UndoAction; import de.osmembrane.controller.actions.ViewAllAction; import de.osmembrane.controller.actions.ZoomInAction; import de.osmembrane.controller.actions.ZoomOutAction; import de.osmembrane.model.ModelProxy; import de.osmembrane.model.persistence.FileType; import de.osmembrane.tools.I18N; import de.osmembrane.view.ViewRegistry; import de.osmembrane.view.interfaces.IView; /** * The action registry implements the Broker pattern to organize the * {@link Action}s. * * @author tobias_kuhn * */ public class ActionRegistry implements Observer { /** * implements the Singleton pattern */ private static ActionRegistry instance = new ActionRegistry(); /** * internal storage of the actions, indexed by class */ public Map<Class<? extends Action>, Action> actions = new HashMap<Class<? extends Action>, Action>(); /** * initializes the {@link ActionRegistry} with all the actions this * controller component has */ private ActionRegistry() { initialize(); ModelProxy.getInstance().getPipeline().addObserver(this); } /** * Initializes the {@link ActionRegistry} by adding all actions to it. */ private void initialize() { // pipeline actions register(new NewPipelineAction()); register(new SavePipelineAction()); register(new SaveAsPipelineAction()); register(new LoadPipelineAction()); register(new ExportPipelineAction()); register(new ImportPipelineAction()); register(new GeneratePipelineAction()); register(new ExecutePipelineAction()); register(new PreviewPipelineAction()); register(new ArrangePipelineAction()); register(new ChangePipelineSettingsAction()); // function actions register(new AddFunctionAction()); register(new MoveFunctionAction()); register(new DuplicateFunctionAction()); register(new DeleteSelectionAction()); // connection actions register(new AddConnectionAction()); // property actions register(new EditPropertyAction()); register(new EditListPropertyAction()); register(new EditFilePropertyAction()); register(new EditDirectoryPropertyAction()); register(new EditBoundingBoxPropertyAction()); // undo, redo actions register(new UndoAction()); register(new RedoAction()); // function presets register(new LoadFunctionPresetAction()); register(new SaveFunctionPresetAction()); // view actions register(new ResetViewAction()); register(new ViewAllAction()); register(new ZoomInAction()); register(new ZoomOutAction()); // other actions register(new ShowHelpAction()); register(new ShowQuickstartAction()); register(new ShowAboutAction()); register(new ChangeSettingsAction()); register(new ExitAction()); // set setEnabled() values update(null, null); } /** * * @return the one and only instance of {@link ActionRegistry} */ public static ActionRegistry getInstance() { return instance; } /** * Adds an {@link Action} to the registry * * @param action * Action to add */ public void register(Action action) { actions.put(action.getClass(), action); } /** * Returns an {@link Action} from the registry * * @param clazz * desired class to return * @return the registered object for that class */ public Action get(Class<? extends Action> clazz) { return actions.get(clazz); } /** * Reinitializes the {@link ActionRegistry} after a language change. */ public void reinitialize() { actions.clear(); System.gc(); initialize(); } @Override public void update(Observable o, Object arg) { // update all actions and their enabled state boolean pipelineFull = (ModelProxy.getInstance().getPipeline() .getFunctions().length > 0); boolean isSaved = ModelProxy.getInstance().getPipeline().isSaved(); get(UndoAction.class).setEnabled( ModelProxy.getInstance().getPipeline().undoAvailable()); get(RedoAction.class).setEnabled( ModelProxy.getInstance().getPipeline().redoAvailable()); get(SaveAsPipelineAction.class).setEnabled(pipelineFull); get(SavePipelineAction.class).setEnabled(!isSaved && pipelineFull); get(ArrangePipelineAction.class).setEnabled(pipelineFull); get(ExecutePipelineAction.class).setEnabled(pipelineFull); get(ExportPipelineAction.class).setEnabled(pipelineFull); get(PreviewPipelineAction.class).setEnabled(pipelineFull); get(GeneratePipelineAction.class).setEnabled(pipelineFull); URL url = ModelProxy.getInstance().getPipeline().getFilename(); String fileName; // if not call from initializer if (o != null) { if (url == null) { fileName = I18N.getInstance().getString( "Controller.UnsavedTitle"); } else { fileName = new File(url.getPath()).getName().replaceAll( "(?i)" + FileType.OSMEMBRANE.getExtension(), ""); } // prevent quick creation, if this is a backup loading call IView mainFrame = ViewRegistry.getInstance().getMainFrame(false); if (mainFrame != null) { mainFrame.setWindowTitle(fileName + (isSaved ? "" : "*")); } } } }