xref: /AOO42X/main/wizards/com/sun/star/wizards/ui/event/UnoDataAware.java (revision 3030a1ca19eed0cfea717b561a0c070033eb35b9)
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