/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ptc.tifworkbench.ui;
import com.ptc.tifworkbench.jaxbbinding.ImSolution;
import com.ptc.tifworkbench.generator.SolutionClassGenerator;
import com.ptc.tifworkbench.worker.ClassGenWorker;
import com.ptc.tifworkbench.worker.Status;
import com.ptc.tifworkbench.worker.StatusReporter;
import com.ptc.tifworkbench.generator.ItfClassGenerator;
import com.ptc.tifworkbench.generator.TifGeneratorInterface;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
/**
*
* @author pbowden
*/
public class WrapperGeneratorDlg extends javax.swing.JDialog
{
private ImSolution solution;
/**
* Creates new form WrapperGeneratorDlg
*/
public WrapperGeneratorDlg(java.awt.Frame parent, boolean modal, ImSolution solution)
{
super(parent, modal);
initComponents();
this.solution = solution;
populateGeneratorClasses();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
progGenerate = new javax.swing.JProgressBar();
btnCancel = new javax.swing.JButton();
btnGenerate = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
txtPackage = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
txtDirectory = new javax.swing.JTextField();
btnSelectDir = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
comboGenerator = new javax.swing.JComboBox();
jScrollPane1 = new javax.swing.JScrollPane();
txtGenDescription = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Generate template wrapper classes");
jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
progGenerate.setString("Classes");
progGenerate.setStringPainted(true);
btnCancel.setText("Cancel");
btnCancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCancelActionPerformed(evt);
}
});
btnGenerate.setText("Generate");
btnGenerate.setEnabled(false);
btnGenerate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnGenerateActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(progGenerate, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGap(0, 275, Short.MAX_VALUE)
.addComponent(btnGenerate)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnCancel)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(progGenerate, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnCancel)
.addComponent(btnGenerate))
.addContainerGap())
);
jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jLabel1.setText("Java package");
txtPackage.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txtPackageKeyTyped(evt);
}
});
jLabel2.setText("Generate in directory");
txtDirectory.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txtDirectoryKeyTyped(evt);
}
});
btnSelectDir.setText("jButton1");
btnSelectDir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSelectDirActionPerformed(evt);
}
});
jLabel3.setText("Generator class");
comboGenerator.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
comboGeneratorActionPerformed(evt);
}
});
txtGenDescription.setColumns(20);
txtGenDescription.setRows(5);
jScrollPane1.setViewportView(txtGenDescription);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(comboGenerator, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(txtPackage)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(txtDirectory)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnSelectDir, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jScrollPane1))
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtPackage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnSelectDir))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(comboGenerator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 70, Short.MAX_VALUE)
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-463)/2, (screenSize.height-361)/2, 463, 361);
}// </editor-fold>//GEN-END:initComponents
private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed
this.setVisible(false);
}//GEN-LAST:event_btnCancelActionPerformed
private void txtDirectoryKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtDirectoryKeyTyped
enableControls(txtPackage.getText(), txtDirectory.getText() + evt.getKeyChar());
}//GEN-LAST:event_txtDirectoryKeyTyped
private void txtPackageKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPackageKeyTyped
enableControls(txtPackage.getText() + evt.getKeyChar(), txtDirectory.getText());
}//GEN-LAST:event_txtPackageKeyTyped
private void btnSelectDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSelectDirActionPerformed
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
int returnVal = chooser.showOpenDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
File path = chooser.getSelectedFile();
txtDirectory.setText(path.getAbsolutePath());
enableControls(txtPackage.getText(), txtDirectory.getText());
}
}//GEN-LAST:event_btnSelectDirActionPerformed
private void btnGenerateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGenerateActionPerformed
TifGeneratorInterface classgen = new ItfClassGenerator(solution,
txtPackage.getText(), new File(txtDirectory.getText()));
ClassGenWorker genWorker = new ClassGenWorker(classgen);
classgen.setReporter(genWorker);
// The worker will fire Status property events when the differencer sets
// any new status.
genWorker.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (StatusReporter.STATUS_PROP.equals(evt.getPropertyName()))
{
Status stat = (Status)evt.getNewValue();
progGenerate.setValue(stat.getProgress());
progGenerate.setString(stat.getMessage());
}
}
});
genWorker.execute();
}//GEN-LAST:event_btnGenerateActionPerformed
private void comboGeneratorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboGeneratorActionPerformed
if("comboBoxChanged".equals(evt.getActionCommand()))
{
String classStr = (String)comboGenerator.getSelectedItem();
System.out.println("Selected: " + classStr);
try
{
Class clazz = Class.forName(classStr);
TifGeneratorInterface tifGen = (TifGeneratorInterface)clazz.newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(WrapperGeneratorDlg.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(WrapperGeneratorDlg.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
txtGenDescription.setText("Cannot create generator class " + classStr);
}
}
}//GEN-LAST:event_comboGeneratorActionPerformed
private void enableControls(String pkg, String path)
{
if(path == null || path.length()==0 || pkg == null || pkg.length()==0)
{
btnGenerate.setEnabled(false);
return;
}
File dir = new File(path);
boolean enableGen = isValidJavaPackage(pkg) && dir.isDirectory();
btnGenerate.setEnabled(enableGen);
}
public boolean isValidJavaPackage(String s)
{
if (s == null || s.length() == 0)
return false;
Pattern p = Pattern.compile("^[a-zA-Z_\\$][\\w\\$]*(?:\\.[a-zA-Z_\\$][\\w\\$]*)*$");
boolean valid = p.matcher(s).matches();
return valid;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCancel;
private javax.swing.JButton btnGenerate;
private javax.swing.JButton btnSelectDir;
private javax.swing.JComboBox comboGenerator;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JProgressBar progGenerate;
private javax.swing.JTextField txtDirectory;
private javax.swing.JTextArea txtGenDescription;
private javax.swing.JTextField txtPackage;
// End of variables declaration//GEN-END:variables
private void populateGeneratorClasses()
{
comboGenerator.removeAllItems();
comboGenerator.addItem("com.ptc.tifworkbench.generator.ItfClassGenerator");
comboGenerator.addItem("com.ptc.tifworkbench.generator.SolutionClassGenerator");
Properties props = System.getProperties();
if(System.getProperties().containsKey("genclasses"))
{
String genClasses = System.getProperty("genclasses");
String [] classes = genClasses.split(";");
for(String className : classes)
comboGenerator.addItem(className);
}
}
}