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

835 lines
40 KiB

package com.fr.grid;
import com.fr.base.BaseUtils;
import com.fr.base.DynamicUnitList;
import com.fr.base.ScreenResolution;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.constants.UIConstants;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.EastRegionContainerPane;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.mainframe.JSliderPane;
import com.fr.design.present.CellWriteAttrPane;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.FloatSelection;
import com.fr.grid.selection.Selection;
import com.fr.poly.creator.ECBlockPane;
import com.fr.report.ReportHelper;
import com.fr.report.cell.CellElement;
import com.fr.report.cell.FloatElement;
import com.fr.report.cell.TemplateCellElement;
import com.fr.report.cell.cellattr.CellGUIAttr;
import com.fr.report.elementcase.ElementCase;
import com.fr.report.elementcase.TemplateElementCase;
import com.fr.stable.ArrayUtils;
import com.fr.stable.ColumnRow;
import com.fr.stable.StringUtils;
import com.fr.stable.unit.FU;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
/**
* the MouseListener of the Grid
*
* @editor zhou 2012-3-22下午1:53:59
*/
public class GridMouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener {
private static final int WIDGET_WIDTH = 13;
private static final int TIME_DELAY = 100;
private static final int TOOLTIP_X = 30;
private static final int TOOLTIP_X_Y_FIX = 4;
private static final double COPY_CROSS_INNER_DISTANCE = 1.5;
private static final double COPY_CROSS_OUTER_DISTANCE = 2.5;
/**
* 拖拽时候刷新时间间隔
*/
private static int DRAG_REFRESH_TIME = 10;
/**
* 对应的表格-Grid
*/
private Grid grid;
/**
* the Point(x,y) where the mouse pressed
*/
private int oldEvtX = 0;
private int oldEvtY = 0;
// the old location, used for Move float element.
private int oldLocationX;
private int oldLocationY;
private long lastMouseMoveTime = 0; // 最后的MouseMove时间.
// 保存各个悬浮元素到oldLocation距离
private Map<String, Point> floatNamePointMap;
/**
* august:因为CellSelection里面没有记录的变量了,必须要有个变量来存按住shift键的位置之前的鼠标的位置
* 用户可能一直按住shift键不放,所以按住shift键之前的鼠标位置是必须有的.
*/
private ColumnRow tempOldSelectedCell;
private int ECBlockGap = 40;
private int resolution = (int) (ScreenResolution.getScreenResolution() * JSliderPane.getInstance().resolutionTimes);
protected GridMouseAdapter(Grid grid) {
this.grid = grid;
}
/**
* @param evt
*/
public void mousePressed(MouseEvent evt) {
if (!grid.isEnabled()) {
return;
}
oldEvtX = evt.getX();
oldEvtY = evt.getY();
grid.stopEditing();
if (!grid.hasFocus() && grid.isRequestFocusEnabled()) {
grid.requestFocus();
}
if (SwingUtilities.isRightMouseButton(evt)) {
doWithRightButtonPressed();
} else {
doWithLeftButtonPressed(evt);
}
// 用户没有按住Shift键时,tempOldSelectedCell是一直变化的。如果一直按住shift,是不变的
ElementCasePane ePane = grid.getElementCasePane();
if (!evt.isShiftDown() && ePane.getSelection() instanceof CellSelection) {
tempOldSelectedCell = GridUtils.getAdjustEventColumnRow_withresolution(ePane, oldEvtX, oldEvtY, resolution);
}
}
/**
* 将悬浮元素(只有文本和公式)添加到鼠标点击的位置
*/
private void doWithDrawingFloatElement() {
ElementCasePane reportPane = grid.getElementCasePane();
TemplateElementCase report = reportPane.getEditingElementCase();
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
int horizentalScrollValue = grid.getHorizontalValue();
int verticalScrollValue = grid.getVerticalValue();
// int resolution = ScreenResolution.getScreenResolution();
FU evtX_fu = FU.valueOfPix(this.oldEvtX, resolution);
FU evtY_fu = FU.valueOfPix(this.oldEvtY, resolution);
FU leftDistance = FU.getInstance(evtX_fu.toFU() + columnWidthList.getRangeValue(0, horizentalScrollValue).toFU());
FU topDistance = FU.getInstance(evtY_fu.toFU() + rowHeightList.getRangeValue(0, verticalScrollValue).toFU());
grid.getDrawingFloatElement().setLeftDistance(leftDistance);
grid.getDrawingFloatElement().setTopDistance(topDistance);
report.addFloatElement(grid.getDrawingFloatElement());
reportPane.setSelection(new FloatSelection(grid.getDrawingFloatElement().getName()));
}
/**
* 处理右击事件,弹出右键菜单.
*/
private void doWithRightButtonPressed() {
ElementCasePane reportPane = grid.getElementCasePane();
Object[] tmpFloatElementCursor = GridUtils.getAboveFloatElementCursor(reportPane, this.oldEvtX, this.oldEvtY);
if (!ArrayUtils.isEmpty(tmpFloatElementCursor)) {
FloatElement selectedFloatElement = (FloatElement) tmpFloatElementCursor[0];
reportPane.setSelection(new FloatSelection(selectedFloatElement.getName()));
} else {
ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(reportPane, this.oldEvtX, this.oldEvtY, this.resolution);
if (!reportPane.getSelection().containsColumnRow(selectedCellPoint)) {
GridUtils.doSelectCell(reportPane, selectedCellPoint.getColumn(), selectedCellPoint.getRow());
}
}
reportPane.repaint();
JPopupMenu cellPopupMenu = reportPane.createPopupMenu();
if (cellPopupMenu != null) {
GUICoreUtils.showPopupMenu(cellPopupMenu, this.grid, this.oldEvtX - 1, this.oldEvtY - 1);
}
}
/**
* 处理左击事件
*/
private void doWithLeftButtonPressed(MouseEvent evt) {
if (BaseUtils.isAuthorityEditing()) {
grid.setEditable(false);
}
ElementCasePane reportPane = grid.getElementCasePane();
TemplateElementCase report = reportPane.getEditingElementCase();
boolean isShiftDown = evt.isShiftDown();
boolean isControlDown = InputEventBaseOnOS.isControlDown(evt);
int clickCount = evt.getClickCount();
// peter:需要判断是否在可移动CellSelection的区域
grid.setDragType(isMoveCellSelection(this.oldEvtX, this.oldEvtY));
if (clickCount >= 2) {
grid.setDragType(GridUtils.DRAG_NONE);
}
if (grid.getDragType() != GridUtils.DRAG_NONE) {// Drag的标志.
Selection selection = reportPane.getSelection();
if (selection instanceof CellSelection) {
// peter:设置DragRecatagle的标志.
if (grid.getDragRectangle() == null) {
grid.setDragRectangle(new Rectangle());
}
CellSelection cs = ((CellSelection) selection).clone();
grid.getDragRectangle().setBounds(cs.toRectangle());
return;
}
}
// peter:选择GridSelection,支持Shift
doOneClickSelection(this.oldEvtX, this.oldEvtY, isShiftDown, isControlDown);
// 得到点击所在的column and row
ColumnRow columnRow = GridUtils.getEventColumnRow_withresolution(reportPane, this.oldEvtX, this.oldEvtY, this.resolution);
TemplateCellElement cellElement = report.getTemplateCellElement(columnRow.getColumn(), columnRow.getRow());
if (clickCount >= 2 && !BaseUtils.isAuthorityEditing()) {
grid.startEditing();
}
if (clickCount == 1 && cellElement != null && cellElement.getWidget() != null && !BaseUtils.isAuthorityEditing()) {
showWidetWindow(cellElement, report);
}
reportPane.repaint();
}
/**
* 显示控件编辑窗口
*
* @param cellElement
* @param report
*/
private void showWidetWindow(TemplateCellElement cellElement, TemplateElementCase report) {
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
double fixed_pos_x = this.oldEvtX - columnWidthList.getRangeValue(grid.getHorizontalValue(), cellElement.getColumn()).toPixD(resolution);
double fixed_pos_y = this.oldEvtY - rowHeightList.getRangeValue(grid.getVerticalValue(), cellElement.getRow()).toPixD(resolution);
double cell_width = columnWidthList.getRangeValue(cellElement.getColumn(), cellElement.getColumn() + cellElement.getColumnSpan()).toPixD(resolution);
double cell_height = rowHeightList.getRangeValue(cellElement.getRow(), cellElement.getRow() + cellElement.getRowSpan()).toPixD(resolution);
if (fitSizeToShow(cell_width, cell_height, fixed_pos_x, fixed_pos_y)) {
EastRegionContainerPane.getInstance().switchTabTo(EastRegionContainerPane.KEY_WIDGET_SETTINGS);
}
}
private boolean fitSizeToShow(double cell_width, double cell_height, double fixed_pos_x, double fixed_pos_y) {
return cell_width - fixed_pos_x > 0 && cell_height - fixed_pos_y > 0
&& cell_width - fixed_pos_x < WIDGET_WIDTH && cell_height - fixed_pos_y < WIDGET_WIDTH;
}
public void setResolution(int resolution) {
this.resolution = resolution;
}
/**
* @param evt
*/
public void mouseReleased(MouseEvent evt) {
if (!grid.isEnabled() || !grid.isEditable()) {
return;
}
boolean isDataChanged = false;
ElementCasePane reportPane = grid.getElementCasePane();
Selection selection = reportPane.getSelection();
if (selection instanceof FloatSelection) {
grid.setCursor(new Cursor(Cursor.MOVE_CURSOR));
}
if (grid.getDragType() == GridUtils.DRAG_CELLSELECTION) {
if (selection instanceof CellSelection) {
grid.getElementCasePane().cut();
// mouse release的时候要判断下是否在reportPane范围内
if (outOfBounds(evt, reportPane)) {
GridUtils.doSelectCell(reportPane, grid.getDragRectangle().x, grid.getDragRectangle().y);
} else {
mousePressed(evt);
}
grid.getElementCasePane().paste();
isDataChanged = true;
}
} else if (grid.getDragType() == GridUtils.DRAG_CELLSELECTION_BOTTOMRIGHT_CORNER) {
if (selection instanceof CellSelection) {
CellSelection cs = (CellSelection) selection;
// august:智能拖拽扩展单元格值
IntelliElements.iterating(reportPane, cs.toRectangle(), grid.getDragRectangle());
if (grid.getDragRectangle() != null) {
reportPane.setSelection(new CellSelection(grid.getDragRectangle().x, grid.getDragRectangle().y, grid.getDragRectangle().width, grid.getDragRectangle().height));
}
isDataChanged = true;
}
} else if (grid.getDragType() == GridUtils.DRAG_FLOAT) {
isDataChanged = true;
}
grid.setDragType(GridUtils.DRAG_NONE);
grid.setDragRectangle(null);
if (isDataChanged) {
reportPane.setSupportDefaultParentCalculate(true);
reportPane.fireTargetModified();
reportPane.setSupportDefaultParentCalculate(false);
}
doWithFormatBrush(reportPane);
reportPane.repaint();
}
private void doWithFormatBrush(ElementCasePane reportPane) {
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) {
return;
}
if (reportPane.getCellNeedTOFormat() != null) {
reportPane.getFormatBrushAction().updateFormatBrush(DesignerContext.getReferencedStyle(), reportPane.getCellNeedTOFormat(), reportPane);
reportPane.fireTargetModified();
}
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_ONCE) {
reportPane.cancelFormatBrush();
}
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_MORE) {
reportPane.getFormatBrush().setSelected(true);
}
}
private boolean outOfBounds(MouseEvent evt, ElementCasePane reportPane) {
return evt.getY() > reportPane.getHeight() || evt.getY() < 0 || evt.getX() > reportPane.getWidth() || evt.getX() < 0;
}
/**
* @param evt
*/
public void mouseMoved(final MouseEvent evt) {
ElementCasePane reportPane = grid.getElementCasePane();
boolean isGridForSelection = !grid.isEnabled() || !grid.isEditable();
if (isGridForSelection || grid.isEditing()) {
if (grid.IsNotShowingTableSelectPane()) {
grid.setCursor(UIConstants.CELL_DEFAULT_CURSOR);
return;
}
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
grid.setCursor(UIConstants.FORMAT_BRUSH_CURSOR);
} else {
grid.setCursor(GUICoreUtils.createCustomCursor(BaseUtils.readImage("com/fr/design/images/buttonicon/select.png"),
new Point(0, 0), "select", grid));
}
return;
}
// peter:停留一段时间.
long systemCurrentTime = System.currentTimeMillis();
if (systemCurrentTime - lastMouseMoveTime <= TIME_DELAY) {
return;
}
lastMouseMoveTime = systemCurrentTime;// 记录最后一次的时间.
mouseMoveOnGrid(evt.getX(), evt.getY());
}
/**
* @param evt
*/
public void mouseDragged(MouseEvent evt) {
if (!grid.isEnabled()) {
return;
}
boolean isControlDown = InputEventBaseOnOS.isControlDown(evt);
long systemCurrentTime = System.currentTimeMillis();
if (systemCurrentTime - lastMouseMoveTime <= DRAG_REFRESH_TIME) {// alex:Drag
return;
} else {
lastMouseMoveTime = systemCurrentTime;
}
// right mouse cannot Drag..
if (SwingUtilities.isRightMouseButton(evt)) {
return;
}
doWithMouseDragged(evt.getX(), evt.getY(), isControlDown);
}
private void doWithMouseDragged(int evtX, int evtY, boolean isControlDown) {
ElementCasePane reportPane = grid.getElementCasePane();
if (reportPane.mustInVisibleRange()) {
Grid grid = reportPane.getGrid();
if (evtX > grid.getWidth() - 2 || evtY > grid.getHeight() - 2) {
return;
}
}
Selection selection = reportPane.getSelection();
if (selection instanceof FloatSelection && !BaseUtils.isAuthorityEditing()) {
doWithFloatElementDragged(evtX, evtY, (FloatSelection) selection);
grid.setDragType(GridUtils.DRAG_FLOAT);
} else if (grid.getDragType() == GridUtils.DRAG_CELLSELECTION_BOTTOMRIGHT_CORNER && !BaseUtils.isAuthorityEditing()) {
doWithCellElementDragged(evtX, evtY, (CellSelection) selection);
} else if (grid.getDragType() == GridUtils.DRAG_CELLSELECTION && !BaseUtils.isAuthorityEditing()) {
// peter:获得调整过的Selected Column Row.
ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
if (selectedCellPoint.getColumn() != grid.getDragRectangle().x || selectedCellPoint.getRow() != grid.getDragRectangle().y) {
grid.getDragRectangle().x = selectedCellPoint.getColumn();
grid.getDragRectangle().y = selectedCellPoint.getRow();
}
} else {// august: 拖拽选中多个单元格
doShiftSelectCell(evtX, evtY);
}
grid.getElementCasePane().repaint();
}
/**
* 拖拽悬浮元素
*
* @param evtX
* @param evtY
* @param fs
*/
private void doWithFloatElementDragged(int evtX, int evtY, FloatSelection fs) {
ElementCase report = grid.getElementCasePane().getEditingElementCase();
// int resolution = ScreenResolution.getScreenResolution();
String floatName = fs.getSelectedFloatName();
FloatElement floatElement = report.getFloatElement(floatName);
int cursorType = grid.getCursor().getType();
if (cursorType == Cursor.NW_RESIZE_CURSOR || cursorType == Cursor.NE_RESIZE_CURSOR || cursorType == Cursor.SE_RESIZE_CURSOR || cursorType == Cursor.SW_RESIZE_CURSOR) {
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
FU floatX1_fu = FU.valueOfPix(Math.min(oldEvtX, evtX), resolution);
FU floatY1_fu = FU.valueOfPix(Math.min(oldEvtY, evtY), resolution);
FU leftDistance = floatX1_fu.add(columnWidthList.getRangeValue(0, grid.getHorizontalValue()));
FU topDistance = floatY1_fu.add(rowHeightList.getRangeValue(0, grid.getVerticalValue()));
floatElement.setLeftDistance(leftDistance);
floatElement.setTopDistance(topDistance);
floatElement.setWidth(FU.valueOfPix(Math.max(oldEvtX, evtX), resolution).subtract(floatX1_fu));
floatElement.setHeight(FU.valueOfPix(Math.max(oldEvtY, evtY), resolution).subtract(floatY1_fu));
} else if (cursorType == Cursor.S_RESIZE_CURSOR || cursorType == Cursor.N_RESIZE_CURSOR) {
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
FU floatY1_fu = FU.valueOfPix(Math.min(oldEvtY, evtY), resolution);
FU topDistance = floatY1_fu.add(rowHeightList.getRangeValue(0, grid.getVerticalValue()));
floatElement.setTopDistance(topDistance);
floatElement.setHeight(FU.valueOfPix(Math.max(oldEvtY, evtY), resolution).subtract(floatY1_fu));
} else if (cursorType == Cursor.W_RESIZE_CURSOR || cursorType == Cursor.E_RESIZE_CURSOR) {
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
FU floatX1_fu = FU.valueOfPix(Math.min(oldEvtX, evtX), resolution);
FU leftDistance = floatX1_fu.add(columnWidthList.getRangeValue(0, grid.getHorizontalValue()));
floatElement.setLeftDistance(leftDistance);
floatElement.setWidth(FU.valueOfPix(Math.max(oldEvtX, evtX), resolution).subtract(floatX1_fu));
} else if (cursorType == Cursor.MOVE_CURSOR) {
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
int horizentalValue = grid.getHorizontalValue();
int verticalValue = grid.getVerticalValue();
String floatElementName = fs.getSelectedFloatName();
FloatElement tempFolatElement = report.getFloatElement(floatElementName);
Point tempFolatElementPoint = floatNamePointMap.get(floatElementName);
int floatX1ForTempFloatElement = tempFolatElementPoint.x + Math.max(oldLocationX + (evtX - oldEvtX), 0);
int floatY1ForTempFloatElement = tempFolatElementPoint.y + Math.max(oldLocationY + (evtY - oldEvtY), 0);
FU floatX1ForTempFloatElement_fu = FU.valueOfPix(floatX1ForTempFloatElement, resolution);
FU leftDistance = floatX1ForTempFloatElement_fu.add(columnWidthList.getRangeValue(0, horizentalValue));
FU floatY1ForTempFloatElement_fu = FU.valueOfPix(floatY1ForTempFloatElement, resolution);
FU topDistance = floatY1ForTempFloatElement_fu.add(rowHeightList.getRangeValue(0, verticalValue));
tempFolatElement.setLeftDistance(leftDistance);
tempFolatElement.setTopDistance(topDistance);
}
}
/**
* 拖拽单元格
*
* @param evtX
* @param evtY
* @param cs
*/
private void doWithCellElementDragged(int evtX, int evtY, CellSelection cs) {
ElementCasePane reportPane = grid.getElementCasePane();
java.awt.Rectangle cellRectangle = cs.toRectangle();
ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
if (cellRectangle.contains(selectedCellPoint.getColumn(), selectedCellPoint.getRow())) {
grid.getDragRectangle().setBounds(cellRectangle);
} else {
int xDistance = evtX - this.oldEvtX;
int yDistance = evtY - this.oldEvtY;
if (Math.abs(yDistance) > Math.abs(xDistance)) {
grid.getDragRectangle().x = cellRectangle.x;
grid.getDragRectangle().width = cellRectangle.width;
if (yDistance >= 0) {
// 聚合报表要求拖拽的时候要在本块的内部进行 不能无限往下拖
if (reportPane instanceof ECBlockPane && evtY > reportPane.getBounds().height - ECBlockGap) {
return;
}
grid.getDragRectangle().y = cellRectangle.y;
grid.getDragRectangle().height = selectedCellPoint.getRow() - cellRectangle.y + 1;
} else {
if (selectedCellPoint.getRow() >= cellRectangle.y && selectedCellPoint.getRow() < cellRectangle.y + cellRectangle.height) {
grid.getDragRectangle().y = cellRectangle.y;
grid.getDragRectangle().height = cellRectangle.height;
} else {
grid.getDragRectangle().y = cellRectangle.y;
grid.getDragRectangle().height = cellRectangle.y - selectedCellPoint.getRow() + cellRectangle.height;
}
}
} else {
grid.getDragRectangle().y = cellRectangle.y;
grid.getDragRectangle().height = cellRectangle.height;
if (xDistance >= 0) {
if (reportPane instanceof ECBlockPane && evtX > reportPane.getBounds().width - ECBlockGap) {
return;
}
grid.getDragRectangle().x = cellRectangle.x;
grid.getDragRectangle().width = selectedCellPoint.getColumn() - cellRectangle.x + 1;
} else {
if (selectedCellPoint.getColumn() >= cellRectangle.x && selectedCellPoint.getColumn() < cellRectangle.x + cellRectangle.width) {
grid.getDragRectangle().x = cellRectangle.x;
grid.getDragRectangle().width = cellRectangle.width;
} else {
grid.getDragRectangle().x = selectedCellPoint.getColumn();
grid.getDragRectangle().width = cellRectangle.x - selectedCellPoint.getColumn() + cellRectangle.width;
}
}
}
}
reportPane.ensureColumnRowVisible(selectedCellPoint.getColumn() + 1, selectedCellPoint.getRow() + 1);
}
private void doShiftSelectCell(double evtX, double evtY) {
ElementCasePane reportPane = grid.getElementCasePane();
Selection s = reportPane.getSelection();
if (s instanceof FloatSelection) {
return;
}
ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
int selectedCellPointX = selectedCellPoint.getColumn();
int selectedCellPointY = selectedCellPoint.getRow();
CellSelection gridSelection = ((CellSelection) s).clone();
//反向选择单元格
int tempOldSelectedCellX = tempOldSelectedCell.getColumn();
int tempOldSelectedCellY = tempOldSelectedCell.getRow();
// int tempOldSelectedCellX = gridSelection.getEditRectangle().x;
// int tempOldSelectedCellY = gridSelection.getEditRectangle().y;
int column = selectedCellPointX >= tempOldSelectedCellX ? tempOldSelectedCellX : selectedCellPointX;
int row = selectedCellPointY >= tempOldSelectedCellY ? tempOldSelectedCellY : selectedCellPointY;
int columnSpan = Math.abs(selectedCellPointX - tempOldSelectedCellX) + 1;
int rowSpan = Math.abs(selectedCellPointY - tempOldSelectedCellY) + 1;
Rectangle oldrectangle = new Rectangle(column, row, columnSpan, rowSpan);
// ajust them to got the correct selected bounds.
Rectangle newrectangle = grid.caculateIntersectsUnion(reportPane.getEditingElementCase(), oldrectangle);
gridSelection.setBounds(newrectangle.x, newrectangle.y, newrectangle.width, newrectangle.height);
gridSelection.clearCellRectangles(gridSelection.getCellRectangleCount() - 1);
gridSelection.addCellRectangle(newrectangle);
reportPane.setSelection(gridSelection);
if (!reportPane.mustInVisibleRange()) {
reportPane.ensureColumnRowVisible(selectedCellPointX, selectedCellPointY);
}
}
private void doControlSelectCell(double evtX, double evtY) {
ElementCasePane reportPane = grid.getElementCasePane();
ElementCase report = reportPane.getEditingElementCase();
//上一次选中的单元格
Selection s = reportPane.getSelection();
if (s instanceof FloatSelection) {
return;
}
ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
//拷贝,而不是直接强制使用以监听单元格选择变化
CellSelection gridSelection = ((CellSelection) s).clone();
gridSelection.setSelectedType(((CellSelection) s).getSelectedType());
CellElement cellElement = report.getCellElement(selectedCellPoint.getColumn(), selectedCellPoint.getRow());
if (cellElement == null) {
gridSelection.setBounds(selectedCellPoint.getColumn(), selectedCellPoint.getRow(), 1, 1);
int point = gridSelection.containsCell(selectedCellPoint.getColumn(), selectedCellPoint.getRow());
if (point == -1) {
gridSelection.addCellRectangle(new Rectangle(selectedCellPoint.getColumn(), selectedCellPoint.getRow(), 1, 1));
} else {
gridSelection.clearCellRectangles(point);
}
} else {
gridSelection.setBounds(cellElement.getColumn(), cellElement.getRow(), cellElement.getColumnSpan(), cellElement.getRowSpan());
gridSelection.addCellRectangle(new Rectangle(cellElement.getColumn(), cellElement.getRow(), cellElement.getColumnSpan(), cellElement.getRowSpan()));
}
reportPane.setSelection(gridSelection);
if (!reportPane.mustInVisibleRange()) {
reportPane.ensureColumnRowVisible(selectedCellPoint.getColumn(), selectedCellPoint.getRow());
}
}
/**
* 鼠标在Grid上面移动.
*/
private void mouseMoveOnGrid(int evtX, int evtY) {
grid.setToolTipText(null);
Object[] floatElementCursor = GridUtils.getAboveFloatElementCursor(grid.getElementCasePane(), evtX, evtY);
if (!ArrayUtils.isEmpty(floatElementCursor)) {// 鼠标在悬浮元素上移动
grid.setCursor((Cursor) floatElementCursor[1]);
} else {// 鼠标在单元格上移动
doMouseMoveOnCells(evtX, evtY);
}
}
/**
* 鼠标在单元格上移动
*
* @param evtX
* @param evtY
*/
private void doMouseMoveOnCells(int evtX, int evtY) {
ElementCasePane reportPane = grid.getElementCasePane();
TemplateElementCase report = reportPane.getEditingElementCase();
//如果是格式刷状态
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
grid.setCursor(UIConstants.FORMAT_BRUSH_CURSOR);
} else {
grid.setCursor(UIConstants.CELL_DEFAULT_CURSOR);
}
ColumnRow selectedCellColumnRow = GridUtils.getEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
TemplateCellElement curCellElement = report.getTemplateCellElement(selectedCellColumnRow.getColumn(), selectedCellColumnRow.getRow());
if (curCellElement != null) {
setCursorAndToolTips(curCellElement, report);
}
int dragType = isMoveCellSelection(evtX, evtY);
if (dragType == GridUtils.DRAG_CELLSELECTION) {// 判断是否移动选中的区域.
grid.setCursor(new Cursor(Cursor.MOVE_CURSOR));
} // peter:判断是否复制移动的角落.
else if (dragType == GridUtils.DRAG_CELLSELECTION_BOTTOMRIGHT_CORNER) {
grid.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
}
}
/**
* 只根据CellGUIAttr里面的tooltips显示了,原先的显示条件属性、形态、控件等无意义
*
* @param curCellElement
* @param report
*/
private void setCursorAndToolTips(TemplateCellElement curCellElement, TemplateElementCase report) {
// int resolution = ScreenResolution.getScreenResolution();
// 计算相对Grid的显示位置.
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
CellGUIAttr cellGUIAttr = curCellElement.getCellGUIAttr();
if (cellGUIAttr == null) {
cellGUIAttr = CellGUIAttr.DEFAULT_CELLGUIATTR;
}
grid.setToolTipText(cellGUIAttr.getTooltipText());
double tooltipX = columnWidthList.getRangeValue(grid.getHorizontalValue(), curCellElement.getColumn()).toPixD(resolution) + TOOLTIP_X_Y_FIX;
double tooltipY = rowHeightList.getRangeValue(grid.getVerticalValue(), curCellElement.getRow() + curCellElement.getRowSpan()).toPixD(resolution) + TOOLTIP_X_Y_FIX;
// peter:显示tooltip
if (StringUtils.isNotBlank(grid.getToolTipText())) {
grid.setTooltipLocation(tooltipX + TOOLTIP_X, tooltipY);
}
}
/**
* 是否移动CellSelection
*/
private int isMoveCellSelection(double evtX, double evtY) {
ElementCasePane reportPane = grid.getElementCasePane();
// p:判断是否在选中区域的边框,可以移动CellSelelction选中区域
Selection selection = reportPane.getSelection();
if (!(selection instanceof CellSelection)) {
return GridUtils.DRAG_NONE;
}
if ((selection instanceof CellSelection)
&& ((CellSelection) selection).getCellRectangleCount() != 1) {// p:没有选择Cell.
return GridUtils.DRAG_NONE;
}
CellSelection cs = (CellSelection) selection;
ElementCase report = reportPane.getEditingElementCase();
// peter:计算相对Grid的显示位置.
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
// int resolution = ScreenResolution.getScreenResolution();
double leftColDistance = columnWidthList.getRangeValue(grid.getHorizontalValue(), cs.getColumn()).toPixD(resolution);
double rightColDistance = columnWidthList.getRangeValue(grid.getHorizontalValue(), cs.getColumn() + cs.getColumnSpan()).toPixD(resolution);
double topRowDistance = rowHeightList.getRangeValue(grid.getVerticalValue(), cs.getRow()).toPixD(resolution);
double bottomRowDistance = rowHeightList.getRangeValue(grid.getVerticalValue(), cs.getRow() + cs.getRowSpan()).toPixD(resolution);
// 首先判断是否在可以复制的右下角落.
if (fitCellSelectionBottomRight(evtX, evtY, rightColDistance, bottomRowDistance)) {
return GridUtils.DRAG_CELLSELECTION_BOTTOMRIGHT_CORNER;
}
// 这个dist值调小一点,尽量让用户不使用drag and drop 来编辑报表支持
double dist = 1.0;
if (fitCellSelection(evtX, leftColDistance, rightColDistance, dist)) {
if (evtY >= (topRowDistance - dist) && evtY <= (bottomRowDistance + dist)) {
return GridUtils.DRAG_CELLSELECTION;
}
} else if (fitCellSelection(evtY, topRowDistance, bottomRowDistance, dist)) {
if (evtX >= (leftColDistance - dist) && evtX <= (rightColDistance + dist)) {
return GridUtils.DRAG_CELLSELECTION;
}
}
return GridUtils.DRAG_NONE;
}
private boolean fitCellSelection(double evt, double d1, double d2, double dist) {
return (evt >= (d1 - dist) && evt <= (d1 + dist))
|| (evt >= (d2 - dist) && evt <= (d2 + dist));
}
private boolean fitCellSelectionBottomRight(double evtX, double evtY, double rightColDistance, double bottomRowDistance) {
return evtX > rightColDistance - COPY_CROSS_INNER_DISTANCE && evtX < rightColDistance + COPY_CROSS_OUTER_DISTANCE
&& evtY > bottomRowDistance - COPY_CROSS_INNER_DISTANCE && bottomRowDistance < bottomRowDistance + COPY_CROSS_OUTER_DISTANCE;
}
/**
* Do one click selection
*/
private void doOneClickSelection(int evtX, int evtY, boolean isShiftDown, boolean isControlDown) {
ElementCasePane reportPane = grid.getElementCasePane();
// check float elements.
Object[] tmpFloatElementCursor = GridUtils.getAboveFloatElementCursor(reportPane, evtX, evtY);
if (!ArrayUtils.isEmpty(tmpFloatElementCursor)) {// p:选中了悬浮元素.
doSelectFloatElement(tmpFloatElementCursor, evtX, evtY);
} else if (isShiftDown) {
doShiftSelectCell(evtX, evtY);
} else if (isControlDown) {
doControlSelectCell(evtX, evtY);
} else {
ColumnRow selectedCellPoint = GridUtils.getEventColumnRow_withresolution(reportPane, evtX, evtY, resolution);
int type = reportPane.ensureColumnRowVisible(selectedCellPoint.getColumn(), selectedCellPoint.getRow());
if (type == ElementCasePane.NO_OVER) {
GridUtils.doSelectCell(reportPane, selectedCellPoint.getColumn(), selectedCellPoint.getRow());
} else if (type == ElementCasePane.VERTICAL_OVER) {
//聚合报表块选在下边界的时候,有时会向下移,阻止向下移
GridUtils.doSelectCell(reportPane, selectedCellPoint.getColumn(), selectedCellPoint.getRow() - 1);
} else if (type == ElementCasePane.HORIZONTAL_OVER) {
//聚合报表块选在右边界的时候,有时会向右移,阻止向右移
GridUtils.doSelectCell(reportPane, selectedCellPoint.getColumn() - 1, selectedCellPoint.getRow());
} else {
GridUtils.doSelectCell(reportPane, selectedCellPoint.getColumn() - 1, selectedCellPoint.getRow() - 1);
}
return;
}
}
/**
* 选中悬浮元素
*
* @param tmpFloatElementCursor
* @param evtX
* @param evtY
*/
private void doSelectFloatElement(Object[] tmpFloatElementCursor, int evtX, int evtY) {
ElementCasePane reportPane = grid.getElementCasePane();
ElementCase report = reportPane.getEditingElementCase();
FloatElement floatElement = (FloatElement) tmpFloatElementCursor[0];
String floatName = floatElement.getName();
reportPane.setSelection(new FloatSelection(floatName));
// double[] floatArray = GridUtils.caculateFloatElementLocations(floatElement, ReportHelper.getColumnWidthList(report), ReportHelper.getRowHeightList(report), reportPane
// .getGrid().getVerticalValue(), reportPane.getGrid().getHorizontalValue());
double[] floatArray = GridUtils.caculateFloatElementLocations_withresolution(floatElement, ReportHelper.getColumnWidthList(report), ReportHelper.getRowHeightList(report), reportPane
.getGrid().getVerticalValue(), reportPane.getGrid().getHorizontalValue(), grid.getResolution());
int cursorType = ((Cursor) tmpFloatElementCursor[1]).getType();
if (cursorType == Cursor.MOVE_CURSOR) {
this.oldEvtX = evtX;
this.oldEvtY = evtY;
FloatElement el = report.getFloatElement(floatName);
// int resolution = ScreenResolution.getScreenResolution();
int verticalValue = grid.getVerticalValue();
int horizentalValue = grid.getHorizontalValue();
DynamicUnitList columnWidthList = ReportHelper.getColumnWidthList(report);
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(report);
this.oldLocationX = FU.getInstance(el.getLeftDistance().toFU() - columnWidthList.getRangeValue(0, horizentalValue).toFU()).toPixI(resolution);
this.oldLocationY = FU.getInstance(el.getTopDistance().toFU() - rowHeightList.getRangeValue(0, verticalValue).toFU()).toPixI(resolution);
if (floatNamePointMap == null) {
floatNamePointMap = new HashMap<String, Point>();
}
floatNamePointMap.clear();
FloatElement tempFolatElement = report.getFloatElement(floatName);
int floatX1ForTempFloatElement = FU.getInstance(tempFolatElement.getLeftDistance().toFU() - columnWidthList.getRangeValue(0, horizentalValue).toFU())
.toPixI(resolution) - oldLocationX;
int floatY1ForTempFloatElement = FU.getInstance(tempFolatElement.getTopDistance().toFU() - rowHeightList.getRangeValue(0, verticalValue).toFU()).toPixI(resolution)
- oldLocationY;
floatNamePointMap.put(floatName, new Point(floatX1ForTempFloatElement, floatY1ForTempFloatElement));
} else if (cursorType == Cursor.NW_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[2], floatArray[3]);
} else if (cursorType == Cursor.NE_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[0], floatArray[3]);
} else if (cursorType == Cursor.SE_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[0], floatArray[1]);
} else if (cursorType == Cursor.SW_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[2], floatArray[1]);
} else if (cursorType == Cursor.N_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[0], floatArray[3]);
} else if (cursorType == Cursor.S_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[0], floatArray[1]);
} else if (cursorType == Cursor.W_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[2], floatArray[1]);
} else if (cursorType == Cursor.E_RESIZE_CURSOR) {
setOld_X_AndOld_Y(floatArray[0], floatArray[1]);
}
}
private void setOld_X_AndOld_Y(double x, double y) {
this.oldEvtX = (int) x;
this.oldEvtY = (int) y;
}
/**
* @param e
*/
public void mouseWheelMoved(MouseWheelEvent e) {
if (!InputEventBaseOnOS.isControlDown(e)) {
ElementCasePane reportPane = grid.getElementCasePane();
if (reportPane.isHorizontalScrollBarVisible()) {
reportPane.getVerticalScrollBar().setValue(reportPane.getVerticalScrollBar().getValue() + e.getWheelRotation() * 3);
}
}
}
/**
* @param e
*/
public void mouseClicked(MouseEvent e) {
}
/**
* @param e
*/
public void mouseEntered(MouseEvent e) {
}
/**
* @param e
*/
public void mouseExited(MouseEvent e) {
}
}