blob: fe68046c8d5dc638d18f4777169ad68c9fe2865e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package com.sun.star.wizards.ui.event;
import com.sun.star.awt.*;
import com.sun.star.lang.EventObject;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.wizards.common.Helper;
import com.sun.star.wizards.common.PropertyNames;
/**
* @author rpiterman
*
* This class suppoprts imple cases where a UI control can
* be directly synchronized with a data property.
* Such controls are: the different text controls
* (synchronizing the "Text" , "Value", "Date", "Time" property),
* Checkbox controls, Dropdown listbox controls (synchronizing the
* SelectedItems[] property.
* For those controls, static convenience methods are offered, to simplify use.
*/
public class UnoDataAware extends DataAware
{
protected Object unoControl;
protected Object unoModel;
protected String unoPropName;
protected Object[] disableObjects = new Object[0];
protected boolean inverse = false;
protected UnoDataAware(Object dataObject, Value value, Object unoObject_, String unoPropName_)
{
super(dataObject, value);
unoControl = unoObject_;
unoModel = getModel(unoControl);
unoPropName = unoPropName_;
}
public void setInverse(boolean i)
{
inverse = i;
}
protected void enableControls(Object value)
{
Boolean b = getBoolean(value);
if (inverse)
{
b = b.booleanValue() ? Boolean.FALSE : Boolean.TRUE;
}
for (int i = 0; i < disableObjects.length; i++)
{
setEnabled(disableObjects[i], b);
}
}
protected void setToUI(Object value)
{
//System.out.println("Settings uno property : "+ Helper.getUnoPropertyValue(this.unoModel,PropertyNames.PROPERTY_NAME) + "<-" +stringof(value));
Helper.setUnoPropertyValue(unoModel, unoPropName, value);
}
private String stringof(Object value)
{
if (value.getClass().isArray())
{
StringBuffer sb = new StringBuffer("[");
for (int i = 0; i < ((short[]) value).length; i++)
{
sb.append(((short[]) value)[i]).append(" , ");
}
sb.append("]");
return sb.toString();
}
else
{
return value.toString();
}
}
/**
* Try to get from an arbitrary object a boolean value.
* Null returns Boolean.FALSE;
* A Boolean object returns itself.
* An Array returns true if it not empty.
* An Empty String returns Boolean.FALSE.
* everything else returns a Boolean.TRUE.
* @param value
* @return
*/
protected Boolean getBoolean(Object value)
{
if (value == null)
{
return Boolean.FALSE;
}
if (value instanceof Boolean)
{
return (Boolean) value;
}
else if (value.getClass().isArray())
{
return ((short[]) value).length != 0 ? Boolean.TRUE : Boolean.FALSE;
}
else if (value.equals(PropertyNames.EMPTY_STRING))
{
return Boolean.FALSE;
}
else if (value instanceof Number)
{
return ((Number) value).intValue() == 0 ? Boolean.TRUE : Boolean.FALSE;
}
else
{
return Boolean.TRUE;
}
}
public void disableControls(Object[] controls)
{
disableObjects = controls;
}
protected Object getFromUI()
{
return Helper.getUnoPropertyValue(unoModel, unoPropName);
}
private static UnoDataAware attachTextControl(Object data, String prop, Object unoText, final Listener listener, String unoProperty, boolean field, Object value)
{
XTextComponent text = UnoRuntime.queryInterface(XTextComponent.class, unoText);
final UnoDataAware uda = new UnoDataAware(data,
field
? DataAwareFields.getFieldValueFor(data, prop, value)
: new DataAware.PropertyValue(prop, data),
text, unoProperty);
text.addTextListener(new XTextListener()
{
public void textChanged(TextEvent te)
{
uda.updateData();
if (listener != null)
{
listener.eventPerformed(te);
}
}
public void disposing(EventObject eo)
{
}
});
return uda;
}
public static UnoDataAware attachEditControl(Object data, String prop, Object unoControl, Listener listener, boolean field)
{
return attachTextControl(data, prop, unoControl, listener, "Text", field, PropertyNames.EMPTY_STRING);
}
public static UnoDataAware attachDateControl(Object data, String prop, Object unoControl, Listener listener, boolean field)
{
return attachTextControl(data, prop, unoControl, listener, "Date", field, 0);
}
public static UnoDataAware attachTimeControl(Object data, String prop, Object unoControl, Listener listener, boolean field)
{
return attachTextControl(data, prop, unoControl, listener, "Time", field, 0);
}
public static UnoDataAware attachNumericControl(Object data, String prop, Object unoControl, Listener listener, boolean field)
{
return attachTextControl(data, prop, unoControl, listener, "Value", field, new Double(0));
}
public static UnoDataAware attachCheckBox(Object data, String prop, Object checkBox, final Listener listener, boolean field)
{
XCheckBox xcheckBox = UnoRuntime.queryInterface(XCheckBox.class, checkBox);
final UnoDataAware uda = new UnoDataAware(data,
field
? DataAwareFields.getFieldValueFor(data, prop, new Short((short) 0))
: new DataAware.PropertyValue(prop, data),
checkBox, PropertyNames.PROPERTY_STATE);
xcheckBox.addItemListener(itemListener(uda, listener));
return uda;
}
static XItemListener itemListener(final DataAware da, final Listener listener)
{
return new XItemListener()
{
public void itemStateChanged(ItemEvent ie)
{
da.updateData();
if (listener != null)
{
listener.eventPerformed(ie);
}
}
public void disposing(EventObject eo)
{
}
};
}
public static UnoDataAware attachLabel(Object data, String prop, Object label, final Listener listener, boolean field)
{
return new UnoDataAware(data,
field ? DataAwareFields.getFieldValueFor(data, prop, PropertyNames.EMPTY_STRING)
: new DataAware.PropertyValue(prop, data),
label, PropertyNames.PROPERTY_LABEL);
}
public static UnoDataAware attachListBox(Object data, String prop, Object listBox, final Listener listener, boolean field)
{
XListBox xListBox = UnoRuntime.queryInterface(XListBox.class, listBox);
final UnoDataAware uda = new UnoDataAware(data,
field
? DataAwareFields.getFieldValueFor(data, prop, new short[0])
: new DataAware.PropertyValue(prop, data),
listBox, PropertyNames.SELECTED_ITEMS);
xListBox.addItemListener(itemListener(uda, listener));
return uda;
}
public static Object getModel(Object control)
{
return UnoRuntime.queryInterface(XControl.class, control).getModel();
}
public static void setEnabled(Object control, boolean enabled)
{
setEnabled(control, enabled ? Boolean.TRUE : Boolean.FALSE);
}
public static void setEnabled(Object control, Boolean enabled)
{
Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enabled);
}
}