/* * (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.components; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import org.openflexo.foundation.param.LabelParameter; import org.openflexo.foundation.param.ParameterDefinition; import org.openflexo.foundation.param.ParameterDefinition.ValueListener; import org.openflexo.foundation.param.ParametersModel; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.inspector.TabModelView; import org.openflexo.inspector.widget.DenaliWidget.WidgetLayout; import org.openflexo.inspector.widget.LabelWidget; import org.openflexo.localization.FlexoLocalization; import org.openflexo.toolbox.ToolBox; import org.openflexo.view.FlexoDialog; import org.openflexo.view.FlexoFrame; import org.openflexo.view.controller.AskParametersController; /** * Dialog allowing to automatically ask and edit parameters * * @author sguerin * */ public class AskParametersDialog extends FlexoDialog implements ValueListener { static final Logger logger = Logger.getLogger(AskParametersDialog.class.getPackage().getName()); public static final int CANCEL = 0; public static final int VALIDATE = 1; int status; private ParametersModel _parametersModel; /*public AskParametersDialog(FlexoProject project, String windowTitle, String title, ParameterDefinition... parameters) { this(project,windowTitle,title, (ParameterDefinition[])parameters); }*/ private JButton _validateButton; private static AskParametersDialog _visibleDialog = null; // private static Vector<AskParametersDialog> _waitingDialog = new Vector<AskParametersDialog>(); private TabModelView paramsPanel; private static final AskParametersDialog _createInstance(FlexoProject project, Frame owner, String windowTitle, String title, ParameterDefinition... parameters) { if (owner != null) { return new AskParametersDialog(owner, project, windowTitle, title, parameters); } if (FlexoFrame.getActiveFrame() != null) { return new AskParametersDialog(FlexoFrame.getActiveFrame(), project, windowTitle, title, parameters); } else if (ProgressWindow.hasInstance()) { return new AskParametersDialog(ProgressWindow.instance().initOwner, project, windowTitle, title, parameters); } return new AskParametersDialog(null, project, windowTitle, title, parameters); } private static ParameterDefinition[] toArray(Vector<ParameterDefinition> parameters) { ParameterDefinition[] returned = new ParameterDefinition[parameters.size()]; int i = 0; for (ParameterDefinition p : parameters) { returned[i++] = p; } return returned; } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, String windowTitle, String title, Vector<ParameterDefinition> parameters) { return createAskParametersDialog(project, windowTitle, title, toArray(parameters)); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, String windowTitle, String title, ParameterDefinition... parameters) { return createAskParametersDialog(project, null, windowTitle, title, parameters); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, Frame owner, String windowTitle, String title, Vector<ParameterDefinition> parameters) { return createAskParametersDialog(project, owner, windowTitle, title, toArray(parameters)); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, Frame owner, String windowTitle, String title, ParameterDefinition... parameters) { AskParametersDialog returned = _createInstance(project, owner, windowTitle, title, parameters); returned.setVisible(true); return returned; } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, String windowTitle, String title, final ValidationCondition validationCondition, Vector<ParameterDefinition> parameters) { return createAskParametersDialog(project, windowTitle, title, validationCondition, toArray(parameters)); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, String windowTitle, String title, final ValidationCondition validationCondition, ParameterDefinition... parameters) { return createAskParametersDialog(project, null, windowTitle, title, validationCondition, parameters); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, Frame owner, String windowTitle, String title, final ValidationCondition validationCondition, Vector<ParameterDefinition> parameters) { return createAskParametersDialog(project, owner, windowTitle, title, validationCondition, toArray(parameters)); } public static final AskParametersDialog createAskParametersDialog(FlexoProject project, Frame owner, String windowTitle, String title, final ValidationCondition validationCondition, ParameterDefinition... parameters) { final AccessToAskParametersDialog access = new AccessToAskParametersDialog(); ParameterDefinition[] newParams = new ParameterDefinition[parameters.length + 1]; for (int i = 0; i < parameters.length; i++) { newParams[i] = parameters[i]; } StringBuffer sb = new StringBuffer(); boolean isFirst = true; for (ParameterDefinition p : parameters) { sb.append((isFirst ? "" : ",") + p.getName()); isFirst = false; } LabelParameter labelParameter = new LabelParameter("failure_message", "", "", false) { @Override public String getValue() { if (access.dialog != null) { if (access.dialog.isValidateEnabled()) { return ""; } else { return "<html><center><font color=\"red\">" + access.dialog._validationCondition.getErrorMessage() + "</font></center></html>"; } } return ""; } }; labelParameter.setAlign(LabelWidget.CENTER); labelParameter.setWidgetLayout(WidgetLayout.LABEL_NEXTTO_WIDGET_LAYOUT); labelParameter.setExpandHorizontally(true); labelParameter.setDepends(sb.toString()); newParams[parameters.length] = labelParameter; access.dialog = _createInstance(project, owner, windowTitle, title, newParams); access.dialog.setValidationCondition(validationCondition); access.dialog.pack(); access.dialog.setVisible(true); return access.dialog; } protected static class AccessToAskParametersDialog { protected AskParametersDialog dialog; } private AskParametersDialog(Frame owner, FlexoProject project, String windowTitle, String title, ParameterDefinition... parameters) { super(owner, true); initDialog(project, windowTitle, title, parameters); } private void initDialog(FlexoProject project, String windowTitle, String title, ParameterDefinition... parameters) { setTitle(windowTitle); status = CANCEL; _parametersModel = new ParametersModel(project, parameters); for (ParameterDefinition p : parameters) { p.addValueListener(this); } getContentPane().setLayout(new BorderLayout()); JLabel titlePanel = new JLabel(title, SwingConstants.CENTER); titlePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); paramsPanel = new TabModelView(_parametersModel.getTabModel(), null, AskParametersController.instance()); paramsPanel.performObserverSwitch(_parametersModel); JPanel controlPanel = new JPanel(); controlPanel.setLayout(new FlowLayout()); controlPanel.setOpaque(true); JButton cancelButton = new JButton(); cancelButton.setOpaque(false); cancelButton.setText(FlexoLocalization.localizedForKey("cancel", cancelButton)); _validateButton = new JButton(); _validateButton.setOpaque(false); if (ToolBox.getPLATFORM() == ToolBox.MACOS) { _validateButton.setText(FlexoLocalization.localizedForKey("validate", _validateButton)); } else { _validateButton.setText(FlexoLocalization.localizedForKey("ok", _validateButton)); } _validateButton.setEnabled(isValidateEnabled()); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { status = CANCEL; dispose(); } }); _validateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { status = VALIDATE; dispose(); } }); if (ToolBox.getPLATFORM() == ToolBox.MACOS) { controlPanel.add(cancelButton); controlPanel.add(_validateButton); } else { controlPanel.add(_validateButton); controlPanel.add(cancelButton); } getContentPane().add(titlePanel, BorderLayout.NORTH); JScrollPane scrollpane = new JScrollPane(paramsPanel); scrollpane.setOpaque(false); scrollpane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); getContentPane().add(scrollpane, BorderLayout.CENTER); getContentPane().add(controlPanel, BorderLayout.SOUTH); // setSize(new Dimension (400,200+parameters.length*30)); getRootPane().setDefaultButton(_validateButton); validate(); pack(); // GPO: Forces width of dialog to be at least 250px paramsPanel.requestFocusInFirstWidget(); if (getWidth() < 250) { setSize(250, getHeight()); } paramsPanel.valueChange(_parametersModel); } @Override public void dispose() { super.dispose(); if (_visibleDialog == this) { _visibleDialog = null; } } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (!visible && _visibleDialog == this) { _visibleDialog = null; } } public int getStatus() { return status; } public Object parameterValueWithName(String paramName) { return _parametersModel.objectForKey(paramName); } public void setParameterValueWithName(Object value, String paramName) { _parametersModel.setObjectForKey(value, paramName); } public boolean booleanParameterValueWithName(String paramName) { return _parametersModel.booleanValueForKey(paramName); } public void setBooleanParameterValueWithName(boolean value, String paramName) { _parametersModel.setBooleanValueForKey(value, paramName); } public int integerParameterValueWithName(String paramName) { return _parametersModel.integerValueForKey(paramName); } public void setIntegerParameterValueWithName(int value, String paramName) { _parametersModel.setIntegerValueForKey(value, paramName); } @Override public void newValueWasSet(ParameterDefinition param, Object oldValue, Object newValue) { if (logger.isLoggable(Level.FINE)) { logger.fine("newValueWasSet() " + param + " oldValue=" + oldValue + " newValue=" + newValue + " isValidateEnabled()=" + isValidateEnabled()); } if (_validateButton != null) { _validateButton.setEnabled(isValidateEnabled()); } if (!param.getName().equals("failure_message")) { update(); } if (isVisible()) { // GPO: Crappy code to resize dialog to best fit for param panel Dimension prefSize = paramsPanel.getPreferredSize(); if (paramsPanel.getSize().width < prefSize.width) { pack(); } if (paramsPanel.getSize().height < prefSize.height) { pack(); } } } protected final boolean isValidateEnabled() { if (_validationCondition != null) { return _validationCondition.isValid(_parametersModel); } return true; } public void update() { paramsPanel.valueChange(_parametersModel); paramsPanel.performObserverSwitch(_parametersModel); } private ValidationCondition _validationCondition = null; public static abstract class ValidationCondition { protected String errorMessage = FlexoLocalization.localizedForKey("invalid_data"); public abstract boolean isValid(ParametersModel model); public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String aMessage) { errorMessage = aMessage; } } public ValidationCondition getValidationCondition() { return _validationCondition; } public void setValidationCondition(ValidationCondition validationCondition) { _validationCondition = validationCondition; _validateButton.setEnabled(isValidateEnabled()); update(); } }