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

1010 lines
31 KiB

/*
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved.
*/
package com.fr.poly;
import java.awt.AWTEvent;
import java.awt.Adjustable;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.KeyStroke;
import com.fr.base.BaseUtils;
import com.fr.base.FRContext;
import com.fr.base.GraphHelper;
import com.fr.base.ScreenResolution;
import com.fr.design.DesignState;
import com.fr.design.DesignerEnvManager;
import com.fr.design.actions.edit.CopyAction;
import com.fr.design.actions.edit.CutAction;
import com.fr.design.actions.edit.PasteAction;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.EditingState;
import com.fr.design.designer.TargetComponent;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.AuthorityEditPane;
import com.fr.design.mainframe.CellElementPropertyPane;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.EastRegionContainerPane;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.mainframe.ElementCasePaneAuthorityEditPane;
import com.fr.design.mainframe.FormScrollBar;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.NoSupportAuthorityEdit;
import com.fr.design.mainframe.ReportComponent;
import com.fr.design.mainframe.cell.QuickEditorRegion;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.ShortCut;
import com.fr.design.menu.ToolBarDef;
import com.fr.design.roleAuthority.RolesAlreadyEditedPane;
import com.fr.design.scrollruler.HorizontalRuler;
import com.fr.design.scrollruler.ScrollRulerComponent;
import com.fr.design.scrollruler.VerticalRuler;
import com.fr.design.selection.QuickEditor;
import com.fr.design.selection.SelectionEvent;
import com.fr.design.selection.SelectionListener;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.general.ComparatorUtils;
import com.fr.grid.selection.Selection;
import com.fr.poly.actions.DeleteBlockAction;
import com.fr.poly.creator.BlockCreator;
import com.fr.poly.creator.BlockEditor;
import com.fr.poly.creator.ECBlockCreator;
import com.fr.poly.creator.ECBlockEditor;
import com.fr.poly.creator.PolyElementCasePane;
import com.fr.poly.hanlder.DataEditingListener;
import com.fr.poly.hanlder.PolyDesignerDropTarget;
import com.fr.poly.model.AddedData;
import com.fr.poly.model.AddingData;
import com.fr.report.ReportHelper;
import com.fr.report.block.Block;
import com.fr.report.poly.PolyWorkSheet;
import com.fr.report.poly.TemplateBlock;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.unit.FU;
import com.fr.stable.unit.OLDPIX;
import com.fr.stable.unit.UNIT;
import com.fr.stable.unit.UnitRectangle;
/**
* @author richer
* @since 6.5.3 聚合报表的设计块不包括底部和右边的滚动条以及左边和上边的像素标识条
*/
/*
* August: 1.PolyDesigner应该有个SelectableElement类似于ElementCasePane的selection,
* 那么究竟是creator可选还是editor可选呢 2.考虑到creator本来就是存在的而editor是由于点击了creator才生成的,
* PolyDesigner的SelectableElement是creator
* 3.加入聚合块是ECBLOCK时那么其选中的东西应该是什么呢是聚合块还是里面的单元格或者悬浮元素
*/
public class PolyDesigner extends ReportComponent<PolyWorkSheet, PolyElementCasePane, BlockCreator> implements ScrollRulerComponent {
/**
* 选中的类型--1.什么都没选中2.选中一个聚合块内部的内容3.选中聚合块本省
*/
public static enum SelectionType {
NONE, INNER, BLOCK
}
private SelectionType selectedtype = SelectionType.NONE;
private AddingData addingData;
private AddedData addedData;
private DataEditingListener editingListener;
private BlockCreator selection;
// 水平和垂直滚动条的值
private int horizontalValue = 0;
private int verticalValue = 0;
private transient ArrayList<TemplateBlock> clip_board = new ArrayList<TemplateBlock>();
// richer:鼠标滚轮每滚动一下,PolyDesignPane的尺寸就改变ROTATIONS这么多
private static final int ROTATIONS = 50;
private JScrollBar verScrollBar;
private JScrollBar horScrollBar;
private JComponent polyArea;
private PolyComponetsBar polyComponetsBar = new PolyComponetsBar();
private JComponent[] toolBarComponent = null;
private int resolution = ScreenResolution.getScreenResolution();
public PolyDesigner(PolyWorkSheet report) {
super(report);
setDoubleBuffered(true);
// 为了处理键盘事件,需要FormDesigner能够获取焦点
setFocusable(true);
setFocusTraversalKeysEnabled(false);
initInputActionMap();
this.addedData = new AddedData(this);
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK);
setOpaque(true);
initComponents();
this.initDataListeners();
this.initPolyBlocks();
this.setFocusTraversalKeysEnabled(false);
new PolyDesignerDropTarget(this);
toolBarComponent = new JComponent[]{new CutAction(this).createToolBarComponent(), new CopyAction(this).createToolBarComponent(), new PasteAction(this).createToolBarComponent(), new DeleteBlockAction(this).createToolBarComponent()};
this.addSelectionChangeListener(new SelectionListener() {
@Override
public void selectionChanged(SelectionEvent e) {
BlockEditor current_editor = selection.getEditor();
elementCasePane = selection.getEditingElementCasePane();
addEditor(current_editor);
current_editor.setBounds(selection.getBounds());
LayoutUtils.layoutRootContainer(PolyDesigner.this);
current_editor.resetSelectionAndChooseState();
current_editor.requestFocus();
}
});
}
private void initComponents() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel ployareaPane = new JPanel(new PolyDesignerLayout());
polyArea = new PolyArea(this);
ployareaPane.add(PolyDesignerLayout.Center, polyArea);
horScrollBar = new FormScrollBar(Adjustable.HORIZONTAL, this);
verScrollBar = new FormScrollBar(Adjustable.VERTICAL, this);
ployareaPane.add(PolyDesignerLayout.Vertical, verScrollBar);
ployareaPane.add(PolyDesignerLayout.VRuler, new VerticalRuler(this));
ployareaPane.add(PolyDesignerLayout.HRuler, new HorizontalRuler(this));
this.add(ployareaPane, BorderLayout.CENTER);
this.add(polyComponetsBar, BorderLayout.WEST);
}
private void initPolyBlocks() {
for (int i = 0, count = this.getTarget().getBlockCount(); i < count; i++) {
TemplateBlock block = (TemplateBlock) getTarget().getBlock(i);
BlockCreator creator = PolyUtils.createCreator(block);
LayoutUtils.layoutRootContainer(creator);
addedData.addBlockCreator(creator);
}
repaint();
}
/**
* 是否含有聚和报表块
* @param targetComponent 目标组件
* @return 是则返回true
*/
public boolean containsBlocks(TargetComponent targetComponent) {
for (int i = 0, count = this.getTarget().getBlockCount(); i < count; i++) {
TemplateBlock block = (TemplateBlock) getTarget().getBlock(i);
if (ComparatorUtils.equals(targetComponent.getTarget(), block)) {
return true;
}
}
return false;
}
private void initDataListeners() {
this.polyArea.removeMouseListener(editingListener);
this.polyArea.removeMouseMotionListener(editingListener);
this.editingListener = new DataEditingListener(this);
this.polyArea.addMouseMotionListener(editingListener);
this.polyArea.addMouseListener(editingListener);
}
@Override
public void setTarget(PolyWorkSheet t) {
super.setTarget(t);
selection = null;
this.addedData = new AddedData(this);
this.initPolyBlocks();
initDataListeners();
this.polyArea.removeAll();
polyArea.repaint();
}
/**
* 增加组件
* @param currentEditor 组件
*/
public void addEditor(BlockEditor currentEditor) {
this.polyArea.add(currentEditor);
}
/**
* 移除组件
* @param currentEditor 组件
*/
public void removeEditor(BlockEditor currentEditor) {
this.polyArea.remove(currentEditor);
}
/**
* 权限编辑状态
* @return 权限编辑面板
*/
public AuthorityEditPane createAuthorityEditPane() {
if (elementCasePane == null) {
return new NoSupportAuthorityEdit();
}
ElementCasePaneAuthorityEditPane elementCasePaneAuthorityEditPane = new ElementCasePaneAuthorityEditPane(elementCasePane);
elementCasePaneAuthorityEditPane.populateDetials();
return elementCasePaneAuthorityEditPane;
}
@Override
public void paintComponent(Graphics g) {
resetEditorComponentBounds();
g.setColor(Color.black);
GraphHelper.drawLine(g, 0, 0, this.getWidth(), 0);
GraphHelper.drawLine(g, 0, 0, 0, this.getHeight());
super.paintComponent(g);
}
/**
* 增加组件
* @param creator 组件
*/
public void addBlockCreator(BlockCreator creator) {
TemplateBlock block = creator.getValue();
getTarget().addBlock(block);
addedData.addBlockCreator(creator);
repaint();
}
/**
* @return
*/
public AddingData getAddingData() {
return addingData;
}
/**
* @param addData
*/
public void setAddingData(AddingData addData) {
this.addingData = addData;
}
/**
* @return
*/
public AddedData getAddedData() {
return addedData;
}
/**
* @param addedData
*/
public void setAddedData(AddedData addedData) {
this.addedData = addedData;
}
/**
* @return
*/
public TemplateBlock getEditingTarget() {
if (selection != null) {
return selection.getValue();
}
return null;
}
@Override
/**
*
*/
public BlockCreator getSelection() {
return selection;
}
/**
* 选中一个聚合快
*/
@Override
/**
* 选中一个聚合快
*/
public void setSelection(BlockCreator selectElement) {
//聚合块不参加权限编辑
if (selectElement == null) {
if (BaseUtils.isAuthorityEditing()) {
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if (jTemplate.isJWorkBook()) {
//清参数面板
jTemplate.removeParameterPaneSelection();
}
noAuthorityEdit();
}
QuickEditorRegion.getInstance().populate(QuickEditor.DEFAULT_EDITOR);
setChooseType(SelectionType.NONE);
return;
}
if (this.selection != selectElement) {
this.selection = selectElement;
fireSelectionChanged();
}
}
/**
* 选中的是否是报表块
* @return 是则返回true
*/
public boolean isSelectedECBolck() {
return this.selection instanceof ECBlockCreator;
}
/**
* 不支持权限编辑
*/
public void noAuthorityEdit() {
EastRegionContainerPane.getInstance().replaceUpPane(new NoSupportAuthorityEdit());
HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setAuthorityMode(false);
}
private void stopEditingState() {
if (selection != null) {
// 移除编辑器的时候当然也要退出编辑状态
removeEditor(selection.getEditor());
selection = null;
}
repaint();
}
private void resetEditorComponentBounds() {
if (selection != null) {
selection.getEditor().setBounds(selection.getEditorBounds());
LayoutUtils.layoutRootContainer(this);
}
}
/**
* @return
*/
public int getHorizontalValue() {
return horizontalValue;
}
/**
* @param horizontalValue
*/
public void setHorizontalValue(int horizontalValue) {
this.horizontalValue = horizontalValue;
}
/**
* @return
*/
public int getVerticalValue() {
return verticalValue;
}
/**
* @param verticalValue
*/
public void setVerticalValue(int verticalValue) {
this.verticalValue = verticalValue;
}
@Override
/**
*
*/
public short getRulerLengthUnit() {
return DesignerEnvManager.getEnvManager().getReportLengthUnit();
}
@Override
/**
* 复制
*/
public void copy() {
if (selection != null) {
clip_board.clear();
clip_board.add(selection.getValue());
}
}
/**
* 黏贴
* @return 黏贴成功返回true
*/
public boolean paste() {
if (!clip_board.isEmpty()) {
// 粘贴后名字和边界都需要改变
TemplateBlock block = null;
try {
block = (TemplateBlock) clip_board.get(0).clone();
String blockName = block.getBlockName();
blockName += "_copy";
List<String> nameList = new ArrayList<String>();
boolean isRepeat = false;
for (int l = getTarget().getBlockCount(), i = 0; i < l; i++) {
if (getTarget().getBlock(i).getBlockName().startsWith(blockName)) {
if (ComparatorUtils.equals(getTarget().getBlock(i).getBlockName(), blockName)) {
isRepeat = true;
blockName += "_copy";
continue;
}
nameList.add(getTarget().getBlock(i).getBlockName());
}
}
while (isRepeat) {
if (nameList.contains(blockName)) {
blockName += "_copy";
} else {
isRepeat = false;
}
}
block.setBlockName(blockName);
clip_board.set(0, block);
} catch (CloneNotSupportedException e) {
FRContext.getLogger().error(e.getMessage(), e);
return false;
}
UnitRectangle bounds = block.getBounds();
bounds.x = bounds.x.add(new OLDPIX(20));
bounds.y = bounds.y.add(new OLDPIX(20));
block.setBounds(bounds);
BlockCreator creator = PolyUtils.createCreator(block);
addBlockCreator(creator);
stopEditingState();
setSelection(creator);
setChooseType(SelectionType.BLOCK);
return true;
}
return false;
}
/**
* 停止编辑
*/
public void stopAddingState() {
this.addingData = null;
}
/**
* 删除
* @return 删除成功返回true
*/
public boolean delete() {
if (selection != null) {
TemplateBlock block = selection.getValue();
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
doCancelFormat(block);
}
getTarget().removeBlock(block);
addedData.removeBlockCreator(selection);
this.removeEditor(selection.getEditor());
selection = null;
this.repaint();
this.requestFocus();
return true;
}
return false;
}
private void doCancelFormat(TemplateBlock bolck) {
TargetComponent casePane = DesignerContext.getReferencedElementCasePane();
TemplateBlock referencedBlock = null;
if (casePane instanceof PolyElementCasePane) {
referencedBlock = ((PolyElementCasePane) casePane).getTarget();
}
if (ComparatorUtils.equals(referencedBlock, bolck)) {
DesignerContext.setFormatState(DesignerContext.FORMAT_STATE_NULL);
elementCasePane.getGrid().setCursor(UIConstants.CELL_DEFAULT_CURSOR);
((ElementCasePane) DesignerContext.getReferencedElementCasePane()).getGrid().setNotShowingTableSelectPane(true);
((ElementCasePane) DesignerContext.getReferencedElementCasePane()).getGrid().setCursor(UIConstants.CELL_DEFAULT_CURSOR);
DesignerContext.setReferencedElementCasePane(null);
DesignerContext.setReferencedIndex(0);
repaint();
HistoryTemplateListPane.getInstance().repaint();
}
}
/**
* 剪切
* @return 剪切成功返回true
*/
public boolean cut() {
copy();
delete();
return true;
}
/**
* 移动
* @param x 横坐标
* @param y 纵坐标
*/
public void move(int x, int y) {
if (selection == null) {
return;
}
TemplateBlock block = selection.getValue();
UnitRectangle ub = block.getBounds();
ub.x = FU.valueOfPix(ub.x.toPixI(resolution) + x, resolution);
ub.y = FU.valueOfPix(ub.y.toPixI(resolution) + y, resolution);
if (ub.x.less_than_zero()) {
ub.x = UNIT.ZERO;
}
if (ub.y.less_than_zero()) {
ub.y = UNIT.ZERO;
}
block.setBounds(ub);
this.fireTargetModified();
this.repaint();
}
/**
* 停止编辑
*/
public void stopEditing() {
if (selection != null) {
// 在停止编辑的时候,要把编辑器的值赋值给显示器
TemplateBlock block = selection.getValue();
selection.setValue(block);
this.removeEditor(selection.getEditor());
selection = null;
this.repaint();
}
}
/**
* @return
*/
public JScrollBar getVerticalScrollBar() {
return this.verScrollBar;
}
/**
* Sets vertical scroll bar
*/
public void setVerticalScrollBar(JScrollBar verScrollBar) {
this.verScrollBar = verScrollBar;
}
@Override
/**
* Gets horizontal scroll bar
*/
public JScrollBar getHorizontalScrollBar() {
return this.horScrollBar;
}
/**
* Sets horizontal scroll bar
*/
public void setHorizontalScrollBar(JScrollBar horScrollBar) {
this.horScrollBar = horScrollBar;
}
@Override
/**
*
*/
public int getMinWidth() {
return ReportHelper.calculateOccupiedArea(getTarget()).width.toPixI(resolution);
}
@Override
/**
*
*/
public int getMinHeight() {
return ReportHelper.calculateOccupiedArea(getTarget()).width.toPixI(resolution);
}
@Override
/**
*
*/
public int getDesignerHeight() {
return this.getHeight();
}
@Override
/**
*
*/
public int getDesignerWidth() {
return this.getWidth();
}
@Override
protected void processMouseWheelEvent(java.awt.event.MouseWheelEvent evt) {
int id = evt.getID();
switch (id) {
case MouseEvent.MOUSE_WHEEL: {
int rotations = evt.getWheelRotation();
this.getVerticalScrollBar().setValue(this.getVerticalScrollBar().getValue() + rotations * ROTATIONS);
break;
}
}
}
/**
* 开始编辑
* @param blockName 聚合块名称
*/
public void startEditing(String blockName) {
if (StringUtils.isBlank(blockName)) {
return;
}
for (int i = 0; i < addedData.getAddedCount(); i++) {
BlockCreator creator = addedData.getAddedAt(i);
if (ComparatorUtils.equals(blockName, creator.getValue().getBlockName())) {
this.setSelection(creator);
return;
}
}
}
/**
* 创建正在编辑的状态.
*
* @return 返回正在编辑的状态.
*/
public EditingState createEditingState() {
return new PolyDesignerEditingState(selection);
}
private class PolyDesignerEditingState implements EditingState {
private String blockName;
private Selection select;
public PolyDesignerEditingState(BlockCreator creator) {
if (creator == null) {
return;
}
this.blockName = creator.getValue().getBlockName();
// TODO: 写个新的Selection,图表,表单可能都要
if (creator.getEditor() instanceof ECBlockEditor) {
select = ((ECBlockEditor) creator.getEditor()).createEffective().getSelection();
}
}
@Override
public void revert() {
PolyDesigner.this.addedData = new AddedData(PolyDesigner.this);
stopEditingState();
initPolyBlocks();
startEditing(blockName);
if (selection == null) {
if (BaseUtils.isAuthorityEditing()) {
EastRegionContainerPane.getInstance().replaceUpPane(new NoSupportAuthorityEdit());
} else {
EastRegionContainerPane.getInstance().replaceDownPane(new JPanel());
QuickEditorRegion.getInstance().populate(QuickEditor.DEFAULT_EDITOR);
}
return;
}
if (selection.getEditor() instanceof ECBlockEditor) {
((ECBlockEditor) selection.getEditor()).createEffective().setSelection(select);
}
}
}
// ////////////////////////////////////////////////////////////////////
// ////////////////for toolbarMenuAdapter//////////////////////////////
// ////////////////////////////////////////////////////////////////////
/**
* 模板的工具
*
* @return 工具
*/
public ToolBarDef[] toolbars4Target() {
return selection == null || isChooseBlock() ? null : this.selection.toolbars4Target();
}
/**
* 表单的工具按钮
*
* @return 工具按钮
*/
public JComponent[] toolBarButton4Form() {
polyComponetsBar.checkEnable();
if (selection != null) {
selection.checkButtonEnable();
}
if (selection == null || isChooseBlock()) {
setToolBarElemEnabled(selection != null);
return toolBarComponent;
} else {
return this.selection.toolBarButton4Form();
}
}
private void setToolBarElemEnabled(boolean isEnabled) {
toolBarComponent[0].setEnabled(isEnabled);
toolBarComponent[1].setEnabled(isEnabled);
toolBarComponent[3].setEnabled(isEnabled);
}
/**
* 模板的子菜单
*
* @return 子菜单
*/
public ShortCut[] shortcut4TemplateMenu() {
return (ShortCut[]) ArrayUtils.addAll(super.shortcut4TemplateMenu(), new ShortCut[]{});
}
public int getMenuState() {
return selection == null ? DesignState.POLY_SHEET : this.selection.getMenuState();
}
/**
* 目标的菜单
*
* @return 菜单
*/
public MenuDef[] menus4Target() {
return selection == null ? new MenuDef[0] : this.selection.menus4Target();
}
// @Override
// public DockingView[] views4Target() {
// return selection == null ? new DockingView[0] : this.selection.views4Target();
// }
private void initInputActionMap() {
InputMap inputMapAncestor = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = this.getActionMap();
inputMapAncestor.clear();
actionMap.clear();
inputMapAncestor.put(KeyStroke.getKeyStroke("UP"), "moveup");
actionMap.put("moveup", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move(0, -1);
}
});
inputMapAncestor.put(KeyStroke.getKeyStroke("DOWN"), "movedown");
actionMap.put("movedown", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move(0, 1);
}
});
inputMapAncestor.put(KeyStroke.getKeyStroke("LEFT"), "moveleft");
actionMap.put("moveleft", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move(-1, 0);
}
});
inputMapAncestor.put(KeyStroke.getKeyStroke("RIGHT"), "moveright");
actionMap.put("moveright", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move(1, 0);
}
});
}
@Override
/**
*
*/
public BlockCreator getDefaultSelectElement() {
return null;
}
/**
* @return
*/
public SelectionType getSelectionType() {
return this.selectedtype;
}
/**
* @param type
*/
public void setChooseType(SelectionType type) {
if (!ComparatorUtils.equals(selectedtype, type) || type == SelectionType.NONE) {
selectedtype = type;
JTemplate<?, ?> jt = DesignerContext.getDesignerFrame().getSelectedJTemplate();
if(jt != null){
jt.setComposite();
}
DesignerContext.getDesignerFrame().resetToolkitByPlus(DesignerContext.getDesignerFrame().getSelectedJTemplate());
if (BaseUtils.isAuthorityEditing()) {
EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance());
} else if (isChooseBlock()) {
EastRegionContainerPane.getInstance().replaceDownPane(PolyBlockProperPane.getInstance(PolyDesigner.this));
} else if (type != SelectionType.NONE) {
EastRegionContainerPane.getInstance().replaceDownPane(CellElementPropertyPane.getInstance());
} else {
EastRegionContainerPane.getInstance().replaceDownPane(new JPanel());
}
}
}
public JPanel getEastUpPane() {
if (selection == null || selection.getEditor() == null) {
return QuickEditorRegion.getInstance();
}
//这边是进行更新
BlockEditor current_editor = selection.getEditor();
current_editor.resetSelectionAndChooseState();
return QuickEditorRegion.getInstance();
}
public JPanel getEastDownPane() {
if (isChooseBlock()) {
return PolyBlockProperPane.getInstance(PolyDesigner.this);
} else if (selectedtype != SelectionType.NONE) {
return CellElementPropertyPane.getInstance();
} else {
return new JPanel();
}
}
/**
* 是否选中聚合块本身
* @return 是则返回true
*/
public boolean isChooseBlock() {
return selectedtype == SelectionType.BLOCK;
}
/**
* Fire gridSelection Changed
*/
private void fireSelectionChanged() {
this.fireSelectionChangeListener();
PolyBlockProperPane.getInstance(this).refreshDockingView();
this.repaint(15);
}
/**
* 添加选中的SelectionListener
*
* @param selectionListener 选中的listener
*/
public void addSelectionChangeListener(SelectionListener selectionListener) {
this.listenerList.add(SelectionListener.class, selectionListener);
}
/**
* 移除选中的SelectionListener
*
* @param selectionListener 选中的listener
*/
public void removeSelectionChangeListener(SelectionListener selectionListener) {
this.listenerList.remove(SelectionListener.class, selectionListener);
}
private void fireSelectionChangeListener() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == SelectionListener.class) {
((SelectionListener) listeners[i + 1]).selectionChanged(new SelectionEvent(this));
}
}
}
/**
* 计算滚动条的值和max
* @param oldmax 之前最大值
* @param max 当前最大值
* @param newValue 当前value
* @param oldValue 之前value
* @param visi designer的大小
* @param orientation 滚动条方向
* @return 计算后的值和max
*/
public Point calculateScroll(int oldmax, int max, int newValue, int oldValue, int visi, int orientation) {
return new Point(newValue, max);
}
/**
* 获取当前聚合报表区域左上角x坐标
*
* @return 当前聚合报表区域左上角x坐标
*
*/
public double getAreaLocationX(){
return polyArea.getLocationOnScreen().getX();
}
/**
* 获取当前聚合报表区域左上角y坐标
*
* @return 当前聚合报表区域左上角y坐标
*
*/
public double getAreaLocationY(){
return polyArea.getLocationOnScreen().getY();
}
/**
* 检测指定块是否与其他的块有重叠区域
*
* @param creator 指定的块编辑器
*
* @return 是否与其他的块有重叠区域
*
*/
public boolean intersectsAllBlock(BlockCreator creator){
return intersectsAllBlock(creator.getValue());
}
/**
* 检测指定块是否与其他的块有重叠区域
*
* @param block 指定的块
*
* @return 是否与其他的块有重叠区域
*
*/
public boolean intersectsAllBlock(TemplateBlock block){
UnitRectangle rec = block.getBounds();
String blockName = block.getBlockName();
return intersectsAllBlock(rec, blockName);
}
/**
* 检测指定块是否与其他的块有重叠区域
*
* @param rec 指定的块区域
* @param blockName 指定的块名称
*
* @return 是否与其他的块有重叠区域
*
*/
public boolean intersectsAllBlock(UnitRectangle rec, String blockName){
PolyWorkSheet worksheet = this.getTarget();
int count = worksheet.getBlockCount();
for (int i = 0; i < count; i++) {
Block temp_block = worksheet.getBlock(i);
UnitRectangle temp_rect = temp_block.getBounds();
if(ComparatorUtils.equals(blockName, temp_block.getBlockName())){
continue;
}
if(temp_rect.intersects(rec)){
return true;
}
}
return false;
}
}