package de.FeatureModellingTool.Pattern.UI;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Iterator;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.tree.TreePath;
import org.jdesktop.swingx.JXTreeTable;
import de.FeatureModellingTool.Pattern.ConstantDefinition;
import de.FeatureModellingTool.Pattern.ConstantDefinition.PatternType;
import de.FeatureModellingTool.Pattern.UI.PatternTreeNode.NodeType;
import de.FeatureModellingTool.PatternBase.Pattern;
import de.FeatureModellingTool.PatternBase.PatternBase;
import de.FeatureModellingTool.PatternBase.Templete;
import de.reuse.Context;
import de.reuse.ContextImplementation;
public class PatternExplorerImplementation extends JScrollPane implements PatternExplorer {
private static final String INNER_SELECTEDNODE = "innerSelectedNode";
/** ����_�����˵� **/
protected JPopupMenu popupMenu = null;
protected NewPatternAction newPatternAction = null;
protected UpdatePatternAction updatePatternAction = null;
protected RemovePatternAction removePatternAction = null;
protected NewPatternAction newTemplateAction = null;
protected UpdatePatternAction updateTemplateAction = null;
protected RemovePatternAction removeTemplateAction = null;
/** ����_�汾�� **/
private PatternTreeModel patternTreeModel = null;
private JXTreeTable treeTable = null;
private Component container = null;
private PatternInfoEditor pie = null;
/** ��װ�˶Զ���ģ�͵IJ��� **/
protected PatternBase patternBase = null;
/** �������� **/
protected final ContextImplementation context = new ContextImplementation();
public PatternExplorerImplementation() {
PatternTreeNode root = new PatternTreeNode();
this.patternTreeModel = new PatternTreeModel(root);
this.treeTable = new JXTreeTable(this.patternTreeModel);
this.treeTable.addMouseListener(new CustomizationVersionExplorerProbe());
this.context.addContextChangeListener(new ContextChangeListener());
this.newPatternAction = new NewPatternAction(PatternType.Pattern);
this.updatePatternAction = new UpdatePatternAction(PatternType.Pattern);
this.removePatternAction = new RemovePatternAction(PatternType.Pattern);
this.newTemplateAction = new NewPatternAction(PatternType.Template);
this.updateTemplateAction = new UpdatePatternAction(PatternType.Template);
this.removeTemplateAction = new RemovePatternAction(PatternType.Template);
this.popupMenu = new JPopupMenu();
this.popupMenu.add(this.newPatternAction);
this.popupMenu.add(this.updatePatternAction);
this.popupMenu.add(this.removePatternAction);
this.popupMenu.add(this.newTemplateAction);
this.popupMenu.add(this.updateTemplateAction);
this.popupMenu.add(this.removeTemplateAction);
this.pie = new PatternInfoEditor();
}
public Context getContext() {
return context;
}
protected class ContextChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if (de.FeatureModellingTool.Pattern.ConstantDefinition.PATTERN_BASE.equals(propertyName)) {
patternBase = (PatternBase) e.getNewValue();
refreshTreeNodes(patternBase);
}
}
}
private void refreshTreeNodes(PatternBase patternBase) {
PatternTreeNode root = (PatternTreeNode) this.treeTable.getTreeTableModel().getRoot();
for (Iterator<Pattern> itCV = patternBase.getRootLoadedPatterns().iterator(); itCV.hasNext();) {
this.refreshTreeNodes(root, itCV.next());
}
for (Iterator<Pattern> itCV = patternBase.getRootUserDefPatterns().iterator(); itCV.hasNext();) {
this.refreshTreeNodes(root, itCV.next());
}
}
private void refreshTreeNodes(PatternTreeNode parentNode, Pattern pattern) {
PatternTreeNode thisNode = new PatternTreeNode(pattern);
//parentNode.add(thisNode);
patternTreeModel.insertNodeInto(thisNode, parentNode, parentNode.getChildCount());
for (Iterator<Pattern> itPattern = pattern.getChildrenPatterns().iterator(); itPattern.hasNext();) {
this.refreshTreeNodes(thisNode, itPattern.next());
}
for (Iterator<Templete> itTemplate = pattern.getChildrenTempletes().iterator(); itTemplate.hasNext();) {
this.refreshTreeNodes(thisNode, itTemplate.next());
}
}
private void refreshTreeNodes(PatternTreeNode parentNode, Templete template) {
PatternTreeNode thisNode = new PatternTreeNode(template);
//parentNode.add(thisNode);
patternTreeModel.insertNodeInto(thisNode, parentNode, parentNode.getChildCount());
for (Iterator<Templete> itTemplate = template.getChildrenTempletes().iterator(); itTemplate.hasNext();) {
this.refreshTreeNodes(thisNode, itTemplate.next());
}
}
public JComponent getExplorerComponent() {
return this.treeTable;
}
protected abstract class PatternAction extends AbstractAction {
protected PatternType patternType;
public PatternAction(PatternType patternType) {
this.patternType = patternType;
}
}
protected class NewPatternAction extends PatternAction {
protected static final long serialVersionUID = 0L;
public NewPatternAction(PatternType patternType) {
super(patternType);
this.putValue(Action.NAME, "�½�" + ConstantDefinition.patternTypeToString(super.patternType));
}
public void actionPerformed(ActionEvent e) {
if (!isEnabled()) {
return;
}
pie.setEditName("");
int result = JOptionPane.showConfirmDialog(container, pie, (String) this.getValue(Action.NAME), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
String parentId = null;
PatternTreeNode ptn = (PatternTreeNode) getContext().getValue(INNER_SELECTEDNODE);
if (ptn != null) {
if (ptn.getNodeType() == NodeType.ntPattern) {
parentId = ptn.getPattern().getName();
} else {
parentId = ptn.getTemplate().getName();
}
}
PatternTreeNode newPTN = null;
if (this.patternType == PatternType.Pattern) {
Pattern newPattern = newPattern(parentId, pie.getEditName());
newPTN = new PatternTreeNode(newPattern);
} else {
Templete newTemplate = newTemplate(parentId, pie.getEditName());
newTemplate.getFeatureModelEditor().addFeature("root");
newPTN = new PatternTreeNode(newTemplate);
}
if (ptn == null) {
PatternTreeNode root = (PatternTreeNode) patternTreeModel.getRoot();
patternTreeModel.insertNodeInto(newPTN, root, root.getChildCount());
} else {
patternTreeModel.insertNodeInto(newPTN, ptn, ptn.getChildCount());
}
}
}
@Override
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
protected class UpdatePatternAction extends PatternAction {
protected static final long serialVersionUID = 0L;
public UpdatePatternAction(PatternType patternType) {
super(patternType);
this.putValue(Action.NAME, "��" + ConstantDefinition.patternTypeToString(super.patternType));
}
public boolean isEnabled() {
if (!super.isEnabled()) {
return false;
}
PatternTreeNode ptn = (PatternTreeNode) getContext().getValue(INNER_SELECTEDNODE);
return ptn != null && ((ptn.getNodeType() == NodeType.ntPattern && this.patternType == PatternType.Pattern) || (ptn.getNodeType() == NodeType.ntTemplate && this.patternType == PatternType.Template));
}
public void actionPerformed(ActionEvent e) {
if (!isEnabled()) {
return;
}
PatternTreeNode ptn = (PatternTreeNode) getContext().getValue(INNER_SELECTEDNODE);
if (ptn == null) {
return;
}
if (ptn.getNodeType() == NodeType.ntPattern) {
pie.setEditName(ptn.getPattern().getName());
} else {
pie.setEditName(ptn.getTemplate().getName());
}
int result = JOptionPane.showConfirmDialog(container, pie, "��" + ConstantDefinition.patternTypeToString(super.patternType),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
if (ptn.getNodeType() == NodeType.ntPattern) {
updatePattern(pie.getEditName());
} else {
updateTemplate(pie.getEditName());
}
treeTable.updateUI();
}
}
@Override
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
protected class RemovePatternAction extends PatternAction {
protected static final long serialVersionUID = 0L;
public RemovePatternAction(PatternType patternType) {
super(patternType);
this.putValue(Action.NAME, "ɾ��" + ConstantDefinition.patternTypeToString(super.patternType));
}
@Override
public boolean isEnabled() {
if (!super.isEnabled()) {
return false;
}
PatternTreeNode ptn = (PatternTreeNode) getContext().getValue(INNER_SELECTEDNODE);
return ptn != null && ((ptn.getNodeType() == NodeType.ntPattern && this.patternType == PatternType.Pattern && ptn.getPattern().getChildrenPatterns().size() == 0 && ptn.getPattern().getChildrenTempletes().size() == 0) || (ptn.getNodeType() == NodeType.ntTemplate && this.patternType == PatternType.Template && ptn.getTemplate().getChildrenTempletes().size() == 0));
}
public void actionPerformed(ActionEvent e) {
if (!isEnabled()) {
return;
}
PatternTreeNode ptn = (PatternTreeNode) getContext().getValue(INNER_SELECTEDNODE);
if (ptn == null || ptn.getChildCount() > 0) {
return;
}
if (ptn.getNodeType() == NodeType.ntPattern) {
removePattern(ptn.getPattern().getName());
} else {
removeTemplate(ptn.getTemplate().getName());
}
PatternTreeNode parentNode = (PatternTreeNode) ptn.getParent();
parentNode.remove(ptn);
treeTable.updateUI();
}
@Override
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
private Pattern newPattern(String parentId, String patternName) {
Pattern pattern = this.patternBase.addPattern(patternName);
if (parentId != null) {
pattern.setParentPattern(this.patternBase.getPattern(parentId));
this.patternBase.getPattern(parentId).addChildPattern(pattern);
} else {
this.patternBase.addPattern(pattern);
}
return pattern;
}
private void updatePattern(String name) {
}
private void removePattern(String patternName) {
this.patternBase.removePattern(patternName);
}
private Templete newTemplate(String parentId, String templateName) {
Templete template = this.patternBase.addTemplete(templateName);
if (this.patternBase.containsPattern(parentId)) {
this.patternBase.getPattern(parentId).addChildTemplete(template);
template.setParentPattern(this.patternBase.getPattern(parentId));
} else {
this.patternBase.getTemplete(parentId).addChildTemplete(template);
template.setParentTemplete(this.patternBase.getTemplete(parentId));
}
return template;
}
private void updateTemplate(String name) {
}
private void removeTemplate(String templateName) {
this.patternBase.removeTemplete(templateName);
}
protected class CustomizationVersionExplorerProbe extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
PatternTreeNode ptn = null;
TreePath tp = treeTable.getPathForLocation(e.getX(), e.getY());
if (tp != null) {
Object node = tp.getLastPathComponent();
if ((node != null) && node instanceof PatternTreeNode) {
ptn = (PatternTreeNode) node;
}
}
if (ptn != null && (e.getButton() == MouseEvent.BUTTON1 || e.getButton() == MouseEvent.BUTTON3)) {
Templete template = ptn.getNodeType() == NodeType.ntTemplate
? ptn.getTemplate()
: null;
firePropertyChange(ConstantDefinition.CURRENT_TEMPLATE, null, template);
}
if (e.getButton() == MouseEvent.BUTTON3) {
getContext().putValue(INNER_SELECTEDNODE, ptn);
updatePatternAction.firePropertyChange("enabled", false, updatePatternAction.isEnabled());
removePatternAction.firePropertyChange("enabled", false, removePatternAction.isEnabled());
updateTemplateAction.firePropertyChange("enabled", false, updateTemplateAction.isEnabled());
removeTemplateAction.firePropertyChange("enabled", false, removeTemplateAction.isEnabled());
popupMenu.show(treeTable, e.getX(), e.getY());
}
}
}
}