You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
11 KiB
263 lines
11 KiB
package com.fr.design.gui.frpane; |
|
|
|
import com.fine.theme.icon.LazyIcon; |
|
import com.fr.base.BaseUtils; |
|
import com.fr.data.impl.TreeNodeAttr; |
|
import com.fr.data.impl.TreeNodeWrapper; |
|
import com.fr.design.actions.UpdateAction; |
|
import com.fr.design.beans.BasicBeanPane; |
|
import com.fr.design.dialog.FineJOptionPane; |
|
import com.fr.design.gui.controlpane.ControlPane; |
|
import com.fr.design.gui.controlpane.NameableCreator; |
|
import com.fr.design.gui.controlpane.UnrepeatedNameHelper; |
|
import com.fr.design.gui.icheckbox.UICheckBox; |
|
import com.fr.design.gui.icontainer.UIScrollPane; |
|
import com.fr.design.gui.ilable.UILabel; |
|
import com.fr.design.gui.itoolbar.UIToolbar; |
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
import com.fr.design.mainframe.DesignerContext; |
|
import com.fr.design.menu.ToolBarDef; |
|
import com.fr.general.ComparatorUtils; |
|
|
|
import com.fr.general.NameObject; |
|
import com.fr.stable.Nameable; |
|
|
|
import javax.swing.JPanel; |
|
import javax.swing.event.TreeSelectionEvent; |
|
import javax.swing.event.TreeSelectionListener; |
|
import javax.swing.JTree; |
|
import javax.swing.BorderFactory; |
|
import javax.swing.JOptionPane; |
|
import javax.swing.tree.DefaultTreeModel; |
|
import javax.swing.tree.TreePath; |
|
import javax.swing.tree.TreeSelectionModel; |
|
import javax.swing.tree.DefaultMutableTreeNode; |
|
import javax.swing.tree.TreeCellRenderer; |
|
import javax.swing.tree.DefaultTreeCellRenderer; |
|
import java.awt.BorderLayout; |
|
import java.awt.Dimension; |
|
import java.awt.Component; |
|
import java.awt.event.ActionEvent; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
|
|
public class JTreeControlPane extends ControlPane { |
|
// 添加一个treeNode |
|
private AddTreeNodeAction addTreeNode; |
|
// 移除一个treeNode |
|
private RemoveTreeNodeAction removeTreeNode; |
|
|
|
private BasicBeanPane updatePane; |
|
|
|
private JTree tree; |
|
private DefaultTreeModel defaultTreeModel; |
|
|
|
private UICheckBox isPerformanceFirst; |
|
|
|
public JTreeControlPane(NameableCreator[] creators, BasicBeanPane updatePane) { |
|
this.initComponents(creators, updatePane); |
|
} |
|
|
|
private void initComponents(NameableCreator[] creators, BasicBeanPane updatePane) { |
|
this.setLayout(new BorderLayout(2, 2)); |
|
this.updatePane = updatePane; |
|
// LeftPane |
|
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
|
JPanel northPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); |
|
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Root")); |
|
defaultTreeModel = new DefaultTreeModel(rootNode); |
|
DefaultMutableTreeNode firstLayer = new DefaultMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradation") + 1, new TreeNodeAttr())); |
|
tree = new JTree(defaultTreeModel); |
|
tree.setRootVisible(false); |
|
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).getLastLeaf().add(firstLayer); |
|
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); |
|
leftPane.add(new UIScrollPane(tree), BorderLayout.CENTER); |
|
tree.addTreeSelectionListener(new TreeSelectionListener() { |
|
public void valueChanged(TreeSelectionEvent e) { |
|
JTreeControlPane.this.updatePane.updateBean(); |
|
refreshCurrentUpdatePane(); |
|
checkButtonEnabled(); |
|
} |
|
}); |
|
tree.setPreferredSize(new Dimension(170, 350)); |
|
tree.setCellRenderer(renderer); |
|
|
|
// JTreeControlPane控制栏 |
|
ToolBarDef toolbarDef = new ToolBarDef(); |
|
toolbarDef.addShortCut(addTreeNode = new AddTreeNodeAction(creators)); |
|
toolbarDef.addShortCut(removeTreeNode = new RemoveTreeNodeAction()); |
|
UIToolbar toolBar = ToolBarDef.createJToolBar(); |
|
toolbarDef.updateToolBar(toolBar); |
|
leftPane.add(toolBar, BorderLayout.NORTH); |
|
|
|
|
|
isPerformanceFirst = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Performance_First")); |
|
northPane.add(new UILabel(" ")); |
|
northPane.add(isPerformanceFirst); |
|
this.add(northPane, BorderLayout.NORTH); |
|
this.add(leftPane, BorderLayout.WEST); |
|
this.add(this.updatePane, BorderLayout.CENTER); |
|
|
|
this.checkButtonEnabled(); |
|
} |
|
|
|
@Override |
|
protected String title4PopupWindow() { |
|
return "tree"; |
|
} |
|
|
|
private void checkButtonEnabled() { |
|
this.addTreeNode.setEnabled(true); |
|
this.removeTreeNode.setEnabled(true); |
|
|
|
// richer:当选择了树根节点时,不能被删除、上移和下移 |
|
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
TreePath rootPath = new TreePath(defaultTreeModel.getPathToRoot(root)); |
|
if (ComparatorUtils.equals(rootPath, tree.getSelectionPath())) { |
|
this.removeTreeNode.setEnabled(false); |
|
} |
|
} |
|
|
|
public void populate(NameObject nameObject) { |
|
// 重新添加tree节点的时候需要remove掉原来的所有子节点 |
|
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).removeAllChildren(); |
|
Object obj = nameObject.getObject(); |
|
TreeNodeAttr[] treeNodeAttr = null; |
|
if (obj instanceof TreeNodeAttr[]) { |
|
treeNodeAttr = ((TreeNodeAttr[]) obj); |
|
isPerformanceFirst.setSelected(false); |
|
}else if (obj instanceof TreeNodeWrapper) { |
|
treeNodeAttr = ((TreeNodeWrapper) obj).getTreeNodeAttrs(); |
|
isPerformanceFirst.setSelected(((TreeNodeWrapper) obj).isPerformanceFirst()); |
|
} |
|
|
|
int count = treeNodeAttr == null ? 0 : treeNodeAttr.length; |
|
//将树的层次一层一层的加上去 |
|
DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
for (int i = 0; i < count; i++) { |
|
|
|
DefaultMutableTreeNode node4add = new DefaultMutableTreeNode( |
|
new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradation") + (i + 1), treeNodeAttr[i])); |
|
node4root.add(node4add); |
|
node4root = node4add; |
|
} |
|
|
|
defaultTreeModel.reload(); |
|
expandAll(tree, true); |
|
tree.setSelectionRow(0); |
|
} |
|
|
|
public NameObject update() { |
|
TreeNodeWrapper treeNodeWrapper = new TreeNodeWrapper(isPerformanceFirst.isSelected(), updateTreeNodeAttr()); |
|
return new NameObject("tree", treeNodeWrapper); |
|
} |
|
|
|
public TreeNodeAttr[] updateTreeNodeAttr() { |
|
updatePane.updateBean(); |
|
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
List<TreeNodeAttr> nodeList = new ArrayList<TreeNodeAttr>(); |
|
|
|
for (; root != null; root = root.getNextNode()) { |
|
if (!(root.getUserObject() instanceof NameObject)) { |
|
continue; |
|
} |
|
NameObject no = (NameObject) root.getUserObject(); |
|
if (no.getObject() instanceof TreeNodeAttr) { |
|
nodeList.add((TreeNodeAttr) no.getObject()); |
|
} |
|
} |
|
|
|
return nodeList.toArray(new TreeNodeAttr[nodeList.size()]); |
|
} |
|
|
|
public void refreshCurrentUpdatePane() { |
|
TreePath selectTreePath = this.tree.getSelectionPath(); |
|
if (selectTreePath != null) { |
|
Object object = ((DefaultMutableTreeNode) selectTreePath.getLastPathComponent()).getUserObject(); |
|
if (object != null) { |
|
JTreeControlPane.this.updatePane.populateBean(object); |
|
} |
|
} |
|
} |
|
|
|
|
|
private class AddTreeNodeAction extends UpdateAction { |
|
private NameableCreator creator; |
|
|
|
public AddTreeNodeAction(NameableCreator[] creators) { |
|
this.creator = creators[0]; |
|
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add")); |
|
this.setMnemonic('A'); |
|
this.setSmallIcon(new LazyIcon("add")); |
|
} |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
// TODO add tree node |
|
final DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
Nameable nameable = creator.createNameable(new UnrepeatedNameHelper() { |
|
|
|
@Override |
|
public String createUnrepeatedName(String prefix) { |
|
DefaultMutableTreeNode innerNode = node; |
|
int nodeCount = 0; |
|
do { |
|
nodeCount++; |
|
} while ((innerNode = innerNode.getNextNode()) != null); |
|
return prefix + nodeCount; |
|
} |
|
}); |
|
|
|
|
|
node.getLastLeaf().add(new DefaultMutableTreeNode(nameable)); |
|
defaultTreeModel.reload(); |
|
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf())); |
|
tree.setSelectionPath(path); |
|
} |
|
} |
|
|
|
private class RemoveTreeNodeAction extends UpdateAction { |
|
public RemoveTreeNodeAction() { |
|
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); |
|
this.setMnemonic('R'); |
|
this.setSmallIcon(new LazyIcon("remove")); |
|
} |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
// TODO remove tree node |
|
int val = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", |
|
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); |
|
if (val != JOptionPane.OK_OPTION) { |
|
return; |
|
} |
|
TreePath selectionPath = tree.getSelectionPath(); |
|
DefaultMutableTreeNode tmpNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent(); |
|
tmpNode.removeFromParent(); |
|
defaultTreeModel.reload(); |
|
DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); |
|
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf())); |
|
tree.setSelectionPath(path); |
|
} |
|
} |
|
|
|
TreeCellRenderer renderer = new DefaultTreeCellRenderer() { |
|
@Override |
|
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { |
|
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); |
|
if (leaf) { |
|
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/default_widget.png")); |
|
} else { |
|
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/arrow_branch.png")); |
|
} |
|
|
|
if (value instanceof DefaultMutableTreeNode) { |
|
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; |
|
Object userObj = node.getUserObject(); |
|
if (userObj instanceof NameObject) { |
|
this.setText(((NameObject) userObj).getName()); |
|
} |
|
} |
|
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0)); |
|
return this; |
|
} |
|
}; |
|
}
|
|
|