1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 package com.sun.star.wizards.ui.event; 24 25 import com.sun.star.awt.*; 26 import com.sun.star.lang.EventObject; 27 import com.sun.star.uno.UnoRuntime; 28 import com.sun.star.wizards.common.Helper; 29 import com.sun.star.wizards.common.PropertyNames; 30 31 /** 32 * @author rpiterman 33 * 34 * This class suppoprts imple cases where a UI control can 35 * be directly synchronized with a data property. 36 * Such controls are: the different text controls 37 * (synchronizing the "Text" , "Value", "Date", "Time" property), 38 * Checkbox controls, Dropdown listbox controls (synchronizing the 39 * SelectedItems[] property. 40 * For those controls, static convenience methods are offered, to simplify use. 41 */ 42 public class UnoDataAware extends DataAware 43 { 44 45 protected Object unoControl; 46 protected Object unoModel; 47 protected String unoPropName; 48 protected Object[] disableObjects = new Object[0]; 49 protected boolean inverse = false; 50 51 protected UnoDataAware(Object dataObject, Value value, Object unoObject_, String unoPropName_) 52 { 53 super(dataObject, value); 54 unoControl = unoObject_; 55 unoModel = getModel(unoControl); 56 unoPropName = unoPropName_; 57 } 58 59 public void setInverse(boolean i) 60 { 61 inverse = i; 62 } 63 64 protected void enableControls(Object value) 65 { 66 Boolean b = getBoolean(value); 67 if (inverse) 68 { 69 b = b.booleanValue() ? Boolean.FALSE : Boolean.TRUE; 70 } 71 for (int i = 0; i < disableObjects.length; i++) 72 { 73 setEnabled(disableObjects[i], b); 74 } 75 } 76 77 protected void setToUI(Object value) 78 { 79 //System.out.println("Settings uno property : "+ Helper.getUnoPropertyValue(this.unoModel,PropertyNames.PROPERTY_NAME) + "<-" +stringof(value)); 80 Helper.setUnoPropertyValue(unoModel, unoPropName, value); 81 } 82 83 private String stringof(Object value) 84 { 85 if (value.getClass().isArray()) 86 { 87 StringBuffer sb = new StringBuffer("["); 88 for (int i = 0; i < ((short[]) value).length; i++) 89 { 90 sb.append(((short[]) value)[i]).append(" , "); 91 } 92 sb.append("]"); 93 return sb.toString(); 94 } 95 else 96 { 97 return value.toString(); 98 } 99 } 100 101 /** 102 * Try to get from an arbitrary object a boolean value. 103 * Null returns Boolean.FALSE; 104 * A Boolean object returns itself. 105 * An Array returns true if it not empty. 106 * An Empty String returns Boolean.FALSE. 107 * everything else returns a Boolean.TRUE. 108 * @param value 109 * @return 110 */ 111 protected Boolean getBoolean(Object value) 112 { 113 if (value == null) 114 { 115 return Boolean.FALSE; 116 } 117 if (value instanceof Boolean) 118 { 119 return (Boolean) value; 120 } 121 else if (value.getClass().isArray()) 122 { 123 return ((short[]) value).length != 0 ? Boolean.TRUE : Boolean.FALSE; 124 } 125 else if (value.equals(PropertyNames.EMPTY_STRING)) 126 { 127 return Boolean.FALSE; 128 } 129 else if (value instanceof Number) 130 { 131 return ((Number) value).intValue() == 0 ? Boolean.TRUE : Boolean.FALSE; 132 } 133 else 134 { 135 return Boolean.TRUE; 136 } 137 } 138 139 public void disableControls(Object[] controls) 140 { 141 disableObjects = controls; 142 } 143 144 protected Object getFromUI() 145 { 146 return Helper.getUnoPropertyValue(unoModel, unoPropName); 147 } 148 149 private static UnoDataAware attachTextControl(Object data, String prop, Object unoText, final Listener listener, String unoProperty, boolean field, Object value) 150 { 151 XTextComponent text = UnoRuntime.queryInterface(XTextComponent.class, unoText); 152 final UnoDataAware uda = new UnoDataAware(data, 153 field 154 ? DataAwareFields.getFieldValueFor(data, prop, value) 155 : new DataAware.PropertyValue(prop, data), 156 text, unoProperty); 157 text.addTextListener(new XTextListener() 158 { 159 160 public void textChanged(TextEvent te) 161 { 162 uda.updateData(); 163 if (listener != null) 164 { 165 listener.eventPerformed(te); 166 } 167 } 168 169 public void disposing(EventObject eo) 170 { 171 } 172 }); 173 return uda; 174 } 175 176 public static UnoDataAware attachEditControl(Object data, String prop, Object unoControl, Listener listener, boolean field) 177 { 178 return attachTextControl(data, prop, unoControl, listener, "Text", field, PropertyNames.EMPTY_STRING); 179 } 180 181 public static UnoDataAware attachDateControl(Object data, String prop, Object unoControl, Listener listener, boolean field) 182 { 183 return attachTextControl(data, prop, unoControl, listener, "Date", field, 0); 184 } 185 186 public static UnoDataAware attachTimeControl(Object data, String prop, Object unoControl, Listener listener, boolean field) 187 { 188 return attachTextControl(data, prop, unoControl, listener, "Time", field, 0); 189 } 190 191 public static UnoDataAware attachNumericControl(Object data, String prop, Object unoControl, Listener listener, boolean field) 192 { 193 return attachTextControl(data, prop, unoControl, listener, "Value", field, new Double(0)); 194 } 195 196 public static UnoDataAware attachCheckBox(Object data, String prop, Object checkBox, final Listener listener, boolean field) 197 { 198 XCheckBox xcheckBox = UnoRuntime.queryInterface(XCheckBox.class, checkBox); 199 final UnoDataAware uda = new UnoDataAware(data, 200 field 201 ? DataAwareFields.getFieldValueFor(data, prop, new Short((short) 0)) 202 : new DataAware.PropertyValue(prop, data), 203 checkBox, PropertyNames.PROPERTY_STATE); 204 xcheckBox.addItemListener(itemListener(uda, listener)); 205 return uda; 206 } 207 208 static XItemListener itemListener(final DataAware da, final Listener listener) 209 { 210 return new XItemListener() 211 { 212 213 public void itemStateChanged(ItemEvent ie) 214 { 215 da.updateData(); 216 if (listener != null) 217 { 218 listener.eventPerformed(ie); 219 } 220 } 221 222 public void disposing(EventObject eo) 223 { 224 } 225 }; 226 } 227 228 public static UnoDataAware attachLabel(Object data, String prop, Object label, final Listener listener, boolean field) 229 { 230 return new UnoDataAware(data, 231 field ? DataAwareFields.getFieldValueFor(data, prop, PropertyNames.EMPTY_STRING) 232 : new DataAware.PropertyValue(prop, data), 233 label, PropertyNames.PROPERTY_LABEL); 234 } 235 236 public static UnoDataAware attachListBox(Object data, String prop, Object listBox, final Listener listener, boolean field) 237 { 238 XListBox xListBox = UnoRuntime.queryInterface(XListBox.class, listBox); 239 final UnoDataAware uda = new UnoDataAware(data, 240 field 241 ? DataAwareFields.getFieldValueFor(data, prop, new short[0]) 242 : new DataAware.PropertyValue(prop, data), 243 listBox, PropertyNames.SELECTED_ITEMS); 244 xListBox.addItemListener(itemListener(uda, listener)); 245 return uda; 246 } 247 248 public static Object getModel(Object control) 249 { 250 return UnoRuntime.queryInterface(XControl.class, control).getModel(); 251 } 252 253 public static void setEnabled(Object control, boolean enabled) 254 { 255 setEnabled(control, enabled ? Boolean.TRUE : Boolean.FALSE); 256 } 257 258 public static void setEnabled(Object control, Boolean enabled) 259 { 260 Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enabled); 261 } 262 } 263