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

210 lines
6.8 KiB

/*
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved.
*/
package com.fr.design.designer.creator;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ContainerEvent;
import java.beans.IntrospectionException;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRBorderLayoutAdapter;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.form.layout.FRBorderLayout;
import com.fr.design.i18n.Toolkit;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBorderLayout;
import com.fr.general.ComparatorUtils;
/**
* @author richer
* @since 6.5.3
*/
public class XWBorderLayout extends XLayoutContainer {
private int Num = 5;
public XWBorderLayout(){
super(new WBorderLayout(),new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT));
}
public XWBorderLayout(WBorderLayout widget, Dimension initSize) {
super(widget, initSize);
}
@Override
protected String getIconName() {
return "layout_border.png";
}
/**
* 默认名称
* @return 名称
*/
@Override
public String createDefaultName() {
return "border";
}
/**
* 转化成相应 WBorderLayout
* @return 相应 WBorderLayout
*/
@Override
public WBorderLayout toData() {
return (WBorderLayout) data;
}
@Override
protected void initLayoutManager() {
this.setLayout(new FRBorderLayout(toData().getHgap(), toData().getVgap()));
}
/**
* 初始大小
* @return 初始大小
*/
@Override
public Dimension initEditorSize() {
return new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT);
}
/**
* 得到属性名
* @return 属性名
* @throws java.beans.IntrospectionException 抛错
*/
@Override
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException {
return new CRPropertyDescriptor[] {
new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Basic_Component_Name")),
new CRPropertyDescriptor("customTitleName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Title"))
};
}
/**
* 将WLayout转换为XLayoutContainer
*/
@Override
public void convert() {
isRefreshing = true;
WBorderLayout wb = this.toData();
this.removeAll();
String[] arrs = {WBorderLayout.NORTH, WBorderLayout.SOUTH, WBorderLayout.EAST, WBorderLayout.WEST, WBorderLayout.CENTER};
for (int i = 0; i < arrs.length; i++) {
Widget wgt = wb.getLayoutWidget(arrs[i]);
if (wgt != null) {
XWidgetCreator comp = (XWidgetCreator) XCreatorUtils.createXCreator(wgt, calculatePreferredSize(wgt));
this.add(comp, arrs[i]);
comp.setBackupParent(this);
}
}
isRefreshing = false;
}
/**
* 设计界面中有组件添加时,要通知WLayout容器重新paint
* @param e 事件
*/
@Override
public void componentAdded(ContainerEvent e) {
if (isRefreshing) {
return;
}
XWidgetCreator creator = (XWidgetCreator) e.getChild();
BorderLayout b = (BorderLayout) getLayout();
Object constraints = b.getConstraints(creator);
WBorderLayout wb = this.toData();
Widget w = creator.toData();
add(wb, w, constraints);
doResizePreferredSize(creator, calculatePreferredSize(w));
}
@Override
protected Dimension calculatePreferredSize(Widget wgt) {
WBorderLayout wlayout = this.toData();
Object constraints = wlayout.getConstraints(wgt);
Dimension d = new Dimension();
if (ComparatorUtils.equals(WBorderLayout.NORTH,constraints)) {
d.height = wlayout.getNorthSize();
} else if (ComparatorUtils.equals(WBorderLayout.SOUTH,constraints)) {
d.height = wlayout.getSouthSize();
} else if (ComparatorUtils.equals(WBorderLayout.EAST,constraints)) {
d.width = wlayout.getEastSize();
} else if (ComparatorUtils.equals(WBorderLayout.WEST,constraints)) {
d.width = wlayout.getWestSize();
}
return d;
}
private void doResizePreferredSize(XWidgetCreator comp, Dimension d) {
comp.setPreferredSize(d);
}
/**
* 加入控件
* @param layout 布局
* @param wgt 控件
* @param constraints 方位
*/
public static void add(WBorderLayout layout, Widget wgt, Object constraints) {
if (ComparatorUtils.equals(WBorderLayout.NORTH,constraints)) {
layout.addNorth(wgt);
} else if (ComparatorUtils.equals(WBorderLayout.SOUTH,constraints)) {
layout.addSouth(wgt);
} else if (ComparatorUtils.equals(WBorderLayout.EAST,constraints)) {
layout.addEast(wgt);
} else if (ComparatorUtils.equals(WBorderLayout.WEST,constraints)) {
layout.addWest(wgt);
} else if (ComparatorUtils.equals(WBorderLayout.CENTER,constraints)) {
layout.addCenter(wgt);
}
}
/**
* 重新计算大小
*/
@Override
public void recalculateChildrenSize() {
Dimension d = getSize();
WBorderLayout layout = toData();
layout.setNorthSize(d.height / Num);
layout.setSouthSize(d.height / Num);
layout.setWestSize(d.width / Num);
layout.setEastSize(d.width / Num);
}
/**
* 在添加的时候需要把可拉伸的方向确定,所以重写了add方法
* @param comp 组件
* @param constraints 方位
*/
@Override
public void add(Component comp, Object constraints) {
super.add(comp, constraints);
if (comp == null) {
return;
}
XCreator creator = (XCreator) comp;
// 添加到北边时可拉伸底部
if (ComparatorUtils.equals(BorderLayout.NORTH, constraints)) {
creator.setDirections(new int[]{Direction.BOTTOM});
// 添加到南部时可拉伸顶部
} else if (ComparatorUtils.equals(BorderLayout.SOUTH, constraints)) {
creator.setDirections(new int[]{Direction.TOP});
// 添加到东部的时候可向左边拉伸
} else if (ComparatorUtils.equals(BorderLayout.EAST, constraints)) {
creator.setDirections(new int[]{Direction.LEFT});
// 添加到西部的时候可向右边拉伸
} else if (ComparatorUtils.equals(BorderLayout.WEST, constraints)) {
creator.setDirections(new int[]{Direction.RIGHT});
}
}
@Override
public LayoutAdapter getLayoutAdapter() {
return new FRBorderLayoutAdapter(this);
}
}