/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.smart.dataui;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.ParseException;
import javax.swing.text.Document;
import com.servoy.base.util.ITagResolver;
import com.servoy.j2db.IApplication;
import com.servoy.j2db.component.ComponentFormat;
import com.servoy.j2db.dataprocessing.IDisplayData;
import com.servoy.j2db.dataprocessing.IEditListener;
import com.servoy.j2db.dataprocessing.TagResolver;
import com.servoy.j2db.printing.IFixedPreferredWidth;
import com.servoy.j2db.ui.IDisplayTagText;
import com.servoy.j2db.ui.ISupportOnRender;
import com.servoy.j2db.ui.scripting.RuntimeDataLabel;
import com.servoy.j2db.util.Debug;
import com.servoy.j2db.util.Text;
import com.servoy.j2db.util.text.ServoyMaskFormatter;
/**
* Runtime swing label component
* @author jblok, jcompagner
*/
public class DataLabel extends AbstractScriptLabel implements IDisplayData, IDisplayTagText, IFixedPreferredWidth, PropertyChangeListener, ISupportOnRender
{
private String dataProviderID;
private Object value;
private String tooltip;
public DataLabel(IApplication app, RuntimeDataLabel scriptable)
{
super(app, scriptable);
scriptable.addPropertyChangeListener(this);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#setToolTipText(java.lang.String)
*/
@Override
public void setToolTipText(String text)
{
if (text != null && text.indexOf("%%") != -1) //$NON-NLS-1$
{
tooltip = text;
}
else
{
super.setToolTipText(text);
}
}
public Object getValueObject()
{
return value;
}
public Document getDocument()
{
return null;
}
public boolean needEditListener()
{
return false;
}
public void addEditListener(IEditListener l)
{
//ignore
}
protected boolean needEntireState;
public boolean needEntireState()
{
return needEntireState;
}
public void setNeedEntireState(boolean b)
{
needEntireState = b;
}
private String tagText;
public void setTagText(String s)
{
tagText = s;
}
/**
* @see com.servoy.j2db.ui.IDisplayTagText#getTagText()
*/
public String getTagText()
{
return tagText;
}
@Override
public String toString()
{
return "DataLabel[" + getName() + ":" + dataProviderID + ":" + getValueObject() + "]"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
/**
* @see javax.swing.JComponent#getToolTipText()
*/
@Override
public String getToolTipText()
{
if (resolver != null && tooltip != null)
{
String oldValue = tooltip;
tooltip = null;
super.setToolTipText(Text.processTags(oldValue, resolver));
tooltip = oldValue;
}
return super.getToolTipText();
}
/**
* @see javax.swing.JComponent#getToolTipText(java.awt.event.MouseEvent)
*/
@Override
public String getToolTipText(MouseEvent event)
{
return getToolTipText();
}
protected ITagResolver resolver;
public void setTagResolver(ITagResolver resolver)
{
this.resolver = resolver;
}
private Object rawValue;
private void resetRawValue()
{
value = null;
setValueObject(rawValue);
}
public void setValueObject(Object obj)
{
this.rawValue = obj;
if (needEntireState)
{
String txt = "";
if (resolver != null)
{
if (dataProviderID != null)
{
try
{
ComponentFormat fp = getScriptObject().getComponentFormat();
txt = Text.processTags(TagResolver.formatObject(obj != null ? obj : "", application.getLocale(), fp.parsedFormat,
(fp.parsedFormat.getDisplayFormat() != null ? new ServoyMaskFormatter(fp.parsedFormat.getDisplayFormat(), true) : null)), resolver);
}
catch (ParseException e)
{
Debug.error(e);
}
}
else
{
txt = Text.processTags(tagText, resolver);
}
if (txt == null) txt = "";
}
if (!txt.equals(value))
{
setText(txt);
value = txt;
}
if (tooltip != null)
{
super.setToolTipText(tooltip);
}
}
else
{
if (obj != null)
{
if (obj.equals(value))
{
if (scriptable != null && scriptable.getRenderEventExecutor().isRenderStateChanged()) fireOnRender(false);
return;
}
if (obj instanceof byte[])
{
setIconDirect((byte[])obj, getNextSeq());
// setIcon(new ImageIcon((byte[])obj));
}
else
{
try
{
ComponentFormat fp = getScriptObject().getComponentFormat();
setText(TagResolver.formatObject(obj, application.getLocale(), fp.parsedFormat, (fp.parsedFormat.getDisplayFormat() != null
? new ServoyMaskFormatter(fp.parsedFormat.getDisplayFormat(), true) : null)));
}
catch (ParseException e)
{
Debug.error(e);
}
}
}
else
{
if (value instanceof byte[])
{
setIcon((byte[])null);
}
else
{
setText(""); //$NON-NLS-1$
}
}
this.value = obj;
if (tooltip != null)
{
super.setToolTipText(tooltip);
}
}
fireOnRender(false);
}
public void fireOnRender(boolean force)
{
if (scriptable != null)
{
if (force) scriptable.getRenderEventExecutor().setRenderStateChanged();
scriptable.getRenderEventExecutor().fireOnRender(hasFocus());
}
}
public String getDataProviderID()
{
return dataProviderID;
}
public void setDataProviderID(String id)
{
dataProviderID = id;
}
public void notifyLastNewValueWasChange(Object oldVal, Object newVal)
{
//ignore
}
public boolean isValueValid()
{
return true;
}
public void setValueValid(boolean valid, Object oldVal)
{
//ignore
}
public void setChangeCommand(String id)
{
//ignore
}
/**
* @see com.servoy.j2db.dataprocessing.IDisplay#stopEditing()
*/
public boolean stopUIEditing(boolean looseFocus)
{
return true;
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if ("format".equals(evt.getPropertyName()))
{
resetRawValue();
}
}
}