Browse Source
Merge in DESIGN/design from ~KERRY/design_10.0:feature/x to feature/x * commit '3d91403aac093065ce8811063372b39e979e25a2': 代码修改 KERNEL-9636 新自适应中设计器模块和主 jar 中的重复代码feature/x
kerry
3 years ago
43 changed files with 536 additions and 1206 deletions
@ -1,4 +1,4 @@ |
|||||||
package com.fr.design.fit; |
package com.fr.design.mainframe; |
||||||
|
|
||||||
import com.fr.stable.Constants; |
import com.fr.stable.Constants; |
||||||
import com.fr.stable.unit.LEN_UNIT; |
import com.fr.stable.unit.LEN_UNIT; |
@ -1,4 +1,4 @@ |
|||||||
package com.fr.design.fit; |
package com.fr.design.mainframe; |
||||||
|
|
||||||
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
||||||
import com.fr.stable.unit.UNIT; |
import com.fr.stable.unit.UNIT; |
@ -1,115 +0,0 @@ |
|||||||
package com.fr.design.actions; |
|
||||||
|
|
||||||
|
|
||||||
import com.fr.base.iofile.attr.MobileOnlyTemplateAttrMark; |
|
||||||
import com.fr.design.designer.creator.XLayoutContainer; |
|
||||||
import com.fr.design.designer.creator.XWAbsoluteBodyLayout; |
|
||||||
import com.fr.design.designer.creator.XWFitLayout; |
|
||||||
import com.fr.design.dialog.BasicDialog; |
|
||||||
import com.fr.design.dialog.DialogActionAdapter; |
|
||||||
import com.fr.design.fit.NewJForm; |
|
||||||
import com.fr.design.fit.common.AdaptiveSwitchUtil; |
|
||||||
import com.fr.design.fit.common.TemplateTool; |
|
||||||
import com.fr.design.form.mobile.FormMobileAttrPane; |
|
||||||
import com.fr.design.mainframe.DesignerContext; |
|
||||||
import com.fr.design.mainframe.FormArea; |
|
||||||
import com.fr.design.mainframe.FormDesigner; |
|
||||||
import com.fr.design.mainframe.JForm; |
|
||||||
import com.fr.design.mainframe.WidgetPropertyPane; |
|
||||||
import com.fr.file.FILE; |
|
||||||
import com.fr.form.main.Form; |
|
||||||
import com.fr.form.main.mobile.FormMobileAttr; |
|
||||||
import com.fr.record.analyzer.EnableMetrics; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
|
|
||||||
import java.awt.event.ActionEvent; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by fanglei on 2016/11/14. |
|
||||||
*/ |
|
||||||
@EnableMetrics |
|
||||||
public class NewFormMobileAttrAction extends FormMobileAttrAction { |
|
||||||
|
|
||||||
public NewFormMobileAttrAction(JForm jf) { |
|
||||||
super(jf); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 执行动作 |
|
||||||
* |
|
||||||
* @return 是否执行成功 |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void actionPerformed(ActionEvent e) { |
|
||||||
final JForm jf = getEditingComponent(); |
|
||||||
if (jf == null) { |
|
||||||
return; |
|
||||||
} |
|
||||||
final Form formTpl = jf.getTarget(); |
|
||||||
FormMobileAttr mobileAttr = formTpl.getFormMobileAttr(); |
|
||||||
|
|
||||||
final FormMobileAttrPane mobileAttrPane = new FormMobileAttrPane(); |
|
||||||
mobileAttrPane.populateBean(mobileAttr); |
|
||||||
|
|
||||||
final boolean oldMobileOnly = mobileAttr.isMobileOnly(); |
|
||||||
final boolean oldAdaptive = mobileAttr.isAdaptivePropertyAutoMatch(); |
|
||||||
BasicDialog dialog = mobileAttrPane.showWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
|
||||||
@Override |
|
||||||
public void doOk() { |
|
||||||
FormMobileAttr formMobileAttr = mobileAttrPane.updateBean(); |
|
||||||
if (formMobileAttr.isMobileOnly() && jf.getTarget().getAttrMark(MobileOnlyTemplateAttrMark.XML_TAG) == null) { |
|
||||||
// 如果是老模板,选择手机专属之后需要另存为
|
|
||||||
FILE editingFILE = jf.getEditingFILE(); |
|
||||||
if (editingFILE != null && editingFILE.exists()) { |
|
||||||
String fileName = editingFILE.getName().substring(0, editingFILE.getName().length() - jf.suffix().length()) + "_mobile"; |
|
||||||
if (!jf.saveAsTemplate(true, fileName)) { |
|
||||||
return; |
|
||||||
} |
|
||||||
} |
|
||||||
// 放到后面。如果提前 return 了,则仍然处于未设置状态,不要添加
|
|
||||||
jf.getTarget().addAttrMark(new MobileOnlyTemplateAttrMark()); |
|
||||||
} |
|
||||||
// 设置移动端属性并刷新界面
|
|
||||||
formTpl.setFormMobileAttr(formMobileAttr); // 会调整 body 的自适应布局,放到最后
|
|
||||||
boolean changeSize = (!oldMobileOnly && formMobileAttr.isMobileOnly()) || (oldMobileOnly && !formMobileAttr.isMobileOnly()); |
|
||||||
if (changeSize) { |
|
||||||
((FormArea)jf.getFormDesign().getParent()).onMobileAttrModified(); |
|
||||||
} |
|
||||||
//改变布局为自适应布局,只在移动端属性设置保存后改变一次
|
|
||||||
boolean changeLayout = !oldAdaptive && formMobileAttr.isAdaptivePropertyAutoMatch(); |
|
||||||
if (changeLayout) { |
|
||||||
jf.getFormDesign().getSelectionModel().setSelectedCreator(jf.getFormDesign().getRootComponent()); |
|
||||||
doChangeBodyLayout(); |
|
||||||
WidgetPropertyPane.getInstance().refreshDockingView(); |
|
||||||
} |
|
||||||
jf.fireTargetModified(); |
|
||||||
FILE editingFILE = jf.getEditingFILE(); |
|
||||||
if(editingFILE != null && editingFILE.exists()){ |
|
||||||
JForm jForm = getEditingComponent(); |
|
||||||
TemplateTool.saveForm(jForm); |
|
||||||
if (jForm instanceof NewJForm) { |
|
||||||
AdaptiveSwitchUtil.switch2OldUI(); |
|
||||||
} |
|
||||||
}else { |
|
||||||
AdaptiveSwitchUtil.switch2OldUIMode(); |
|
||||||
NewJForm mobileJForm = new NewJForm(jf.getTarget(), jf.getEditingFILE()); |
|
||||||
//设置临时的id,和新建的模板区分
|
|
||||||
mobileJForm.getTarget().setTemplateID(StringUtils.EMPTY); |
|
||||||
TemplateTool.resetTabPaneEditingTemplate(mobileJForm); |
|
||||||
TemplateTool.activeAndResizeTemplate(mobileJForm); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
dialog.setVisible(true); |
|
||||||
} |
|
||||||
|
|
||||||
private void doChangeBodyLayout(){ |
|
||||||
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
|
||||||
XLayoutContainer rootLayout = formDesigner.getRootComponent(); |
|
||||||
if (rootLayout.getComponentCount() == 1 && rootLayout.getXCreator(0).acceptType(XWAbsoluteBodyLayout.class)) { |
|
||||||
rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(0); |
|
||||||
} |
|
||||||
((XWFitLayout)formDesigner.getRootComponent()).switch2FitBodyLayout(rootLayout); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
@ -1,70 +0,0 @@ |
|||||||
package com.fr.design.fit.grid; |
|
||||||
|
|
||||||
import com.fr.base.DynamicUnitList; |
|
||||||
import com.fr.design.fit.DesignerUIModeConfig; |
|
||||||
import com.fr.design.mainframe.ElementCasePane; |
|
||||||
import com.fr.grid.GridHeader; |
|
||||||
import com.fr.grid.AbstractGridHeaderMouseHandler; |
|
||||||
import com.fr.report.elementcase.ElementCase; |
|
||||||
import com.fr.report.elementcase.TemplateElementCase; |
|
||||||
|
|
||||||
import java.awt.event.MouseEvent; |
|
||||||
|
|
||||||
public abstract class GridHeaderWithBoundMouseHandler extends AbstractGridHeaderMouseHandler{ |
|
||||||
protected static final int FUZZY_EDGE = 10; |
|
||||||
private int limit; |
|
||||||
|
|
||||||
public GridHeaderWithBoundMouseHandler(GridHeader gHeader, int limit) { |
|
||||||
super(gHeader); |
|
||||||
this.limit = limit; |
|
||||||
} |
|
||||||
|
|
||||||
public void setLimit(int limit) { |
|
||||||
this.limit = limit; |
|
||||||
} |
|
||||||
|
|
||||||
public int getLimit() { |
|
||||||
return limit; |
|
||||||
} |
|
||||||
|
|
||||||
public int getDragIndex(MouseEvent evt) { |
|
||||||
ElementCase report = this.getEditingElementCase(); |
|
||||||
DynamicUnitList sizeList = getSizeList(report); |
|
||||||
|
|
||||||
int scrollValue = getScrollValue(this.getElementCasePane()); |
|
||||||
int scrollExtent = getScrollExtent(this.getElementCasePane()); |
|
||||||
int endValue = scrollValue + scrollExtent + 1; |
|
||||||
|
|
||||||
int beginValue = getBeginValue(this.getElementCasePane()); |
|
||||||
|
|
||||||
double tmpSize1 = 0; |
|
||||||
double tmpSize2; |
|
||||||
double tmpIncreaseSize = 0; |
|
||||||
|
|
||||||
int resolution = DesignerUIModeConfig.getInstance().getScreenResolution(); |
|
||||||
|
|
||||||
for (int index = beginValue; index < endValue; index++) { |
|
||||||
if (index == 0) { |
|
||||||
index = scrollValue; |
|
||||||
} |
|
||||||
|
|
||||||
tmpSize1 += tmpIncreaseSize; |
|
||||||
tmpIncreaseSize = sizeList.get(index).toPixD(resolution); |
|
||||||
tmpSize2 = tmpSize1 + Math.max(1, tmpIncreaseSize); |
|
||||||
if (isOnSeparatorLineIncludeZero(evt, tmpSize2, tmpIncreaseSize) || isOnNormalSeparatorLine(evt, tmpSize2)) { |
|
||||||
return index; |
|
||||||
} |
|
||||||
} |
|
||||||
return -1; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public ElementCasePane getElementCasePane() { |
|
||||||
return this.gHeader.getElementCasePane(); |
|
||||||
} |
|
||||||
|
|
||||||
public TemplateElementCase getEditingElementCase() { |
|
||||||
return this.getElementCasePane().getEditingElementCase(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,194 +0,0 @@ |
|||||||
package com.fr.design.fit.grid; |
|
||||||
|
|
||||||
import com.fr.base.DynamicUnitList; |
|
||||||
import com.fr.design.fit.DesignerUIModeConfig; |
|
||||||
import com.fr.design.gui.imenu.UIPopupMenu; |
|
||||||
import com.fr.design.mainframe.ElementCasePane; |
|
||||||
import com.fr.grid.GridColumn; |
|
||||||
import com.fr.grid.GridHeader; |
|
||||||
import com.fr.grid.GridUtils; |
|
||||||
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.stable.ColumnRow; |
|
||||||
import com.fr.stable.unit.FU; |
|
||||||
import com.fr.stable.unit.UNIT; |
|
||||||
|
|
||||||
import javax.swing.SwingUtilities; |
|
||||||
import java.awt.Dimension; |
|
||||||
import java.awt.Point; |
|
||||||
import java.awt.Rectangle; |
|
||||||
import java.awt.Toolkit; |
|
||||||
import java.awt.event.MouseEvent; |
|
||||||
|
|
||||||
/** |
|
||||||
* peter:处理对GridColumn的Mouse事件. |
|
||||||
*/ |
|
||||||
public class GridLimitColumnMouseHandler extends GridHeaderWithBoundMouseHandler { |
|
||||||
|
|
||||||
|
|
||||||
public GridLimitColumnMouseHandler(GridColumn gridColumn, int limit) { |
|
||||||
super(gridColumn, limit); |
|
||||||
this.resolution = gridColumn.getResolution(); |
|
||||||
} |
|
||||||
|
|
||||||
@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); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
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 ElementCasePaneUtil.createColumnPopupMenu(reportPane, 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); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void mouseReleased(MouseEvent e) { |
|
||||||
super.mouseReleased(e); |
|
||||||
int resolution = DesignerUIModeConfig.getInstance().getScreenResolution(); |
|
||||||
int dragIndex = getDragIndex(e); |
|
||||||
if (Math.abs(e.getX() - getLimit()) < FUZZY_EDGE && dragIndex >= 0) { |
|
||||||
UNIT oldValue = this.getEditingElementCase().getColumnWidth(dragIndex); |
|
||||||
this.getEditingElementCase().setColumnWidth(dragIndex, FU.valueOfPix(oldValue.toPixI(resolution) + getLimit() - e.getX(), resolution)); |
|
||||||
} |
|
||||||
this.getElementCasePane().repaint(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,190 +0,0 @@ |
|||||||
package com.fr.design.fit.grid; |
|
||||||
|
|
||||||
import com.fr.base.DynamicUnitList; |
|
||||||
import com.fr.design.fit.DesignerUIModeConfig; |
|
||||||
import com.fr.design.gui.imenu.UIPopupMenu; |
|
||||||
import com.fr.design.mainframe.ElementCasePane; |
|
||||||
import com.fr.grid.GridHeader; |
|
||||||
import com.fr.grid.GridRow; |
|
||||||
import com.fr.grid.GridUtils; |
|
||||||
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.stable.ColumnRow; |
|
||||||
import com.fr.stable.unit.FU; |
|
||||||
import com.fr.stable.unit.UNIT; |
|
||||||
|
|
||||||
import javax.swing.SwingUtilities; |
|
||||||
import java.awt.Dimension; |
|
||||||
import java.awt.Point; |
|
||||||
import java.awt.Rectangle; |
|
||||||
import java.awt.event.MouseEvent; |
|
||||||
|
|
||||||
/** |
|
||||||
* peter:处理对GridRow的Mouse事件. |
|
||||||
*/ |
|
||||||
public class GridLimitRowMouseHandler extends GridHeaderWithBoundMouseHandler { |
|
||||||
|
|
||||||
public GridLimitRowMouseHandler(GridRow gridRow, int limit) { |
|
||||||
super(gridRow, limit); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void resetSelectionByRightButton(ColumnRow selectedCellPoint, Selection cs, ElementCasePane ePane) { |
|
||||||
int[] selectedRows = cs.getSelectedRows(); |
|
||||||
if (selectedRows.length == 0 |
|
||||||
|| selectedCellPoint.getRow() < selectedRows[0] |
|
||||||
|| selectedCellPoint.getRow() > selectedRows[selectedRows.length - 1]) { |
|
||||||
resetGridSelectionBySelect(selectedCellPoint.getRow(), ePane); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
protected int doChooseFrom() { |
|
||||||
return CellSelection.CHOOSE_ROW; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int getScrollValue(ElementCasePane casePane) { |
|
||||||
return casePane.getGrid().getVerticalValue(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int getScrollExtent(ElementCasePane casePane) { |
|
||||||
return casePane.getGrid().getVerticalExtent(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int getBeginValue(ElementCasePane casePane) { |
|
||||||
return casePane.getGrid().getVerticalBeginValue(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected Rectangle resetSelectedBoundsByShift(Rectangle editRectangle, ColumnRow selectedCellPoint, ElementCasePane reportPane) { |
|
||||||
int tempOldSelectedCellY = editRectangle.y;// editRectangle.x;
|
|
||||||
|
|
||||||
// ajust them to got the correct selected bounds.
|
|
||||||
if (selectedCellPoint.getRow() >= editRectangle.y) { |
|
||||||
selectedCellPoint = ColumnRow.valueOf(selectedCellPoint.getColumn(), selectedCellPoint.getRow() + 1); |
|
||||||
} else { |
|
||||||
tempOldSelectedCellY++; |
|
||||||
} |
|
||||||
|
|
||||||
int lastColumn = GridUtils.getAdjustLastColumnRowOfReportPane(reportPane).getColumn(); |
|
||||||
return new Rectangle(0, Math.min(tempOldSelectedCellY, selectedCellPoint.getRow()), |
|
||||||
lastColumn, Math.max(editRectangle.height, Math.abs(tempOldSelectedCellY - selectedCellPoint.getRow()))); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int[] getGridSelectionIndices(CellSelection cs) { |
|
||||||
return cs.getSelectedRows(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int getColumnOrRowByGridHeader(ColumnRow selectedCellPoint) { |
|
||||||
return selectedCellPoint.getRow(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
protected void resetGridSelectionBySelect(int row, ElementCasePane ePane) { |
|
||||||
int lastColumn = GridUtils.getAdjustLastColumnRowOfReportPane(ePane).getColumn(); |
|
||||||
CellSelection cellSelection = new CellSelection(0, row, lastColumn, 1); |
|
||||||
cellSelection.setSelectedType(CellSelection.CHOOSE_ROW); |
|
||||||
ePane.setSelection(cellSelection); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Checks whether is on zero separator line. |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
protected boolean isOnSeparatorLineIncludeZero(MouseEvent evt, double tmpHeight2, double tmpIncreaseHeight) { |
|
||||||
return tmpIncreaseHeight <= 1 && (evt.getY() >= tmpHeight2 + 2 && evt.getY() <= tmpHeight2 + SEPARATOR_GAP); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected boolean between(MouseEvent evt, double from, double to) { |
|
||||||
return evt.getY() > from && evt.getY() <= to; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected DynamicUnitList getSizeList(ElementCase elementCase) { |
|
||||||
return ReportHelper.getRowHeightList(elementCase); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String methodName() { |
|
||||||
return "setRowHeight"; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Checks whether is on normal separator line. |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
protected boolean isOnNormalSeparatorLine(MouseEvent evt, double tmpHeight2) { |
|
||||||
return (evt.getY() >= tmpHeight2 - 2) && (evt.getY() <= tmpHeight2 + 2); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected int evtOffset(MouseEvent evt, int offset) { |
|
||||||
return evt.getY() - offset; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String getSelectedHeaderTooltip(int rowSelectedCount) { |
|
||||||
return rowSelectedCount + "R"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected Point getTipLocationByMouseEvent(MouseEvent evt, GridHeader gHeader, Dimension tipPreferredSize) { |
|
||||||
Point convertPoint = new Point(0, evt.getY()); |
|
||||||
SwingUtilities.convertPointToScreen(convertPoint, gHeader); |
|
||||||
|
|
||||||
convertPoint.x = convertPoint.x + gHeader.getSize().width + 2; |
|
||||||
convertPoint.y = convertPoint.y - tipPreferredSize.height / 2; |
|
||||||
|
|
||||||
return convertPoint; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String nameOfMoveCursorGIF() { |
|
||||||
return "cursor_vmove"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String nameOfSelectCursorGIF() { |
|
||||||
return "cursor_vselect"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String nameOfSplitCursorGIF() { |
|
||||||
return "cursor_vsplit"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected UIPopupMenu createPopupMenu(ElementCasePane reportPane, |
|
||||||
MouseEvent evt, int rowIndex) { |
|
||||||
return ElementCasePaneUtil.createRowPopupMenu(reportPane, evt, rowIndex); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void resetGridSelectionByDrag(CellSelection gridSelection, ElementCasePane reportPane, |
|
||||||
int startMultiSelectIndex, int endMultiSelectIndex) { |
|
||||||
int lastColumn = GridUtils.getAdjustLastColumnRowOfReportPane(reportPane).getColumn(); |
|
||||||
gridSelection.setLastRectangleBounds(0, Math.min(endMultiSelectIndex, startMultiSelectIndex), lastColumn, Math.abs(startMultiSelectIndex - endMultiSelectIndex) + 1); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void mouseReleased(MouseEvent e) { |
|
||||||
super.mouseReleased(e); |
|
||||||
int resolution = DesignerUIModeConfig.getInstance().getScreenResolution(); |
|
||||||
int dragIndex = getDragIndex(e); |
|
||||||
if (Math.abs(e.getY() - getLimit()) < FUZZY_EDGE && dragIndex >= 0) { |
|
||||||
UNIT oldValue = this.getEditingElementCase().getRowHeight(dragIndex); |
|
||||||
this.getEditingElementCase().setRowHeight(dragIndex, FU.valueOfPix(oldValue.toPixI(resolution) + getLimit() - e.getY(), resolution)); |
|
||||||
} |
|
||||||
this.getElementCasePane().repaint(); |
|
||||||
} |
|
||||||
} |
|
@ -1,201 +0,0 @@ |
|||||||
package com.fr.design.fit.grid; |
|
||||||
|
|
||||||
import com.fr.design.designer.creator.XElementCase; |
|
||||||
import com.fr.design.fit.AdaptiveCellElementPainter; |
|
||||||
import com.fr.design.fit.DesignerUIModeConfig; |
|
||||||
import com.fr.design.fit.common.FormDesignerUtil; |
|
||||||
import com.fr.design.mainframe.ElementCasePane; |
|
||||||
import com.fr.design.mainframe.FormDesigner; |
|
||||||
import com.fr.grid.CellElementPainter; |
|
||||||
import com.fr.grid.Grid; |
|
||||||
import com.fr.grid.GridColumn; |
|
||||||
import com.fr.grid.GridRow; |
|
||||||
import com.fr.grid.GridUI; |
|
||||||
import com.fr.report.elementcase.TemplateElementCase; |
|
||||||
import com.fr.report.worksheet.FormElementCase; |
|
||||||
import com.fr.stable.Constants; |
|
||||||
import com.fr.stable.GraphDrawHelper; |
|
||||||
|
|
||||||
import javax.swing.JComponent; |
|
||||||
import java.awt.Color; |
|
||||||
import java.awt.Graphics; |
|
||||||
import java.awt.Graphics2D; |
|
||||||
import java.awt.Insets; |
|
||||||
import java.awt.Rectangle; |
|
||||||
import java.awt.event.MouseListener; |
|
||||||
import java.awt.event.MouseMotionListener; |
|
||||||
import java.awt.event.MouseWheelListener; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Created by kerry on 2020-04-14 |
|
||||||
*/ |
|
||||||
public class NewFormDesignerGridUI extends GridUI { |
|
||||||
private GridLimitColumnMouseHandler gridColumnMouseHandler; |
|
||||||
private GridLimitRowMouseHandler gridRowMouseHandler; |
|
||||||
private AdaptiveGridListener adaptiveGridListener; |
|
||||||
private FormDesigner designer; |
|
||||||
|
|
||||||
public NewFormDesignerGridUI(FormDesigner designer, int resolution) { |
|
||||||
super(resolution); |
|
||||||
this.designer = designer; |
|
||||||
this.setCellElementPainter(new AdaptiveCellElementPainter()); |
|
||||||
} |
|
||||||
|
|
||||||
public void setCellElementPainter(CellElementPainter elementPainter) { |
|
||||||
this.painter = elementPainter; |
|
||||||
} |
|
||||||
|
|
||||||
public void paint(Graphics g, JComponent c) { |
|
||||||
Graphics2D g2d = (Graphics2D) g; |
|
||||||
Grid grid = (Grid) c; |
|
||||||
// 取得ElementCasePane.ElementCase
|
|
||||||
ElementCasePane elementCasePane = grid.getElementCasePane(); |
|
||||||
final TemplateElementCase elementCase = elementCasePane.getEditingElementCase(); |
|
||||||
|
|
||||||
super.paint(g, c); |
|
||||||
|
|
||||||
if (!(elementCase instanceof FormElementCase)) { |
|
||||||
return; |
|
||||||
} |
|
||||||
final Rectangle rectangle = getBoundsLineRect(elementCase, grid); |
|
||||||
int width = getScaleWidth(rectangle.width) - columnWidthList.getRangeValue(0, horizontalValue).toPixI(resolution); |
|
||||||
int height = getScaleHeight(rectangle.height) - rowHeightList.getRangeValue(0, verticalValue).toPixI(resolution); |
|
||||||
drawBoundsLine(g2d, width, height); |
|
||||||
addListener(grid, elementCasePane, width, height, rectangle.width, rectangle.height); |
|
||||||
} |
|
||||||
|
|
||||||
private int getScaleWidth(int width) { |
|
||||||
return width * resolution / DesignerUIModeConfig.getInstance().getScreenResolution(); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private int getScaleHeight(int height) { |
|
||||||
return height * resolution / DesignerUIModeConfig.getInstance().getScreenResolution(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 获取需要画线的矩形大小 |
|
||||||
*/ |
|
||||||
private Rectangle getBoundsLineRect(TemplateElementCase elementCase, Grid grid) { |
|
||||||
final Rectangle rectangle = new Rectangle(); |
|
||||||
XElementCase xElementCase = FormDesignerUtil.getXelementCase(designer.getRootComponent(), (FormElementCase) elementCase); |
|
||||||
if (xElementCase != null) { |
|
||||||
rectangle.setBounds(xElementCase.getBounds()); |
|
||||||
|
|
||||||
//减去内边距的宽和高
|
|
||||||
Insets insets = xElementCase.getInsets(); |
|
||||||
rectangle.width -= insets.left + insets.right; |
|
||||||
rectangle.height -= insets.top + insets.bottom; |
|
||||||
|
|
||||||
} |
|
||||||
return rectangle; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void addListener(Grid grid, ElementCasePane elementCasePane, int width, int height, int actualWidth, int actualHeight) { |
|
||||||
addGridColumnListener(elementCasePane.getGridColumn(), width); |
|
||||||
addGridRowListener(elementCasePane.getGridRow(), height); |
|
||||||
addMouseListener(grid, width, height, actualWidth, actualHeight); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void drawBoundsLine(Graphics2D g2d, int width, int height) { |
|
||||||
g2d.setPaint(Color.black); |
|
||||||
g2d.setStroke(GraphDrawHelper.getStroke(Constants.LINE_DASH_DOT)); |
|
||||||
g2d.drawLine(0, height, width, height); |
|
||||||
g2d.drawLine(width, 0, width, height); |
|
||||||
} |
|
||||||
|
|
||||||
private void removeGridColumnListener(GridColumn column) { |
|
||||||
MouseMotionListener[] mouseMotionListeners = column.getMouseMotionListeners(); |
|
||||||
for (MouseMotionListener mouseMotionListener : mouseMotionListeners) { |
|
||||||
if (mouseMotionListener instanceof com.fr.grid.GridColumnMouseHandler || mouseMotionListener instanceof GridLimitColumnMouseHandler) { |
|
||||||
column.removeMouseMotionListener(mouseMotionListener); |
|
||||||
} |
|
||||||
} |
|
||||||
MouseListener[] mouseListeners = column.getMouseListeners(); |
|
||||||
for (MouseListener motionListener : mouseListeners) { |
|
||||||
if (motionListener instanceof com.fr.grid.GridColumnMouseHandler || motionListener instanceof GridLimitColumnMouseHandler) { |
|
||||||
column.removeMouseListener(motionListener); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void removeGridRowListener(GridRow row) { |
|
||||||
MouseMotionListener[] mouseMotionListeners = row.getMouseMotionListeners(); |
|
||||||
for (MouseMotionListener mouseMotionListener : mouseMotionListeners) { |
|
||||||
if (mouseMotionListener instanceof com.fr.grid.GridRowMouseHandler || mouseMotionListener instanceof GridLimitRowMouseHandler) { |
|
||||||
row.removeMouseMotionListener(mouseMotionListener); |
|
||||||
} |
|
||||||
} |
|
||||||
MouseListener[] mouseListeners = row.getMouseListeners(); |
|
||||||
for (MouseListener motionListener : mouseListeners) { |
|
||||||
if (motionListener instanceof com.fr.grid.GridRowMouseHandler || motionListener instanceof GridLimitRowMouseHandler) { |
|
||||||
row.removeMouseListener(motionListener); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void removeGridListener(Grid grid) { |
|
||||||
MouseMotionListener[] mouseMotionListeners = grid.getMouseMotionListeners(); |
|
||||||
for (MouseMotionListener mouseMotionListener : mouseMotionListeners) { |
|
||||||
if (mouseMotionListener instanceof AdaptiveGridListener) { |
|
||||||
grid.removeMouseMotionListener(mouseMotionListener); |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
MouseListener[] mouseListeners = grid.getMouseListeners(); |
|
||||||
for (MouseListener motionListener : mouseListeners) { |
|
||||||
if (motionListener instanceof AdaptiveGridListener) { |
|
||||||
grid.removeMouseListener(motionListener); |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
MouseWheelListener[] mouseWheelListeners = grid.getMouseWheelListeners(); |
|
||||||
for (MouseWheelListener mouseWheelListener : mouseWheelListeners) { |
|
||||||
if (mouseWheelListener instanceof AdaptiveGridListener) { |
|
||||||
grid.removeMouseWheelListener(mouseWheelListener); |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void addGridColumnListener(GridColumn column, int width) { |
|
||||||
if (gridColumnMouseHandler != null) { |
|
||||||
gridColumnMouseHandler.setLimit(width); |
|
||||||
return; |
|
||||||
} |
|
||||||
removeGridColumnListener(column); |
|
||||||
gridColumnMouseHandler = new GridLimitColumnMouseHandler(column, width); |
|
||||||
column.addMouseListener(gridColumnMouseHandler); |
|
||||||
column.addMouseMotionListener(gridColumnMouseHandler); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void addGridRowListener(GridRow row, int height) { |
|
||||||
if (gridRowMouseHandler != null) { |
|
||||||
gridRowMouseHandler.setLimit(height); |
|
||||||
return; |
|
||||||
} |
|
||||||
removeGridRowListener(row); |
|
||||||
gridRowMouseHandler = new GridLimitRowMouseHandler(row, height); |
|
||||||
row.addMouseMotionListener(gridRowMouseHandler); |
|
||||||
row.addMouseListener(gridRowMouseHandler); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void addMouseListener(Grid grid, int width, int height, int actualWidth, int actualHeight) { |
|
||||||
if (adaptiveGridListener != null) { |
|
||||||
adaptiveGridListener.resetBoundInfo(width, height, actualWidth, actualHeight); |
|
||||||
return; |
|
||||||
} |
|
||||||
removeGridListener(grid); |
|
||||||
adaptiveGridListener = new AdaptiveGridListener(grid, width, height, actualWidth, actualHeight); |
|
||||||
grid.addMouseMotionListener(adaptiveGridListener); |
|
||||||
grid.addMouseListener(adaptiveGridListener); |
|
||||||
grid.addMouseWheelListener(adaptiveGridListener); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue