/************************************************************** * * 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); } }