📄 thinlet.java
字号:
private int getSum(int[] values,
int from, int length, int gap, boolean last) {
if (length <= 0) { return 0; }
int value = 0;
for (int i = 0; i < length; i++) {
value += values[from + i];
}
return value + (length - (last ? 0 : 1)) * gap;
}
/**
*
*/
private Dimension getFieldSize(Object component) {
String text = getString(component, "text", "");
int columns = getInteger(component, "columns", 0);
Font currentfont = (Font) get(component, "font");
FontMetrics fm = getFontMetrics((currentfont != null) ? currentfont : font);
return new Dimension(((columns > 0) ?
(columns * fm.charWidth('e')) : 76) + 4,
fm.getAscent() + fm.getDescent() + 4); // fm.stringWidth(text)
}
/**
* @param component a widget including the text and icon parameters
* @param dx increase width by this value
* @param dy increase height by this value
* @return size of the text and the image (plus a gap) including the given offsets
*/
private Dimension getSize(Object component, int dx, int dy) {
String text = getString(component, "text", null);
int tw = 0; int th = 0;
if (text != null) {
Font customfont = (Font) get(component, "font");
FontMetrics fm = getFontMetrics((customfont != null) ? customfont : font);
tw = fm.stringWidth(text);
th = fm.getAscent() + fm.getDescent();
}
Image icon = getIcon(component, "icon", null);
int iw = 0; int ih = 0;
if (icon != null) {
iw = icon.getWidth(this);
ih = icon.getHeight(this);
if (text != null) { iw += 2; }
}
return new Dimension(tw + iw + dx, Math.max(th, ih) + dy);
}
/**
* Invokes the paint method
*/
public void update(Graphics g) {
paint(g);
}
/*public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
if (infoflags == ImageObserver.ALLBITS) {
validate(content);
}
return super.imageUpdate(img, infoflags, x, y, width, height);
}*/
/**
* Paints the components inside the graphics clip area
*/
public void paint(Graphics g) {
g.setFont(font);
if (hgradient == null) {
int[][] pix = new int[2][block * block];
int r1 = c_bg.getRed(); int r2 = c_press.getRed();
int g1 = c_bg.getGreen(); int g2 = c_press.getGreen();
int b1 = c_bg.getBlue(); int b2 = c_press.getBlue();
for (int i = 0; i < block; i++) {
int cr = r1 - (r1 - r2) * i / block;
int cg = g1 - (g1 - g2) * i / block;
int cb = b1 - (b1 - b2) * i / block;
int color = (255 << 24) | (cr << 16) | (cg << 8) | cb;
for (int j = 0; j < block; j++) {
pix[0][i * block + j] = color;
pix[1][j * block + i] = color;
}
}
hgradient = createImage(new MemoryImageSource(block, block, pix[0], 0, block));
vgradient = createImage(new MemoryImageSource(block, block, pix[1], 0, block));
}
//g.setColor(Color.orange);
//g.fillRect(0, 0, getSize().width, getSize().height);
//long time = System.currentTimeMillis();
Rectangle clip = g.getClipBounds();
///dg.setClip(r.x, r.y, r.width, r.height);
paint(g, clip.x, clip.y, clip.width, clip.height, content, isEnabled());
//System.out.println(System.currentTimeMillis() - time);
//g.setClip(0, 0, getSize().width, getSize().height);
//g.setColor(Color.red); g.drawRect(clip.x, clip.y, clip.width - 1, clip.height - 1);
}
/**
* Fill a given part of a MemoryImageSource with gradient
* @param pix arrays of source pixels
* @param offset image width
* @param x gradient left location
* @param y fill top location
* @param width gradient width size
* @param height fill height size
* @param color1 top/left color
* @param color2 bottom/right color
* @param horizontal horizontal if true, vertical otherwise
*/
private static void fillGradient(int[] pix, int offset, int x, int y, int width, int height,
int color1, int color2, boolean horizontal) {
int r1 = (color1 >> 16) & 0xff; int rd = ((color2 >> 16) & 0xff) - r1;
int g1 = (color1 >> 8) & 0xff; int gd = ((color2 >> 8) & 0xff) - g1;
int b1 = color1 & 0xff; int bd = (color2 & 0xff) - b1;
int gs = horizontal ? width : height; int fs = horizontal ? height : width;
for (int i = 0; i < gs; i++) {
int color = 0xff000000 | ((r1 + rd * i / gs) << 16) |
((g1 + gd * i / gs) << 8) | (b1 + bd * i / gs);
for (int j = 0; j < fs; j++) {
pix[x + (horizontal ? i : j) + (y + (horizontal ? j : i)) * offset] = color;
}
}
}
/**
* @param clipx the cliping rectangle is relative to the component's
* parent location similar to the component's bounds rectangle
* @param clipy
* @param clipwidth
* @param clipheight
* @throws java.lang.IllegalArgumentException
*/
private void paint(Graphics g,
int clipx, int clipy, int clipwidth, int clipheight,
Object component, boolean enabled) {
if (!getBoolean(component, "visible", true)) { return; }
Rectangle bounds = getRectangle(component, "bounds");
if (bounds == null) { return; }
// negative component width indicates invalid component layout
if (bounds.width < 0) {
bounds.width = Math.abs(bounds.width);
doLayout(component);
}
// return if the component was out of the cliping rectangle
if ((clipx + clipwidth < bounds.x) ||
(clipx > bounds.x + bounds.width) ||
(clipy + clipheight < bounds.y) ||
(clipy > bounds.y + bounds.height)) {
return;
}
// set the clip rectangle relative to the component location
clipx -= bounds.x; clipy -= bounds.y;
g.translate(bounds.x, bounds.y);
//g.setClip(0, 0, bounds.width, bounds.height);
String classname = getClass(component);
boolean pressed = (mousepressed == component);
boolean inside = (mouseinside == component) &&
((mousepressed == null) || pressed);
boolean focus = focusinside && (focusowner == component);
enabled = getBoolean(component, "enabled", true); //enabled &&
if ("label" == classname) {
paint(component, 0, 0, bounds.width, bounds.height,
g, clipx, clipy, clipwidth, clipheight, false, false, false, false,
0, 0, 0, 0, false, enabled ? 'e' : 'd', "left", true, false);
}
else if (("button" == classname) || ("togglebutton" == classname)) {
boolean toggled = ("togglebutton" == classname) && getBoolean(component, "selected", false);
boolean link = ("button" == classname) && (get(component, "type") == "link");
if (link) {
paint(component, 0, 0, bounds.width, bounds.height,
g, clipx, clipy, clipwidth, clipheight, false, false, false, false,
0, 0, 0, 0, focus, enabled ? (pressed ? 'e' : 'l') : 'd', "center",
true, enabled && (inside != pressed));
} else { // disabled toggled
char mode = enabled ? ((inside != pressed) ? 'h' : ((pressed || toggled) ? 'p' : 'g')) : 'd';
paint(component, 0, 0, bounds.width, bounds.height,
g, clipx, clipy, clipwidth, clipheight, true, true, true, true,
2, 5, 2, 5, focus, mode, "center", true, false);
//(enabled && ("button" == classname) && get(component, "type") == "default")...
}
}
else if ("checkbox" == classname) {
paint(component, 0, 0, bounds.width, bounds.height,
g, clipx, clipy, clipwidth, clipheight, false, false, false, false,
0, block + 3, 0, 0, false, enabled ? 'e' : 'd', "left", true, false);
boolean selected = getBoolean(component, "selected", false);
String group = getString(component, "group", null);
Color border = enabled ? c_border : c_disable;
Color foreground = enabled ? ((inside != pressed) ? c_hover :
(pressed ? c_press : c_ctrl)) : c_bg;
int dy = (bounds.height - block + 2) / 2;
if (group == null) {
paintRect(g, 1, dy + 1, block - 2, block - 2,
border, foreground, true, true, true, true, true);
} else {
g.setColor((foreground != c_ctrl) ? foreground : c_bg);
g.fillOval(1, dy + 1, block - 3 + evm, block - 3 + evm);
g.setColor(border);
g.drawOval(1, dy + 1, block - 3, block - 3);
}
if (focus) {
g.setColor(c_focus);
if (group == null) {
g.drawRect(3, dy + 3, block - 7, block - 7);
} else {
g.drawOval(3, dy + 3, block - 7, block - 7);
}
}
if((!selected && inside && pressed) ||
(selected && (!inside || !pressed))) {
g.setColor(enabled ? c_text : c_disable);
if (group == null) {
g.fillRect(3, dy + block - 9, 2 + evm, 6 + evm);
g.drawLine(3, dy + block - 4, block - 4, dy + 3);
g.drawLine(4, dy + block - 4, block - 4, dy + 4);
} else {
g.fillOval(5, dy + 5, block - 10 + evm, block - 10 + evm);
g.drawOval(4, dy + 4, block - 9, block - 9);
}
}
}
else if ("combobox" == classname) {
if (getBoolean(component, "editable", true)) {
Image icon = getIcon(component, "icon", null);
int left = (icon != null) ? icon.getWidth(this) : 0;
paintField(g, clipx, clipy, clipwidth, clipheight, component,
bounds.width - block, bounds.height,
inside, pressed, focus, enabled, false, left);
if (icon != null) {
g.drawImage(icon, 2, (bounds.height - icon.getHeight(this)) / 2, this);
}
paintArrow(g, bounds.width - block, 0, block, bounds.height,
'S', enabled, inside, pressed, "down", true, false, true, true, true);
} else {
paint(component, 0, 0, bounds.width, bounds.height,
g, clipx, clipy, clipwidth, clipheight,
true, true, true, true, 1, 1, 1, 1 + block, focus,
enabled ? ((inside != pressed) ? 'h' : (pressed ? 'p' : 'g')) : 'd',
"left", false, false);
g.setColor(enabled ? c_text : c_disable);
paintArrow(g, bounds.width - block, 0, block, bounds.height, 'S');
}
}
else if (":combolist" == classname) {
paintScroll(component, classname, bounds, pressed, inside, focus, enabled,
g, clipx, clipy, clipwidth, clipheight);
}
else if (("textfield" == classname) || ("passwordfield" == classname)) {
paintField(g, clipx, clipy, clipwidth, clipheight, component,
bounds.width, bounds.height,
inside, pressed, focus, enabled, ("passwordfield" == classname), 0);
}
else if ("textarea" == classname) {
paintScroll(component, classname, bounds, pressed, inside, focus, enabled,
g, clipx, clipy, clipwidth, clipheight);
}
else if ("tabbedpane" == classname) {
int i = 0; Object selectedtab = null;
int selected = getInteger(component, "selected", 0);
String placement = getString(component, "placement", "top");
boolean horizontal = ((placement == "top") || (placement == "bottom"));
boolean stacked = (placement == "stacked");
int bx = stacked ? 0 : horizontal ? 2 : 1, by = stacked ? 0 : horizontal ? 1 : 2,
bw = 2 * bx, bh = 2 * by;
// paint tabs except the selected one
g.clipRect(0, 0, bounds.width, bounds.height); //+clip
for (Object tab = get(component, ":comp"); tab != null; tab = get(tab, ":next")) {
Rectangle r = getRectangle(tab, "bounds");
if (selected != i) {
boolean hover = inside && (mousepressed == null) && (insidepart == tab);
boolean tabenabled = enabled && getBoolean(tab, "enabled", true);
paint(tab, r.x + bx, r.y + by, r.width - bw, r.height - bh,
g, clipx, clipy, clipwidth, clipheight,
(placement != "bottom"), (placement != "right"),
!stacked && (placement != "top"), (placement != "left"),
1, 3, 1, 3, false, tabenabled ? (hover ? 'h' : 'g') : 'd', "left", true, false);
} else {
selectedtab = tab;
// paint tabbedpane border
paint(tab, (placement == "left") ? r.width - 1 : 0,
stacked ? (r.y + r.height - 1) : (placement == "top") ? r.height - 1 : 0,
(horizontal || stacked) ? bounds.width : (bounds.width - r.width + 1),
stacked ? (bounds.height - r.y - r.height + 1) :
horizontal ? (bounds.height - r.height + 1) : bounds.height,
g, true, true, true, true, enabled ? 'e' : 'd');
Object comp = get(selectedtab, ":comp");
if ((comp != null) && getBoolean(comp, "visible", true)) {
clipx -= r.x; clipy -= r.y; g.translate(r.x, r.y); // relative to tab
paint(g, clipx, clipy, clipwidth, clipheight, comp, enabled);
clipx += r.x; clipy += r.y; g.translate(-r.x, -r.y);
}
}
i++;
}
// paint selected tab and its content
if (selectedtab != null) {
Rectangle r = getRectangle(selectedtab, "bounds");
// paint selected tab
int ph = stacked ? 3 : (horizontal ? 5 : 4);
int pv = stacked ? 1 : (horizontal ? 2 : 3);
paint(selectedtab, r.x, r.y, r.width, r.height,
g, clipx, clipy, clipwidth, clipheight,
(placement != "bottom"), (placement != "right"),
!stacked && (placement != "top"), (placement != "left"),
pv, ph, pv, ph, focus, enabled ? 'b' : 'i', "left", true, false);
}
g.setClip(clipx, clipy, clipwidth, clipheight); //+clip
}
else if (("panel" == classname) || ("dialog" == classname)) {
int titleheight = getInteger(component, ":titleheight", 0);
if ("dialog" == classname) {
paint(component, 0, 0, bounds.width, 3 + titleheight,
g, clipx, clipy, clipwidth, clipheight, true, true, false, true,
1, 2, 1, 2, false, 'g', "left", false, false);
paintRect(g, 0, 3 + titleheight, bounds.width, bounds.height - 3 - titleheight,
c_border, c_press, false, true, true, true, true); // lower part excluding titlebar
paint(component, // content area
3, 3 + titleheight, bounds.width - 6, bounds.height - 6 - titleheight,
g, true, true, true, true, 'b');
} else { // panel
boolean border = getBoolean(component, "border", false);
paint(component, 0, titleheight / 2, bounds.width, bounds.height - (titleheight / 2),
g, border, border, border, border, enabled ? 'e' : 'd');
paint(component, 0, 0, bounds.width, titleheight, // panel title
g, clipx, clipy, clipwidth, clipheight, false, false, false, false,
0, 3, 0, 3, false, enabled ? 'e' : 'd', "left", false, false);
}
if (get(component, ":port") != null) {
paintScroll(component, classname, bounds, pressed, inside, focus, enabled,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -