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
9 years ago
|
/*
|
||
|
* 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;
|
||
|
}
|
||
|
}
|