1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.x.form.support;
14
15 import java.lang.reflect.Field;
16
17 import com.eviware.soapui.SoapUI;
18 import com.eviware.soapui.support.UISupport;
19 import com.eviware.soapui.support.action.swing.ActionList;
20 import com.eviware.x.form.XForm;
21 import com.eviware.x.form.XFormDialog;
22 import com.eviware.x.form.XFormDialogBuilder;
23 import com.eviware.x.form.XFormFactory;
24 import com.eviware.x.form.XFormField;
25 import com.eviware.x.form.XFormTextField;
26 import com.eviware.x.form.XForm.FieldType;
27
28 /***
29 * Builds XFormDialogs from AForm/AField annotated classes/interfaces
30 *
31 * @author ole.matzura
32 */
33
34 public class ADialogBuilder
35 {
36 public static XFormDialog buildDialog( Class<? extends Object> formClass )
37 {
38 return buildDialog( formClass, null );
39 }
40
41 public static XFormDialog buildDialog( Class<? extends Object> formClass, ActionList actions )
42 {
43 AForm formAnnotation = formClass.getAnnotation( AForm.class );
44 if( formAnnotation == null )
45 {
46 throw new RuntimeException( "formClass is not annotated correctly.." );
47 }
48
49 XFormDialogBuilder builder = XFormFactory.createDialogBuilder(formAnnotation.name());
50 XForm form = builder.createForm( "Basic" );
51
52 for( Field field : formClass.getFields() )
53 {
54 AField fieldAnnotation = field.getAnnotation( AField.class );
55 if( fieldAnnotation != null )
56 {
57 addFormField( form, fieldAnnotation );
58 }
59 }
60
61 ActionList defaultActions = formAnnotation.helpUrl().length() == 0 ?
62 builder.buildOkCancelActions() : builder.buildOkCancelHelpActions( formAnnotation.helpUrl() );
63
64 if( actions == null )
65 actions = defaultActions;
66 else
67 actions.addActions( defaultActions );
68
69 XFormDialog dialog = builder.buildDialog( actions, formAnnotation.description(),
70 UISupport.createImageIcon( formAnnotation.icon() ));
71
72 return dialog;
73 }
74
75 public static XFormDialog buildTabbedDialog( Class<? extends Object> tabbedFormClass, ActionList actions )
76 {
77 AForm formAnnotation = tabbedFormClass.getAnnotation( AForm.class );
78 if( formAnnotation == null )
79 {
80 throw new RuntimeException( "formClass is not annotated correctly.." );
81 }
82
83 XFormDialogBuilder builder = XFormFactory.createDialogBuilder(formAnnotation.name());
84
85 for( Field field : tabbedFormClass.getFields() )
86 {
87 AField fieldAnnotation = field.getAnnotation( AField.class );
88 if( fieldAnnotation != null )
89 {
90 XForm form = builder.createForm( fieldAnnotation.name() );
91
92 try
93 {
94 Class formClass = Class.forName( fieldAnnotation.description() );
95
96 for( Field formField : formClass.getFields() )
97 {
98 AField formFieldAnnotation = formField.getAnnotation( AField.class );
99 if( formFieldAnnotation != null )
100 {
101 addFormField( form, formFieldAnnotation );
102 }
103 }
104 }
105 catch( Exception e )
106 {
107 SoapUI.logError( e );
108 }
109 }
110 }
111
112 ActionList defaultActions = formAnnotation.helpUrl().length() == 0 ?
113 builder.buildOkCancelActions() : builder.buildOkCancelHelpActions( formAnnotation.helpUrl() );
114
115 if( actions == null )
116 actions = defaultActions;
117 else
118 actions.addActions( defaultActions );
119
120 XFormDialog dialog = builder.buildDialog( actions, formAnnotation.description(),
121 UISupport.createImageIcon( formAnnotation.icon() ));
122
123 return dialog;
124 }
125
126 private static void addFormField( XForm form, AField fieldAnnotation )
127 {
128 XFormField field = null;
129
130 switch( fieldAnnotation.type() )
131 {
132 case STRING :
133 field = form.addTextField( fieldAnnotation.name(), fieldAnnotation.description(), FieldType.TEXT );
134 break;
135 case INT :
136 field = form.addTextField( fieldAnnotation.name(), fieldAnnotation.description(), FieldType.TEXT );
137 ((XFormTextField)field).setWidth( 10 );
138 break;
139 case STRINGAREA :
140 field = form.addTextField( fieldAnnotation.name(), fieldAnnotation.description(), FieldType.TEXTAREA );
141 break;
142 case BOOLEAN :
143 field = form.addCheckBox( fieldAnnotation.name(), fieldAnnotation.description() );
144 break;
145 case FILE :
146 field = form.addTextField( fieldAnnotation.name(), fieldAnnotation.description(), FieldType.FILE );
147 break;
148 case FOLDER :
149 field = form.addTextField( fieldAnnotation.name(), fieldAnnotation.description(), FieldType.FOLDER );
150 break;
151 case ENUMERATION :
152 field = form.addComboBox( fieldAnnotation.name(), fieldAnnotation.values(), fieldAnnotation.description() );
153 break;
154 case RADIOGROUP :
155 field = form.addComponent( fieldAnnotation.name(), new XFormRadioGroup( fieldAnnotation.values() ) );
156 break;
157 case MULTILIST :
158 field = form.addComponent( fieldAnnotation.name(), new XFormMultiSelectList( fieldAnnotation.values() ) );
159 break;
160 default :
161 System.out.println( "Unsupported field type: " + fieldAnnotation.type() );
162 }
163
164 if( field != null )
165 field.setEnabled( fieldAnnotation.enabled() );
166 }
167
168 }