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

179 lines
8.3 KiB

package com.fr.grid;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import com.fr.base.BaseUtils;
import com.fr.base.DynamicUnitList;
import com.fr.base.GraphHelper;
import com.fr.base.ScreenResolution;
import com.fr.cache.list.IntList;
import com.fr.design.constants.UIConstants;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.roleAuthority.ReportAndFSManagePane;
import com.fr.grid.selection.Selection;
import com.fr.privilege.finegrain.ColumnRowPrivilegeControl;
import com.fr.report.ReportHelper;
import com.fr.report.elementcase.ElementCase;
/**
* @editor zhou
* @since 2012-3-22下午5:54:21
*/
public class GridRowUI extends ComponentUI {
private Color detailsBackground = UIConstants.GRID_ROW_DETAILS_BACKGROUND;
private int resolution ;
GridRowUI(int resolution){
if (resolution == 0){
resolution = ScreenResolution.getScreenResolution();
}
this.resolution = resolution;
}
@Override
public void paint(Graphics g, JComponent c) {
if (!(c instanceof GridRow)) {
throw new IllegalArgumentException("The component c to paint must be a GridColumn!");
}
Graphics2D g2d = (Graphics2D) g;
GridRow gridRow = (GridRow) c;
ElementCasePane reportPane = gridRow.getElementCasePane();
// size
Dimension size = gridRow.getSize();
float time = (float)resolution/ScreenResolution.getScreenResolution();
g2d.setFont(gridRow.getFont().deriveFont(gridRow.getFont().getSize2D() * time));
ElementCase elementCase = reportPane.getEditingElementCase();
DynamicUnitList rowHeightList = ReportHelper.getRowHeightList(elementCase);
int verticalValue = reportPane.getGrid().getVerticalValue();
// denny:
int verticalBeginValue = verticalValue;
reportPane.getGrid().setVerticalBeinValue(verticalBeginValue);
int verticalExtent = reportPane.getGrid().getVerticalExtent();
// paint more rows(double extent), for dragging.
int verticalEndValue = verticalValue + verticalExtent + 1;
double horizontalLineHeight = size.getHeight();
// use background to paint first.
// denny: 用来标识已有数据
int rowCount = elementCase.getRowCount();
double rowTopHeight = 0;
if (rowCount > verticalBeginValue) {
rowTopHeight = rowHeightList.getRangeValue(verticalBeginValue, rowCount).toPixD(resolution);
}
rowTopHeight = Math.min(horizontalLineHeight, rowTopHeight);
if (gridRow.getBackground() != null) {
g2d.setPaint(this.detailsBackground);
GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, size.getWidth(), rowTopHeight));
g2d.setPaint(Color.WHITE);
GraphHelper.fill(g2d, new Rectangle2D.Double(0, rowTopHeight, size.getHeight(), size.getHeight() - rowTopHeight));
}
// draw top border line.
g2d.setPaint(gridRow.getSeparatorLineColor());
GraphHelper.drawLine(g2d, 0, 0, size.getWidth(), 0);
// draw row
double tmpHeight2 = 0;
drawRow(verticalBeginValue, verticalEndValue, rowHeightList, resolution, tmpHeight2, gridRow, g2d);
// 画左边的边框线.
g2d.setColor(gridRow.getSeparatorLineColor());
GraphHelper.drawLine(g2d, 0, 0, 0, tmpHeight2);
}
private void drawRow(int verticalBeginValue, int verticalEndValue, DynamicUnitList rowHeightList, int resolution,
double tmpHeight2, GridRow gridRow, Graphics2D g2d) {
boolean isSelectedBounds;
double tmpHeight1 = 0;
double tmpIncreaseHeight = 0;
ElementCasePane reportPane = gridRow.getElementCasePane();
// size
Dimension size = gridRow.getSize();
ElementCase elementCase = reportPane.getEditingElementCase();
// Increase vertical scroll value.
for (int i = 0; i <= verticalEndValue; i++) {
// denny:
if (i == 0) {
i = verticalBeginValue;
}
// ajust height.
tmpHeight1 += tmpIncreaseHeight;
tmpIncreaseHeight = rowHeightList.get(i).toPixD(resolution);
// check these row wich height is zero.
tmpHeight2 = tmpIncreaseHeight == 0 ? tmpHeight1 + 1 : tmpHeight1 + tmpIncreaseHeight;
// check selection bound.
Selection sel = reportPane.getSelection();
int[] selectedRows = sel.getSelectedRows();
if (IntList.asList(selectedRows).contain(i)) {
g2d.setPaint(gridRow.getSelectedBackground());
GraphHelper.fill(g2d, new Rectangle2D.Double(0, tmpHeight1 + 1, size.width, tmpIncreaseHeight - 1));
isSelectedBounds = true;
} else {
isSelectedBounds = false;
}
drawAuthority(elementCase, g2d, tmpHeight1, tmpIncreaseHeight, size, i);
// draw seperate line.
g2d.setColor(gridRow.getSeparatorLineColor());
GraphHelper.drawLine(g2d, 0, tmpHeight2, size.getWidth(), tmpHeight2);
// draw content
// marks: 目前只支持处理文字和图像。
Integer rowContent = gridRow.getDisplay(i);
String paintText = rowContent.toString();
if (elementCase.getReportPageAttr() != null) {
if (i >= elementCase.getReportPageAttr().getRepeatHeaderRowFrom() && i <= elementCase.getReportPageAttr().getRepeatHeaderRowTo()) {
paintText += "(H)";
}
if (i >= elementCase.getReportPageAttr().getRepeatFooterRowFrom() && i <= elementCase.getReportPageAttr().getRepeatFooterRowTo()) {
paintText += "(F)";
}
}
drawNormalContent(i, g2d, gridRow, paintText, tmpIncreaseHeight, isSelectedBounds, elementCase, size, tmpHeight1);
}
}
private void drawAuthority(ElementCase elementCase, Graphics2D g2d, double tmpHeight1, double tmpIncreaseHeight, Dimension size, int i) {
boolean isAuthorityEdited = BaseUtils.isAuthorityEditing();
if (isAuthorityEdited) {
ColumnRowPrivilegeControl cpc = elementCase.getRowPrivilegeControl(i);
String selectedRoles = ReportAndFSManagePane.getInstance().getRoleTree().getSelectedRoleName();
if (cpc.checkInvisible(selectedRoles)) {
g2d.setColor(UIConstants.AUTHORITY_COLOR);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));
GraphHelper.fill(g2d, new Rectangle2D.Double(0, tmpHeight1 + 1, size.width, tmpIncreaseHeight - 1));
}
}
}
private void drawNormalContent(int i, Graphics2D g2d, GridRow gridRow, String paintText, double tmpIncreaseHeight, boolean isSelectedBounds
, ElementCase elementCase, Dimension size, double tmpHeight1) {
// FontMetrics
FontRenderContext fontRenderContext = g2d.getFontRenderContext();
float time = (float)resolution/ScreenResolution.getScreenResolution();
float fmAscent = GraphHelper.getFontMetrics(gridRow.getFont()).getAscent() * time;
double stringWidth = gridRow.getFont().getStringBounds(paintText, fontRenderContext).getWidth() * time;
double stringHeight = gridRow.getFont().getStringBounds(paintText, fontRenderContext).getHeight() * time;
// 如果高度太小了就不画了
if (stringHeight <= tmpIncreaseHeight + 2) {
if (isSelectedBounds) {
g2d.setColor(gridRow.getSelectedForeground());
} else {
// p:检查eanbled
if (gridRow.isEnabled()) {
g2d.setColor(gridRow.getForeground());
} else {
g2d.setPaint(UIManager.getColor("controlShadow"));
}
}
GraphHelper.drawString(g2d, paintText, (size.width - stringWidth) / 2, tmpHeight1 + (tmpIncreaseHeight - stringHeight) / 2 + GridHeader.SIZE_ADJUST / 2 + fmAscent - 2);
}
}
}