forked from fanruan/design
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
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; |
|
} |
|
} |