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