package com.fr.grid; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseEvent; import javax.swing.SwingUtilities; import com.fr.base.DynamicUnitList; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.Selection; import com.fr.report.ReportHelper; import com.fr.report.elementcase.ElementCase; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.ColumnRow; import com.fr.stable.unit.FU; import com.fr.stable.unit.UNIT; /** * peter:处理对GridColumn的Mouse事件. */ public class GridColumnMouseHandler extends AbstractGridHeaderMouseHandler { private final int adsorbWidth; public GridColumnMouseHandler(GridColumn gridColumn) { this(gridColumn, 0); } public GridColumnMouseHandler(GridColumn gridColumn, int adsorbWidth) { super(gridColumn); this.adsorbWidth = adsorbWidth; this.resolution = gridColumn.resolution; } public void setResolution(int resolution){ this.resolution = resolution; } @Override protected void resetSelectionByRightButton(ColumnRow selectedCellPoint, Selection cs, ElementCasePane ePane) { int[] selectedColumns = cs.getSelectedColumns(); if (selectedColumns.length == 0 || selectedCellPoint.getColumn() < selectedColumns[0] || selectedCellPoint.getColumn() > selectedColumns[selectedColumns.length - 1]) { resetGridSelectionBySelect(selectedCellPoint.getColumn(), ePane); } } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); if (this.adsorbWidth <= 0) { return; } ElementCasePane elementCasePane = this.gHeader.getElementCasePane(); TemplateElementCase editingElementCase = elementCasePane.getEditingElementCase(); double adsorbWidthWithResolution = this.adsorbWidth * (resolution * 1D / DesignerUIModeConfig.getInstance().getScreenResolution()); int dragIndex = getDragIndex(e); if (Math.abs(e.getX() - adsorbWidthWithResolution) < FUZZY_EDGE && dragIndex >= 0) { UNIT oldValue = editingElementCase.getColumnWidth(dragIndex); editingElementCase.setColumnWidth(dragIndex, oldValue.add(FU.valueOfPix((int) (adsorbWidthWithResolution- e.getX()), resolution))); } elementCasePane.repaint(); } protected int doChooseFrom() { return CellSelection.CHOOSE_COLUMN; } @Override protected Rectangle resetSelectedBoundsByShift(Rectangle editRectangle, ColumnRow selectedCellPoint, ElementCasePane reportPane) { int tempOldSelectedCellX = editRectangle.x;// editRectangle.x; // adjust them to got the correct selected bounds. if (selectedCellPoint.getColumn() >= editRectangle.x) { selectedCellPoint = ColumnRow.valueOf(selectedCellPoint.getColumn() + 1, selectedCellPoint.getRow()); } else { tempOldSelectedCellX++; } int lastRow = GridUtils.getAdjustLastColumnRowOfReportPane(reportPane).getRow(); return new Rectangle(Math.min(tempOldSelectedCellX, selectedCellPoint.getColumn()), 0, Math.max(editRectangle.width, Math.abs(tempOldSelectedCellX - selectedCellPoint.getColumn())), lastRow); } @Override protected int[] getGridSelectionIndices(CellSelection cs) { return cs.getSelectedColumns(); } @Override protected int getScrollValue(ElementCasePane casePane) { return casePane.getGrid().getHorizontalValue(); } @Override protected int getScrollExtent(ElementCasePane casePane) { return casePane.getGrid().getHorizontalExtent(); } @Override protected int getBeginValue(ElementCasePane casePane) { return casePane.getGrid().getHorizontalBeginValue(); } @Override protected int getColumnOrRowByGridHeader(ColumnRow selectedCellPoint) { return selectedCellPoint.getColumn(); } /** * Checks whether is on zero separator line. * */ @Override protected boolean isOnSeparatorLineIncludeZero(MouseEvent evt, double tmpWidth2, double tmpIncreaseWidth) { return tmpIncreaseWidth <= 1 && (evt.getX() >= tmpWidth2 + 2 && (evt.getX() <= tmpWidth2 + SEPARATOR_GAP )); } @Override protected boolean between(MouseEvent evt, double from, double to) { return evt.getX() > from && evt.getX() <= to; } /** * Checks whether is on normal separator line. */ @Override protected boolean isOnNormalSeparatorLine(MouseEvent evt, double tmpWidth2) { return (evt.getX() >= tmpWidth2 - 2) && (evt.getX() <= tmpWidth2 + 2); } @Override protected int evtOffset(MouseEvent evt, int offset) { return evt.getX() - offset; } @Override protected DynamicUnitList getSizeList(ElementCase elementCase) { return ReportHelper.getColumnWidthList(elementCase); } @Override protected String methodName() { return "setColumnWidth"; } @Override protected String getSelectedHeaderTooltip(int selectedColumnCount) { return selectedColumnCount + "C"; } @Override protected Point getTipLocationByMouseEvent(MouseEvent evt, GridHeader gHeader, Dimension tipPreferredSize) { Point convertPoint = new Point(evt.getX(), 0); SwingUtilities.convertPointToScreen(convertPoint, gHeader); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); convertPoint.x = Math.max(0, Math.min(convertPoint.x - tipPreferredSize.width / 2, screenSize.width - tipPreferredSize.width)); convertPoint.y = convertPoint.y - tipPreferredSize.height - 2; return convertPoint; } @Override protected void resetGridSelectionBySelect(int column, ElementCasePane ePane) { int lastRow = GridUtils.getAdjustLastColumnRowOfReportPane(ePane).getRow(); CellSelection cellSelection = new CellSelection(column, 0, 1, lastRow); cellSelection.setSelectedType(CellSelection.CHOOSE_COLUMN); ePane.setSelection(cellSelection); } @Override protected String nameOfMoveCursorGIF() { return "cursor_hmove"; } @Override protected String nameOfSelectCursorGIF() { return "cursor_hselect"; } @Override protected String nameOfSplitCursorGIF() { return "cursor_hsplit"; } @Override protected UIPopupMenu createPopupMenu(ElementCasePane reportPane, MouseEvent evt, int columnIndex) { return reportPane.createColumnPopupMenu(evt, columnIndex); } @Override protected void resetGridSelectionByDrag(CellSelection gridSelection, ElementCasePane reportPane, int startMultiSelectIndex, int endMultiSelectIndex) { int lastRow = GridUtils.getAdjustLastColumnRowOfReportPane(reportPane).getRow(); gridSelection.setLastRectangleBounds(Math.min(endMultiSelectIndex, startMultiSelectIndex), 0, Math.abs(startMultiSelectIndex - endMultiSelectIndex) + 1, lastRow); } }