Skip to content

Commit 8001ab5

Browse files
Closes #35 - Populate default utPLSQL code templates
Additional button in preference dialog, will create override ids ut_spec, ut_spec_proc, ut_body, ut_body_proc but will keep all other code templates "as is". Preference settings are considered when generating code templates.
1 parent d42d90b commit 8001ab5

File tree

1 file changed

+115
-6
lines changed

1 file changed

+115
-6
lines changed

sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend

Lines changed: 115 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,24 @@
1515
*/
1616
package org.utplsql.sqldev
1717

18+
import java.awt.event.ActionEvent
19+
import java.awt.event.ActionListener
20+
import java.util.Map
1821
import javax.swing.BorderFactory
22+
import javax.swing.JButton
1923
import javax.swing.JCheckBox
2024
import javax.swing.JPanel
2125
import javax.swing.JSpinner
2226
import javax.swing.JTextField
2327
import javax.swing.SpinnerNumberModel
28+
import javax.swing.table.DefaultTableModel
29+
import oracle.dbtools.raptor.templates.CodeTemplateUtil
2430
import oracle.ide.panels.DefaultTraversablePanel
2531
import oracle.ide.panels.TraversableContext
2632
import oracle.ide.panels.TraversalException
2733
import oracle.javatools.ui.layout.FieldLayoutBuilder
2834
import org.utplsql.sqldev.model.preference.PreferenceModel
2935
import org.utplsql.sqldev.resources.UtplsqlResources
30-
import javax.swing.JButton
31-
import java.awt.event.ActionEvent
32-
import java.awt.event.ActionListener
3336

3437
class PreferencePanel extends DefaultTraversablePanel {
3538
val JPanel runTestPanel = new JPanel();
@@ -46,6 +49,8 @@ class PreferencePanel extends DefaultTraversablePanel {
4649
val SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1);
4750
val JSpinner numberOfTestsPerUnitSpinner = new JSpinner(numberOfTestsPerUnitModel);
4851
val JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox
52+
val DefaultTableModel codeTemplatesModel = new DefaultTableModel(#["Id", "Template"], 0);
53+
val JButton createCodeTemplatesButton = new JButton()
4954
val JCheckBox generateCommentsCheckBox = new JCheckBox
5055
val JCheckBox disableTestsCheckBox = new JCheckBox
5156
val JTextField suitePathTextField = new JTextField
@@ -55,7 +60,7 @@ class PreferencePanel extends DefaultTraversablePanel {
5560
val JTextField rootFolderInOddgenViewTextField = new JTextField
5661
val JCheckBox generateFilesCheckBox = new JCheckBox
5762
val JTextField outputDirectoryTextField = new JTextField
58-
val JButton outputDirectoryBrowse = new JButton();
63+
val JButton outputDirectoryBrowse = new JButton()
5964
val JCheckBox deleteExistingFilesCheckBox = new JCheckBox
6065

6166
new() {
@@ -86,6 +91,7 @@ class PreferencePanel extends DefaultTraversablePanel {
8691
generateTestPanel.border = BorderFactory.createTitledBorder(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"))
8792
val FieldLayoutBuilder b2 = new FieldLayoutBuilder(generateTestPanel)
8893
b2.alignLabelsLeft = true
94+
b2.stretchComponentsWithNoButton = true
8995
b2.add(
9096
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component(
9197
testPackagePrefixTextField))
@@ -115,7 +121,8 @@ class PreferencePanel extends DefaultTraversablePanel {
115121
indentSpacesSpinner))
116122
b2.add(
117123
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")))
119126
// oddgen group
120127
oddgenPanel.border = BorderFactory.createTitledBorder("oddgen")
121128
val FieldLayoutBuilder b3 = new FieldLayoutBuilder(oddgenPanel)
@@ -129,7 +136,8 @@ class PreferencePanel extends DefaultTraversablePanel {
129136
generateFilesCheckBox))
130137
b3.add(
131138
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")))
133141
b3.add(
134142
b3.field.label.withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")).component(
135143
deleteExistingFilesCheckBox))
@@ -142,6 +150,14 @@ class PreferencePanel extends DefaultTraversablePanel {
142150
builder.addVerticalField("", oddgenPanel)
143151
builder.addVerticalSpring
144152

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+
145161
// register action listener for directory chooser
146162
outputDirectoryBrowse.addActionListener(new ActionListener() {
147163
override actionPerformed(ActionEvent event) {
@@ -150,6 +166,98 @@ class PreferencePanel extends DefaultTraversablePanel {
150166
}
151167
})
152168
}
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+
--%suitepathsuitePathTextField.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+
'''
153261
154262
override onEntry(TraversableContext traversableContext) {
155263
var PreferenceModel info = traversableContext.userInformation
@@ -164,6 +272,7 @@ class PreferencePanel extends DefaultTraversablePanel {
164272
testUnitSuffixTextField.text = info.testUnitSuffix
165273
numberOfTestsPerUnitSpinner.value = info.numberOfTestsPerUnit
166274
checkGenerateUtplsqlTestCheckBox.selected = info.checkGenerateUtplsqlTest
275+
loadCodeTemplates
167276
generateCommentsCheckBox.selected = info.generateComments
168277
disableTestsCheckBox.selected = info.disableTests
169278
suitePathTextField.text = info.suitePath

0 commit comments

Comments
 (0)