package net.sf.minuteProject.console.panel;
import static net.sf.minuteProject.console.utils.UIUtils.createCombo;
import static net.sf.minuteProject.console.utils.UIUtils.createLabel;
import static net.sf.minuteProject.console.utils.UIUtils.createTextField;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.apache.commons.lang.StringUtils;
import net.sf.minuteProject.configuration.bean.strategy.datamodel.PrimaryKeyPolicyPatternEnum;
import net.sf.minuteProject.console.ConsoleSample;
import net.sf.minuteProject.console.face.FillBasicConfiguration;
import net.sf.minuteProject.integration.bean.BasicIntegrationConfiguration;
import net.sf.minuteProject.loader.catalog.databasecatalog.node.Database;
import net.sf.minuteProject.utils.code.RestrictedCodeUtils;
@SuppressWarnings("serial")
public class ModelCommonPanel extends JPanel implements FillBasicConfiguration {
// private Form f;
public static final String root_package = "root package";
public static final String model_name = "model name";
public static final String version_name = "version";
public static final String primary_key_policy = "primary key policy";
public static final String sequence_pattern = "pattern";
public static final String global_sequence_name = "name";
public static final String entity_attached_sequence_suffix = "suffix";
private ConsoleSample consoleSample;
public static final String SEQUENCE = "sequence";
public static final String AUTOINCREMENT = "autoincrement";
public static final String GLOBAL_SEQUENCE = "global sequence";
public static final String ENTITY_ASSOCIATED_SEQUENCE = "entity linked sequence";
private boolean isTargetDirTouched = false;
private JTextField rootPackageTf,
modelNameTf,
targetDirTf,
versionNameTf,
sequencePatternTf;
private JComboBox pkPolicyCb, sequencePatternCb;
private JLabel sequencePatternL, sequenceL, globalSequenceNameL, entityAttachedSequenceSuffixL;
public ModelCommonPanel(ConsoleSample consoleSample) {
this.consoleSample = consoleSample;
globalSequenceNameL = createLabel(global_sequence_name);
entityAttachedSequenceSuffixL = createLabel(entity_attached_sequence_suffix);
}
public void fill(BasicIntegrationConfiguration bic) {
String rootPackage = rootPackageTf.getText();
if (!StringUtils.isEmpty(rootPackage))
bic.setRootpackage(rootPackage);
String modelPackage = modelNameTf.getText();
if (!StringUtils.isEmpty(modelPackage))
bic.setModelName(modelPackage);
// bic.setDefaultBusinesspackage(modelNameTf.getText());
String pkPolicy = pkPolicyCb.getSelectedItem().toString();
bic.setPrimaryKeyPolicy(PrimaryKeyPolicyPatternEnum.getPrimaryKeyPolicy(pkPolicy));
bic.setOutputDir(targetDirTf.getText());
bic.setVersion(versionNameTf.getText());
if (pkPolicy.equals(SEQUENCE)) {
String sequencePattern = sequencePatternCb.getSelectedItem().toString();
bic.setSequencePattern(sequencePattern);
if (sequencePattern.equals(GLOBAL_SEQUENCE))
bic.setSequenceGlobalName(sequencePatternTf.getText());
else
bic.setSequenceEntitySuffix(sequencePatternTf.getText());
}
}
public void fillPanel (JPanel panel) {
panel.add(createLabel(root_package), "skip");
rootPackageTf = createTextField("");
panel.add(rootPackageTf, "wrap");
panel.add(createLabel(model_name), "skip");
modelNameTf = createTextField("",new ModelNameListener());
panel.add(modelNameTf);
panel.add(createLabel(version_name), "center");
versionNameTf = createTextField("1.0");
panel.add(versionNameTf, "wrap para");
panel.add(createLabel(primary_key_policy), "skip");
pkPolicyCb = createCombo(new String[] {SEQUENCE, AUTOINCREMENT}, new PkPolicyItemListener());
panel.add(pkPolicyCb);
// sequence specific
sequenceL = createLabel(sequence_pattern);
panel.add(sequenceL, "center");
sequencePatternCb = createCombo(new String[] {GLOBAL_SEQUENCE, ENTITY_ASSOCIATED_SEQUENCE}, new SequencePatternItemListener());
panel.add(sequencePatternCb, "wrap");
panel.add(createLabel(""), "skip");
setSequencePatternLable();
panel.add(sequencePatternL, "skip, center");
sequencePatternTf = createTextField("");
panel.add(sequencePatternTf, "wrap para");
//sequence end
panel.add(createLabel("target dir"), "skip");
targetDirTf = createTextField(getDefaultTargetDir(), new TargetDirListener());
panel.add(targetDirTf, "span, growx, wrap para");
}
private void setSequencePatternLable() {
if (sequencePatternL==null)
sequencePatternL = createLabel("");
if (sequencePatternCb.getSelectedItem().toString().equals(GLOBAL_SEQUENCE))
sequencePatternL.setText(global_sequence_name);
else
sequencePatternL.setText(entity_attached_sequence_suffix);
}
private class PkPolicyItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange()==ItemEvent.SELECTED) {
if (e.getItem().toString().equals(SEQUENCE)) {
showSequenceDetails();
} else {
hideSequenceDetails();
}
}
}
}
private class SequencePatternItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange()==ItemEvent.SELECTED) {
setSequencePatternLable();
}
}
}
private void hideSequenceDetails() {
sequenceL.setVisible(false);
sequencePatternCb.setVisible(false);
sequencePatternL.setVisible(false);
sequencePatternTf.setVisible(false);
}
private void showSequenceDetails() {
sequenceL.setVisible(true);
sequencePatternCb.setVisible(true);
setSequencePatternLable();
sequencePatternL.setVisible(true);
sequencePatternTf.setVisible(true);
}
private class TargetDirListener implements FocusListener {
String value, previousValue;
public void focusLost(FocusEvent arg0) {
value = targetDirTf.getText();
if (previousValue!=null && value!=null) {
if (!isTargetDirTouched)
isTargetDirTouched=!(previousValue.equals(value));
}
}
public void focusGained(FocusEvent arg0) {
previousValue = targetDirTf.getText();
}
}
private class ModelNameListener implements FocusListener {
public void focusLost(FocusEvent arg0) {
rebuildDefaultTargetDir();
}
public void focusGained(FocusEvent arg0) {
}
}
public void rebuildDefaultTargetDir() {
if (!isTargetDirTouched) {
targetDirTf.setText(getDefaultTargetDir());
}
}
private String getDefaultTargetDir() {
StringBuffer sb = new StringBuffer ("../output");
String formattedModelName = getFormattedModelName();
if (formattedModelName!=null)
sb.append("/"+formattedModelName);
String formattedTargetName = getFormattedTargetName();
if (formattedTargetName!=null)
sb.append("/"+formattedTargetName);
return sb.toString();
}
private String getFormattedTargetName() {
return getFormattedName(getTechnologyName());
}
private String getTechnologyName() {
return consoleSample.getTargetPanel().getTargetTechnology();
}
private String getFormattedModelName() {
return getFormattedName(modelNameTf.getText());
}
private String getFormattedName(String name) {
if (name==null || name.trim().equals(""))
return null;
return getJavaFormattedName(name);
}
private String getJavaFormattedName(String text) {
return RestrictedCodeUtils.convertToValidJava(text);
}
public void applyCurrentPrimaryKeyPolicy(Database database) {
pkPolicyCb.setSelectedItem(database.getPrimaryKeyPolicy().getType());
}
}