15
15
*/
16
16
package org.utplsql.sqldev
17
17
18
+ import java.awt.event.ActionEvent
19
+ import java.awt.event.ActionListener
20
+ import java.util.Map
18
21
import javax.swing.BorderFactory
22
+ import javax.swing.JButton
19
23
import javax.swing.JCheckBox
20
24
import javax.swing.JPanel
21
25
import javax.swing.JSpinner
22
26
import javax.swing.JTextField
23
27
import javax.swing.SpinnerNumberModel
28
+ import javax.swing.table.DefaultTableModel
29
+ import oracle.dbtools.raptor.templates.CodeTemplateUtil
24
30
import oracle.ide.panels.DefaultTraversablePanel
25
31
import oracle.ide.panels.TraversableContext
26
32
import oracle.ide.panels.TraversalException
27
33
import oracle.javatools.ui.layout.FieldLayoutBuilder
28
34
import org.utplsql.sqldev.model.preference.PreferenceModel
29
35
import org.utplsql.sqldev.resources.UtplsqlResources
30
- import javax.swing.JButton
31
- import java.awt.event.ActionEvent
32
- import java.awt.event.ActionListener
33
36
34
37
class PreferencePanel extends DefaultTraversablePanel {
35
38
val JPanel runTestPanel = new JPanel ();
@@ -46,6 +49,8 @@ class PreferencePanel extends DefaultTraversablePanel {
46
49
val SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel (1 , 1 , 10 , 1 );
47
50
val JSpinner numberOfTestsPerUnitSpinner = new JSpinner (numberOfTestsPerUnitModel);
48
51
val JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox
52
+ val DefaultTableModel codeTemplatesModel = new DefaultTableModel (#[" Id" , " Template" ], 0 );
53
+ val JButton createCodeTemplatesButton = new JButton ()
49
54
val JCheckBox generateCommentsCheckBox = new JCheckBox
50
55
val JCheckBox disableTestsCheckBox = new JCheckBox
51
56
val JTextField suitePathTextField = new JTextField
@@ -55,7 +60,7 @@ class PreferencePanel extends DefaultTraversablePanel {
55
60
val JTextField rootFolderInOddgenViewTextField = new JTextField
56
61
val JCheckBox generateFilesCheckBox = new JCheckBox
57
62
val JTextField outputDirectoryTextField = new JTextField
58
- val JButton outputDirectoryBrowse = new JButton ();
63
+ val JButton outputDirectoryBrowse = new JButton ()
59
64
val JCheckBox deleteExistingFilesCheckBox = new JCheckBox
60
65
61
66
new () {
@@ -86,6 +91,7 @@ class PreferencePanel extends DefaultTraversablePanel {
86
91
generateTestPanel. border = BorderFactory . createTitledBorder(UtplsqlResources . getString(" MENU_GENERATE_TEST_LABEL" ))
87
92
val FieldLayoutBuilder b2 = new FieldLayoutBuilder (generateTestPanel)
88
93
b2. alignLabelsLeft = true
94
+ b2. stretchComponentsWithNoButton = true
89
95
b2. add(
90
96
b2. field. label. withText(UtplsqlResources . getString(" PREF_TEST_PACKAGE_PREFIX_LABEL" )). component(
91
97
testPackagePrefixTextField))
@@ -115,7 +121,8 @@ class PreferencePanel extends DefaultTraversablePanel {
115
121
indentSpacesSpinner))
116
122
b2. add(
117
123
b2. field. label. withText(UtplsqlResources . getString(" PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL" )). component(
118
- checkGenerateUtplsqlTestCheckBox))
124
+ checkGenerateUtplsqlTestCheckBox). button(createCodeTemplatesButton). withText(
125
+ UtplsqlResources . getString(" PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL" )))
119
126
// oddgen group
120
127
oddgenPanel. border = BorderFactory . createTitledBorder(" oddgen" )
121
128
val FieldLayoutBuilder b3 = new FieldLayoutBuilder (oddgenPanel)
@@ -129,7 +136,8 @@ class PreferencePanel extends DefaultTraversablePanel {
129
136
generateFilesCheckBox))
130
137
b3. add(
131
138
b3. field. label. withText(UtplsqlResources . getString(" PREF_OUTPUT_DIRECTORY_LABEL" )). component(
132
- outputDirectoryTextField). button(outputDirectoryBrowse). withText(" Bro&wse" ))
139
+ outputDirectoryTextField). button(outputDirectoryBrowse). withText(
140
+ UtplsqlResources . getString(" PREF_OUTPUT_DIRECTORY_BUTTON_LABEL" )))
133
141
b3. add(
134
142
b3. field. label. withText(UtplsqlResources . getString(" PREF_DELETE_EXISTING_FILES_LABEL" )). component(
135
143
deleteExistingFilesCheckBox))
@@ -142,6 +150,14 @@ class PreferencePanel extends DefaultTraversablePanel {
142
150
builder. addVerticalField(" " , oddgenPanel)
143
151
builder. addVerticalSpring
144
152
153
+ // register action listener for create code template button
154
+ createCodeTemplatesButton. addActionListener(new ActionListener () {
155
+ override actionPerformed(ActionEvent event) {
156
+ saveCodeTemplates
157
+ }
158
+
159
+ })
160
+
145
161
// register action listener for directory chooser
146
162
outputDirectoryBrowse. addActionListener(new ActionListener () {
147
163
override actionPerformed(ActionEvent event) {
@@ -150,6 +166,98 @@ class PreferencePanel extends DefaultTraversablePanel {
150
166
}
151
167
})
152
168
}
169
+
170
+ private def loadCodeTemplates () {
171
+ val Map<String , String > map = CodeTemplateUtil . loadFiles()
172
+ for (key : map. keySet) {
173
+ codeTemplatesModel. addRow(#[key, map. get(key)])
174
+ }
175
+ }
176
+
177
+ private def saveCodeTemplates () {
178
+ codeTemplatesModel. addRow(#[" ut_spec" , utSpecTemplate. replaceTabsWithSpaces])
179
+ codeTemplatesModel. addRow(#[" ut_spec_proc" , utSpecProcTemplate. replaceTabsWithSpaces. trimPlusNewLine])
180
+ codeTemplatesModel. addRow(#[" ut_body" , utBodyTemplate. replaceTabsWithSpaces])
181
+ codeTemplatesModel. addRow(#[" ut_body_proc" , utBodyProcTemplate. replaceTabsWithSpaces. trimPlusNewLine])
182
+ CodeTemplateUtil . save(codeTemplatesModel)
183
+ }
184
+
185
+ private def replaceTabsWithSpaces (CharSequence input ) {
186
+ val spaces = String . format(" %1$" + indentSpacesSpinner. value+ " s" , " " )
187
+ return input. toString. replace(" \t " , spaces)
188
+ }
189
+
190
+ private def trimPlusNewLine (String input ) {
191
+ input. trim + System . lineSeparator
192
+ }
193
+
194
+ private def utSpecTemplate () '''
195
+ CREATE OR REPLACE PACKAGE «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text» IS
196
+
197
+ --%suite
198
+ «IF !suitePathTextField.text.empty»
199
+ --%suitepath («suitePathTextField .text »)
200
+ «ENDIF»
201
+
202
+ «utSpecProcTemplate»
203
+ END «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text»;
204
+ /
205
+ ' ' '
206
+
207
+ private def utSpecProcTemplate() ' ' '
208
+ «val withContext = numberOfTestsPerUnitModel. value as Integer > 1 »
209
+ «IF withContext»
210
+ -- % context([procedure_name])
211
+
212
+ «ENDIF »
213
+ «FOR i : 1 .. numberOfTestsPerUnitModel. value as Integer »
214
+ -- % test
215
+ «IF disableTestsCheckBox. selected»
216
+ -- % disabled
217
+ «ENDIF »
218
+ PROCEDURE «testUnitPrefixTextField. text»[procedure_name]«testUnitSuffixTextField. text»«IF withContext»«i»«ENDIF »;
219
+
220
+ «ENDFOR »
221
+ «IF withContext»
222
+ -- % endcontext
223
+
224
+ «ENDIF »
225
+ ' ' '
226
+
227
+ private def utBodyTemplate() ' ' '
228
+ CREATE OR REPLACE PACKAGE BODY «testPackagePrefixTextField. text»[package_name]«testPackageSuffixTextField. text» IS
229
+
230
+ «utBodyProcTemplate»
231
+ END «testPackagePrefixTextField. text»[package_name]«testPackageSuffixTextField. text»;
232
+ /
233
+ ' ' '
234
+
235
+ private def utBodyProcTemplate() ' ' '
236
+ «val withContext = numberOfTestsPerUnitModel. value as Integer > 1 »
237
+ «FOR i : 1 .. numberOfTestsPerUnitModel. value as Integer »
238
+ «IF generateCommentsCheckBox. selected»
239
+ --
240
+ -- test«IF withContext» [procedure_name] case «i»: ... «ENDIF »
241
+ --
242
+ «ENDIF »
243
+ PROCEDURE «testUnitPrefixTextField. text»[procedure_name]«testUnitSuffixTextField. text»«IF withContext»«i»«ENDIF » IS
244
+ l_actual INTEGER : = 0 ;
245
+ l_expected INTEGER : = 1 ;
246
+ BEGIN
247
+ «IF generateCommentsCheckBox. selected»
248
+ -- populate actual
249
+ -- .. .
250
+
251
+ -- populate expected
252
+ -- .. .
253
+
254
+ -- assert
255
+ «ENDIF »
256
+ ut. expect(l_actual). to_equal(l_expected);
257
+ END «testUnitPrefixTextField. text»[procedure_name]«testUnitSuffixTextField. text»«IF withContext»«i»«ENDIF »;
258
+
259
+ «ENDFOR »
260
+ ' ' '
153
261
154
262
override onEntry(TraversableContext traversableContext) {
155
263
var PreferenceModel info = traversableContext.userInformation
@@ -164,6 +272,7 @@ class PreferencePanel extends DefaultTraversablePanel {
164
272
testUnitSuffixTextField.text = info.testUnitSuffix
165
273
numberOfTestsPerUnitSpinner.value = info.numberOfTestsPerUnit
166
274
checkGenerateUtplsqlTestCheckBox.selected = info.checkGenerateUtplsqlTest
275
+ loadCodeTemplates
167
276
generateCommentsCheckBox.selected = info.generateComments
168
277
disableTestsCheckBox.selected = info.disableTests
169
278
suitePathTextField.text = info.suitePath
0 commit comments