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.
844 lines
35 KiB
844 lines
35 KiB
package com.fr.grid; |
|
|
|
import java.awt.Cursor; |
|
import java.awt.Point; |
|
import java.awt.Rectangle; |
|
import java.awt.event.MouseEvent; |
|
import java.awt.event.MouseListener; |
|
import java.awt.event.MouseMotionListener; |
|
import java.awt.event.MouseWheelEvent; |
|
import java.awt.event.MouseWheelListener; |
|
import java.util.HashMap; |
|
import java.util.Map; |
|
|
|
import javax.swing.JPopupMenu; |
|
import javax.swing.SwingUtilities; |
|
|
|
import com.fr.base.BaseUtils; |
|
import com.fr.base.DynamicUnitList; |
|
import com.fr.base.ScreenResolution; |
|
import com.fr.design.constants.UIConstants; |
|
import com.fr.design.mainframe.DesignerContext; |
|
import com.fr.design.mainframe.ElementCasePane; |
|
import com.fr.design.present.CellWriteAttrPane; |
|
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 com.fr.stable.unit.OLDPIX; |
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
/** |
|
* 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; |
|
|
|
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 (grid.getDrawingFloatElement() != null) { |
|
doWithDrawingFloatElement(); |
|
} else { |
|
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(ePane, oldEvtX, oldEvtY); |
|
} |
|
} |
|
|
|
} |
|
|
|
/** |
|
* 将悬浮元素(只有文本和公式)添加到鼠标点击的位置 |
|
*/ |
|
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(reportPane, this.oldEvtX, this.oldEvtY); |
|
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 = evt.isControlDown(); |
|
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(reportPane, this.oldEvtX, this.oldEvtY); |
|
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) { |
|
int resolution = ScreenResolution.getScreenResolution(); |
|
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)) { |
|
CellWriteAttrPane.showWidgetWindow(grid.getElementCasePane()); |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
/** |
|
* @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 (grid.getDrawingFloatElement() != null) { |
|
if (grid.getDrawingFloatElement().getWidth().equal_zero() && grid.getDrawingFloatElement().getHeight().equal_zero()) { |
|
grid.getDrawingFloatElement().setWidth(new OLDPIX(100)); |
|
grid.getDrawingFloatElement().setHeight(new OLDPIX(100)); |
|
} |
|
grid.setDrawingFloatElement(null); |
|
} else if (selection instanceof FloatSelection) { |
|
grid.setCursor(Cursor.getDefaultCursor()); |
|
} |
|
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 = evt.isControlDown(); |
|
|
|
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(reportPane, evtX, evtY); |
|
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(reportPane, evtX, evtY); |
|
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(reportPane, evtX, evtY); |
|
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(reportPane, evtX, evtY); |
|
//拷贝,而不是直接强制使用以监听单元格选择变化 |
|
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); |
|
if (grid.getDrawingFloatElement() != null) { |
|
grid.setCursor(UIConstants.DRAW_CURSOR); // august:是否是将要画悬浮元素,就是那个笔的形状 |
|
} else { |
|
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(reportPane, evtX, evtY); |
|
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(reportPane, evtX, evtY); |
|
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()); |
|
|
|
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) { |
|
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) { |
|
} |
|
} |