/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.view.menu; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Arrays; import java.util.Enumeration; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.JMenu; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import org.openflexo.FlexoCst; import org.openflexo.GeneralPreferences; import org.openflexo.components.AskParametersDialog; import org.openflexo.components.NewProjectComponent; import org.openflexo.components.OpenProjectComponent; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.action.ImportProject; import org.openflexo.foundation.action.ValidateProject; import org.openflexo.foundation.imported.action.RefreshImportedProcessAction; import org.openflexo.foundation.imported.action.RefreshImportedRoleAction; import org.openflexo.foundation.imported.action.UploadPrjAction; import org.openflexo.foundation.param.CheckboxParameter; import org.openflexo.foundation.param.ParameterDefinition; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.SaveResourceExceptionList; import org.openflexo.foundation.utils.OperationCancelledException; import org.openflexo.foundation.utils.ProjectInitializerException; import org.openflexo.foundation.utils.ProjectLoadingCancelledException; import org.openflexo.foundation.validation.ValidationReport; import org.openflexo.icon.IconLibrary; import org.openflexo.localization.FlexoLocalization; import org.openflexo.module.ProjectLoader; import org.openflexo.print.PrintManagingController; import org.openflexo.toolbox.ToolBox; import org.openflexo.view.controller.FlexoController; import org.openflexo.view.controller.model.ControllerModel; import org.openflexo.ws.client.PPMWebService.PPMWebServiceClient; /** * 'File' menu * * @author sguerin */ public class FileMenu extends FlexoMenu { static final Logger logger = Logger.getLogger(FileMenu.class.getPackage().getName()); public JMenu recentProjectMenu; public JMenu exportMenu; public JMenu importMenu; protected FlexoController _controller; protected FileMenu(FlexoController controller) { this(controller, true); } protected FileMenu(FlexoController controller, boolean insertCommonItems) { super("file", controller); _controller = controller; if (insertCommonItems) { add(new NewProjectItem()); add(new OpenProjectItem()); add(recentProjectMenu = new JMenu()); recentProjectMenu.setText(FlexoLocalization.localizedForKey("recent_projects", recentProjectMenu)); add(new ImportProjectMenuItem()); add(new SaveProjectItem()); add(new SaveAllProjectItem()); add(new SaveAsProjectItem()); add(new SaveProjectForServerItem()); add(new SendProjectToFlexoServerItem()); // TODO: repair reload project. this includes to also support close project. // add(reloadProjectItem = new ReloadProjectItem()); addSeparator(); if (addImportItems()) { add(importMenu); } if (addExportItems()) { add(exportMenu); } if (importMenu != null || exportMenu != null) { addSeparator(); } } addSpecificItems(); if (insertCommonItems) { add(new InspectProjectItem()); if (controller instanceof PrintManagingController) { addSeparator(); addPrintItems(); add(new PageSetUpItem()); } addSeparator(); } add(new QuitItem()); updateRecentProjectMenu(); } public void updateRecentProjectMenu() { if (recentProjectMenu != null) { recentProjectMenu.removeAll(); Enumeration<File> en = GeneralPreferences.getLastOpenedProjects().elements(); while (en.hasMoreElements()) { File f = en.nextElement(); recentProjectMenu.add(new ProjectItem(f)); } } } public void addToExportItems(FlexoMenuItem exportItem) { if (exportMenu == null) { exportMenu = new JMenu(); exportMenu.setText(FlexoLocalization.localizedForKey("export", exportMenu)); } exportMenu.add(exportItem); } public void addToImportItems(FlexoMenuItem importItem) { if (importMenu == null) { importMenu = new JMenu(); importMenu.setText(FlexoLocalization.localizedForKey("import", importMenu)); } importMenu.add(importItem); } protected boolean addExportItems() { return false; } protected boolean addImportItems() { return false; } public void addSpecificItems() { // No specific item here, please override this method when required } public void addPrintItems() { // No specific item here, please override this method when required } public void quit() { try { getModuleLoader().quit(true); } catch (OperationCancelledException e) { // User pressed cancel. if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "Cancelled saving", e); } } } public class NewProjectItem extends FlexoMenuItem { public NewProjectItem() { super(new NewProjectAction(), "new_project", KeyStroke.getKeyStroke(KeyEvent.VK_N, FlexoCst.META_MASK), getController(), true); setIcon(IconLibrary.NEW_ICON); } } public class NewProjectAction extends AbstractAction { public NewProjectAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { File projectDirectory = NewProjectComponent.getProjectDirectory(); if (projectDirectory != null) { getController().getProjectLoader().newProject(projectDirectory); } } } public class OpenProjectItem extends FlexoMenuItem { public OpenProjectItem() { super(new OpenProjectAction(), "open_project", KeyStroke.getKeyStroke(KeyEvent.VK_O, FlexoCst.META_MASK), getController(), true); setIcon(IconLibrary.OPEN_ICON); } } public class OpenProjectAction extends AbstractAction { public OpenProjectAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { File projectDirectory = OpenProjectComponent.getProjectDirectory(); if (projectDirectory != null) { try { getProjectLoader().loadProject(projectDirectory); } catch (ProjectLoadingCancelledException e) { } catch (ProjectInitializerException e) { e.printStackTrace(); FlexoController.notify(FlexoLocalization.localizedForKey("could_not_open_project_located_at") + projectDirectory.getAbsolutePath()); } } } } public class ProjectItem extends FlexoMenuItem { /** * */ public ProjectItem(File project) { super(new RecentProjectAction(project), project.getName(), null, getController(), false); } } public class RecentProjectAction extends AbstractAction { private File projectDirectory; public RecentProjectAction(File projectDirectory) { super(); this.projectDirectory = projectDirectory; } @Override public void actionPerformed(ActionEvent arg0) { try { getProjectLoader().loadProject(projectDirectory); } catch (ProjectLoadingCancelledException e) { } catch (ProjectInitializerException e) { e.printStackTrace(); FlexoController.notify(FlexoLocalization.localizedForKey("could_not_open_project_located_at") + projectDirectory.getAbsolutePath()); } } } public class ImportProjectMenuItem extends FlexoMenuItem { public ImportProjectMenuItem() { super(new ImportProjectAction(), "import_project", null, getController(), true); setIcon(IconLibrary.IMPORT_ICON); } } public class ImportProjectAction extends AbstractAction { public ImportProjectAction() { super(); } @Override public void actionPerformed(ActionEvent e) { FlexoEditor editor = getController().getEditor(); if (editor != null) { editor.performActionType(ImportProject.actionType, editor.getProject(), null, e); } } } public class SaveProjectItem extends FlexoMenuItem { public SaveProjectItem() { super(new SaveProjectAction(), "save_current_project", KeyStroke.getKeyStroke(KeyEvent.VK_S, FlexoCst.META_MASK), getController(), true); setIcon(IconLibrary.SAVE_ICON); } } public class SaveProjectAction extends AbstractAction implements PropertyChangeListener { public SaveProjectAction() { super(); if (getController() != null) { manager.addListener(ControllerModel.CURRENT_EDITOR, this, getController().getControllerModel()); } updateEnability(); } @Override public void actionPerformed(ActionEvent arg0) { if (getController() == null || getController().getProject() == null) { return; } if (getController().getProject().hasUnsaveStorageResources()) { Cursor c = getController().getFlexoFrame().getCursor(); FileMenu.this._controller.getFlexoFrame().setCursor(Cursor.WAIT_CURSOR); try { getProjectLoader().saveProjects(Arrays.asList(getController().getProject())); } catch (SaveResourceExceptionList e) { e.printStackTrace(); FlexoController.showError(FlexoLocalization.localizedForKey("errors_during_saving"), FlexoLocalization.localizedForKey("errors_during_saving")); } finally { getController().getFlexoFrame().setCursor(c); } } } @Override public void propertyChange(PropertyChangeEvent evt) { if (getController() != null) { if (evt.getSource() == getController().getControllerModel()) { if (ControllerModel.CURRENT_EDITOR.equals(evt.getPropertyName())) { updateEnability(); } } } } private void updateEnability() { setEnabled(getController() != null && getController().getProject() != null); } } public class SaveAsProjectItem extends FlexoMenuItem { public SaveAsProjectItem() { super(new SaveAsProjectAction(), "save_current_project_as", null, getController(), true); setIcon(IconLibrary.SAVE_AS_ICON); } } public class SaveAsProjectAction extends AbstractAction { public SaveAsProjectAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { getProjectLoader().saveAsProject(getController().getProject()); } } public class SendProjectToFlexoServerItem extends FlexoMenuItem { public SendProjectToFlexoServerItem() { super(new SendProjectToFlexoServerAction(), "send_project_to_flexo_server", null, getController(), true); setIcon(IconLibrary.NETWORK_ICON); } } public class SendProjectToFlexoServerAction extends AbstractAction { public SendProjectToFlexoServerAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { boolean isOperationConfirmed = saveForServerPreprocessing(); if (!isOperationConfirmed) { return; } UploadPrjAction refresh = UploadPrjAction.actionType.makeNewAction(getController().getProject(), null, getController() .getEditor()); refresh.doAction(); } } // ========================================================================== // ============================= SaveProjectForServer ============================= // ========================================================================== public class SaveProjectForServerItem extends FlexoMenuItem { public SaveProjectForServerItem() { super(new SaveProjectForServerAction(), "save_project_for_server", null, getController(), true); setIcon(IconLibrary.SAVE_ICON); } } private boolean saveForServerPreprocessing() { FlexoProject project = _controller.getProject(); if (project.getImportedProcessLibrary() != null && project.getImportedProcessLibrary().size() > 0 || project.getImportedRoleList() != null && project.getImportedRoleList().size() > 0) { int i = FlexoController.confirmYesNoCancel(FlexoLocalization .localizedForKey("would_you_like_to_refresh_imported_objects_first") + "?"); switch (i) { case JOptionPane.YES_OPTION: PPMWebServiceClient client = getController().getWSClient(); if (client == null) { break; } boolean goOn = true; if (goOn && project.getImportedProcessLibrary() != null && project.getImportedProcessLibrary().size() > 0) { RefreshImportedProcessAction refresh = RefreshImportedProcessAction.actionType.makeNewAction( project.getImportedProcessLibrary(), null, getController().getEditor()); refresh.setWebService(client.getWebService_PortType()); refresh.setLogin(client.getLogin()); refresh.setMd5Password(client.getEncriptedPWD()); refresh.setAutomaticAction(true); refresh.doAction(); goOn = refresh.hasActionExecutionSucceeded(); } if (goOn && project.getImportedRoleList() != null && project.getImportedRoleList().size() > 0) { RefreshImportedRoleAction refresh = RefreshImportedRoleAction.actionType.makeNewAction(project.getImportedRoleList(), null, getController().getEditor()); refresh.setWebService(client.getWebService_PortType()); refresh.setLogin(client.getLogin()); refresh.setMd5Password(client.getEncriptedPWD()); refresh.setAutomaticAction(true); refresh.doAction(); goOn = refresh.hasActionExecutionSucceeded(); } if (goOn) { ValidationReport report = project.getImportedObjectValidationModel().validate(project.getWorkflow()); if (report.getErrorNb() != 0 || report.getWarningNb() != 0) { getController().getConsistencyCheckWindow(true).setValidationReport(report); getController().getConsistencyCheckWindow(true).setModal(true); getController().getConsistencyCheckWindow(true).setVisible(true); } } case JOptionPane.NO_OPTION: break; default: return false; } } int i = FlexoController.confirmYesNoCancel(FlexoLocalization .localizedForKey("would_you_like_to_check_your_project_consistency_first") + "?"); switch (i) { case JOptionPane.YES_OPTION: ValidateProject validate = ValidateProject.actionType.makeNewAction(project, null, getController().getEditor()); validate.doAction(); if (validate.getErrorsNb() > 0) { StringBuilder sb = new StringBuilder(); if (validate.getIeValidationReport().getErrorNb() > 0) { sb.append(FlexoLocalization.localizedForKey("there_are_errors_in_your_components") + "\n"); } if (validate.getWkfValidationReport().getErrorNb() > 0) { sb.append(FlexoLocalization.localizedForKey("there_are_errors_in_your_processes") + "\n"); } if (validate.getDmValidationReport().getErrorNb() > 0) { sb.append(FlexoLocalization.localizedForKey("there_are_errors_in_your_data_model") + "\n"); } if (validate.getDkvValidationReport().getErrorNb() > 0) { sb.append(FlexoLocalization.localizedForKey("there_are_errors_in_the_dkv") + "\n"); } sb.append(FlexoLocalization.localizedForKey("would_you_like_to_continue_anyway") + "?"); if (!FlexoController.confirmWithWarning(sb.toString())) { return false; } } else { if (GeneralPreferences.getNotifyValidProject()) { ParameterDefinition[] params = new ParameterDefinition[1]; CheckboxParameter dontNotify = new CheckboxParameter("dont_notify", "dont_notify_if_project_is_valid", false); params[0] = dontNotify; AskParametersDialog dialog = AskParametersDialog.createAskParametersDialog(project, FlexoLocalization.localizedForKey("project_is_valid"), FlexoLocalization.localizedForKey("project_is_valid"), params); if (dialog.getStatus() == AskParametersDialog.VALIDATE) { if (dontNotify.getValue()) { GeneralPreferences.setNotifyValidProject(false); GeneralPreferences.save(); } } else { return false; } } } break; case JOptionPane.NO_OPTION: break; default: return false; } return true; } public class SaveAllProjectItem extends FlexoMenuItem { public SaveAllProjectItem() { super(new SaveAllProjectAction(), "save_all_project", KeyStroke.getKeyStroke(KeyEvent.VK_S, FlexoCst.META_MASK | KeyEvent.SHIFT_MASK), getController(), true); setIcon(IconLibrary.SAVE_ALL_ICON); } } public class SaveAllProjectAction extends AbstractAction implements PropertyChangeListener { public SaveAllProjectAction() { super(); if (getProjectLoader() != null) { manager.addListener(ProjectLoader.ROOT_PROJECTS, this, getProjectLoader()); } updateEnability(); } @Override public void actionPerformed(ActionEvent arg0) { if (getProjectLoader().someProjectsAreModified()) { Cursor c = getController().getFlexoFrame().getCursor(); FileMenu.this._controller.getFlexoFrame().setCursor(Cursor.WAIT_CURSOR); try { getProjectLoader().saveAllProjects(); } catch (SaveResourceExceptionList e) { e.printStackTrace(); FlexoController.showError(FlexoLocalization.localizedForKey("errors_during_saving"), FlexoLocalization.localizedForKey("errors_during_saving")); } finally { getController().getFlexoFrame().setCursor(c); } } } @Override public void propertyChange(PropertyChangeEvent evt) { if (getProjectLoader() != null) { if (evt.getSource() == getProjectLoader()) { if (ProjectLoader.ROOT_PROJECTS.equals(evt.getPropertyName())) { updateEnability(); } } } } private void updateEnability() { setEnabled(getProjectLoader().getRootProjects().size() > 0); } } protected ProjectLoader getProjectLoader() { return getController().getProjectLoader(); } public class SaveProjectForServerAction extends AbstractAction { public SaveProjectForServerAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { boolean isOperationConfirmed = saveForServerPreprocessing(); if (isOperationConfirmed) { getProjectLoader().saveProjectForServer(getController().getProject()); } } } // ========================================================================== // ============================= ReloadProject ============================= // ========================================================================== public class ReloadProjectItem extends FlexoMenuItem { public ReloadProjectItem() { super(new ReloadProjectAction(), "reload_project", null, getController(), true); } } public class ReloadProjectAction extends AbstractAction { public ReloadProjectAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { try { getProjectLoader().reloadProject(getController().getProject()); } catch (ProjectLoadingCancelledException e) { } catch (ProjectInitializerException e) { e.printStackTrace(); FlexoController.notify(FlexoLocalization.localizedForKey("could_not_open_project_located_at") + e.getProjectDirectory().getAbsolutePath()); } } } // ========================================================================== // ============================= InspectProject // ============================= // ========================================================================== public class InspectProjectItem extends FlexoMenuItem { public InspectProjectItem() { super(new InspectProjectAction(), "inspect_project", null, getController(), true); setIcon(IconLibrary.INSPECT_ICON); } } public class InspectProjectAction extends AbstractAction { public InspectProjectAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { // FlexoModule.getActiveModule().getFlexoController().showInspector(); // FlexoModule.getActiveModule().getFlexoController().setCurrentInspectedObject(FlexoModule.getActiveModule().getFlexoController().getProject()); FlexoController controller = getController(); controller.getSelectionManager().setSelectedObject(controller.getProject()); controller.showInspector(); /* * int state = controller.getInspectorWindow().getExtendedState(); state &= ~Frame.ICONIFIED; * controller.getInspectorWindow().setExtendedState(state); */ } } // ========================================================================== // ============================= Quit Flexo // ================================= // ========================================================================== public class QuitItem extends FlexoMenuItem { public QuitItem() { super(new QuitAction(), "quit", ToolBox.getPLATFORM() == ToolBox.WINDOWS ? KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK) : KeyStroke.getKeyStroke(KeyEvent.VK_Q, FlexoCst.META_MASK), getController(), true); } } public class QuitAction extends AbstractAction { public QuitAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { quit(); } } // ========================================================================== // ============================= PageSetUP ================================ // ========================================================================== public class PageSetUpItem extends FlexoMenuItem { public PageSetUpItem() { super(new PageSetUpAction(), "page_setup", null, getController(), true); } } public class PageSetUpAction extends AbstractAction { public PageSetUpAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { ((PrintManagingController) _controller).getPrintManager().pageSetup(); } } }