帆软报表设计器源代码。
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.
 
 
 
 

163 lines
5.0 KiB

package com.fr.design.designer.treeview;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
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.XWidgetCreator;
import com.fr.design.mainframe.FormDesigner;
import com.fr.form.ui.Widget;
import com.fr.log.FineLoggerFactory;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import java.awt.Component;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class ComponentTreeModel implements TreeModel {
private ArrayList<TreeModelListener> listeners = new ArrayList<TreeModelListener>();
private Component root;
private FormDesigner designer;
private final int ABSOLUTE_AS_BODY_NOT_FOUND = -1;
public ComponentTreeModel(FormDesigner designer, Component root) {
this.designer = designer;
this.root = root;
}
@Override
public Object getRoot() {
return root;
}
@Override
public Object getChild(Object parent, int index) {
if (parent != null && parent instanceof XLayoutContainer) {
XLayoutContainer xlayout = (XLayoutContainer) parent;
XCreator creator = xlayout.getXCreator(index);
//绝对布局作为body的时候不显示自适应布局父层
int absoluteBodyIndex = getAbsoluteBodyIndex(creator);
if (absoluteBodyIndex > ABSOLUTE_AS_BODY_NOT_FOUND){
return creator.getComponent(absoluteBodyIndex);
}
return creator.getXCreator();
}
return null;
}
/**
* 设置根节点
*
* @param root 根节点
*/
public void setRoot(Component root){
this.root=root;
}
@Override
public int getChildCount(Object parent) {
if (parent != null && parent instanceof XLayoutContainer) {
XLayoutContainer xlayout = (XLayoutContainer) parent;
return xlayout.getShowXCreatorCount();
}
return 0;
}
/**
* 是否为叶子节点
* @param node 对象
* @return 是则返回true
*/
@Override
public boolean isLeaf(Object node) {
if (node != null && node instanceof XCreator) {
return ((XCreator) node).isComponentTreeLeaf();
}
return true;
}
/**
* 树节点值改变
* @param path 树结构路径
* @param newValue 新值
*/
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
Object lastObject = path.getLastPathComponent();
if (lastObject != newValue) {
if (newValue instanceof String) {
// Change varaible name
XCreator component = (XCreator) lastObject;
Widget wgt = ((XWidgetCreator)component).toData();
wgt.setWidgetName((String)newValue);
designer.getEditListenerTable().fireCreatorModified(component, DesignerEvent.CREATOR_EDITED);
}
TreeModelEvent event = new TreeModelEvent(this, path.getPath());
fireEvent("treeNodesChanged", event);
}
}
@Override
public int getIndexOfChild(Object parent, Object child) {
if (parent != null && parent instanceof XLayoutContainer) {
return ((XLayoutContainer)parent).getIndexOfChild(child);
}
return -1;
}
/**
* 添加树事件
* @param l 事件
*/
@Override
public void addTreeModelListener(TreeModelListener l) {
if (!listeners.contains(l)) {
listeners.add(l);
}
}
/**
* 删除树事件
* @param l 事件
*/
@Override
public void removeTreeModelListener(TreeModelListener l) {
if (listeners.contains(l)) {
listeners.remove(l);
}
}
protected void fireEvent(String eventName, TreeModelEvent evt) {
try {
Method m = TreeModelListener.class.getMethod(eventName, TreeModelEvent.class);
for (TreeModelListener listener : listeners) {
m.invoke(listener, evt);
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
private int getAbsoluteBodyIndex(XCreator xCreator){
//绝对布局作为body,父层是自适应布局,找到绝对布局位于父层的index
int index = ABSOLUTE_AS_BODY_NOT_FOUND;
if (xCreator.acceptType(XWFitLayout.class)){
XWFitLayout bodyFitLayout = (XWFitLayout)xCreator;
for (int i = 0;i < bodyFitLayout.getXCreatorCount();i++){
//类型是绝对布局并且还是body
if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){
index = i;
}
}
}
return index;
}
}