xref: /AOO41X/main/odk/examples/DevelopersGuide/Forms/SingleControlValidation.java (revision 73d9b18ad12b526a229c2c5ca3fb0f85a41c2f42)
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 
24 import com.sun.star.uno.*;
25 import com.sun.star.util.*;
26 import com.sun.star.lang.*;
27 import com.sun.star.accessibility.*;
28 import com.sun.star.container.*;
29 import com.sun.star.beans.*;
30 import com.sun.star.form.binding.*;
31 import com.sun.star.form.validation.*;
32 
33 /**
34  *
35  * @author  fs@openoffice.org
36  */
37 public class SingleControlValidation implements XFormComponentValidityListener
38 {
39     private DocumentHelper          m_document;         /// our current test document
40     private FormLayer               m_formLayer;        /// quick access to the form layer
41     private XMultiServiceFactory    m_orb;              /// our service factory
42 
43     private XPropertySet            m_inputField;
44     private XPropertySet            m_inputLabel;
45     private XPropertySet            m_statusField;
46     private XPropertySet            m_explanationField;
47     private XValidator              m_validator;
48 
49     /* ------------------------------------------------------------------ */
50     public SingleControlValidation( DocumentHelper document, int columnPos, int rowPos, String formComponentService, XValidator validator )
51     {
52         m_document = document;
53         m_validator = validator;
54         m_formLayer = new FormLayer( m_document );
55         createControls( columnPos, rowPos, formComponentService, 1, 0 );
56     }
57 
58     /* ------------------------------------------------------------------ */
59     public SingleControlValidation( DocumentHelper document, int columnPos, int rowPos, String formComponentService, XValidator validator, int controlCount, int controlHeight )
60     {
61         m_document = document;
62         m_validator = validator;
63         m_formLayer = new FormLayer( m_document );
64         createControls( columnPos, rowPos, formComponentService, controlCount, controlHeight );
65     }
66 
67     /* ------------------------------------------------------------------ */
68     public XPropertySet getInputField()
69     {
70         return m_inputField;
71     }
72 
73     /* ------------------------------------------------------------------ */
74     public void setExplanatoryText( String text )
75     {
76         try
77         {
78             m_inputLabel.setPropertyValue( "Label", text );
79         }
80         catch( com.sun.star.uno.Exception e )
81         {
82             e.printStackTrace( System.err );
83         }
84     }
85 
86     /* ------------------------------------------------------------------ */
87     private void createControls( int columnPos, int rowPos, String formComponentService, int controlCount, int controlHeight )
88     {
89         try
90         {
91             m_inputLabel = m_formLayer.createControlAndShape( "FixedText", columnPos, rowPos, 70, 12, null );
92             m_inputLabel.setPropertyValue( "MultiLine", new Boolean( true ) );
93 
94             com.sun.star.awt.FontDescriptor font = (com.sun.star.awt.FontDescriptor)m_inputLabel.getPropertyValue( "FontDescriptor" );
95             font.Weight = com.sun.star.awt.FontWeight.BOLD;
96             m_inputLabel.setPropertyValue( "FontDescriptor", font );
97 
98             if ( controlHeight == 0 )
99                 controlHeight = 6;
100 
101             int controlPos = rowPos + 12;
102             XPropertySet[] controls = new XPropertySet[ controlCount ];
103             for ( int i = 0; i < controlCount; ++i, controlPos += controlHeight )
104             {
105                 controls[ i ] = m_formLayer.createControlAndShape( formComponentService, columnPos, controlPos, 25, controlHeight, null );
106                 controls[ i ].setPropertyValue( "Name", formComponentService );
107                 controls[ i ].setPropertyValue( "Tag", String.valueOf( i ) );
108 
109                 if ( controls[ i ].getPropertySetInfo().hasPropertyByName( "Border" ) )
110                     controls[ i ].setPropertyValue( "Border", new Short( (short)2 ) );
111 
112                 XValidatableFormComponent xComp = (XValidatableFormComponent)UnoRuntime.queryInterface( XValidatableFormComponent.class,
113                     controls[ i ] );
114                 xComp.addFormComponentValidityListener( this );
115             }
116             m_inputField = controls[ 0 ];
117 
118             // ----------------------------------
119             controlPos += 4;
120             XPropertySet xLabel = m_formLayer.createControlAndShape( "FixedText", columnPos, controlPos, 70, 4, null );
121             xLabel.setPropertyValue( "Label", new String( "Status:" ) );
122             controlPos += 4;
123             m_statusField = m_formLayer.createControlAndShape( "FixedText", columnPos, controlPos, 70, 4, null );
124             m_statusField.setPropertyValue( "Label", new String( "" ) );
125 
126             // ----------------------------------
127             controlPos += 6;
128             xLabel = m_formLayer.createControlAndShape( "FixedText", columnPos, controlPos, 70, 4, null );
129             xLabel.setPropertyValue( "Label", new String( "Explanation for invalidity:" ) );
130             controlPos += 4;
131             m_explanationField = m_formLayer.createControlAndShape( "FixedText", columnPos, controlPos, 70, 4, null );
132             m_explanationField.setPropertyValue( "Label", new String( "" ) );
133 
134             XValidatable xValidatable = (XValidatable)UnoRuntime.queryInterface( XValidatable.class, m_inputField );
135             xValidatable.setValidator( m_validator );
136         }
137         catch( java.lang.Exception e  )
138         {
139             e.printStackTrace( System.out );
140         }
141     }
142 
143     /* ------------------------------------------------------------------ */
144     /* XEventListener overridables                                        */
145     /* ------------------------------------------------------------------ */
146     public void disposing( com.sun.star.lang.EventObject eventObject )
147     {
148         // not interested in
149     }
150 
151     /* ------------------------------------------------------------------ */
152     /* XFormComponentValidityListener overridables                        */
153     /* ------------------------------------------------------------------ */
154     public void componentValidityChanged( com.sun.star.lang.EventObject eventObject )
155     {
156         try
157         {
158             if ( m_inputField.equals( eventObject.Source ) )
159             {
160                 XValidatableFormComponent xComp = (XValidatableFormComponent)UnoRuntime.queryInterface( XValidatableFormComponent.class,
161                     eventObject.Source );
162                 // the current value
163                 Object value = xComp.getCurrentValue();
164 
165                 // the current validity flag
166                 boolean isValid = xComp.isValid();
167 
168                 m_statusField.setPropertyValue("Label", isValid ? "valid" : "invalid" );
169                 m_statusField.setPropertyValue( "TextColor", new Integer( isValid ? 0x008000 : 0x800000 ) );
170 
171                 String validityMessage = "";
172                 if ( !isValid )
173                     validityMessage = m_validator.explainInvalid( value );
174                 m_explanationField.setPropertyValue( "Label", validityMessage );
175             }
176         }
177         catch( com.sun.star.uno.Exception e )
178         {
179             e.printStackTrace( System.out );
180         }
181     }
182 
183 }
184