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

145 lines
5.1 KiB

/*
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved.
*/
package com.fr.design.gui.icombobox;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JLabel;
import javax.swing.JList;
import com.fr.base.FRContext;
import com.fr.base.GraphHelper;
import com.fr.base.ScreenResolution;
import com.fr.general.FRFont;
import com.fr.stable.Constants;
/**
* Combobox for selecting line styles.
*/
public class LineComboBox extends UIComboBox {
/**
* Constructor.
*
* @param lineStyleArray the array of lineStyle.
*/
public LineComboBox(int[] lineStyleArray) {
//copy lineStyle.
Integer[] lineStyleIntegerArray = new Integer[lineStyleArray.length];
for (int i = 0; i < lineStyleArray.length; i++) {
lineStyleIntegerArray[i] = new Integer(lineStyleArray[i]);
}
this.setModel(new DefaultComboBoxModel(lineStyleIntegerArray));
this.setRenderer(new LineCellRenderer());
}
/**
* Get selected line style.
*/
public int getSelectedLineStyle() {
int style = ((Integer) getSelectedItem()).intValue();
return (style < 0) ? Constants.LINE_NONE : style;
}
/**
* Set the selected line style.
*/
public void setSelectedLineStyle(int style) {
this.setSelectedItem(new Integer(style));
}
/**
* CellRenderer.
*/
class LineCellRenderer extends UIComboBoxRenderer {
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel comp= (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
this.style = ((Integer) value).intValue();
comp.setText(null);
return comp;
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
Dimension d = getSize();
g2d.setColor(getForeground());
FRFont font = FRContext.getDefaultValues().getFRFont();
int resolution = ScreenResolution.getScreenResolution();
Font rfont = font.applyResolutionNP(resolution);
g2d.setFont(rfont);
FontMetrics fm = GraphHelper.getFontMetrics(rfont);
if (style == Constants.LINE_NONE) {
//draw "none" string
GraphHelper.drawString(g2d, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_None"), 4, (d.height - fm.getHeight()) / 2 + fm.getAscent());
} else {
GraphHelper.drawLine(g2d, 4, d.height / 2, d.width - 8, d.height / 2, style);
}
if(isShowAxisWithLineStyle()) { // 带有坐标轴箭头的样式.
drawArrow(g2d, new Point2D.Double(4, d.height / 2), new Point2D.Double(d.width - 8, d.height/2));
}
}
private void drawArrow(Graphics2D g2d, Point2D p0, Point2D p1) {
Point2D s = new Point2D.Double(p1.getX() - p0.getX(), p1.getY() - p0.getY());
Point2D t = new Point2D.Double();
double d1 = p0.distance(p1);
//d2-d5设定箭头的大小,p1-p2为坐标轴的延长线,p2-p5-p3-p6为箭头4个点的具体位置
double d2 = 9;
double d3 = 15;
double d4 = 7;
double d5 = 3;
t.setLocation(d2 * s.getX() / d1, d2 * s.getY() / d1);
Point2D p2 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY());
t.setLocation(d3 * s.getX() / d1, d3 * s.getY() / d1);
Point2D p3 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY());
t.setLocation(d4 * s.getX() / d1, d4 * s.getY() / d1);
Point2D p4 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY());
Point2D p5 = new Point2D.Double(p4.getX() + s.getY() / d1 * d5, p4.getY() - s.getX() / d1 * d5);
Point2D p6 = new Point2D.Double(p4.getX() - s.getY() / d1 * d5, p4.getY() + s.getX() / d1 * d5);
GeneralPath arrow = new GeneralPath();
arrow.moveTo((float) p2.getX() - 10, (float) p2.getY());
arrow.lineTo((float) p5.getX() - 10, (float) p5.getY());
arrow.lineTo((float) p3.getX() - 10, (float) p3.getY());
arrow.lineTo((float) p6.getX() - 10, (float) p6.getY());
arrow.closePath();
g2d.draw(arrow);
g2d.fill(arrow);
}
private boolean isShowAxisWithLineStyle() {
return style == Constants.LINE_CHART_MED_ARROW
|| style == Constants.LINE_CHART_THICK_ARROW || style == Constants.LINE_CHART_THIN_ARROW;
}
public Dimension getPreferredSize() {
return new Dimension(60, 16);
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
private int style = Constants.LINE_NONE;
}
}