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

127 lines
4.6 KiB

package com.fr.design.actions.utils;
import com.fr.base.Style;
import com.fr.design.actions.cell.style.StyleActionInterface;
import com.fr.design.mainframe.DesignOperationEvent;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.event.EventDispatcher;
import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.FloatSelection;
import com.fr.grid.selection.Selection;
import com.fr.report.cell.CellElement;
import com.fr.report.cell.DefaultTemplateCellElement;
import com.fr.report.cell.FloatElement;
import com.fr.report.cell.TemplateCellElement;
import com.fr.report.elementcase.ElementCase;
import com.fr.report.elementcase.TemplateElementCase;
import java.awt.*;
public class ReportActionUtils {
private ReportActionUtils() {
}
public static interface IterAction {
public void dealWith(CellElement editCellElement);
}
public static boolean executeAction(
final StyleActionInterface styleActionInterface, ElementCasePane reportPane) {
Selection sel = reportPane.getSelection();
if (sel instanceof FloatSelection) {
ElementCase report = reportPane.getEditingElementCase();
FloatElement selectedFloatElement =
report.getFloatElement(((FloatSelection) sel).getSelectedFloatName());
Style selectedStyle = selectedFloatElement.getStyle();
selectedFloatElement.setStyle(
styleActionInterface.executeStyle(selectedStyle, selectedStyle));
} else {
TemplateElementCase report = reportPane.getEditingElementCase();
TemplateCellElement editCellElement = report.getTemplateCellElement(((CellSelection) sel).getColumn(), ((CellSelection) sel).getRow());
if (editCellElement == null) {
editCellElement = new DefaultTemplateCellElement(((CellSelection) sel).getColumn(), ((CellSelection) sel).getRow());
report.addCellElement(editCellElement);
}
final Style selectedStyle = editCellElement.getStyle();
actionIterateWithCellSelection((CellSelection) sel, report, new IterAction() {
@Override
public void dealWith(CellElement editCellElement) {
Style style2Mod = editCellElement.getStyle();
updateCellStyle(editCellElement, styleActionInterface.executeStyle(style2Mod, selectedStyle));
}
});
}
return true;
}
public static void actionIterateWithCellSelection(
CellSelection gridSelection, TemplateElementCase report, IterAction action) {
//需要先行后列地增加新元素。
// 从最后循环起以保证最后一个修改标准单元格(originalStyle)。
int cellRectangleCount = gridSelection.getCellRectangleCount();
for (int rec = 0; rec < cellRectangleCount; rec++) {
Rectangle cellRectangle = gridSelection.getCellRectangle(rec);
// 从最后循环起以保证最后一个修改标准单元格(originalStyle)。
for (int j = cellRectangle.height - 1; j >= 0; j--) {
for (int i = cellRectangle.width - 1; i >= 0; i--) {
int column = i + cellRectangle.x;
int row = j + cellRectangle.y;
TemplateCellElement editCellElement = report.getTemplateCellElement(column, row);
if (editCellElement == null) {
editCellElement = new DefaultTemplateCellElement(column, row);
report.addCellElement(editCellElement);
} else {
// 对于合并的格子,我们不多次计算的Style.
if (editCellElement.getColumn() != column
|| editCellElement.getRow() != row) {
continue;
}
}
action.dealWith(editCellElement);
}
}
}
}
/**
* peter:是只读的分析然后获得当前的Style.
*
* @param reportPane the current rpt pane.
* @return current style.
*/
public static Style getCurrentStyle(ElementCasePane reportPane) {
//got simple cell element from row and column
ElementCase report = reportPane.getEditingElementCase();
Selection sel = reportPane.getSelection();
if (sel instanceof FloatSelection) {
FloatElement selectedFloatElement = report.getFloatElement(((FloatSelection) sel).getSelectedFloatName());
return selectedFloatElement.getStyle();
}
//需要先行后列地增加新元素。
//vivian: 如excel那样改变style.是状态的改变由第一个的状态决定,即如果只选择了第一个值那么就改为相反的值,
// 如果是选择了多个值则首先变成和第一个值的一样
CellElement editCellElement = report.getCellElement(((CellSelection) sel).getColumn(), ((CellSelection) sel).getRow());
if (editCellElement == null) {
return Style.DEFAULT_STYLE;
}
//peter:直接返回当前编辑元素的Style
return editCellElement.getStyle();
}
public static void updateCellStyle(CellElement cellElement, Style style){
cellElement.setStyle(style);
EventDispatcher.fire(DesignOperationEvent.CELL_STYLE_MODIFY);
}
}