/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.editor.drilldown.basic;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.designer.core.util.FormulaEditorPanel;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.ui.xul.XulComponent;
import org.pentaho.ui.xul.XulDomContainer;
import org.pentaho.ui.xul.dom.Element;
import org.pentaho.ui.xul.swing.AbstractSwingContainer;
import org.pentaho.ui.xul.swing.tags.SwingListitem;
import org.pentaho.ui.xul.util.TextType;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
/**
* A xulified version of the formula-input.
*
* @author Thomas Morgner.
*/
public class XulFormulaTextField extends AbstractSwingContainer implements XulComponent
{
private class KeyInputHandler implements KeyListener
{
public void keyPressed(final KeyEvent e)
{
oldValue = textField.getFormula();
}
public void keyReleased(final KeyEvent e)
{
if (oldValue != null && !oldValue.equals(textField.getFormula()))
{
changeSupport.firePropertyChange("value", oldValue, getValue());
oldValue = textField.getFormula();
}
else if (oldValue == null)
{
//AWT error where sometimes the keyReleased is fired before keyPressed.
oldValue = textField.getFormula();
}
else
{
logger.debug("Special key pressed, ignoring");
}
}
public void keyTyped(final KeyEvent e)
{
}
}
private class MethodInvokeHandler extends KeyAdapter
{
private final String method;
public MethodInvokeHandler(final String method)
{
this.method = method;
}
public void keyReleased(final KeyEvent e)
{
invoke(method);
}
}
private class ChangeEventForwarder implements PropertyChangeListener
{
private ChangeEventForwarder()
{
}
/**
* This method gets called when a bound property is changed.
*
* @param evt A PropertyChangeEvent object describing the event source
* and the property that has changed.
*/
public void propertyChange(final PropertyChangeEvent evt)
{
XulFormulaTextField.this.value = textField.getFormula();
changeSupport.firePropertyChange("value", evt.getOldValue(), evt.getNewValue());
}
}
private static final Log logger = LogFactory.getLog(XulFormulaTextField.class);
private FormulaEditorPanel textField;
boolean disabled;
private String value;
private boolean readonly;
private TextType type;
private String onInput;
private int maxlength;
private String oldValue;
public XulFormulaTextField(final Element self,
final XulComponent parent,
final XulDomContainer domContainer,
final String tagName)
{
super(tagName);
setManagedObject(null);
disabled = false;
value = "";
type = TextType.NORMAL;
readonly = false;
maxlength = -1;
oldValue = null;
}
public String getValue()
{
return value;
}
public void setValue(final String text)
{
final String oldVal = this.value;
if (textField != null && ObjectUtilities.equal(text, textField.getFormula()))
{
return;
}
if (textField != null)
{
textField.setFormula(text);
}
this.value = text;
if (text != null || oldVal != null)
{
changeSupport.firePropertyChange("value", oldVal, text);
}
}
public void layout()
{
final ArrayList<String> list = new ArrayList<String>();
for (final Element comp : getChildNodes())
{
if (comp instanceof SwingListitem)
{
final SwingListitem swingListitem = (SwingListitem) comp;
list.add((String) swingListitem.getValue());
logger.info("added tag to formula editor");
}
}
final FormulaEditorPanel panel = (FormulaEditorPanel) getManagedObject();
panel.setTags(list.toArray(new String[list.size()]));
}
public int getMaxlength()
{
return maxlength;
}
public boolean isDisabled()
{
return this.disabled;
}
public void setDisabled(final boolean dis)
{
final boolean oldValue = this.disabled;
this.disabled = dis;
if (textField != null)
{
textField.setEnabled(!dis);
}
changeSupport.firePropertyChange("disabled", oldValue, dis);
}
public void setMaxlength(final int length)
{
maxlength = length;
}
public boolean isReadonly()
{
return readonly;
}
public void setReadonly(final boolean readOnly)
{
this.readonly = readOnly;
}
public String getType()
{
if (type == null)
{
return null;
}
return type.toString();
}
public void selectAll()
{
textField.selectAll();
}
public void setFocus()
{
}
public Object getTextControl()
{
return getManagedObject();
}
@Override
public Object getManagedObject()
{
if (super.getManagedObject() == null)
{
textField = new FormulaEditorPanel();
textField.setFormula(value);
textField.setPreferredSize(new Dimension(150, textField.getPreferredSize().height));
textField.setMinimumSize(new Dimension(textField.getPreferredSize().width,
textField.getPreferredSize().height));
textField.setEditable(!readonly);
textField.setEnabled(!disabled);
textField.addFormulaKeyListener(new KeyInputHandler());
textField.addPropertyChangeListener("formula", new ChangeEventForwarder());
setManagedObject(textField);
}
textField.setToolTipText(this.getTooltiptext());
return super.getManagedObject();
}
public void setOninput(final String method)
{
if (textField != null)
{
onInput = method;
textField.addFormulaKeyListener(new MethodInvokeHandler(method));
}
else
{ //Not instantiated, save for later
onInput = method;
}
}
public String getOninput()
{
return onInput;
}
}