|
|
|
@ -4,11 +4,9 @@ import com.fr.design.constants.UIConstants;
|
|
|
|
|
import com.fr.design.designer.creator.XCreator; |
|
|
|
|
import com.fr.design.designer.creator.XCreatorUtils; |
|
|
|
|
import com.fr.design.designer.creator.XLayoutContainer; |
|
|
|
|
import com.fr.design.designer.creator.XWAbsoluteBodyLayout; |
|
|
|
|
import com.fr.design.designer.creator.XWFitLayout; |
|
|
|
|
import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; |
|
|
|
|
import com.fr.design.designer.treeview.ComponentTreeCellRenderer; |
|
|
|
|
import com.fr.design.designer.treeview.ComponentTreeModel; |
|
|
|
|
import com.fr.design.file.HistoryTemplateListCache; |
|
|
|
|
import com.fr.design.gui.itree.UITreeUI; |
|
|
|
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
|
import com.fr.stable.StringUtils; |
|
|
|
@ -19,9 +17,7 @@ import javax.swing.JPanel;
|
|
|
|
|
import javax.swing.JPopupMenu; |
|
|
|
|
import javax.swing.JTree; |
|
|
|
|
import javax.swing.SwingUtilities; |
|
|
|
|
import javax.swing.tree.DefaultMutableTreeNode; |
|
|
|
|
import javax.swing.tree.TreeCellRenderer; |
|
|
|
|
import javax.swing.tree.TreeNode; |
|
|
|
|
import javax.swing.tree.TreePath; |
|
|
|
|
import javax.swing.tree.TreeSelectionModel; |
|
|
|
|
import java.awt.BorderLayout; |
|
|
|
@ -37,8 +33,9 @@ import java.awt.image.BufferedImage;
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Enumeration; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Vector; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
public class ComponentTree extends JTree { |
|
|
|
|
|
|
|
|
@ -46,6 +43,8 @@ public class ComponentTree extends JTree {
|
|
|
|
|
private ComponentTreeModel model; |
|
|
|
|
private UITreeUI uiTreeUI = new UITreeUI(); |
|
|
|
|
private PopupPreviewPane previewPane; |
|
|
|
|
|
|
|
|
|
private static final Map<String, List<TreePath>> treePathCache = new HashMap<>(); |
|
|
|
|
private static final int PADDING_LEFT = 5; |
|
|
|
|
private static final int PADDING_TOP = 5; |
|
|
|
|
|
|
|
|
@ -85,6 +84,7 @@ public class ComponentTree extends JTree {
|
|
|
|
|
public ComponentTree(FormDesigner designer, ComponentTreeModel model) { |
|
|
|
|
this(designer); |
|
|
|
|
this.setModel(model); |
|
|
|
|
expandTree(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setSelectionPath(TreePath path) { |
|
|
|
@ -138,7 +138,6 @@ public class ComponentTree extends JTree {
|
|
|
|
|
setSelectionPaths(treepath); |
|
|
|
|
if (treepath.length > 0) { |
|
|
|
|
scrollPathToVisible(treepath[0]); |
|
|
|
|
//expandPath(treepath[0]);
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -193,6 +192,20 @@ public class ComponentTree extends JTree {
|
|
|
|
|
return paths; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void setExpandedState(TreePath path, boolean state) { |
|
|
|
|
super.setExpandedState(path, state); |
|
|
|
|
saveTreePath(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 删除key对应的缓存展开路径 |
|
|
|
|
*/ |
|
|
|
|
public void removeTreePath(String key) { |
|
|
|
|
if (!StringUtils.isEmpty(key)) { |
|
|
|
|
treePathCache.remove(key); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setSelectionPath() { |
|
|
|
|
|
|
|
|
@ -232,6 +245,7 @@ public class ComponentTree extends JTree {
|
|
|
|
|
public void refreshTreeRoot() { |
|
|
|
|
model = new ComponentTreeModel(designer, designer.getTopContainer()); |
|
|
|
|
setModel(model); |
|
|
|
|
expandTree(); |
|
|
|
|
setDragEnabled(false); |
|
|
|
|
setDropMode(DropMode.ON_OR_INSERT); |
|
|
|
|
setTransferHandler(new TreeTransferHandler()); |
|
|
|
@ -239,49 +253,62 @@ public class ComponentTree extends JTree {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获得树的展开路径 |
|
|
|
|
* */ |
|
|
|
|
public void getExpandNodes(List<TreePath> searchList) { |
|
|
|
|
getExpandNodes((XLayoutContainer)designer.getTopContainer(),searchList); |
|
|
|
|
* 从缓存中获取展开路径并进行展开 |
|
|
|
|
*/ |
|
|
|
|
public void expandTree() { |
|
|
|
|
expandTree(loadTreePath()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void getExpandNodes(XLayoutContainer container, List<TreePath> searchList) { |
|
|
|
|
TreePath treePath = buildTreePath(container); |
|
|
|
|
if (isExpanded(treePath)) { |
|
|
|
|
searchList.add(treePath); |
|
|
|
|
for (int i = 0, size = container.getXCreatorCount(); i < size; i++) { |
|
|
|
|
XCreator creator = container.getXCreator(i); |
|
|
|
|
if (creator.acceptType(XLayoutContainer.class) || creator.acceptType(XCardSwitchButton.class)) { |
|
|
|
|
getExpandNodes((XLayoutContainer) creator.getXCreator(), searchList); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
* 按照传入参数展开组件树 |
|
|
|
|
*/ |
|
|
|
|
private void expandTree(List<TreePath> list) { |
|
|
|
|
if (list == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//对绝对布局做特殊处理
|
|
|
|
|
if (container.acceptType(XWFitLayout.class)) { |
|
|
|
|
XWFitLayout bodyFitLayout = (XWFitLayout) container; |
|
|
|
|
for (int j = 0; j < bodyFitLayout.getXCreatorCount(); j++) { |
|
|
|
|
//类型是绝对布局并且还是body
|
|
|
|
|
if (bodyFitLayout.getXCreator(j).acceptType(XWAbsoluteBodyLayout.class)) { |
|
|
|
|
container = (XLayoutContainer) bodyFitLayout.getXCreator(j); |
|
|
|
|
getExpandNodes(container, searchList); |
|
|
|
|
for (TreePath treePath : list) { |
|
|
|
|
if (treePath.getLastPathComponent() instanceof XLayoutContainer) { |
|
|
|
|
XLayoutContainer creator = (XLayoutContainer) treePath.getLastPathComponent(); |
|
|
|
|
if (XCreatorUtils.getParentXLayoutContainer(creator) == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
expandPath(treePath); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 将树按照展开路径进行展开 |
|
|
|
|
* */ |
|
|
|
|
public void expandNodes(List<TreePath> list){ |
|
|
|
|
for(TreePath treePath:list) { |
|
|
|
|
if (treePath.getLastPathComponent() instanceof XLayoutContainer) { |
|
|
|
|
XLayoutContainer creator= (XLayoutContainer) treePath.getLastPathComponent(); |
|
|
|
|
if (XCreatorUtils.getParentXLayoutContainer(creator) == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
expandPath(treePath); |
|
|
|
|
* 获得树的展开路径 |
|
|
|
|
*/ |
|
|
|
|
private List<TreePath> getExpandTreePaths() { |
|
|
|
|
List<TreePath> result = new ArrayList<>(); |
|
|
|
|
TreePath rootTreePath = buildTreePath(designer.getTopContainer()); |
|
|
|
|
Enumeration<TreePath> enumeration = getExpandedDescendants(rootTreePath); |
|
|
|
|
if (enumeration != null) { |
|
|
|
|
while (enumeration.hasMoreElements()) { |
|
|
|
|
result.add(enumeration.nextElement()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void saveTreePath() { |
|
|
|
|
String templateID = designer.getTarget().getTemplateID(); |
|
|
|
|
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
if (templateID != null && jt != null && StringUtils.equals(templateID, jt.getTarget().getTemplateID())) { |
|
|
|
|
String key = jt.getEditingFILE().getPath() + templateID; |
|
|
|
|
treePathCache.put(key, getExpandTreePaths()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private List<TreePath> loadTreePath() { |
|
|
|
|
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
if (jt == null) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
String key = jt.getEditingFILE().getPath() + designer.getTarget().getTemplateID(); |
|
|
|
|
|
|
|
|
|
return treePathCache.get(key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private TreePath buildTreePath(Component comp) { |
|
|
|
|