/* * (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.ie.view.widget; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JTextField; import javax.swing.SwingConstants; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.ie.dm.IETextFieldCssClassChange; import org.openflexo.foundation.ie.dm.table.WidgetRemovedFromTable; import org.openflexo.foundation.ie.util.TextFieldClass; import org.openflexo.foundation.ie.widget.IEEditableTextWidget; import org.openflexo.foundation.ie.widget.IETextFieldWidget; import org.openflexo.ie.IEPreferences; import org.openflexo.ie.util.TriggerRepaintDocumentListener; import org.openflexo.ie.view.IEWOComponentView; import org.openflexo.ie.view.controller.IEController; import org.openflexo.logging.FlexoLogger; /** * @author bmangez * * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code and Comments */ public class IETextFieldWidgetView extends AbstractInnerTableWidgetView<IETextFieldWidget> implements DisplayableBindingValue { private static final Logger logger = FlexoLogger.getLogger(IETextFieldWidgetView.class.getPackage().getName()); protected boolean labelEditing = false; // ========================================================================== // ============================= Variables // ================================== // ========================================================================== private JTextField _jTextField; private MouseListener mouseListener = new MouseAdapter() { /** * Overrides mouseClicked * * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent) */ @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && !labelEditing) { editValue(); } } }; protected JTextField _jLabelTextField;// Edition of default value public static final Font TEXTFIELD_FONT = new Font("SansSerif", Font.PLAIN, 10); // private IETextFieldWidget _model; // ========================================================================== // ============================= Constructor // ================================ // ========================================================================== public IETextFieldWidgetView(IEController ieController, IETextFieldWidget model, boolean addDnDSupport, IEWOComponentView view) { super(ieController, model, addDnDSupport, view); // _model = model; FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 4, 4); // layout.setVgap(4); setLayout(layout); if (getTextFieldModel().getBindingValue() != null) { _jTextField = new JTextField(getTextFieldModel().getBindingValue().getCodeStringRepresentation()); } else { _jTextField = new JTextField(getTextFieldModel().getValue()); _jTextField.addMouseListener(mouseListener); } // _jTextField.setPreferredSize(new // Dimension(parent.getWidthForCol(model.getCol())-5,16)); _jTextField.setFont(TEXTFIELD_FONT); add(_jTextField); // _jTextField.addMouseListener(SelectionManager.instance()); _jTextField.setEditable(false); _jTextField.setFocusable(false); TransparentMouseListener tml = new TransparentMouseListener(_jTextField, this); _jTextField.addMouseListener(tml); _jTextField.addMouseMotionListener(tml); if (getTextFieldModel().getDescription() != null) { _jTextField.setToolTipText(getTextFieldModel().getDescription()); } updateDisplayedValue(); } public IETextFieldWidget getTextFieldModel() { return getModel(); } // ========================================================================== // ============================= Observer // =================================== // ========================================================================== private void applyCss() { revalidate(); repaint(); } @Override public void updateDisplayedValue() { if (IEPreferences.getDisplayBindingValue()) { _jTextField.setText(getTextFieldModel().getBindingValue() != null ? getTextFieldModel().getBindingValue() .getCodeStringRepresentation() : "UNBOUND"); applyCss(); removeDoubleClickListener(); } else { _jTextField.setText(getTextFieldModel().getValue()); applyCss(); addDoubleClickListener(); } } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ @Override public void update(FlexoObservable arg0, DataModification modif) { if (modif instanceof IETextFieldCssClassChange) { applyCss(); } String propertyName = modif.propertyName(); if (propertyName != null) { if (propertyName.equals(IEEditableTextWidget.BINDING_VALUE) && arg0 == getTextFieldModel()) { updateDisplayedValue(); } else if (propertyName.equals(ATTRIB_DESCRIPTION_NAME)) { _jTextField.setToolTipText(getTextFieldModel().getDescription()); } else if (propertyName.equals("value")) { if (getTextFieldModel().getBindingValue() == null) { _jTextField.setText(getTextFieldModel().getValue()); applyCss(); } } } if (modif instanceof WidgetRemovedFromTable && arg0 == getModel()) { delete(); } else { super.update(arg0, modif); } } /** * */ private void addDoubleClickListener() { MouseListener[] ml = _jTextField.getMouseListeners(); for (int i = 0; i < ml.length; i++) { if (ml[i] == mouseListener) { return; } } _jTextField.addMouseListener(mouseListener); } /** * */ private void removeDoubleClickListener() { _jTextField.removeMouseListener(mouseListener); } public void editValue() { if (logger.isLoggable(Level.FINE)) { logger.fine("Edit ie textfield"); } labelEditing = true; _jLabelTextField = new JTextField(getTextFieldModel().getValue()); // _jLabelTextField.setForeground(getFlexoNode().getTextColor()); _jLabelTextField.setBounds(_jTextField.getBounds()); _jLabelTextField.setPreferredSize(_jTextField.getPreferredSize()); _jLabelTextField.setMinimumSize(new Dimension(60, 15)); _jLabelTextField.setFont(_jTextField.getFont()); _jLabelTextField.setFocusable(true); _jLabelTextField.setHorizontalAlignment(SwingConstants.LEFT); _jLabelTextField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { finalizeEditValue(); } }); _jLabelTextField.getDocument().addDocumentListener(new TriggerRepaintDocumentListener(this)); _jLabelTextField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent arg0) { if (arg0.getOppositeComponent() != IETextFieldWidgetView.this) { finalizeEditValue(); } else { _jLabelTextField.grabFocus(); } } }); remove(_jTextField); add(_jLabelTextField); _jLabelTextField.grabFocus(); _jLabelTextField.selectAll(); validate(); repaint(); } public void finalizeEditValue() { if (logger.isLoggable(Level.FINE)) { logger.fine("Finalize edit ie textfield"); } if (labelEditing) { getTextFieldModel().setValue(_jLabelTextField.getText()); labelEditing = false; remove(_jLabelTextField); add(_jTextField); validate(); repaint(); } } @Override public Dimension getPreferredSize() { if (getTextFieldModel().getIsExtensible()) { IESequenceWidgetWidgetView parentSequenceView = null; if (getParent() instanceof IESequenceWidgetWidgetView) { parentSequenceView = (IESequenceWidgetWidgetView) getParent(); } if (parentSequenceView != null) { int width = parentSequenceView.getAvailableWidth(); Dimension d = super.getPreferredSize(); if (width > 0) { d.width = width; } Insets i = _jTextField.getInsets(); _jTextField.setPreferredSize(new Dimension(d.width - i.left - i.right, _jTextField.getFontMetrics(_jTextField.getFont()) .getHeight() + i.top + i.bottom)); return d; } int w = getParent() == null ? 150 : getParent().getWidth() - getParent().getInsets().left - getParent().getInsets().right; int h = _jTextField.getHeight(); _jTextField.setPreferredSize(new Dimension(w - 4, h)); return new Dimension(w, h + 4); } if (getTextFieldModel().getTfcssClass() != null && getTextFieldModel().getTfcssClass().equals(TextFieldClass.DLMEDIUM)) { Dimension d = _jTextField.getPreferredSize(); d.width = 150; _jTextField.setPreferredSize(d); d = new Dimension(d.width + 8, d.height + 8); return d; } else if (getTextFieldModel().getTfcssClass() != null && getTextFieldModel().getTfcssClass().equals(TextFieldClass.DLSHORT)) { Dimension d = _jTextField.getPreferredSize(); d.width = 30; _jTextField.setPreferredSize(d); d = new Dimension(d.width + 8, d.height + 8); return d; } else if (getTextFieldModel().getTfcssClass() != null && getTextFieldModel().getTfcssClass().equals(TextFieldClass.DLTINY)) { Dimension d = _jTextField.getPreferredSize(); d.width = 20; _jTextField.setPreferredSize(d); d = new Dimension(d.width + 8, d.height + 8); return d; } else { Dimension d = _jTextField.getPreferredSize(); d.width = (int) _jTextField.getFontMetrics(_jTextField.getFont()) .getStringBounds(_jTextField.getText(), _jTextField.getGraphics()).getWidth() + 10; if (d.width < 50) { d.width = 50; } _jTextField.setPreferredSize(d); d = new Dimension(d.width + 8, d.height + 8); return d; } } }