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
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); |
|
} |
|
} |
|
|
|
} |