1515 */
1616package org.utplsql.sqldev
1717
18+ import java.awt.event.ActionEvent
19+ import java.awt.event.ActionListener
20+ import java.util.Map
1821import javax.swing.BorderFactory
22+ import javax.swing.JButton
1923import javax.swing.JCheckBox
2024import javax.swing.JPanel
2125import javax.swing.JSpinner
2226import javax.swing.JTextField
2327import javax.swing.SpinnerNumberModel
28+ import javax.swing.table.DefaultTableModel
29+ import oracle.dbtools.raptor.templates.CodeTemplateUtil
2430import oracle.ide.panels.DefaultTraversablePanel
2531import oracle.ide.panels.TraversableContext
2632import oracle.ide.panels.TraversalException
2733import oracle.javatools.ui.layout.FieldLayoutBuilder
2834import org.utplsql.sqldev.model.preference.PreferenceModel
2935import org.utplsql.sqldev.resources.UtplsqlResources
30- import javax.swing.JButton
31- import java.awt.event.ActionEvent
32- import java.awt.event.ActionListener
3336
3437class 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+ --%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+ ' ' '
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