forked from demo/example
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.
105 lines
4.0 KiB
105 lines
4.0 KiB
6 years ago
|
// 导出打印单选按钮及复选框
|
||
|
package com.fr.function;
|
||
|
|
||
|
import com.fr.base.AbstractPainter;
|
||
|
import com.fr.base.BaseUtils;
|
||
|
import com.fr.base.GraphHelper;
|
||
|
import com.fr.base.Style;
|
||
|
import com.fr.general.FArray;
|
||
|
import com.fr.general.FRFont;
|
||
|
import com.fr.script.AbstractFunction;
|
||
|
import com.fr.stable.Primitive;
|
||
|
import com.fr.stable.StringUtils;
|
||
|
|
||
|
import java.awt.Color;
|
||
|
import java.awt.FontMetrics;
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Graphics2D;
|
||
|
import java.awt.Image;
|
||
|
|
||
|
public class Widget2Image extends AbstractFunction {
|
||
|
public Object run(Object[] args) {
|
||
|
if (args.length < 3)
|
||
|
return Primitive.NULL;
|
||
|
// 第一个参数:控件类型,不区分大小写
|
||
|
String type = args[0].toString().toLowerCase();
|
||
|
if (!("checkbox".equals(type) || "radiobutton".equals(type)))
|
||
|
return Primitive.ERROR_VALUE;
|
||
|
// 第二个参数:控件按钮个数
|
||
|
int num = Integer.parseInt(args[1].toString());
|
||
|
// 第三个参数:按钮组的值,哪些被选中
|
||
|
String selection = args[2].toString();
|
||
|
// 第四个参数:可选参数,按钮组对应的显示值数组
|
||
|
FArray textArray = new FArray();
|
||
|
if (args.length == 4 && args[3] instanceof FArray) {
|
||
|
textArray = (FArray) args[3];
|
||
|
}
|
||
|
return new WidgetPaint(type, num, selection, textArray);
|
||
|
}
|
||
|
|
||
|
public static class WidgetPaint extends AbstractPainter {
|
||
|
public static String CHECK_ON = "/com/fr/web/images/checkon.gif";
|
||
|
public static String CHECK_OFF = "/com/fr/web/images/checkoff.gif";
|
||
|
public static String RADIO_ON = "/com/fr/web/images/radioon.gif";
|
||
|
public static String RADIO_OFF = "/com/fr/web/images/radiooff.gif";
|
||
|
public static FRFont DEFUALT_FONT = FRFont.getInstance();
|
||
|
public static FontMetrics FontMetrics = GraphHelper
|
||
|
.getFontMetrics(DEFUALT_FONT);
|
||
|
private String type;
|
||
|
private int num;
|
||
|
private String selection;
|
||
|
private FArray textArray;
|
||
|
|
||
|
{
|
||
|
DEFUALT_FONT = DEFUALT_FONT.applyForeground(Color.BLACK);
|
||
|
}
|
||
|
|
||
|
public WidgetPaint(String type, int num, String selection,
|
||
|
FArray textArray) {
|
||
|
this.type = type;
|
||
|
this.num = num;
|
||
|
this.selection = selection;
|
||
|
this.textArray = textArray;
|
||
|
}
|
||
|
|
||
|
private String resolveText(int i) {
|
||
|
if (i < this.textArray.length()) {
|
||
|
return this.textArray.elementAt(i).toString();
|
||
|
}
|
||
|
return StringUtils.EMPTY;
|
||
|
}
|
||
|
|
||
|
public void paint(Graphics g, int width, int height, int resolution,
|
||
|
Style style) {
|
||
|
String OFF = CHECK_OFF;
|
||
|
String ON = CHECK_ON;
|
||
|
if ("radiobutton".equals(type)) {
|
||
|
OFF = RADIO_OFF;
|
||
|
ON = RADIO_ON;
|
||
|
}
|
||
|
Image[] checkOFFON = {BaseUtils.readImage(OFF),
|
||
|
BaseUtils.readImage(ON)};
|
||
|
int[] imgWidths = {checkOFFON[0].getWidth(null),
|
||
|
checkOFFON[1].getWidth(null)};
|
||
|
int[] imgHeights = {checkOFFON[0].getHeight(null),
|
||
|
checkOFFON[1].getHeight(null)};
|
||
|
Graphics2D g2d = (Graphics2D) g;
|
||
|
g2d.setFont(FRFont.getInstance());
|
||
|
g2d.setPaint(Color.BLACK);
|
||
|
int x = 2;
|
||
|
int y = (height - imgHeights[0]) / 2;
|
||
|
String select = selection;
|
||
|
for (int i = 0; i < num; i++) {
|
||
|
int bit = Integer.parseInt(select.substring(i, i + 1));
|
||
|
g2d.drawImage(checkOFFON[bit], x, y, imgWidths[bit],
|
||
|
imgHeights[bit], null);
|
||
|
x += imgWidths[bit] + 2;
|
||
|
String text = resolveText(i);
|
||
|
g2d.setBackground(Color.BLACK);
|
||
|
g2d.drawString(text, (float) x, (float) (y + FontMetrics
|
||
|
.getAscent()));
|
||
|
x += FontMetrics.stringWidth(text) + 2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|