📄 thinlet.java
字号:
for (int i = 0; i < 2; i++) { // i=0: horizontal, i=1: vertical
// remaining space
int d = ((i == 0) ? (areawidth - contentwidth) : (areaheight - contentheight));
if (d != 0) { //+ > 0
int w = getSum(grid[2 + i], 0, grid[2 + i].length, 0, false);
if (w > 0) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[2 + i][j] != 0) {
grid[i][j] += d * grid[2 + i][j] / w;
}
}
}
}
}
Object comp = get(component, ":comp");
for (int i = 0; comp != null; comp = get(comp, ":next")) {
if (!getBoolean(comp, "visible", true)) { continue; }
int ix = areax + left + getSum(grid[0], 0, grid[4][i], gap, true);
int iy = areay + top + getSum(grid[1], 0, grid[5][i], gap, true);
int iwidth = getSum(grid[0], grid[4][i], grid[6][i], gap, false);
int iheight = getSum(grid[1], grid[5][i], grid[7][i], gap, false);
String halign = getString(comp, "halign", "fill");
String valign = getString(comp, "valign", "fill");
if ((halign != "fill") || (valign != "fill")) {
Dimension d = getPreferredSize(comp);
if (halign != "fill") {
int dw = Math.max(0, iwidth - d.width);
if (halign == "center") { ix += dw / 2; }
else if (halign == "right") { ix += dw; }
iwidth -= dw;
}
if (valign != "fill") {
int dh = Math.max(0, iheight - d.height);
if (valign == "center") { iy += dh / 2; }
else if (valign == "bottom") { iy += dh; }
iheight -= dh;
}
}
setRectangle(comp, "bounds", ix, iy, iwidth, iheight);
doLayout(comp);
i++;
}
}
}
else if ("desktop" == classname) {
Rectangle bounds = getRectangle(component, "bounds");
for (Object comp = get(component, ":comp");
comp != null; comp = get(comp, ":next")) {
String iclass = getClass(comp);
if (iclass == "dialog") {
Dimension d = getPreferredSize(comp);
if (get(comp, "bounds") == null)
setRectangle(comp, "bounds",
Math.max(0, (bounds.width - d.width) / 2),
Math.max(0, (bounds.height - d.height) / 2),
Math.min(d.width, bounds.width), Math.min(d.height, bounds.height));
} else if ((iclass != ":combolist") && (iclass != ":popup")) {
setRectangle(comp, "bounds", 0, 0, bounds.width, bounds.height);
}
doLayout(comp);
}
}
else if ("spinbox" == classname) {
layoutField(component, block, false, 0);
}
else if ("splitpane" == classname) {
Rectangle bounds = getRectangle(component, "bounds");
boolean horizontal = ("vertical" != get(component, "orientation"));
int divider = getInteger(component, "divider", -1);
int maxdiv = Math.max(0, (horizontal ? bounds.width : bounds.height) - 5);
Object comp1 = get(component, ":comp");
boolean visible1 = (comp1 != null) && getBoolean(comp1, "visible", true);
if (divider == -1) {
int d1 = 0;
if (visible1) {
Dimension d = getPreferredSize(comp1);
d1 = horizontal ? d.width : d.height;
}
divider = Math.min(d1, maxdiv);
setInteger(component, "divider", divider, -1);
}
else if (divider > maxdiv) {
setInteger(component, "divider", divider = maxdiv, -1);
}
if (visible1) {
setRectangle(comp1, "bounds", 0, 0, horizontal ? divider : bounds.width,
horizontal ? bounds.height : divider);
doLayout(comp1);
}
Object comp2 = (comp1 != null) ? get(comp1, ":next") : null;
if ((comp2 != null) && getBoolean(comp2, "visible", true)) {
setRectangle(comp2, "bounds", horizontal ? (divider + 5) : 0,
horizontal ? 0 : (divider + 5),
horizontal ? (bounds.width - 5 - divider) : bounds.width,
horizontal ? bounds.height : (bounds.height - 5 - divider));
doLayout(comp2);
}
}
else if (("list" == classname) ||
("table" == classname) || ("tree" == classname)) {
int line = getBoolean(component, "line", true) ? 1 : 0;
int width = 0;
int columnheight = 0;
if ("table" == classname) {
Object header = get(component, "header");
int[] columnwidths = null;
if (header != null) {
columnwidths = new int[getCount(header)];
Object column = get(header, ":comp");
for (int i = 0; i < columnwidths.length; i++) {
if (i != 0) { column = get(column, ":next"); }
columnwidths[i] = getInteger(column, "width", 80);
width += columnwidths[i];
Dimension d = getSize(column, 2, 2);
columnheight = Math.max(columnheight, d.height);
}
}
set(component, ":widths", columnwidths);
}
int y = 0;
int level = 0;
for (Object item = get(component, ":comp"); item != null;) {
int x = 0;
int iwidth = 0; int iheight = 0;
if ("table" == classname) {
iwidth = width;
for (Object cell = get(item, ":comp"); cell != null; cell = get(cell, ":next")) {
Dimension d = getSize(cell, 2, 2);
iheight = Math.max(iheight, d.height);
}
}
else {
if ("tree" == classname) {
x = (level + 1) * block;
}
Dimension d = getSize(item, 6, 2);
iwidth = d.width; iheight = d.height;
width = Math.max(width, x + d.width);
}
setRectangle(item, "bounds", x, y, iwidth, iheight);
y += iheight + line;
if ("tree" == classname) {
Object next = get(item, ":comp");
if ((next != null) && getBoolean(item, "expanded", true)) {
level++;
} else {
while (((next = get(item, ":next")) == null) && (level > 0)) {
item = getParent(item);
level--;
}
}
item = next;
} else {
item = get(item, ":next");
}
}
layoutScroll(component, width, y - line, columnheight, 0, 0, 0, true, 0);
}
else if ("menubar" == classname) {
Rectangle bounds = getRectangle(component, "bounds");
int x = 0;
for (Object menu = get(component, ":comp");
menu != null; menu = get(menu, ":next")) {
Dimension d = getSize(menu, 8, 4);
setRectangle(menu, "bounds", x, 0, d.width, bounds.height);
x += d.width;
}
}
else if ("bean" == classname) {
Rectangle r = getRectangle(component, "bounds");
((Component) get(component, "bean")).setBounds(r);
}
}
/**
* Scroll tabs to make the selected one visible
* @param component a tabbedpane
*/
private void checkOffset(Object component) {
String placement = getString(component, "placement", "top");
int selected = getInteger(component, "selected", 0); int i = 0;
if (placement == "stacked") {
int dy = 0;
for (Object tab = get(component, ":comp"); tab != null; tab = get(tab, ":next")) {
Rectangle r = getRectangle(tab, "bounds");
r.y = dy;
dy += r.height;
if (i == selected) { dy += getRectangle(get(tab, ":comp"), "bounds").height + 2; }
i++;
}
if (mouseinside == component) { // layout changed, check the hovered tab
checkLocation();
}
return;
}
boolean horizontal = ((placement == "top") || (placement == "bottom"));
Rectangle bounds = getRectangle(component, "bounds");
int panesize = horizontal ? bounds.width : bounds.height;
int first = 0; int last = 0; int d = 0;
for (Object tab = get(component, ":comp"); tab != null; tab = get(tab, ":next")) {
Rectangle r = getRectangle(tab, "bounds");
if (i == 0) { first = (horizontal ? r.x : r.y); }
last = (horizontal ? (r.x + r.width) : (r.y + r.height));
if (i == selected) {
int ifrom = (horizontal ? r.x : r.y) - 6;
int ito = (horizontal ? (r.x + r.width) : (r.y + r.height)) + 6;
if (ifrom < 0) { d = -ifrom; }
else if (ito > panesize) { d = panesize - ito; }
}
i++;
}
d = Math.min(-first, Math.max(d, panesize - last));
if (d != 0) {
for (Object tab = get(component, ":comp"); tab != null; tab = get(tab, ":next")) {
Rectangle r = getRectangle(tab, "bounds");
if (horizontal) { r.x += d; } else { r.y += d; }
Object comp = get(tab, ":comp"); // relative to the tab location
if ( (comp != null) && getBoolean(comp, "visible", true)) {
Rectangle rc = getRectangle(comp, "bounds");
if (horizontal) { rc.x -= d; } else { rc.y -= d; }
}
}
if (mouseinside == component) { // layout changed, check the hovered tab
checkLocation();
}
}
}
/**
*
*/
private char[] getChars(Object component,
String text, boolean wrap, int width, int height) {
char[] chars = (char[]) get(component, ":text");
if ((chars == null) || (chars.length != text.length())) {
chars = text.toCharArray();
set(component, ":text", chars);
}
else text.getChars(0, chars.length, chars, 0);
if (wrap) {
Font currentfont = (Font) get(component, "font");
FontMetrics fm = getFontMetrics((currentfont != null) ? currentfont : font);
int lines = (height - 4 + fm.getLeading()) / fm.getHeight();
boolean prevletter = false; int n = chars.length; int linecount = 0;
for (int i = 0, j = -1, k = 0; k <= n; k++) { // j is the last space index (before k)
if (((k == n) || (chars[k] == '\n') || (chars[k] == ' ')) &&
(j > i) && (fm.charsWidth(chars, i, k - i) > width)) {
chars[j] = '\n';
k--; // draw line to the begin of the current word (+ spaces) if it is out of width
}
else if ((k == n) || (chars[k] == '\n')) { // draw line to the text/line end
j = k; prevletter = false;
}
else {
if ((chars[k] == ' ') && (prevletter || (j > i))) { j = k; } // keep spaces starting the line
prevletter = (chars[k] != ' ');
continue;
}
linecount++;
if ((lines != 0) && (linecount == lines)) { return null; }
i = j + 1;
}
}
return chars;
}
/**
*
*/
/*private boolean wrap(char[] chars, int width, int lines) {
FontMetrics fm = getFontMetrics(font);
boolean prevletter = false; int n = chars.length; int linecount = 0;
for (int i = 0, j = -1, k = 0; k <= n; k++) { // j is the last space index (before k)
if (((k == n) || (chars[k] == '\n') || (chars[k] == ' ')) &&
(j > i) && (fm.charsWidth(chars, i, k - i) > width)) {
chars[j] = '\t';
k--; // draw line to the begin of the current word (+ spaces) if it is out of width
}
else if ((k == n) || (chars[k] == '\n')) { // draw line to the text/line end
j = k; prevletter = false;
}
else {
if (chars[k] == '\t') { chars[k] = ' '; }
if ((chars[k] == ' ') && (prevletter || (j > i))) { j = k; } // keep spaces starting the line
prevletter = (chars[k] != ' ');
continue;
}
linecount++;
if ((lines != 0) && (linecount == lines)) { return false; }
i = j + 1;
}
return true;
}*/
/**
* @param component a menuitem
* @return key modifier strings and key text
*/
private String getAccelerator(Object component) {
Object accelerator = get(component, "accelerator");
if (accelerator != null) {
long keystroke = ((Long) accelerator).longValue();
int keycode = (int) (keystroke >> 32);
int modifiers = (int) (keystroke & 0xffff);
return KeyEvent.getKeyModifiersText(keycode) + " " +
KeyEvent.getKeyText(modifiers);
}
return null;
}
/**
* Pop up the list of choices for the given combobox
* @param combobox
* @return the created combolist
*/
private Object popupCombo(Object combobox) {
// combobox bounds relative to the root desktop
int combox = 0, comboy = 0, combowidth = 0, comboheight = 0;
for (Object comp = combobox; comp != content; comp = getParent(comp)) {
Rectangle r = getRectangle(comp, "bounds");
combox += r.x; comboy += r.y;
if (comp == combobox) { combowidth = r.width; comboheight = r.height; }
}
// :combolist -> combobox and combobox -> :combolist
Object combolist = createImpl(":combolist");
set(combolist, "combobox", combobox);
set(combobox, ":combolist", combolist);
// add :combolist to the root desktop and set the combobox as popupowner
popupowner = combobox;
insertItem(content, ":comp", combolist, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -