| /* |
| Thinlet GUI toolkit - www.thinlet.com |
| Copyright (C) 2002 Robert Bajzat ([email protected]) |
| |
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| //package thinlet; //java |
| //midp package thinlet.midp; |
| |
| import java.applet.*; //java |
| import java.awt.*; //java |
| import java.awt.datatransfer.*; //java |
| import java.awt.image.*; //java |
| import java.awt.event.*; //java |
| import java.lang.reflect.*; //java |
| import java.io.*; |
| import java.net.*; //java |
| import java.util.*; |
| //midp import javax.microedition.lcdui.*; |
| //midp import javax.microedition.midlet.*; |
| |
| /** |
| * |
| */ |
| public class Thinlet extends Container //java |
| implements Runnable, Serializable { //java |
| //midp public class Thinlet extends Canvas implements CommandListener { |
| |
| //midp private static final Boolean TRUE = new Boolean(true); |
| //midp private static final Boolean FALSE = new Boolean(false); |
| |
| //midp private transient Font font; |
| private transient Color c_bg; |
| private transient Color c_text; |
| private transient Color c_textbg; |
| private transient Color c_border; |
| private transient Color c_disable; |
| private transient Color c_hover; |
| private transient Color c_press; |
| private transient Color c_focus; |
| private transient Color c_select; |
| private transient Color c_ctrl = null; //java |
| //midp private transient Color c_ctrl; |
| private transient int block; |
| private transient Image gradient; //java |
| { |
| setFont(new Font("SansSerif", Font.PLAIN, 12)); //java |
| //midp setFont(Font.getDefaultFont()); |
| setColors(0xe6e6e6, 0x000000, 0xffffff, |
| 0x909090, 0xb0b0b0, 0xededed, 0xb9b9b9, 0x89899a, 0xc5c5dd); // f99237 eac16a // e68b2c ffc73c |
| } |
| |
| private transient Thread timer; |
| private transient long watchdelay; |
| private transient long watch; |
| private transient String clipboard; |
| |
| private Object content = createImpl("desktop"); |
| private transient Object mouseinside; |
| private transient Object insidepart; |
| private transient Object mousepressed; |
| private transient Object pressedpart; |
| private transient int referencex, referencey; |
| private transient int mousex, mousey; |
| private transient Object focusowner; |
| private transient boolean focusinside; //midp { focusinside = true; } |
| private transient Object popupowner; |
| private transient Object tooltipowner; |
| //private transient int pressedkey; |
| |
| //java> |
| private static final int DRAG_ENTERED = AWTEvent.RESERVED_ID_MAX + 1; |
| private static final int DRAG_EXITED = AWTEvent.RESERVED_ID_MAX + 2; |
| |
| private static long WHEEL_MASK = 0; |
| private static int MOUSE_WHEEL = 0; |
| private static Method wheelrotation = null; |
| static { |
| try { |
| WHEEL_MASK = AWTEvent.class.getField("MOUSE_WHEEL_EVENT_MASK").getLong(null); |
| MOUSE_WHEEL = MouseEvent.class.getField("MOUSE_WHEEL").getInt(null); |
| } catch (Exception exc) { /* not 1.4 */ } |
| } |
| { |
| if (MOUSE_WHEEL != 0) { // disable global focus-manager for this component in 1.4 |
| try { |
| getClass().getMethod("setFocusTraversalKeysEnabled", new Class[] { Boolean.TYPE }). |
| invoke(this, new Object[] { Boolean.FALSE }); |
| } catch (Exception exc) { /* never */ } |
| } |
| enableEvents(AWTEvent.COMPONENT_EVENT_MASK | |
| AWTEvent.FOCUS_EVENT_MASK | AWTEvent.KEY_EVENT_MASK | |
| AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | WHEEL_MASK); |
| } |
| //<java |
| |
| /** |
| * |
| */ |
| public void setColors(int background, int text, int textbackground, |
| int border, int disable, int hover, int press, |
| int focus, int select) { |
| c_bg = new Color(background); c_text = new Color(text); |
| c_textbg = new Color(textbackground); c_border = new Color(border); |
| c_disable = new Color(disable); c_hover = new Color(hover); |
| c_press = new Color(press); c_focus = new Color(focus); |
| c_select = new Color(select); |
| //midp c_ctrl = c_hover; |
| //java> |
| int[] pix = new int[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 r = r1 - (r1 - r2) * i / block; |
| int g = g1 - (g1 - g2) * i / block; |
| int b = b1 - (b1 - b2) * i / block; |
| int color = (255 << 24) | (r << 16) | (g << 8) | b; |
| for (int j = 0; j < block; j++) { |
| pix[i * block + j] = color; |
| //pix[j * block + i] = color; |
| } |
| } |
| gradient = createImage(new MemoryImageSource(block, block, pix, 0, block)); |
| //<java |
| } |
| |
| /** |
| * |
| */ |
| public void setFont(Font font) { |
| block = getFontMetrics(font).getHeight(); //java |
| super.setFont(font); //java |
| //midp block = font.getHeight(); |
| //midp this.font = font; |
| } |
| |
| /** |
| * |
| */ |
| private void doLayout(Object component) { |
| String classname = getClass(component); |
| if ("combobox" == classname) { |
| if (getBoolean(component, "editable", true)) { |
| Image icon = getIcon(component, "icon", null); |
| layoutField(component, block, false, |
| (icon != null) ? icon.getWidth(this) : 0); |
| } // set editable -> validate (overwrite textfield repaint) |
| else { |
| int selected = getInteger(component, "selected", -1); |
| if (selected != -1) { |
| Object choice = getItem(component, "choice", selected); |
| set(component, "text", get(choice, "text")); |
| set(component, "icon", get(choice, "icon")); |
| } |
| } |
| } |
| else if (("textfield" == classname) || ("passwordfield" == classname)) { |
| layoutField(component, 0, ("passwordfield" == classname), 0); |
| } |
| else if ("textarea" == classname) { |
| String text = getString(component, "text", ""); |
| int start = getInteger(component, "start", 0); |
| if (start > text.length()) { setInteger(component, "start", start = text.length(), 0); } |
| int end = getInteger(component, "end", 0); |
| if (end > text.length()) { setInteger(component, "end", end = text.length(), 0); } |
| int caretx = 0; int carety = 0; |
| FontMetrics fm = getFontMetrics(getFont()); //java |
| int width = 0, height = 0; |
| for (int i = 0, j = 0; j != -1; i = j + 1) { |
| j = text.indexOf('\n', i); |
| if (i != j) { // && i != text.length() |
| String line = (j != -1) ? text.substring(i, j) : text.substring(i); //java |
| width = Math.max(width, fm.stringWidth(line)); //java |
| //midp width = font.substringWidth(text, i, ((j != -1) ? j : text.length()) - i); |
| } |
| if ((end >= i) && ((j == -1) || (end <= j))) { |
| caretx = fm.stringWidth(text.substring(i, end)); //java |
| //midp caretx = font.substringWidth(text, i, end - i); |
| carety = height; |
| } |
| height += fm.getHeight(); |
| } |
| layoutScrollPane(component, width + 2, |
| height - fm.getLeading() + 2, 0, 0); |
| scrollToVisible(component, caretx, carety, |
| 2, fm.getAscent() + fm.getDescent() + 2); |
| } |
| else if ("tabbedpane" == classname) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| String placement = getString(component, "placement", "top"); |
| boolean horizontal = ((placement == "top") || (placement == "bottom")); |
| int tabd = 0; |
| int tabsize = 0; |
| for (Object comp = get(component, "tab"); |
| comp != null; comp = get(comp, ":next")) { |
| Dimension d = getSize(comp, 8, 4, "left"); |
| setRectangle(comp, "bounds", |
| horizontal ? tabd : 0, horizontal ? 0 : tabd, d.width, d.height); |
| tabd += horizontal ? d.width : d.height; |
| tabsize = Math.max(tabsize, horizontal ? d.height : d.width); |
| } |
| for (Object comp = get(component, "tab"); |
| comp != null; comp = get(comp, ":next")) { |
| Rectangle r = getRectangle(comp, "bounds"); |
| if (horizontal) { |
| if (placement == "bottom") { r.y = bounds.height - tabsize; } |
| r.height = tabsize; |
| } else { |
| if (placement == "right") { r.x = bounds.width - tabsize; } |
| r.width = tabsize; |
| } |
| } |
| int cx = (placement == "left") ? (tabsize + 1) : 2; |
| int cy = (placement == "top") ? (tabsize + 1) : 2; |
| int cwidth = bounds.width - (horizontal ? 4 : (tabsize + 3)); |
| int cheight = bounds.height - (horizontal ? (tabsize + 3) : 4); |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if (!getBoolean(comp, "visible", true)) { continue; } |
| setRectangle(comp, "bounds", cx, cy, cwidth, cheight); |
| doLayout(comp); |
| } |
| } |
| else if (("panel" == classname) || (classname == "dialog")) { |
| int gap = getInteger(component, "gap", 0); |
| int[][] grid = getGrid(component, gap); |
| if (grid != null) { |
| int top = getInteger(component, "top", 0); |
| int left = getInteger(component, "left", 0); |
| int bottom = getInteger(component, "bottom", 0); |
| int right = getInteger(component, "right", 0); |
| if (classname == "dialog") { |
| int titleheight = getInteger(component, "titleheight", 0); |
| top += 4 + titleheight; left += 4; bottom += 4; right += 4; |
| } |
| |
| Rectangle bounds = getRectangle(component, "bounds"); |
| for (int i = 0; i < 2; i++) { |
| int d = ((i == 0) ? (bounds.width - left - right) : |
| (bounds.height - top - bottom)) - |
| getSum(grid[i], 0, grid[i].length, gap, false); |
| if (d != 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; |
| } |
| } |
| } |
| } |
| } |
| |
| int i = 0; |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if (!getBoolean(comp, "visible", true)) { continue; } |
| int ix = left + getSum(grid[0], 0, grid[4][i], gap, true); |
| int iy = 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, "component"); |
| 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 == "popupmenu")) { |
| iclass = iclass; //compiler bug |
| } else { |
| 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 = (horizontal ? bounds.width : bounds.height) - 5; |
| |
| Object comp1 = get(component, "component"); |
| 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 width = 0; |
| int columnheight = 0; |
| if ("table" == classname) { |
| for (Object column = get(component, "column"); |
| column != null; column = get(column, ":next")) { |
| width += getInteger(column, "width", 80); |
| Dimension d = getSize(column, 2, 2, "left"); |
| columnheight = Math.max(columnheight, d.height); |
| } |
| } |
| String itemname = ("list" == classname) ? "item" : |
| (("table" == classname) ? "row" : "node"); |
| int y = 0; |
| int level = 0; |
| for (Object item = get(component, itemname); item != null;) { |
| int x = 0; |
| int iwidth = 0; int iheight = 0; |
| if ("table" == classname) { |
| iwidth = width; |
| for (Object cell = get(item, "cell"); |
| cell != null; cell = get(cell, ":next")) { |
| Dimension d = getSize(cell, 2, 3, "left"); |
| iheight = Math.max(iheight, d.height); |
| } |
| } |
| else { |
| if ("tree" == classname) { |
| x = (level + 1) * block; |
| } |
| Dimension d = getSize(item, 2, 3, "left"); |
| iwidth = d.width; iheight = d.height; |
| width = Math.max(width, x + d.width); |
| } |
| setRectangle(item, "bounds", x, y, iwidth, iheight); |
| y += iheight; |
| if ("tree" == classname) { |
| Object next = get(item, "node"); |
| 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"); |
| } |
| } |
| layoutScrollPane(component, width, y - 1, 0, columnheight); |
| } |
| else if ("menubar" == classname) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| int x = 0; |
| for (Object menu = get(component, "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Dimension d = getSize(menu, 8, 4, "left"); |
| setRectangle(menu, "bounds", x, 0, d.width, bounds.height); |
| x += d.width; |
| } |
| } |
| else if (("combolist" == classname) || ("popupmenu" == classname)) { |
| boolean combo = ("combolist" == classname); |
| int pw = 0; int ph = 0; int pxy = combo ? 0 : 1; |
| for (Object item = get(get(component, combo ? "combobox" : "menu"), |
| combo ? "choice" : "menu"); item != null; item = get(item, ":next")) { |
| String itemclass = combo ? null : getClass(item); |
| Dimension d = (itemclass == "separator") ? new Dimension(1, 1) : |
| getSize(item, 8 , 4, "left"); |
| if (itemclass == "checkboxmenuitem") { |
| d.width = d.width + block + 3; |
| d.height = Math.max(block, d.height); |
| } |
| else if (itemclass == "menu") { |
| d.width += block; |
| } |
| setRectangle(item, "bounds", pxy, pxy + ph, d.width, d.height); |
| pw = Math.max(pw, d.width); |
| ph += d.height; |
| } |
| Rectangle r = getRectangle(component, "bounds"); |
| r.width = pw + 2; r.height = ph + 2; |
| if (combo) { |
| Rectangle db = getRectangle(content, "bounds"); |
| if (r.y + ph + 2 > db.height) { |
| r.width = pw + 2 + block; |
| r.height = db.height - r.y; |
| } |
| else { |
| r.height = Math.min(r.height, db.height - r.y); |
| } |
| r.width = Math.min(r.width, db.width - r.x); |
| layoutScrollPane(component, pw, ph, 0, 0);//~ |
| } |
| } |
| //java> |
| else if ("bean" == classname) { |
| Rectangle r = getRectangle(component, "bounds"); |
| ((Component) get(component, "bean")).setBounds(r); |
| } |
| //<java |
| } |
| |
| /** |
| * |
| */ |
| private Object popup(Object component, Object classname) { |
| Object popup = null; |
| int px = 0; int py = 0; |
| if (("menubar" == classname) || ("popupmenu" == classname)) { |
| Object popupmenu = get(component, "popupmenu"); |
| Object selected = get(component, "selected"); |
| if (popupmenu != null) { |
| if (get(popupmenu, "menu") == selected) { return null; } |
| set(popupmenu, "selected", null); |
| set(popupmenu, "menu", null); |
| removeItemImpl(content, "component", popupmenu); |
| repaint(popupmenu); |
| set(popupmenu, ":parent", null); |
| set(component, "popupmenu", null); |
| if (mouseinside == popupmenu) { |
| findComponent(content, mousex, mousey); |
| handleMouseEvent(mousex, mousex, 1, false, false, false, //java |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); //java |
| } |
| popup(popupmenu, "popupmenu"); |
| } |
| if ((selected == null) || (getClass(selected) != "menu")) { return null; } |
| popup = createImpl("popupmenu"); |
| set(popup, "menu", selected); |
| set(component, "popupmenu", popup); |
| |
| Rectangle bounds = getRectangle(selected, "bounds"); |
| if ("menubar" == classname) { |
| px = bounds.x; py = bounds.y + bounds.height - 1; |
| } else { |
| px = bounds.x + getRectangle(component, "bounds").width - 4; |
| py = bounds.y; |
| } |
| } |
| else { //if ("combobox" == classname) { |
| popup = createImpl("combolist"); |
| set(popup, "combobox", component); |
| set(component, "combolist", popup); |
| |
| py = getRectangle(component, "bounds").height + 1; |
| } |
| if (("menubar" == classname) || ("combobox" == classname)) { |
| popupowner = component; |
| } |
| insertItem(content, "component", popup, 0); |
| set(popup, ":parent", content); |
| while (component != content) { |
| Rectangle r = getRectangle(component, "bounds"); |
| px += r.x; py += r.y; |
| component = getParent(component); |
| } |
| setRectangle(popup, "bounds", px, py, 0, 0); |
| doLayout(popup); repaint(popup); |
| return popup; |
| } |
| |
| /** |
| * |
| */ |
| private void closeup(Object combobox, Object combolist, Object item) { |
| if ((item != null) && getBoolean(item, "enabled", true)) { |
| String text = getString(item, "text", ""); |
| set(combobox, "text", text); // if editable |
| setInteger(combobox, "start", text.length(), 0); |
| setInteger(combobox, "end", 0, 0); |
| set(combobox, "icon", get(item, "icon")); |
| validate(combobox); |
| setInteger(combobox, "selected", getIndex(combobox, "choice", item), -1); |
| invoke(combobox, "action"); |
| } |
| set(combolist, "combobox", null); |
| set(combobox, "combolist", null); |
| removeItemImpl(content, "component", combolist); |
| repaint(combolist); |
| set(combolist, ":parent", null); |
| popupowner = null; |
| if (mouseinside == combolist) { |
| findComponent(content, mousex, mousey); |
| handleMouseEvent(mousex, mousex, 1, false, false, false, //java |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); //java |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void closeup(Object menubar) { |
| set(menubar, "selected", null); |
| popup(menubar, "menubar"); |
| repaint(menubar); // , selected |
| popupowner = null; |
| } |
| |
| /** |
| * |
| */ |
| private void closeup() { |
| if (popupowner != null) { |
| String classname = getClass(popupowner); |
| if ("menubar" == classname) { |
| closeup(popupowner); |
| } |
| else if ("combobox" == classname) { |
| closeup(popupowner, get(popupowner, "combolist"), null); |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void showTip() { |
| String text = null; |
| tooltipowner = null; |
| String classname = getClass(mouseinside); |
| if ((classname == "tabbedpane") || (classname == "menubar") || (classname == "popupmenu")) { |
| if (insidepart != null) { |
| text = getString(insidepart, "tooltip", null); |
| } |
| } |
| else if (classname == "combolist") { |
| if (insidepart instanceof Object[]) { |
| text = getString(insidepart, "tooltip", null); |
| } |
| } |
| //list table tree |
| if (text == null) { text = getString(mouseinside, "tooltip", null); } |
| else { tooltipowner = insidepart; } |
| if (text != null) { |
| FontMetrics fm = getFontMetrics(getFont()); |
| int width = fm.stringWidth(text) + 4; |
| int height = fm.getAscent() + fm.getDescent() + 4; |
| if (tooltipowner == null) { tooltipowner = mouseinside; } |
| setRectangle(tooltipowner, "tooltipbounds", mousex + 10, mousey + 10, width, height); |
| repaint(mousex + 10, mousey + 10, width, height); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void hideTip() { |
| if (tooltipowner != null) { |
| Rectangle bounds = getRectangle(tooltipowner, "tooltipbounds"); |
| set(tooltipowner, "tooltipbounds", null); |
| tooltipowner = null; |
| repaint(bounds.x, bounds.y, bounds.width, bounds.height); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void layoutField(Object component, int dw, boolean hidden, int left) { |
| int width = getRectangle(component, "bounds").width - left -dw; |
| String text = getString(component, "text", ""); |
| int start = getInteger(component, "start", 0); |
| if (start > text.length()) { setInteger(component, "start", start = text.length(), 0); } |
| int end = getInteger(component, "end", 0); |
| if (end > text.length()) { setInteger(component, "end", end = text.length(), 0); } |
| int offset = getInteger(component, "offset", 0); |
| int off = offset; |
| FontMetrics fm = getFontMetrics(getFont()); |
| int caret = hidden ? (fm.charWidth('*') * end) : |
| fm.stringWidth(text.substring(0, end)); //java |
| //midp font.substringWidth(text, 0, end); |
| if (off > caret) { |
| off = caret; |
| } |
| else if (off < caret - width + 4) { |
| off = caret - width + 4; |
| } |
| off = Math.max(0, Math.min(off, (hidden ? (fm.charWidth('*') * |
| text.length()) : fm.stringWidth(text)) - width + 4)); |
| if (off != offset) { |
| setInteger(component, "offset", off, 0); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void layoutScrollPane(Object component, |
| int contentwidth, int contentheight, int rowwidth, int columnheight) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| boolean hneed = false; boolean vneed = false; |
| if (contentwidth > bounds.width - rowwidth - 2) { |
| hneed = true; |
| vneed = (contentheight > bounds.height - columnheight - 2 - block); |
| } |
| if (vneed || (contentheight > bounds.height - columnheight - 2)) { |
| vneed = true; |
| hneed = hneed || (contentwidth > bounds.width - rowwidth - 2 - block); |
| } |
| int viewportwidth = bounds.width - rowwidth - (vneed ? block : 0); |
| int viewportheight = bounds.height - columnheight - (hneed ? block : 0); |
| setRectangle(component, ":port", |
| rowwidth, columnheight, viewportwidth, viewportheight); //?rowwidth |
| |
| Rectangle view = getRectangle(component, ":view"); |
| setRectangle(component, ":view", |
| (view != null) ? Math.max(0, |
| Math.min(view.x, contentwidth - viewportwidth + 2)) : 0, |
| (view != null) ? Math.max(0, |
| Math.min(view.y, contentheight - viewportheight + 2)) : 0, |
| Math.max(viewportwidth - 2, contentwidth), |
| Math.max(viewportheight - 2, contentheight)); |
| } |
| |
| /** |
| * |
| */ |
| private void scrollToVisible(Object component, |
| int x, int y, int width, int height) { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle port = getRectangle(component, ":port"); |
| int vx = Math.max(x + width - port.width + 2, Math.min(view.x, x)); |
| int vy = Math.max(y + height - port.height + 2, Math.min(view.y, y)); |
| if ((view.x != vx) || (view.y != vy)) { |
| repaint(component); // horizontal | vertical |
| view.x = vx; view.y = vy; |
| } |
| } |
| |
| /** |
| * |
| */ |
| public Dimension getPreferredSize() { |
| return getPreferredSize(content); |
| } |
| |
| /** |
| * |
| */ |
| private Dimension getPreferredSize(Object component) { |
| int width = getInteger(component, "width", 0); |
| int height = getInteger(component, "height", 0); |
| if ((width > 0) && (height > 0)) { |
| return new Dimension(width, height); |
| } |
| String classname = getClass(component); |
| //System.out.println("classname: " + classname); |
| if ("label" == classname) { |
| return getSize(component, 0, 0, "left"); |
| } |
| if ("button" == classname) { |
| return getSize(component, 12, 6, "center"); |
| } |
| if ("checkbox" == classname) { |
| Dimension d = getSize(component, 0, 0, "left"); |
| d.width = d.width + block + 3; |
| d.height = Math.max(block, d.height); |
| return d; |
| } |
| if ("combobox" == classname) { |
| if (getBoolean(component, "editable", true)) { |
| Dimension size = getFieldSize(component); |
| Image icon = getIcon(component, "icon", null); |
| if (icon != null) { |
| size.width += icon.getWidth(this); |
| size.height = Math.max(size.height, icon.getHeight(this) + 2); |
| } |
| size.width += block; |
| return size; |
| } else { |
| int selected = getInteger(component, "selected", -1); |
| return getSize((selected != -1) ? |
| getItemImpl(component, "choice", selected) : |
| get(component, "choice"), 4 + block, 4, "left"); |
| } |
| } |
| if (("textfield" == classname) || ("passwordfield" == classname)) { |
| return getFieldSize(component); |
| } |
| if ("textarea" == classname) { |
| int columns = getInteger(component, "columns", 0); |
| int rows = getInteger(component, "rows", 0); // 'e' -> 'm' ? |
| FontMetrics fm = getFontMetrics(getFont()); //java |
| return new Dimension( |
| ((columns > 0) ? (columns * fm.charWidth('e') + 2) : 76) + 2 + block, |
| ((rows > 0) ? (rows * fm.getHeight() - fm.getLeading() + 2) : 76) + 2 + block); |
| } |
| if ("tabbedpane" == classname) { |
| String placement = getString(component, "placement", "top"); |
| boolean horizontal = ((placement == "top") || (placement == "bottom")); |
| int tabsize = 0; |
| int contentwidth = 0; int contentheight = 0; |
| for (Object comp = get(component, "tab"); |
| comp != null; comp = get(comp, ":next")) { |
| Dimension d = getSize(comp, 8, 4, "left"); |
| tabsize = Math.max(tabsize, horizontal ? d.height : d.width); |
| } |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if (!getBoolean(comp, "visible", true)) { continue; } |
| Dimension d = getPreferredSize(comp); |
| contentwidth = Math.max(contentwidth, d.width); |
| contentheight = Math.max(contentheight, d.height); |
| } |
| return new Dimension(contentwidth + (horizontal ? 4 : (tabsize + 3)), |
| contentheight + (horizontal ? (tabsize + 3) : 4)); |
| } |
| if (("panel" == classname) || (classname == "dialog")) { |
| Dimension size = new Dimension( |
| getInteger(component, "left", 0) + getInteger(component, "right", 0), |
| getInteger(component, "top", 0) + getInteger(component, "bottom", 0)); |
| if (classname == "dialog") { |
| int titleheight = getSize(component, 0, 0, "left").height; |
| setInteger(component, "titleheight", titleheight, 0); |
| size.width += 8; size.height += 8 + titleheight; |
| } |
| int gap = getInteger(component, "gap", 0); |
| int[][] grid = getGrid(component, gap); |
| if (grid != null) { |
| size.width += getSum(grid[0], 0, grid[0].length, gap, false); |
| size.height += getSum(grid[1], 0, grid[1].length, gap, false); |
| } |
| return size; |
| } |
| else if ("desktop" == classname) { |
| Dimension size = new Dimension(); |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| String iclass = getClass(comp); |
| if ((iclass != "dialog") && (iclass != "popupmenu") && |
| (iclass != "combolist")) { |
| Dimension d = getPreferredSize(comp); |
| size.width = Math.max(d.width, size.width); |
| size.height = Math.max(d.height, size.height); |
| } |
| } |
| return size; |
| } |
| if ("spinbox" == classname) { |
| Dimension size = getFieldSize(component); |
| size.width += block; |
| return size; |
| } |
| if ("progressbar" == classname) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| return new Dimension(horizontal ? 76 : 6, horizontal ? 6 : 76); |
| } |
| if ("slider" == classname) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| return new Dimension(horizontal ? 76 : 10, horizontal ? 10 : 76); |
| } |
| if ("splitpane" == classname) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| Object comp1 = get(component, "component"); |
| Dimension size = ((comp1 == null) || !getBoolean(comp1, "visible", true)) ? |
| new Dimension() : getPreferredSize(comp1); |
| Object comp2 = get(comp1, ":next"); |
| if ((comp2 != null) && getBoolean(comp2, "visible", true)) { |
| Dimension d = getPreferredSize(comp2); |
| size.width = horizontal ? (size.width + d.width) : |
| Math.max(size.width, d.width); |
| size.height = horizontal ? Math.max(size.height, d.height) : |
| (size.height + d.height); |
| } |
| if (horizontal) { size.width += 5; } else { size.height += 5; } |
| return size; |
| } |
| if (("list" == classname) || |
| ("table" == classname) || ("tree" == classname)) { |
| return new Dimension(76 + 2 + block, 76 + 2 + block); |
| } |
| if ("separator" == classname) { |
| return new Dimension(1, 1); |
| } |
| if ("menubar" == classname) { |
| Dimension size = new Dimension(0, 0); |
| for (Object menu = get(component, "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Dimension d = getSize(menu, 8, 4, "left"); |
| size.width += d.width; |
| size.height = Math.max(size.height, d.height); |
| } |
| return size; |
| } |
| //java> |
| if ("bean" == classname) { |
| return ((Component) get(component, "bean")).getPreferredSize(); |
| } |
| //<java |
| throw new IllegalArgumentException((String) classname); |
| } |
| |
| /** |
| * |
| */ |
| private int[][] getGrid(Object component, int gap) { |
| int count = 0; |
| for (Object comp = get(component, "component"); comp != null; |
| comp = get(comp, ":next")) { |
| if (getBoolean(comp, "visible", true)) { count++; } |
| } |
| if (count == 0) { return null; } |
| int columns = getInteger(component, "columns", 0); |
| int icols = (columns != 0) ? columns : count; |
| int irows = (columns != 0) ? ((count + columns - 1) / columns) : 1; |
| int[][] grid = { |
| new int[icols], new int[irows], // columnwidths, rowheights |
| new int[icols], new int[irows], // columnweights, rowweights |
| new int[count], new int[count], // gridx, gridy |
| new int[count], new int[count] }; // gridwidth, gridheight |
| int[] columnheight = new int[icols]; |
| int[][] cache = null; // preferredwidth, height, columnweight, rowweight |
| |
| int i = 0; int x = 0; int y = 0; |
| int nextsize = 0; |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if (!getBoolean(comp, "visible", true)) { continue; } |
| int colspan = ((columns != 0) && (columns < count)) ? |
| Math.min(getInteger(comp, "colspan", 1), columns) : 1; |
| int rowspan = (columns != 1) ? getInteger(comp, "rowspan", 1) : 1; |
| |
| for (int j = 0; j < colspan; j++) { |
| if ((columns != 0) && (x + colspan > columns)) { |
| x = 0; y++; j = -1; |
| } |
| else if (columnheight[x + j] > y) { |
| x += (j + 1); j = -1; |
| } |
| } |
| if (y + rowspan > grid[1].length) { |
| int[] rowheights = new int[y + rowspan]; |
| System.arraycopy(grid[1], 0, rowheights, 0, grid[1].length); |
| grid[1] = rowheights; |
| int[] rowweights = new int[y + rowspan]; |
| System.arraycopy(grid[3], 0, rowweights, 0, grid[3].length); |
| grid[3] = rowweights; |
| } |
| for (int j = 0; j < colspan; j++) { |
| columnheight[x + j] = y + rowspan; |
| } |
| |
| int weightx = getInteger(comp, "weightx", 0); |
| int weighty = getInteger(comp, "weighty", 0); |
| Dimension d = getPreferredSize(comp); |
| |
| if (colspan == 1) { |
| grid[0][x] = Math.max(grid[0][x], d.width); // columnwidths |
| grid[2][x] = Math.max(grid[2][x], weightx); // columnweights |
| } |
| else { |
| if (cache == null) { cache = new int[4][count]; } |
| cache[0][i] = d.width; |
| cache[2][i] = weightx; |
| if ((nextsize == 0) || (colspan < nextsize)) { nextsize = colspan; } |
| } |
| if (rowspan == 1) { |
| grid[1][y] = Math.max(grid[1][y], d.height); // rowheights |
| grid[3][y] = Math.max(grid[3][y], weighty); // rowweights |
| } |
| else { |
| if (cache == null) { cache = new int[4][count]; } |
| cache[1][i] = d.height; |
| cache[3][i] = weighty; |
| if ((nextsize == 0) || (rowspan < nextsize)) { nextsize = rowspan; } |
| } |
| grid[4][i] = x; //gridx |
| grid[5][i] = y; //gridy |
| grid[6][i] = colspan; //gridwidth |
| grid[7][i] = rowspan; //gridheight |
| |
| x += colspan; |
| i++; |
| } |
| |
| while (nextsize != 0) { |
| int size = nextsize; nextsize = 0; |
| for (int j = 0; j < 2; j++) { // horizontal, vertical |
| for (int k = 0; k < count; k++) { |
| if (grid[6 + j][k] == size) { // gridwidth, gridheight |
| int gridpoint = grid[4 + j][k]; // gridx, gridy |
| |
| int weightdiff = cache[2 + j][k]; |
| for (int m = 0; (weightdiff > 0) && (m < size); m++) { |
| weightdiff -= grid[2 + j][gridpoint + m]; |
| } |
| if (weightdiff > 0) { |
| int weightsum = cache[2 + j][k] - weightdiff; |
| for (int m = 0; (weightsum > 0) && (m < size); m++) { |
| int weight = grid[2 + j][gridpoint + m]; |
| if (weight > 0) { |
| int weightinc = weight * weightdiff / weightsum; |
| grid[2 + j][gridpoint + m] += weightinc; |
| weightdiff -= weightinc; |
| weightsum -= weightinc; |
| } |
| } |
| grid[2 + j][gridpoint + size - 1] += weightdiff; |
| } |
| |
| int sizediff = cache[j][k]; |
| int weightsum = 0; |
| for (int m = 0; (sizediff > 0) && (m < size); m++) { |
| sizediff -= grid[j][gridpoint + m]; |
| weightsum += grid[2 + j][gridpoint + m]; |
| } |
| if (sizediff > 0) { |
| for (int m = 0; (weightsum > 0) && (m < size); m++) { |
| int weight = grid[2 + j][gridpoint + m]; |
| if (weight > 0) { |
| int sizeinc = weight * sizediff / weightsum; |
| grid[j][gridpoint + m] += sizeinc; |
| sizediff -= sizeinc; |
| weightsum -= weight; |
| } |
| } |
| grid[j][gridpoint + size - 1] += sizediff; |
| } |
| } |
| else if ((grid[6 + j][k] > size) && |
| ((nextsize == 0) || (grid[6 + j][k] < nextsize))) { |
| nextsize = grid[6 + j][k]; |
| } |
| } |
| } |
| } |
| return grid; |
| } |
| |
| /** |
| * |
| */ |
| 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); |
| FontMetrics fm = getFontMetrics(getFont()); |
| return new Dimension(((columns > 0) ? |
| (columns * fm.charWidth('e')) : 76) + 4, |
| fm.getAscent() + fm.getDescent() + 4); // fm.stringWidth(text) |
| } |
| |
| /** |
| * |
| */ |
| private Dimension getSize(Object component, |
| int dx, int dy, String defaultalignment) { |
| String text = getString(component, "text", null); |
| int tw = 0; int th = 0; |
| if (text != null) { |
| FontMetrics fm = getFontMetrics(getFont()); |
| 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); |
| } |
| return new Dimension(tw + iw + dx, Math.max(th, ih) + dy); |
| } |
| //java> |
| |
| /** |
| * |
| */ |
| 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); |
| } |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| public void paint(Graphics g) { |
| //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); |
| } |
| |
| //<java |
| /*midp |
| protected void paint(Graphics g) { |
| paint(g, g.getClipX(), g.getClipY(), |
| g.getClipWidth(), g.getClipHeight(), content, true); |
| } |
| |
| protected void showNotify() { |
| setRectangle(content, "bounds", 0, 0, getWidth(), getHeight()); |
| doLayout(content); |
| } |
| midp*/ |
| |
| /** |
| * |
| */ |
| 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; } |
| if (bounds.width < 0) { |
| bounds.width = Math.abs(bounds.width); |
| doLayout(component); |
| } |
| if ((clipx + clipwidth < bounds.x) || |
| (clipx > bounds.x + bounds.width) || |
| (clipy + clipheight < bounds.y) || |
| (clipy > bounds.y + bounds.height)) { |
| return; |
| } |
| clipx -= bounds.x; clipy -= bounds.y; |
| 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 && |
| g.translate(bounds.x, bounds.y); |
| //g.setClip(0, 0, bounds.width, bounds.height); |
| |
| if ("label" == classname) { |
| paintContent(component, g, clipx, clipy, clipwidth, clipheight, |
| 0, 0, bounds.width, bounds.height, |
| enabled ? c_text : c_disable, "left", true); |
| } |
| else if ("button" == classname) { |
| paintRect(g, 0, 0, bounds.width, bounds.height, |
| enabled ? c_border : c_disable, |
| enabled ? ((inside != pressed) ? c_hover : |
| (pressed ? c_press : c_ctrl)) : c_bg, true, true, true, true); |
| if (focus) { |
| g.setColor(c_focus); |
| g.drawRect(2, 2, bounds.width - 5, bounds.height - 5); |
| } |
| paintContent(component, g, clipx, clipy, clipwidth, clipheight, |
| 6, 3, bounds.width - 12, bounds.height - 6, |
| enabled ? c_text : c_disable, "center", true); |
| } |
| else if ("checkbox" == classname) { |
| 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); |
| } else { |
| g.setColor((foreground != c_ctrl) ? foreground : c_bg); |
| g.fillOval(1, dy + 1, block - 3, block - 3); //java |
| g.setColor(border); |
| g.drawOval(1, dy + 1, block - 3, block - 3); //java |
| } |
| 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); //java |
| } |
| } |
| if((!selected && inside && pressed) || |
| (selected && (!inside || !pressed))) { |
| g.setColor(enabled ? c_text : c_disable); |
| if (group == null) { |
| g.fillRect(3, dy + block - 9, 2, 6); |
| 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, block - 10); //java |
| g.drawOval(4, dy + 4, block - 9, block - 9); //java |
| } |
| } |
| paintContent(component, g, clipx, clipy, clipwidth, clipheight, |
| block + 3, 0, bounds.width - block - 3, bounds.height, |
| enabled ? c_text : c_disable, "left", true); |
| } |
| 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); //java |
| //midp g.drawImage(icon, 2, bounds.height / 2, Graphics.LEFT | Graphics.VCENTER); |
| } |
| paintArrow(g, bounds.width - block, 0, block, bounds.height, |
| 'S', enabled, inside, pressed, "down", true, false, true, true); |
| } else { |
| paintRect(g, 0, 0, bounds.width, bounds.height, |
| enabled ? c_border : c_disable, |
| enabled ? ((inside != pressed) ? c_hover : |
| (pressed ? c_press : c_ctrl)) : c_bg, true, true, true, true); |
| paintContent(component, g, clipx, clipy, clipwidth, clipheight, |
| 2, 2, bounds.width - block - 4, bounds.height - 4, |
| enabled ? c_text : c_disable, "left", false); |
| paintArrow(g, bounds.width - block, 0, block, bounds.height, 'S'); |
| if (focus) { |
| g.setColor(c_focus); |
| g.drawRect(2, 2, bounds.width - block - 5, bounds.height - 5); |
| } |
| } |
| } |
| else if ("combolist" == classname) { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle viewport = getRectangle(component, ":port"); |
| g.setColor(c_border); |
| g.drawRect(viewport.x, viewport.y, viewport.width - 1, viewport.height - 1); |
| if (paintScrollPane(g, clipx, clipy, clipwidth, clipheight, |
| bounds, view, viewport, enabled, inside, pressed)) { |
| Object selected = get(component, "inside"); |
| int ly = clipy - viewport.y - 1; |
| int yfrom = view.y + Math.max(0, ly); |
| int yto = view.y + Math.min(viewport.height - 2, ly + clipheight); |
| for (Object choice = get(get(component, "combobox"), "choice"); |
| choice != null; choice = get(choice, ":next")) { |
| Rectangle r = getRectangle(choice, "bounds"); |
| if (yto <= r.y) { break; } |
| if (yfrom >= r.y + r.height) { continue; } |
| boolean armed = (selected == choice); |
| paintRect(g, r.x, r.y, bounds.width - 2, r.height, c_border, |
| armed ? c_select : c_bg, false, false, false, false); |
| paintContent(choice, g, clipx, yfrom, clipwidth, yto - yfrom, |
| r.x + 4, r.y + 2, bounds.width - 10, r.height - 4, |
| getBoolean(choice, "enabled", true) ? c_text : c_disable, "left", false); |
| } |
| resetScrollPane(g, clipx, clipy, clipwidth, clipheight, view, viewport); |
| } |
| //paintRect(g, 0, 0, bounds.width, bounds.height, |
| // secondary1, c_ctrl, true, true, true, true); |
| } |
| 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) { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle viewport = getRectangle(component, ":port"); |
| boolean editable = getBoolean(component, "editable", true); |
| paintRect(g, viewport.x, viewport.y, viewport.width, viewport.height, |
| enabled ? c_border : c_disable, editable ? c_textbg : c_bg, |
| true, true, true, true); |
| if (paintScrollPane(g, clipx, clipy, clipwidth, clipheight, |
| bounds, view, viewport, enabled, inside, pressed)) { |
| String text = getString(component, "text", ""); |
| int start = focus ? getInteger(component, "start", 0) : 0; |
| int end = focus ? getInteger(component, "end", 0) : 0; |
| int is = Math.min(start, end); int ie = Math.max(start, end); |
| boolean wrap = getBoolean(component, "wrap", false); |
| FontMetrics fm = g.getFontMetrics(); //java |
| int fontascent = fm.getAscent(); int fontheight = fm.getHeight(); //java |
| //midp int fontheight = fm.getHeight(); |
| int ascent = 1; |
| int ly = clipy - viewport.y - 1; |
| int yfrom = view.y + Math.max(0, ly); |
| int yto = view.y + Math.min(viewport.height - 2, ly + clipheight); |
| //g.setColor(Color.pink); g.fillRect(0, yfrom - 1, 75, 2); g.fillRect(0, yto - 1, 75, 2); |
| |
| boolean prevletter = false; int n = text.length(); char c = 0; |
| for (int i = 0, j = -1, k = 0; k <= n; k++) { // j is the last space index (before k) |
| if (yto <= ascent) { break; } |
| if (wrap) { |
| if (((k == n) || ((c = text.charAt(k)) == '\n') || (c == ' ')) && |
| (j > i) && (fm.stringWidth(text.substring(i, k)) > viewport.width - 4)) { |
| k--; // draw line to the begin of the current word (+ spaces) if it is out of width |
| } |
| else if ((k == n) || (c == '\n')) { // draw line to the text/line end |
| j = k; prevletter = false; |
| } |
| else { |
| if ((c == ' ') && (prevletter || (j > i))) { j = k; } // keep spaces starting the line |
| prevletter = (c != ' '); |
| continue; |
| } |
| } |
| else { |
| if ((k == n) || ((c = text.charAt(k)) == '\n')) { j = k; } else { continue; } |
| } |
| if (yfrom < ascent + fontheight) { |
| String line = (j != -1) ? text.substring(i, j) : text.substring(i); //java |
| if (focus && (is != ie) && (ie >= i) && ((j == -1) || (is <= j))) { |
| int xs = (is < i) ? -1 : (((j != -1) && (is > j)) ? (view.width - 1) : |
| fm.stringWidth(text.substring(i, is))); //java |
| //midp font.substringWidth(text, i, is - i)); |
| int xe = ((j != -1) && (ie > j)) ? (view.width - 1) : |
| fm.stringWidth(text.substring(i, ie)); //java |
| //midp font.substringWidth(text, i, ie - i); |
| g.setColor(c_select); |
| g.fillRect(1 + xs, ascent, xe - xs, fontheight); |
| } |
| g.setColor(enabled ? c_text : c_disable); |
| g.drawString(line, 1, ascent + fontascent); //java |
| //midp g.drawSubstring(text, i, ((j != -1) ? j : text.length()) - i, 1, ascent, Graphics.LEFT | Graphics.TOP); |
| if (focus && (end >= i) && ((j == -1) || (end <= j))) { |
| int caret = fm.stringWidth(text.substring(i, end)); //java |
| //midp int caret = font.substringWidth(text, i, end - i); |
| g.setColor(c_focus); |
| g.fillRect(caret, ascent, 1, fontheight); |
| } |
| } |
| ascent += fontheight; |
| i = j + 1; |
| } |
| resetScrollPane(g, clipx, clipy, clipwidth, clipheight, view, viewport); |
| } |
| } |
| else if ("tabbedpane" == classname) { |
| int i = 0; Rectangle last = null; |
| int selected = getInteger(component, "selected", 0); |
| String placement = getString(component, "placement", "top"); |
| for (Object comp = get(component, "tab"); |
| comp != null; comp = get(comp, ":next")) { |
| Rectangle r = getRectangle(comp, "bounds"); |
| boolean hover = !(selected == i) && inside && |
| (mousepressed == null) && (insidepart == comp); |
| boolean sel = (selected == i); |
| boolean tabenabled = enabled && getBoolean(comp, "enabled", true); |
| paintRect(g, r.x, r.y, r.width, r.height, |
| enabled ? c_border : c_disable, |
| tabenabled ? (sel ? c_bg : (hover ? c_hover : c_ctrl)) : c_ctrl, |
| (placement != "bottom") || !sel, (placement != "right") || !sel, |
| (placement == "bottom") || ((placement == "top") && !sel), |
| (placement == "right") || ((placement == "left") && !sel)); |
| if (focus && sel) { |
| g.setColor(c_focus); |
| g.drawRect(r.x + 2, r.y + 2, r.width - 4, r.height - 4); |
| } |
| paintContent(comp, g, clipx, clipy, clipwidth, clipheight, |
| r.x + 4, r.y + 2, r.width - 8, r.height - 4, |
| tabenabled ? c_text : c_disable, "left", true); |
| i++; last = r; |
| } |
| if (last != null) { |
| boolean horizontal = ((placement == "top") || (placement == "bottom")); |
| paintRect(g, horizontal ? (last.x + last.width) : last.x, |
| horizontal ? last.y : (last.y + last.height), |
| horizontal ? (bounds.width - last.x - last.width) : last.width, |
| horizontal ? last.height : (bounds.height - last.y - last.height), |
| enabled ? c_border : c_disable, c_bg, |
| (placement != "top"), (placement != "left"), |
| (placement == "top"), (placement == "left")); |
| paintRect(g, (placement == "left") ? last.width : 0, |
| (placement == "top") ? last.height : 0, |
| horizontal ? bounds.width : (bounds.width - last.width), |
| horizontal ? (bounds.height - last.height) : bounds.height, |
| enabled ? c_border : c_disable, c_bg, |
| (placement != "top"), (placement != "left"), |
| (placement != "bottom"), (placement != "right")); |
| } |
| Object tabcontent = getItemImpl(component, "component", selected); |
| if (tabcontent != null) { |
| paint(g, clipx, clipy, clipwidth, clipheight, tabcontent, enabled); |
| } |
| } |
| else if (("panel" == classname) || ("dialog" == classname)) { |
| if ("dialog" == classname) { |
| int titleheight = getInteger(component, "titleheight", 0); |
| paintRect(g, 0, 0, bounds.width, 3 + titleheight, |
| c_border, c_ctrl, true, true, false, true); |
| paintRect(g, 0, 3 + titleheight, bounds.width, bounds.height - 3 - titleheight, |
| c_border, c_press, false, true, true, true); |
| paintContent(component, g, clipx, clipy, clipwidth, clipheight, |
| 3, 2, bounds.width - 6, titleheight, c_text, "left", false); |
| paintRect(g, 3, 3 + titleheight, bounds.width - 6, bounds.height - 6 - titleheight, |
| c_border, c_bg, true, true, true, true); |
| } else { |
| paintRect(g, 0, 0, bounds.width, bounds.height, |
| c_border, c_bg, false, false, false, false); |
| } |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| paint(g, clipx, clipy, clipwidth, clipheight, comp, enabled); |
| } |
| } |
| else if ("desktop" == classname) { |
| paintReverse(g, clipx, clipy, clipwidth, clipheight, |
| get(component, "component"), enabled); |
| //g.setColor(Color.red); if (clip != null) g.drawRect(clipx, clipy, clipwidth, clipheight); |
| if (tooltipowner != null) { |
| Rectangle r = getRectangle(tooltipowner, "tooltipbounds"); |
| paintRect(g, r.x, r.y, r.width, r.height, |
| c_border, c_bg, true, true, true, true); |
| String text = getString(tooltipowner, "tooltip", null); |
| g.setColor(c_text); |
| g.drawString(text, r.x + 2, r.y + g.getFontMetrics().getAscent() + 2); //java |
| //midp g.drawString(text, r.x + 2, r.y + (r.height - font.getHeight()) / 2, Graphics.LEFT | Graphics.TOP); |
| } |
| } |
| else if ("spinbox" == classname) { |
| paintField(g, clipx, clipy, clipwidth, clipheight, component, |
| bounds.width - block, bounds.height, |
| inside, pressed, focus, enabled, false, 0); |
| paintArrow(g, bounds.width - block, 0, block, bounds.height / 2, |
| 'N', enabled, inside, pressed, "up", true, false, false, true); |
| paintArrow(g, bounds.width - block, bounds.height / 2, |
| block, bounds.height - (bounds.height / 2), |
| 'S', enabled, inside, pressed, "down", true, false, true, true); |
| } |
| else if ("progressbar" == classname) { |
| int minimum = getInteger(component, "minimum", 0); |
| int maximum = getInteger(component, "maximum", 100); |
| int value = getInteger(component, "value", 0); |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| int length = (value - minimum) * |
| ((horizontal ? bounds.width : bounds.height) - 1) / (maximum - minimum); |
| paintRect(g, 0, 0, horizontal ? length : bounds.width, |
| horizontal ? bounds.height : length, enabled ? c_border : c_disable, |
| c_select, true, true, horizontal, !horizontal); |
| paintRect(g, horizontal ? length : 0, horizontal ? 0 : length, |
| horizontal ? (bounds.width - length) : bounds.width , |
| horizontal ? bounds.height : (bounds.height - length), |
| enabled ? c_border : c_disable, c_bg, true, true, true, true); |
| } |
| else if ("slider" == classname) { |
| int minimum = getInteger(component, "minimum", 0); |
| int maximum = getInteger(component, "maximum", 100); |
| int value = getInteger(component, "value", 0); |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| int length = (value - minimum) * |
| ((horizontal ? bounds.width : bounds.height) - block) / |
| (maximum - minimum); |
| paintRect(g, horizontal ? 0 : 3, horizontal ? 3 : 0, |
| horizontal ? length : (bounds.width - 6), |
| horizontal ? (bounds.height - 6) : length, |
| enabled ? c_border : c_disable, |
| c_bg, true, true, horizontal, !horizontal); |
| paintRect(g, horizontal ? length : 0, horizontal ? 0 : length, |
| horizontal ? block : bounds.width, horizontal ? bounds.height : block, |
| enabled ? c_border : c_disable, |
| enabled ? c_ctrl : c_bg, true, true, true, true); |
| if (focus) { |
| g.setColor(c_focus); |
| g.drawRect(horizontal ? (length + 2) : 2, horizontal ? 2 : (length + 2), |
| (horizontal ? block : bounds.width) - 5, |
| (horizontal ? bounds.height : block) - 5); |
| //g.drawRect(length + 1, 1, block - 3, bounds.height - 3); |
| } |
| paintRect(g, horizontal ? (block + length) : 3, |
| horizontal ? 3 : (block + length), |
| bounds.width - (horizontal ? (block + length) : 6), |
| bounds.height - (horizontal ? 6 : (block + length)), |
| enabled ? c_border : c_disable, |
| c_bg, horizontal, !horizontal, true, true); |
| } |
| else if ("splitpane" == classname) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| int divider = getInteger(component, "divider", -1); |
| paintRect(g, horizontal ? divider : 0, horizontal ? 0 : divider, |
| horizontal ? 5 : bounds.width, horizontal ? bounds.height : 5, |
| c_border, c_bg, false, false, false, false); |
| g.setColor(enabled ? (focus ? c_focus : c_border) : c_disable); |
| int xy = horizontal ? bounds.height : bounds.width; |
| int xy1 = Math.max(0, xy / 2 - 12); |
| int xy2 = Math.min(xy / 2 + 12, xy - 1); |
| for (int i = divider + 1; i < divider + 4; i += 2) { |
| if (horizontal) { g.drawLine(i, xy1, i, xy2); } |
| else { g.drawLine(xy1, i, xy2, i); } |
| } |
| Object comp1 = get(component, "component"); |
| if (comp1 != null) { |
| paint(g, clipx, clipy, clipwidth, clipheight, comp1, enabled); |
| Object comp2 = get(comp1, ":next"); |
| if (comp2 != null) { |
| paint(g, clipx, clipy, clipwidth, clipheight, comp2, enabled); |
| } |
| } |
| } |
| else if (("list" == classname) || |
| ("table" == classname) || ("tree" == classname)) { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle viewport = getRectangle(component, ":port"); |
| int[] columnwidths = null; |
| int lx = clipx - viewport.x - 1; |
| int xfrom = view.x + Math.max(0, lx); |
| int xto = view.x + Math.min(viewport.width - 2, lx + clipwidth); |
| if ("table" == classname) { |
| columnwidths = new int[getItemCountImpl(component, "column")]; |
| int i = 0; int x = 0; boolean drawheader = (clipy < viewport.y); |
| if (drawheader) { g.setClip(viewport.x, 0, viewport.width, viewport.y); } |
| for (Object column = get(component, "column"); |
| column != null; column = get(column, ":next")) { |
| boolean lastcolumn = (i == columnwidths.length - 1); |
| int width = getInteger(column, "width", 80); |
| if (lastcolumn) { width = Math.max(width, viewport.width - x); } |
| columnwidths[i] = width; |
| if (drawheader && (xfrom < x + width) && (xto > x)) { |
| paintRect(g, x - view.x, 0, width, viewport.y, |
| enabled ? c_border : c_disable, enabled ? c_ctrl : c_bg, |
| true, true, false, lastcolumn); |
| paintContent(column, g, clipx, clipy, clipwidth, clipheight, |
| x + 2 - view.x, 1, width - 2, |
| viewport.y - 2, enabled ? c_text : c_disable, "left", false); |
| } |
| i++; x += width; |
| } |
| if (drawheader) { g.setClip(clipx, clipy, clipwidth, clipheight); } |
| } |
| paintRect(g, viewport.x, viewport.y, viewport.width, viewport.height, |
| enabled ? c_border : c_disable, c_textbg, true, true, true, true); |
| if (paintScrollPane(g, clipx, clipy, clipwidth, clipheight, bounds, |
| view, viewport, enabled, inside, pressed)) { |
| Object lead = get(component, "lead"); |
| int ly = clipy - viewport.y - 1; |
| int yfrom = view.y + Math.max(0, ly); |
| int yto = view.y + Math.min(viewport.height - 2, ly + clipheight); |
| for (Object item = get(component, ("list" == classname) ? "item" : |
| (("table" == classname) ? "row" : "node")); item != null;) { |
| Rectangle r = getRectangle(item, "bounds"); |
| if (lead == null) { |
| set(component, "lead", lead = item); // draw first item focused when lead is null |
| } |
| if (yto <= r.y) { break; } // the clip bounds are above |
| |
| Object next = ("tree" == classname) ? get(item, "node") : null; |
| boolean expanded = (next != null) && |
| getBoolean(item, "expanded", true); |
| if (yfrom < r.y + r.height) { // the clip rectangle is not bellow the current item |
| boolean selected = getBoolean(item, "selected", false); |
| paintRect(g, 0, r.y, view.width, r.height, |
| c_bg, selected ? c_select : c_textbg, false, false, true, false); |
| if (focus && (lead == item)) { |
| g.setColor(c_focus); |
| g.drawRect(0, r.y, view.width - 1, r.height - 2); |
| } |
| if ("table" == classname) { |
| int x = 0; int i = 0; |
| for (Object cell = get(item, "cell"); |
| cell != null; cell = get(cell, ":next")) { |
| if (xto <= x) { break; } |
| int iwidth = (i < columnwidths.length) ? columnwidths[i] : 80; |
| if (xfrom < x + iwidth) { |
| boolean cellenabled = enabled && getBoolean(cell, "enabled", true); |
| paintContent(cell, g, xfrom, yfrom, xto - xfrom, yto - yfrom, |
| r.x + x + 1, r.y + 1, iwidth - 2, r.height - 3, |
| cellenabled ? c_text : c_disable, "left", false); |
| } |
| x += iwidth; i++; |
| } |
| } else { |
| boolean itemenabled = enabled && getBoolean(item, "enabled", true); |
| paintContent(item, g, xfrom, yfrom, xto - xfrom, yto - yfrom, |
| r.x + 1, r.y + 1, view.width - r.x - 2, |
| r.height - 3, itemenabled ? c_text : c_disable, "left", false); |
| |
| if (next != null) { |
| int x = r.x - block / 2; |
| int y = r.y + (r.height - 1) / 2; |
| //g.drawRect(x - 4, y - 4, 8, 8); |
| paintRect(g, x - 4, y - 4, 9, 9, itemenabled ? c_border : c_disable, |
| itemenabled ? c_ctrl : c_bg, true, true, true, true); |
| g.setColor(itemenabled ? c_text : c_disable); |
| g.drawLine(x - 2, y, x + 2, y); |
| if (!expanded) { |
| g.drawLine(x, y - 2, x, y + 2); |
| } |
| } |
| } |
| } |
| if ("tree" == classname) { |
| if ((next == null) || !expanded) { |
| while ((item != component) && ((next = get(item, ":next")) == null)) { |
| item = getParent(item); |
| } |
| } |
| item = next; |
| } else { |
| item = get(item, ":next"); |
| } |
| } |
| /*if (columnwidths != null) { |
| g.setColor(c_bg); |
| for (int i = 0, cx = -1; i < columnwidths.length - 1; i++) { |
| cx += columnwidths[i]; |
| g.drawLine(cx, 0, cx, view.height); |
| } |
| }*/ |
| resetScrollPane(g, clipx, clipy, clipwidth, clipheight, view, viewport); |
| } |
| } |
| else if ("separator" == classname) { |
| g.setColor(enabled ? c_border : c_disable); |
| g.fillRect(0, 0, bounds.width, bounds.height); |
| } |
| else if ("menubar" == classname) { |
| Object selected = get(component, "selected"); |
| int lastx = 0; |
| for (Object menu = get(component, "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Rectangle mb = getRectangle(menu, "bounds"); |
| if (clipx + clipwidth <= mb.x) { break; } |
| if (clipx >= mb.x + mb.width) { continue; } |
| boolean armed = (selected == menu); |
| boolean hoover = (selected == null) && (insidepart == menu); |
| paintRect(g, mb.x, 0, mb.width, bounds.height, enabled ? c_border : c_disable, |
| enabled ? (armed ? c_select : (hoover ? c_hover : c_ctrl)) : c_bg, |
| armed, armed, true, armed); |
| paintContent(menu, g, clipx, clipy, clipwidth, clipheight, |
| mb.x + 4, 1, mb.width, bounds.height, |
| (enabled && getBoolean(menu, "enabled", true)) ? c_text : c_disable, |
| "left", true); |
| lastx = mb.x + mb.width; |
| } |
| paintRect(g, lastx, 0, bounds.width - lastx, bounds.height, |
| enabled ? c_border : c_disable, enabled ? c_ctrl : c_bg, |
| false, false, true, false); |
| } |
| else if ("popupmenu" == classname) { |
| paintRect(g, 0, 0, bounds.width, bounds.height, |
| c_border, c_bg, true, true, true, true); |
| Object selected = get(component, "selected"); |
| for (Object menu = get(get(component, "menu"), "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Rectangle r = getRectangle(menu, "bounds"); |
| if (clipy + clipheight <= r.y) { break; } |
| if (clipy >= r.y + r.height) { continue; } |
| String itemclass = getClass(menu); |
| if (itemclass == "separator") { |
| g.setColor(c_border); |
| g.fillRect(r.x, r.y, bounds.width - 2, r.height); |
| } else { |
| boolean armed = (selected == menu); |
| boolean menuenabled = getBoolean(menu, "enabled", true); |
| paintRect(g, r.x, r.y, bounds.width - 2, r.height, c_border, |
| armed ? c_select : c_bg, false, false, false, false); |
| int tx = r.x; |
| if (itemclass == "checkboxmenuitem") { |
| tx += block + 3; |
| boolean checked = getBoolean(menu, "selected", false); |
| String group = getString(menu, "group", null); |
| g.translate(r.x + 4, r.y + 2); |
| g.setColor(menuenabled ? c_border : c_disable); |
| if (group == null) { |
| g.drawRect(1, 1, block - 3, block - 3); |
| } else { |
| g.drawOval(1, 1, block - 3, block - 3); //java |
| } |
| if (checked) { |
| g.setColor(menuenabled ? c_text : c_disable); |
| if (group == null) { |
| g.fillRect(3, block - 9, 2, 6); |
| g.drawLine(3, block - 4, block - 4, 3); |
| g.drawLine(4, block - 4, block - 4, 4); |
| } else { |
| g.fillOval(5, 5, block - 10, block - 10); //java |
| g.drawOval(4, 4, block - 9, block - 9); //java |
| } |
| } |
| g.translate(-r.x - 4, -r.y - 2); |
| } |
| paintContent(menu, g, clipx, clipy, clipwidth, clipheight, |
| tx + 4, r.y + 2, bounds.width - 10, |
| r.height - 4, menuenabled ? c_text : c_disable, "left", true); |
| if (itemclass == "menu") { |
| paintArrow(g, r.x + bounds.width - block, r.y, block, r.height, 'E'); |
| } |
| } |
| } |
| } |
| //java> |
| else if ("bean" == classname) { |
| g.clipRect(0, 0, bounds.width, bounds.height); |
| ((Component) get(component, "bean")).paint(g); |
| g.setClip(clipx, clipy, clipwidth, clipheight); |
| } |
| //<java |
| else throw new IllegalArgumentException((String) classname); |
| g.translate(-bounds.x, -bounds.y); |
| clipx += bounds.x; clipy += bounds.y; |
| } |
| |
| /** |
| * |
| */ |
| private void paintReverse(Graphics g, |
| int clipx, int clipy, int clipwidth, int clipheight, |
| Object component, boolean enabled) { |
| if (component != null) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| if ((clipx < bounds.x) || |
| (clipx + clipwidth > bounds.x + bounds.width) || |
| (clipy < bounds.y) || |
| (clipy + clipheight > bounds.y + bounds.height)) { |
| paintReverse(g, clipx, clipy, clipwidth, clipheight, |
| get(component, ":next"), enabled); |
| } |
| paint(g, clipx, clipy, clipwidth, clipheight, component, enabled); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void paintField(Graphics g, |
| int clipx, int clipy, int clipwidth, int clipheight, Object component, |
| int width, int height, boolean inside, boolean pressed, |
| boolean focus, boolean enabled, boolean hidden, int left) { |
| boolean editable = getBoolean(component, "editable", true); |
| paintRect(g, 0, 0, width, height, enabled ? c_border : c_disable, |
| editable ? c_textbg : c_bg, true, true, true, true); |
| g.clipRect(1 + left, 1, width - left - 2, height - 2); |
| |
| String text = getString(component, "text", ""); |
| int offset = getInteger(component, "offset", 0); |
| FontMetrics fm = g.getFontMetrics(); //java |
| |
| int caret = 0; |
| if (focus) { |
| int start = getInteger(component, "start", 0); |
| int end = getInteger(component, "end", 0); |
| caret = hidden ? (fm.charWidth('*') * end) : |
| fm.stringWidth(text.substring(0, end)); //java |
| //midp font.substringWidth(text, 0, end); |
| if (start != end) { |
| int is = hidden ? (fm.charWidth('*') * start) : |
| fm.stringWidth(text.substring(0, start)); //java |
| //midp font.substringWidth(text, 0, start); |
| g.setColor(c_select); |
| g.fillRect(2 + left - offset + Math.min(is, caret), 1, |
| Math.abs(caret - is), height - 2); |
| } |
| } |
| |
| if (focus) { |
| g.setColor(c_focus); |
| g.fillRect(1 + left - offset + caret, 1, 1, height - 2); |
| } |
| |
| g.setColor(enabled ? c_text : c_disable); |
| int fx = 2 + left - offset; |
| int fy = (height + fm.getAscent() - fm.getDescent()) / 2; //java |
| //midp int fy = (height - font.getHeight()) / 2; |
| if (hidden) { |
| int fh = fm.charWidth('*'); |
| for (int i = text.length(); i > 0; i--) { |
| g.drawString("*", fx, fy); //java |
| //midp g.drawChar('*', fx, fy, Graphics.LEFT | Graphics.TOP); |
| fx += fh; |
| } |
| } else { |
| g.drawString(text, fx, fy); //java |
| //midp g.drawString(text, fx, fy, Graphics.LEFT | Graphics.TOP); |
| } |
| g.setClip(clipx, clipy, clipwidth, clipheight); |
| } |
| |
| /** |
| * |
| */ |
| private boolean paintScrollPane(Graphics g, |
| int clipx, int clipy, int clipwidth, int clipheight, Rectangle bounds, |
| Rectangle view, Rectangle viewport, |
| boolean enabled, boolean inside, boolean pressed) { |
| if ((viewport.y + viewport.height < bounds.height) && |
| (clipy + clipheight > viewport.y + viewport.height)) { // need horizontal |
| int x = viewport.x; |
| int y = viewport.y + viewport.height; |
| int height = bounds.height - y; |
| int button = Math.min(block, viewport.width / 2); |
| int track = viewport.width - (2 * button); //max 10 |
| int knob = Math.min(track, Math.max(track * (viewport.width - 2) / view.width, 6)); |
| int decrease = view.x * (track - knob) / |
| (view.width - viewport.width + 2); |
| int increase = track - decrease - knob; |
| paintArrow(g, x, y, button, height, |
| 'W', enabled, inside, pressed, "left", false, true, true, false); |
| paintRect(g, x + button, y, decrease, height, |
| enabled ? c_border : c_disable, c_bg, false, true, true, false); |
| paintRect(g, x + button + decrease, y, knob, height, |
| enabled ? c_border : c_disable, enabled ? c_ctrl : c_bg, false, true, true, true); |
| int n = Math.min(5, (knob - 4) / 3); |
| g.setColor(enabled ? c_border : c_disable); |
| int cx = (x + button + decrease) + (knob + 2 - n * 3) / 2; |
| for (int i = 0; i < n; i++ ) { |
| g.drawLine(cx + i * 3, y + 2, cx + i * 3, y + height - 4); |
| } |
| paintRect(g, x + button + decrease + knob, y, increase, height, |
| enabled ? c_border : c_disable, c_bg, false, false, true, true); |
| paintArrow(g, x + button + track, y, button, height, |
| 'E', enabled, inside, pressed, "right", false, false, true, true); |
| } |
| if ((viewport.x + viewport.width < bounds.width) && |
| (clipx + clipwidth > viewport.x + viewport.width)) { // need vertical |
| int x = viewport.x + viewport.width; |
| int y = viewport.y; |
| int width = bounds.width - x; |
| //if (y > 0) { |
| // paintRect(g, x - 1, 0, width + 1, y, |
| // enabled ? c_border : c_disable, c_bg, false, true, false, false); |
| //} |
| int track = viewport.height - (2 * block); |
| int knob = track * (viewport.height - 2) / view.height; |
| int decrease = view.y * (track - knob) / |
| (view.height - viewport.height + 2); |
| int increase = track - decrease - knob; |
| paintArrow(g, x, y, width, block, |
| 'N', enabled, inside, pressed, "up", true, false, false, true); |
| paintRect(g, x, y + block, width, decrease, |
| enabled ? c_border : c_disable, c_bg, true, false, false, true); |
| paintRect(g, x, y + block + decrease, width, knob, |
| enabled ? c_border : c_disable, enabled ? c_ctrl : c_bg, true, false, true, true); |
| int n = Math.min(5, (knob - 4) / 3); |
| g.setColor(enabled ? c_border : c_disable); |
| int cy = (y + block + decrease) + (knob + 2 - n * 3) / 2; |
| for (int i = 0; i < n; i++ ) { |
| g.drawLine(x + 2, cy + i * 3, x + width - 4, cy + i * 3); |
| } |
| paintRect(g, x, y + block + decrease + knob, width, increase, |
| enabled ? c_border : c_disable, c_bg, false, false, true, true); |
| paintArrow(g, x, y + block + track, width, block, |
| 'S', enabled, inside, pressed, "down", false, false, true, true); |
| } |
| if ((clipx + clipwidth > viewport.x) && (clipy + clipheight > viewport.y) && |
| (clipx < viewport.x + viewport.width) && (clipy < viewport.y + viewport.height)) { |
| g.clipRect(viewport.x + 1, viewport.y + 1, viewport.width - 2, viewport.height - 2); |
| g.translate(viewport.x + 1 - view.x, viewport.y + 1 - view.y); |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * |
| */ |
| private void resetScrollPane(Graphics g, |
| int clipx, int clipy, int clipwidth, int clipheight, |
| Rectangle view, Rectangle viewport) { |
| g.translate(view.x - viewport.x - 1, view.y - viewport.y - 1); |
| g.setClip(clipx, clipy, clipwidth, clipheight); |
| } |
| |
| /** |
| * |
| */ |
| private void paintRect(Graphics g, int x, int y, int width, int height, |
| Color border, Color bg, |
| boolean top, boolean left, boolean bottom, boolean right) { |
| if ((width <= 0) || (height <= 0)) return; |
| g.setColor(border); |
| if (top) { |
| g.drawLine(x + width - 1, y, x, y); |
| y++; height--; if (height <= 0) return; |
| } |
| if (left) { |
| g.drawLine(x, y, x, y + height - 1); |
| x++; width--; if (width <= 0) return; |
| } |
| if (bottom) { |
| g.drawLine(x, y + height - 1, x + width - 1, y + height - 1); |
| height--; if (height <= 0) return; |
| } |
| if (right) { |
| g.drawLine(x + width - 1, y + height - 1, x + width - 1, y); |
| width--; if (width <= 0) return; |
| } |
| |
| //java> |
| if (bg == c_ctrl) { |
| if (height > block) { |
| g.setColor(c_bg); |
| g.fillRect(x, y, width, height - block); |
| } |
| for (int i = 0; i < width; i += block) { |
| g.drawImage(gradient, x + i, (height > block) ? (y + height - block) : y, |
| x + Math.min(i + block, width), y + height, |
| 0, 0, Math.min(block, width - i), Math.min(block, height), null); |
| } |
| /*if (width > block) { |
| g.setColor(c_bg); |
| g.fillRect(x, y, width - block, height); |
| } |
| for (int i = 0; i < height; i += block) { |
| g.drawImage(gradient, (width > block) ? (x + width - block) : x, y + i, |
| x + width, y + Math.min(i + block, height), |
| 0, 0, Math.min(block, width), Math.min(block, height - i), null); |
| }*/ |
| } |
| else { |
| g.setColor(bg); |
| g.fillRect(x, y, width, height); |
| } |
| //<java |
| //midp g.setColor(bg); |
| //midp g.fillRect(x, y, width, height); |
| } |
| |
| /** |
| * |
| */ |
| private void paintArrow(Graphics g, int x, int y, int width, int height, |
| char dir, boolean enabled, boolean inside, boolean pressed, String part, |
| boolean top, boolean left, boolean bottom, boolean right) { |
| inside = inside && (insidepart == part); |
| pressed = pressed && (pressedpart == part); |
| paintRect(g, x, y, width, height, enabled ? c_border : c_disable, |
| enabled ? ((inside != pressed) ? c_hover : |
| (pressed ? c_press : c_ctrl)) : c_bg, |
| top, left, bottom, right); |
| g.setColor(enabled ? c_text : c_disable); |
| paintArrow(g, x, y, width, height, dir); |
| } |
| |
| /** |
| * |
| */ |
| private void paintArrow(Graphics g, |
| int x, int y, int width, int height, char dir) { |
| int cx = x + width / 2 - 2; |
| int cy = y + height / 2 - 2; |
| for (int i = 0; i < 4; i++) { |
| if (dir == 'N') { // north |
| g.drawLine(cx + 1 - i, cy + i, cx + 1/*2*/ + i, cy + i); |
| } |
| else if (dir == 'W') { // west |
| g.drawLine(cx + i, cy + 1 - i, cx + i, cy + 1/*2*/ + i); |
| } |
| else if (dir == 'S') { // south |
| g.drawLine(cx + 1 - i, cy + 4 - i, cx + 1/*2*/ + i, cy + 4 - i); |
| } |
| else { // east |
| g.drawLine(cx + 4 - i, cy + 1 - i, cx + 4 - i, cy + 1/*2*/ + i); |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void paintContent(Object component, Graphics g, |
| int clipx, int clipy, int clipwidth, int clipheight, |
| int x, int y, int width, int height, Color fg, String defaultalignment, |
| boolean checkmnemonic) { |
| String text = getString(component, "text", null); |
| Image icon = getIcon(component, "icon", null); |
| if ((text == null) && (icon == null)) { return; } |
| String alignment = getString(component, "alignment", defaultalignment); |
| |
| FontMetrics fm = null; //java |
| int tw = 0, th = 0; |
| int ta = 0; //java |
| if (text != null) { |
| fm = g.getFontMetrics(); //java |
| tw = fm.stringWidth(text); |
| ta = fm.getAscent(); //java |
| th = fm.getDescent() + ta; //java |
| //midp th = font.getHeight(); |
| g.setColor(fg); |
| } |
| int iw = 0, ih = 0; |
| if (icon != null) { |
| iw = icon.getWidth(this); |
| ih = icon.getHeight(this); //java |
| } |
| |
| boolean clipped = (tw + iw > width) || (th > height) || (ih > height); |
| int cx = x; |
| if ("center" == alignment) { cx += (width - tw - iw) / 2; } |
| else if ("right" == alignment) { cx += width - tw - iw; } |
| |
| if (clipped) { g.clipRect(x, y, width, height); } |
| if (icon != null) { |
| g.drawImage(icon, cx, y + (height - ih) / 2, this); //java |
| //midp g.drawImage(icon, cx, y + height / 2, Graphics.LEFT | Graphics.VCENTER); |
| cx += iw; |
| } |
| if (text != null) { |
| int ty = y + (height - th) / 2 + ta; //java |
| g.drawString(text, cx, ty); //java |
| //midp g.drawString(text, cx, y + (height - th) / 2, Graphics.LEFT | Graphics.TOP); |
| if (checkmnemonic) { |
| int mnemonic = getInteger(component, "mnemonic", -1); |
| if ((mnemonic != -1) && (mnemonic < text.length())) { |
| int mx = cx + fm.stringWidth(text.substring(0, mnemonic)); //java |
| //midp int mx = cx + font.substringWidth(text, 0, mnemonic); |
| //midp int ty = (height + th) / 2; |
| g.drawLine(mx, ty + 1, mx + fm.charWidth(text.charAt(mnemonic)), ty + 1); |
| } |
| } |
| } |
| if (clipped) { g.setClip(clipx, clipy, clipwidth, clipheight); } |
| } |
| //midp private void setTimer(long delay) {} |
| //java> |
| |
| /** |
| * |
| */ |
| public synchronized void run() { |
| while (timer == Thread.currentThread()) { |
| try { |
| if (watch == 0) { |
| wait(0); |
| } else { |
| long current = System.currentTimeMillis(); |
| if (watch > current) { |
| wait(watch - current); |
| } else { |
| watch = 0; |
| if ((watchdelay == 300L) || (watchdelay == 60L)) { |
| if (processScroll(mousepressed, pressedpart)) { setTimer(60L); } |
| } else if ((watchdelay == 375L) || (watchdelay == 75L)) { |
| if (processSpin(mousepressed, pressedpart)) { setTimer(75L); } |
| } else if (watchdelay == 750L) { |
| //System.out.println("> tip: " + getClass(mouseinside) + " : " + ((insidepart instanceof Object[]) ? getClass(insidepart) : insidepart)); |
| showTip(); |
| } |
| } |
| } |
| } catch (InterruptedException ie) {} //ie.printStackTrace(); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void setTimer(long delay) { |
| watchdelay = delay; |
| if (delay == 0) { |
| watch = 0; |
| } else { |
| long prev = watch; |
| watch = System.currentTimeMillis() + delay; |
| if (timer == null) { |
| timer = new Thread(this); |
| timer.setPriority(Thread.MIN_PRIORITY); |
| timer.setDaemon(true); |
| timer.start(); |
| } |
| if ((prev == 0) || (watch < prev)) { |
| synchronized (this) { notify(); } //try {}catch (IllegalMonitorStateException imse) {} |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| public boolean isFocusTraversable() { |
| return true; |
| } |
| |
| //<java |
| /*midp |
| private static final int MOUSE_ENTERED = 1; |
| private static final int MOUSE_EXITED = 2; // |
| private static final int MOUSE_PRESSED = 3; |
| private static final int MOUSE_DRAGGED = 4; |
| private static final int MOUSE_RELEASED = 5; |
| private static final int DRAG_ENTERED = 6; |
| private static final int DRAG_EXITED = 7; |
| |
| protected void pointerPressed(int x, int y) { |
| findComponent(content, x, y); |
| if (popupowner != null) { |
| String classname = getClass(mouseinside); |
| if ((popupowner != mouseinside) && |
| (classname != "popupmenu") && (classname != "combolist")) { |
| closeup(); |
| } |
| } |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); |
| mousepressed = mouseinside; |
| pressedpart = insidepart; |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_PRESSED, mousepressed, pressedpart); |
| } |
| |
| protected void pointerReleased(int x, int y) { |
| Object mouserelease = mousepressed; |
| Object releasepart = pressedpart; |
| mousepressed = pressedpart = null; |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_RELEASED, mouserelease, releasepart); |
| } |
| |
| protected void pointerDragged(int x, int y) { |
| Object previnside = mouseinside; |
| Object prevpart = insidepart; |
| findComponent(content, x, y); |
| boolean same = (previnside == mouseinside) && (prevpart == insidepart); |
| boolean isin = (mousepressed == mouseinside) && (pressedpart == insidepart); |
| boolean wasin = (mousepressed == previnside) && (pressedpart == prevpart); |
| |
| if (wasin && !isin) { |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_EXITED, mousepressed, pressedpart); |
| } |
| else if (!same && (popupowner != null) && !wasin) { |
| handleMouseEvent(x, y, 1, false, false, false, |
| DRAG_EXITED, previnside, prevpart); |
| } |
| if (isin && !wasin) { |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_ENTERED, mousepressed, pressedpart); |
| } |
| else if (!same && (popupowner != null) && !isin) { |
| handleMouseEvent(x, y, 1, false, false, false, |
| DRAG_ENTERED, mouseinside, insidepart); |
| } |
| if (isin == wasin) { |
| handleMouseEvent(x, y, 1, false, false, false, |
| MouseEvent.MOUSE_DRAGGED, mousepressed, pressedpart); |
| } |
| } |
| |
| protected void keyPressed(int keyCode) { |
| if ((popupowner != null) || (focusowner != null)) { |
| hideTip(); |
| if (keyCode > 0) { |
| processKeyPress((popupowner != null) ? popupowner : focusowner, |
| false, false, 1, keyCode, 0); |
| } |
| else { |
| int keychar = 0, key = 0; |
| switch (getGameAction(keyCode)) { |
| case UP: key = KeyEvent.VK_UP; break; |
| case LEFT: key = KeyEvent.VK_LEFT; break; |
| case DOWN: key = KeyEvent.VK_DOWN; break; |
| case RIGHT: key = KeyEvent.VK_RIGHT; break; |
| case FIRE: key = KeyEvent.VK_ENTER; keychar = KeyEvent.VK_SPACE; break; |
| case GAME_A: key = KeyEvent.VK_ESCAPE; break; |
| } |
| if (key != 0) { |
| processKeyPress((popupowner != null) ? popupowner : focusowner, |
| false, false, 1, keychar, key); |
| } |
| //if (keyCode == getKeyCode(LEFT)) { |
| } |
| } |
| } |
| |
| protected void keyRepeated(int keyCode) { |
| keyPressed(keyCode); |
| } |
| |
| private static final Command nextcommand = new Command("Next", Command.SCREEN, 0); |
| //private static final Command prevcommand = new Command("Previous", Command.SCREEN, 0); |
| { |
| addCommand(nextcommand); |
| //addCommand(prevcommand); |
| setCommandListener(this); |
| } |
| |
| public void commandAction(Command command, Displayable displayable) { |
| if (command == nextcommand) { |
| setNextFocusable(focusowner, false); |
| repaint(focusowner); |
| closeup(); |
| } |
| //else if (command == prevcommand) { |
| //setPreviousFocusable(focusowner, null, true, true, false); |
| //repaint(focusowner); |
| //closeup(); |
| //} |
| } |
| midp*/ |
| //java> |
| |
| /** |
| * |
| */ |
| protected void processEvent(AWTEvent e) { |
| int id = e.getID(); |
| if ((id >= MouseEvent.MOUSE_FIRST) && (id <= MouseEvent.MOUSE_LAST)) { |
| MouseEvent me = (MouseEvent) e; |
| int x = me.getX(); |
| int y = me.getY(); |
| int clickcount = me.getClickCount(); |
| boolean shiftdown = me.isShiftDown(); |
| boolean controldown = me.isControlDown(); |
| boolean popuptrigger = me.isPopupTrigger(); |
| if (id == MouseEvent.MOUSE_ENTERED) { |
| if (mousepressed == null) { |
| findComponent(content, x, y); |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_MOVED) { |
| Object previnside = mouseinside; |
| Object prevpart = insidepart; |
| findComponent(content, x, y); |
| if ((previnside == mouseinside) && (prevpart == insidepart)) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_MOVED, mouseinside, insidepart); |
| } |
| else { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_EXITED, previnside, prevpart); |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_EXITED) { |
| if (mousepressed == null) { |
| Object mouseexit = mouseinside; |
| Object exitpart = insidepart; |
| mouseinside = insidepart = null; |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_EXITED, mouseexit, exitpart); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_PRESSED) { |
| if (popupowner != null) { |
| String classname = getClass(mouseinside); |
| if ((popupowner != mouseinside) && |
| (classname != "popupmenu") && (classname != "combolist")) { |
| closeup(); |
| } |
| } |
| mousepressed = mouseinside; |
| pressedpart = insidepart; |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_PRESSED, mousepressed, pressedpart); |
| } |
| else if (id == MouseEvent.MOUSE_DRAGGED) { |
| Object previnside = mouseinside; |
| Object prevpart = insidepart; |
| findComponent(content, x, y); |
| boolean same = (previnside == mouseinside) && (prevpart == insidepart); |
| boolean isin = (mousepressed == mouseinside) && (pressedpart == insidepart); |
| boolean wasin = (mousepressed == previnside) && (pressedpart == prevpart); |
| |
| if (wasin && !isin) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_EXITED, mousepressed, pressedpart); |
| } |
| else if (!same && (popupowner != null) && !wasin) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| DRAG_EXITED, previnside, prevpart); |
| } |
| if (isin && !wasin) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_ENTERED, mousepressed, pressedpart); |
| } |
| else if (!same && (popupowner != null) && !isin) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| DRAG_ENTERED, mouseinside, insidepart); |
| } |
| if (isin == wasin) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_DRAGGED, mousepressed, pressedpart); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| Object mouserelease = mousepressed; |
| Object releasepart = pressedpart; |
| mousepressed = pressedpart = null; |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_RELEASED, mouserelease, releasepart); |
| if ((mouseinside != null) && |
| ((mouserelease != mouseinside) || (releasepart != insidepart))) { |
| handleMouseEvent(x, y, clickcount, shiftdown, controldown, popuptrigger, |
| MouseEvent.MOUSE_ENTERED, mouseinside, insidepart); |
| } |
| } |
| } |
| else if (id == MOUSE_WHEEL) { |
| Rectangle port = getRectangle(mouseinside, ":port"); |
| if (port != null) { // is scrollable |
| Rectangle bounds = getRectangle(mouseinside, "bounds"); |
| try { // mouse wheel is supported since 1.4 thus it use reflection |
| if (wheelrotation == null) { |
| wheelrotation = e.getClass().getMethod("getWheelRotation", null); |
| } |
| int rotation = ((Integer) wheelrotation.invoke(e, null)).intValue(); |
| |
| if (port.x + port.width < bounds.width) { // has vertical scrollbar |
| processScroll(mouseinside, (rotation > 0) ? "down" : "up"); |
| } |
| else if (port.y + port.height < bounds.height) { // has horizontal scrollbar |
| processScroll(mouseinside, (rotation > 0) ? "right" : "left"); |
| } |
| } catch (Exception exc) { /* never */ } |
| } |
| } |
| else if ((id == KeyEvent.KEY_PRESSED) || (id == KeyEvent.KEY_TYPED)) { |
| if (focusinside && ((popupowner != null) || (focusowner != null))) { |
| hideTip(); |
| KeyEvent ke = (KeyEvent) e; |
| int keychar = ke.getKeyChar(); |
| boolean control = (keychar <= 0x1f) || |
| ((keychar >= 0x7f) && (keychar <= 0x9f)) || |
| (keychar >= 0xffff) || ke.isControlDown(); |
| if (control == (id == KeyEvent.KEY_PRESSED)) { |
| int keycode = control ? ke.getKeyCode() : 0; |
| if (!processKeyPress((popupowner != null) ? popupowner : focusowner, |
| ke.isShiftDown(), ke.isControlDown(), ke.getModifiers(), |
| control ? 0 : keychar, keycode)) { |
| if ((keycode == KeyEvent.VK_TAB) || |
| ((keycode == KeyEvent.VK_F6) && (ke.isAltDown() || ke.isControlDown()))) { |
| boolean outgo = (keycode == KeyEvent.VK_F6); |
| if (!ke.isShiftDown() ? setNextFocusable(focusowner, outgo) : |
| setPreviousFocusable(focusowner, outgo)) { |
| ke.consume(); |
| } else if (MOUSE_WHEEL != 0) { // 1.4 |
| if (!ke.isShiftDown()) { |
| transferFocus(); |
| } |
| else { try { |
| getClass().getMethod("transferFocusBackward", null). invoke(this, null); |
| } catch (Exception exc) { /* never */ } } |
| } |
| repaint(focusowner); |
| closeup(); |
| } |
| else if (keycode == KeyEvent.VK_F8) { |
| for (Object splitpane = focusowner; |
| splitpane != null; splitpane = getParent(splitpane)) { |
| if (getClass(splitpane) == "splitpane") { |
| setFocus(splitpane); repaint(splitpane); break; //middle |
| } |
| } |
| } |
| } |
| else ke.consume(); |
| /*else if (keycode == KeyEvent.VK_F10) { |
| Object menubar = null; // find("class", "menubar") |
| if ((menubar != null) && (get(menubar, "selected") == null)) { |
| set(menubar, "selected", getMenu(menubar, null, true, false)); |
| Object popup = popup(menubar, "menubar"); |
| set(popup, "selected", getMenu(popup, null, true, true)); |
| repaint(menubar); // , selected |
| } |
| }*/ |
| } |
| } |
| } |
| /*else if (id == KeyEvent.KEY_RELEASED) { |
| if (focusinside && (focusowner != null)) { |
| KeyEvent ke = (KeyEvent) e; |
| //pressedkey = 0; |
| processKeyRelease(focusowner, ke, ke.getKeyCode()); |
| } |
| }*/ |
| else if (id == FocusEvent.FOCUS_LOST) { |
| focusinside = false; |
| if (focusowner != null) { repaint(focusowner); } |
| closeup(); |
| } |
| else if (id == FocusEvent.FOCUS_GAINED) { |
| focusinside = true; |
| if (focusowner == null) { setFocus(content); } |
| else { repaint(focusowner); } |
| } |
| else if ((id == ComponentEvent.COMPONENT_RESIZED) || |
| (id == ComponentEvent.COMPONENT_SHOWN)) { |
| Dimension d = getSize(); |
| //System.out.println(id + ": " + d.width + ", " + d.height); |
| setRectangle(content, "bounds", 0, 0, d.width, d.height); |
| validate(content); |
| closeup(); |
| if (!focusinside) { requestFocus(); } |
| } |
| } |
| |
| /** |
| * |
| */ |
| /*private boolean processKeyPress(Object component, |
| KeyEvent e, int keycode, Object invoker) { |
| if (processKeyPress(component, e, keycode)) { return true; } |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if ((comp != invoker) && processKeyPress(comp, e, keycode, null)) { |
| return true; |
| } |
| } |
| if ((invoker != null) && (component != content)) { |
| Object parent = getParent(component); |
| if (parent != null) { |
| return processKeyPress(parent, e, keycode, component); |
| } |
| } |
| return false; |
| }*/ |
| //<java |
| |
| /** |
| * |
| */ |
| private boolean processKeyPress(Object component, |
| boolean shiftdown, boolean controldown, int modifiers, int keychar, int keycode) { |
| String classname = getClass(component); |
| if ("button" == classname) { |
| if (keychar == KeyEvent.VK_SPACE || |
| ((keycode == KeyEvent.VK_ENTER) && |
| (getString(component, "type", null) == "default")) || |
| ((keycode == KeyEvent.VK_ESCAPE) && //... |
| (getString(component, "type", null) == "cancel"))) { |
| //pressedkey = keychar; |
| invoke(component, "action"); |
| repaint(component); |
| return true; |
| } |
| } |
| else if ("checkbox" == classname) { |
| if (keychar == KeyEvent.VK_SPACE) { |
| changeCheck(component, true); |
| repaint(component); |
| return true; |
| } |
| } |
| else if ("combobox" == classname) { |
| Object combolist = get(component, "combolist"); |
| if (combolist == null) { |
| if (getBoolean(component, "editable", true) && |
| processField(component, shiftdown, controldown, modifiers, |
| keychar, keycode, false, false)) { |
| setInteger(component, "selected", -1, -1); |
| return true; |
| } |
| if ((keychar == KeyEvent.VK_SPACE) || (keycode == KeyEvent.VK_DOWN)) { |
| combolist = popup(component, classname); |
| int selected = getInteger(component, "selected", -1); |
| set(combolist, "inside", (selected != -1) ? |
| getItemImpl(component, "choice", selected) : |
| get(component, "choice")); //scroll to it! |
| } |
| else return false; |
| } else { |
| if ((keycode == KeyEvent.VK_UP) || |
| (keycode == KeyEvent.VK_DOWN) || (keycode == KeyEvent.VK_PAGE_UP) || |
| (keycode == KeyEvent.VK_PAGE_DOWN) || |
| (keycode == KeyEvent.VK_HOME) || (keycode == KeyEvent.VK_END)) { |
| Object selected = get(combolist, "inside"); |
| Object next = getListItem(component, combolist, |
| keycode, selected, "choice", null); |
| if (next != null) { |
| set(combolist, "inside", next); |
| Rectangle r = getRectangle(next, "bounds"); |
| scrollToVisible(combolist, r.x, r.y, 0, r.height); |
| if (selected != null) { repaint(combolist, "combolist", selected); } |
| repaint(combolist, "combolist", next); |
| } |
| } |
| else if ((keycode == KeyEvent.VK_ENTER) || (keychar == KeyEvent.VK_SPACE)) { |
| closeup(component, combolist, get(combolist, "inside")); //Alt+Up |
| } |
| else if (keycode == KeyEvent.VK_ESCAPE) { |
| closeup(component, combolist, null); |
| } |
| else return processField(component, shiftdown, controldown, modifiers, |
| keychar, keycode, false, false); |
| } |
| return true; |
| } |
| else if (("textfield" == classname) || ("passwordfield" == classname)) { |
| return processField(component, shiftdown, controldown, modifiers, |
| keychar, keycode, false, ("passwordfield" == classname)); |
| } |
| else if ("textarea" == classname) { |
| String text = getString(component, "text", ""); |
| int start = getInteger(component, "start", 0); |
| int end = getInteger(component, "end", 0); |
| |
| int istart = start; |
| int iend = end; |
| String insert = null; |
| if ((keycode == KeyEvent.VK_HOME) && !controldown) { |
| while ((iend > 0) && (text.charAt(iend - 1) != '\n')) { iend--; } |
| if (!shiftdown) { istart = iend; } |
| } |
| else if ((keycode == KeyEvent.VK_END) && !controldown) { |
| iend = text.indexOf('\n', end); |
| if (iend == -1) { iend = text.length(); } |
| if (!shiftdown) { istart = iend; } |
| } |
| else if ((keycode == KeyEvent.VK_UP) || |
| (keycode == KeyEvent.VK_PAGE_UP)) { |
| int prev = end; |
| while ((prev > 0) && (text.charAt(prev - 1) != '\n')) { prev--; } |
| if (prev != 0) { |
| int dx = end - prev; |
| int lines = (keycode == KeyEvent.VK_PAGE_UP) ? |
| (getRectangle(component, ":port").height / |
| getFontMetrics(getFont()).getHeight()) : 1; |
| int first = prev; |
| do { |
| prev = first; first--; lines--; |
| while ((first > 0) && (text.charAt(first - 1) != '\n')) { first--; } |
| } while ((first > 0) && (lines > 0)); |
| iend = Math.min(first + dx, prev - 1); |
| if (!shiftdown) { istart = iend; } |
| } |
| } |
| else if ((keycode == KeyEvent.VK_DOWN) || |
| (keycode == KeyEvent.VK_PAGE_DOWN)) { |
| int next = text.indexOf('\n', end); |
| if (next != -1) { |
| int prev = end; |
| while ((prev > 0) && (text.charAt(prev - 1) != '\n')) { prev--; } |
| if (keycode == KeyEvent.VK_PAGE_DOWN) { |
| int lines = getRectangle(component, ":port").height / |
| getFontMetrics(getFont()).getHeight(); |
| for (int more = 0; (lines > 1) && |
| ((more = text.indexOf('\n', next + 1)) != -1); next = more) { |
| lines--; |
| } |
| } |
| int last = text.indexOf('\n', next + 1); |
| iend = Math.min(next + 1 + end - prev, |
| (last == -1) ? (text.length() + 1) : last); |
| if (!shiftdown) { istart = iend; } |
| } |
| } |
| return changeField(component, text, insert, istart, iend, start, end) ? |
| true : processField(component, shiftdown, controldown, modifiers, |
| keychar, keycode, true, false); |
| } |
| else if ("tabbedpane" == classname) { |
| if ((keycode == KeyEvent.VK_RIGHT) || (keycode == KeyEvent.VK_DOWN) || |
| (keycode == KeyEvent.VK_LEFT) || (keycode == KeyEvent.VK_UP)) { |
| int selected = getInteger(component, "selected", 0); |
| boolean increase = (keycode == KeyEvent.VK_RIGHT) || (keycode == KeyEvent.VK_DOWN); |
| int newvalue = selected; |
| int n = increase ? getItemCountImpl(component, "tab") : 0; |
| int d = (increase ? 1 : -1); |
| for (int i = selected + d; increase ? (i < n) : (i >= 0); i += d) { |
| if (getBoolean(getItemImpl(component, "tab", i), "enabled", true)) { |
| newvalue = i; break; |
| } |
| } |
| if (newvalue != selected) { |
| setInteger(component, "selected", newvalue, 0); |
| repaint(component); |
| invoke(component, "action"); |
| } |
| } |
| } |
| else if ("spinbox" == classname) { |
| if ((keycode == KeyEvent.VK_UP) || (keycode == KeyEvent.VK_DOWN)) { |
| processSpin(component, (keycode == KeyEvent.VK_UP)? "up" : "down"); |
| return true; |
| } |
| return processField(component, shiftdown, controldown, modifiers, |
| keychar, keycode, false, false); |
| } |
| else if ("slider" == classname) { |
| int value = getInteger(component, "value", 0); |
| int d = 0; |
| if ((keycode == KeyEvent.VK_HOME) || (keycode == KeyEvent.VK_LEFT) || |
| (keycode == KeyEvent.VK_UP) || (keycode == KeyEvent.VK_PAGE_UP)) { |
| d = getInteger(component, "minimum", 0) - value; |
| if ((keycode == KeyEvent.VK_LEFT) || (keycode == KeyEvent.VK_UP)) { |
| d = Math.max(d, -getInteger(component, "unit", 5)); |
| } |
| else if (keycode == KeyEvent.VK_PAGE_UP) { |
| d = Math.max(d, -getInteger(component, "block", 25)); |
| } |
| } |
| else if ((keycode == KeyEvent.VK_END) || (keycode == KeyEvent.VK_RIGHT) || |
| (keycode == KeyEvent.VK_DOWN) || (keycode == KeyEvent.VK_PAGE_DOWN)) { |
| d = getInteger(component, "maximum", 100) - value; |
| if ((keycode == KeyEvent.VK_RIGHT) || (keycode == KeyEvent.VK_DOWN)) { |
| d = Math.min(d, getInteger(component, "unit", 5)); |
| } |
| else if (keycode == KeyEvent.VK_PAGE_DOWN) { |
| d = Math.min(d, getInteger(component, "block", 25)); |
| } |
| } |
| if (d != 0) { |
| setInteger(component, "value", value + d, 0); |
| repaint(component); |
| invoke(component, "action"); |
| } |
| } |
| else if ("splitpane" == classname) { |
| int divider = getInteger(component, "divider", -1); |
| int d = 0; |
| if (keycode == KeyEvent.VK_HOME) { |
| d = -divider; |
| } |
| else if ((keycode == KeyEvent.VK_LEFT) || (keycode == KeyEvent.VK_UP)) { |
| d = Math.max(-10, -divider); |
| } |
| else if ((keycode == KeyEvent.VK_END) || |
| (keycode == KeyEvent.VK_RIGHT) || (keycode == KeyEvent.VK_DOWN)) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| Rectangle bounds = getRectangle(component, "bounds"); |
| int max = (horizontal ? bounds.width : bounds.height) - 5; |
| d = max - divider; |
| if (keycode != KeyEvent.VK_END) { |
| d = Math.min(d, 10); |
| } |
| } |
| if (d != 0) { |
| setInteger(component, "divider", divider + d, -1); |
| validate(component); |
| } |
| } |
| else if ("list" == classname) { |
| return processList(component, shiftdown, controldown, keychar, keycode, "item", null); |
| } |
| else if ("table" == classname) { |
| return processList(component, shiftdown, controldown, keychar, keycode, "row", null); |
| } |
| else if ("tree" == classname) { |
| //? clear childs' selection, select this is its subnode was selected |
| if (keycode == KeyEvent.VK_LEFT) { |
| Object lead = get(component, "lead"); |
| if ((get(lead, "node") != null) && getBoolean(lead, "expanded", true)) { |
| setBoolean(lead, "expanded", false, true); |
| selectItem(component, lead, "node", "node"); |
| validate(component); |
| invoke(component, "collapse"); //lead |
| return true; |
| } |
| else { |
| Object parent = getParent(lead); |
| if (parent != component) { |
| selectItem(component, parent, "node", "node"); |
| setLead(component, lead, parent); |
| return true; |
| } |
| } |
| } |
| //? for interval mode select its all subnode or deselect all after |
| else if (keycode == KeyEvent.VK_RIGHT) { |
| Object lead = get(component, "lead"); |
| Object node = get(lead, "node"); |
| if (node != null) { |
| if (getBoolean(lead, "expanded", true)) { |
| selectItem(component, node, "node", "node"); |
| setLead(component, lead, node); |
| } |
| else { |
| setBoolean(lead, "expanded", true, true); |
| selectItem(component, lead, "node", "node"); |
| validate(component); |
| invoke(component, "expand"); //lead |
| } |
| return true; |
| } |
| } |
| return processList(component, shiftdown, controldown, keychar, keycode, "node", "node"); |
| } |
| else if ("menubar" == classname) { |
| Object previous = null; Object last = null; |
| for (Object i = get(component, "popupmenu"); |
| i != null; i = get(i, "popupmenu")) { |
| previous = last; last = i; |
| } |
| Object selected = get(last, "selected"); |
| Object hotpopup = ((selected != null) || (previous == null)) ? |
| last : previous; |
| if ((selected == null) && (previous != null)) { |
| selected = get(previous, "selected"); |
| } |
| |
| if ((keycode == KeyEvent.VK_UP) || (keycode == KeyEvent.VK_DOWN)) { |
| set(hotpopup, "selected", null); |
| popup(hotpopup, "popupmenu"); |
| selected = getMenu(hotpopup, |
| selected, keycode == KeyEvent.VK_DOWN, true); |
| set(hotpopup, "selected", selected); |
| repaint(hotpopup); |
| } |
| else if (keycode == KeyEvent.VK_LEFT) { |
| if (previous != null) { |
| selected = get(previous, "selected"); |
| set(previous, "selected", null); |
| popup(previous, "popupmenu"); |
| set(previous, "selected", selected); |
| repaint(previous); // , selected |
| } |
| else { |
| selected = getMenu(component, get(component, "selected"), false, false); |
| set(component, "selected", selected); |
| Object popup = popup(component, "menubar"); |
| set(popup, "selected", getMenu(popup, null, true, true)); |
| repaint(component); // , selected |
| } |
| } |
| else if (keycode == KeyEvent.VK_RIGHT) { |
| if ((previous != null) && (selected == null)) { |
| set(last, "selected", get(get(last, "menu"), "menu")); |
| repaint(last); // , selected |
| } |
| else if ((selected != null) && (getClass(selected) == "menu")) { |
| Object popup = popup(last, "popupmenu"); |
| set(popup, "selected", get(get(popup, "menu"), "menu")); |
| } |
| else { |
| selected = getMenu(component, get(component, "selected"), true, false); |
| set(component, "selected", selected); |
| Object popup = popup(component, "menubar"); |
| set(popup, "selected", getMenu(popup, null, true, true)); |
| repaint(component); // , selected |
| } |
| } |
| else if ((keycode == KeyEvent.VK_ENTER) || |
| (keychar == KeyEvent.VK_SPACE) || (keycode == KeyEvent.VK_ESCAPE)) { |
| if ((keycode != KeyEvent.VK_ESCAPE) && |
| getBoolean(selected, "enabled", true)) { |
| if ((selected != null) && (getClass(selected) == "checkboxmenuitem")) { |
| changeCheck(selected, false); |
| } |
| else invoke(selected, "action"); |
| } |
| closeup(component); |
| } |
| else return false; |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * |
| */ |
| private boolean changeCheck(Object component, boolean box) { |
| String group = getString(component, "group", null); |
| if (group != null) { |
| if (getBoolean(component, "selected", false)) { return false; } |
| for (Object comp = get(getParent(component), |
| box ? "component" : "menu"); comp != null; comp = get(comp, ":next")) { |
| if (comp == component) { |
| setBoolean(component, "selected", true); |
| } |
| else if (group.equals(get(comp, "group")) && |
| getBoolean(comp, "selected", false)) { |
| setBoolean(comp, "selected", false); |
| if (box) { repaint(comp); } //checkbox only |
| } |
| } |
| } |
| else { |
| setBoolean(component, "selected", |
| !getBoolean(component, "selected", false), false); |
| } |
| invoke(component, "action"); |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| private Object getMenu(Object component, Object part, |
| boolean forward, boolean popup) { |
| if (forward) { |
| if (part != null) { part = get(part, ":next"); } |
| if (part == null) { |
| part = get(popup ? get(component, "menu") : component, "menu"); |
| } |
| } |
| else { |
| Object prev = get(popup ? get(component, "menu") : component, "menu"); |
| for (Object next = get(prev, ":next"); |
| (next != null) && (next != part); next = get(next, ":next")) { |
| prev = next; |
| } |
| part = prev; |
| } |
| return (getClass(part) == "separator") ? |
| getMenu(component, part, forward, popup) : part; |
| } |
| |
| /** |
| * |
| */ |
| /*private boolean processKeyRelease(Object component, KeyEvent e, int keycode) { |
| return true; |
| }*/ |
| |
| /** |
| * |
| */ |
| private boolean processField(Object component, |
| boolean shiftdown, boolean controldown, int modifiers, |
| int keychar, int keycode, boolean multiline, boolean hidden) { |
| String text = getString(component, "text", ""); |
| int start = getInteger(component, "start", 0); |
| int end = getInteger(component, "end", 0); |
| boolean editable = getBoolean(component, "editable", true); |
| |
| int istart = start; |
| int iend = end; |
| String insert = null; |
| //midp if (editable && (keychar != 0)) { |
| if (editable && (keychar != 0) && //java |
| ((modifiers == 0) || (modifiers == InputEvent.SHIFT_MASK))) { //java |
| insert = String.valueOf((char) keychar); |
| } |
| else if (multiline && editable && (keycode == KeyEvent.VK_ENTER)) { |
| insert = "\n"; |
| } |
| else if (editable && (keycode == KeyEvent.VK_BACK_SPACE)) { |
| insert = ""; |
| if (start == end) { istart -= 1; } |
| } |
| else if (keycode == KeyEvent.VK_END) { |
| iend = text.length(); |
| if (!shiftdown) { istart = iend; } |
| } |
| else if (keycode == KeyEvent.VK_HOME) { |
| iend = 0; |
| if (!shiftdown) { istart = iend; } |
| } |
| else if (keycode == KeyEvent.VK_LEFT) { |
| //java> |
| if (controldown) { |
| for (int i = 0; i < 2; i++) { |
| while ((iend > 0) && ((i != 0) == |
| Character.isLetterOrDigit(text.charAt(iend - 1)))) { iend--; } |
| } |
| } else { |
| iend -= 1; |
| } |
| //<java |
| //midp iend -= 1; |
| if (!shiftdown) { istart = iend; } |
| } |
| else if (keycode == KeyEvent.VK_RIGHT) { |
| //java> |
| if (controldown) { |
| for (int i = 0; i < 2; i++) { |
| while ((iend < text.length()) && ((i == 0) == |
| Character.isLetterOrDigit(text.charAt(iend)))) { iend++; } |
| } |
| } else { |
| iend += 1; |
| } |
| //<java |
| //midp iend += 1; |
| if (!shiftdown) { istart = iend; } |
| } |
| else if (editable && (keycode == KeyEvent.VK_DELETE)) { |
| insert = ""; |
| if (start == end) { iend += 1; } |
| } |
| else if (controldown && |
| ((keycode == KeyEvent.VK_A) || (keycode == 0xBF))) { |
| istart = 0; // KeyEvent.VK_SLASH |
| iend = text.length(); |
| } |
| else if (controldown && (keycode == 0xDC)) { |
| istart = iend = text.length(); // KeyEvent.VK_BACK_SLASH |
| } |
| else if ((editable && !hidden && controldown && (keycode == KeyEvent.VK_X)) || |
| (!hidden && controldown && (keycode == KeyEvent.VK_C))) { |
| if (start != end) { |
| clipboard = text.substring( |
| Math.min(start, end), Math.max(start, end)); |
| //java> |
| try { |
| /* Personal Basis Profile doesn't contain datatransfer package |
| Toolkit toolkit = getToolkit(); |
| Object systemclipboard = toolkit.getClass().getMethod("getSystemClipboard", null).invoke(toolkit, null); |
| Class selectionclass = Class.forName("java.awt.datatransfer." + "StringSelection"); |
| Object selection = selectionclass.getConstructor(new Class[] { String.class }). |
| newInstance(new Object[] { clipboard }); |
| systemclipboard.getClass().getMethod("setContents", new Class[] { |
| Class.forName("java.awt.datatransfer." + "Transferable"), |
| Class.forName("java.awt.datatransfer." + "ClipboardOwner") }). |
| invoke(systemclipboard, new Object[] { selection, null });*/ |
| getToolkit().getSystemClipboard().setContents( |
| new StringSelection(clipboard), null); |
| } catch (Exception exc) {} |
| //<java |
| if (keycode == KeyEvent.VK_X) { insert = ""; } |
| } |
| } |
| else if (editable && controldown && (keycode == KeyEvent.VK_V)) { |
| //java> |
| try { |
| /* no datatransfer package in PBP |
| Toolkit toolkit = getToolkit(); |
| Object systemclipboard = toolkit.getClass().getMethod("getSystemClipboard", null).invoke(toolkit, null); |
| Object contents = systemclipboard.getClass().getMethod("getContents", new Class[] { Object.class }). |
| invoke(systemclipboard, new Object[] { this }); |
| Class dataflavor = Class.forName("java.awt.datatransfer." + "DataFlavor"); |
| insert = (String) (contents.getClass().getMethod("getTransferData", new Class[] { dataflavor }). |
| invoke(contents, new Object[] { dataflavor.getField("stringFlavor").get(null) }));*/ |
| insert = (String) getToolkit().getSystemClipboard(). |
| getContents(this).getTransferData(DataFlavor.stringFlavor); |
| } catch (Exception exc) { |
| insert = clipboard; |
| } |
| //<java |
| //midp insert = clipboard; |
| StringBuffer filtered = new StringBuffer(insert.length()); |
| for (int i = 0; i < insert.length(); i++) { |
| char ckey = insert.charAt(i); |
| if (((ckey > 0x1f) && (ckey < 0x7f)) || |
| ((ckey > 0x9f) && (ckey < 0xffff)) || |
| (multiline && (ckey == '\n'))) { |
| filtered.append(ckey); |
| } |
| } |
| if (filtered.length() != insert.length()) { |
| insert = filtered.toString(); |
| } |
| } |
| return changeField(component, text, insert, istart, iend, start, end); |
| } |
| |
| /** |
| * |
| */ |
| private boolean changeField(Object component, String text, String insert, |
| int movestart, int moveend, int start, int end) { |
| if ((insert == null) && (start == movestart) && (end == moveend)) { |
| return false; |
| } |
| movestart = Math.max(0, Math.min(movestart, text.length())); |
| moveend = Math.max(0, Math.min(moveend, text.length())); |
| if (insert != null) { |
| int min = Math.min(movestart, moveend); |
| set(component, "text", text.substring(0, min) + insert + |
| text.substring(Math.max(movestart, moveend))); |
| movestart = moveend = min + insert.length(); |
| invoke(component, "action"); |
| } |
| if (start != movestart) { setInteger(component, "start", movestart, 0); } |
| if (end != moveend) { setInteger(component, "end", moveend, 0); } |
| if ((insert != null) || (start != movestart) || (end != moveend)) { |
| validate(component); |
| } |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| private boolean processList(Object component, boolean shiftdown, boolean controldown, |
| int keychar, int keycode, String itemname, String leafname) { |
| if ((keycode == KeyEvent.VK_UP) || |
| (keycode == KeyEvent.VK_DOWN) || (keycode == KeyEvent.VK_PAGE_UP) || |
| (keycode == KeyEvent.VK_PAGE_DOWN) || |
| (keycode == KeyEvent.VK_HOME) || (keycode == KeyEvent.VK_END)) { |
| Object lead = get(component, "lead"); |
| Object row = getListItem(component, component, |
| keycode, lead, itemname, leafname); |
| if (row != null) { |
| String selection = getString(component, "selection", "single"); |
| if (shiftdown && (selection != "single") && (lead != null)) { |
| extend(component, lead, row, itemname, leafname); |
| } |
| else if (!controldown) { |
| selectItem(component, row, itemname, leafname); |
| } |
| setLead(component, lead, row); |
| Rectangle r = getRectangle(row, "bounds"); |
| scrollToVisible(component, r.x, r.y, 0, r.height - 1); |
| return true; |
| } |
| } |
| else if (keychar == KeyEvent.VK_SPACE) { |
| select(component, get(component, "lead"), |
| itemname, leafname, shiftdown, controldown); //... |
| return true; |
| } |
| else if (controldown) { |
| if (((keycode == KeyEvent.VK_A) || (keycode == 0xBF)) && //KeyEvent.VK_SLASH |
| (getString(component, "selection", "single") != "single")) { |
| selectAll(component, true, itemname, leafname); |
| return true; |
| } |
| else if (keycode == 0xDC) { //KeyEvent.VK_BACK_SLASH |
| selectAll(component, false, itemname, leafname); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * |
| */ |
| private Object getListItem(Object component, Object scrollpane, |
| int keycode, Object lead, String itemname, String leafname) { |
| Object row = null; |
| if (keycode == KeyEvent.VK_UP) { |
| for (Object prev = get(component, itemname); prev != lead; |
| prev = getNextItem(component, prev, leafname)) { |
| row = prev; // component -> getParent(lead) |
| } |
| } |
| else if (keycode == KeyEvent.VK_DOWN) { |
| row = (lead == null) ? get(component, itemname) : |
| getNextItem(component, lead, leafname); |
| } |
| else if ((keycode == KeyEvent.VK_PAGE_UP) || |
| (keycode == KeyEvent.VK_PAGE_DOWN)) { |
| Rectangle view = getRectangle(scrollpane, ":view"); |
| Rectangle port = getRectangle(scrollpane, ":port"); |
| Rectangle rl = (lead != null) ? getRectangle(lead, "bounds") : null; |
| int vy = (keycode == KeyEvent.VK_PAGE_UP) ? |
| view.y : (view.y + port.height - 2); |
| if ((keycode == KeyEvent.VK_PAGE_UP) && |
| (rl != null) && (rl.y <= view.y)) { |
| vy -= port.height - 2; |
| } |
| if ((keycode == KeyEvent.VK_PAGE_DOWN) && |
| (rl != null) && (rl.y + rl.height >= view.y + port.height - 2)) { |
| vy += port.height - 2; |
| } |
| for (Object item = get(component, itemname); item != null; |
| item = getNextItem(component, item, leafname)) { |
| Rectangle r = getRectangle(item, "bounds"); |
| if (keycode == KeyEvent.VK_PAGE_UP) { |
| row = item; |
| if (r.y + r.height > vy) { break; } |
| } else { |
| if (r.y > vy) { break; } |
| row = item; |
| } |
| } |
| } |
| else if (keycode == KeyEvent.VK_HOME) { |
| row = get(component, itemname); |
| } |
| else if (keycode == KeyEvent.VK_END) { |
| for (Object last = lead; last != null; |
| last = getNextItem(component, last, leafname)) { |
| row = last; |
| } |
| } |
| return row; |
| } |
| |
| /** |
| * |
| */ |
| private void selectAll(Object component, |
| boolean selected, String itemname, String leafname) { |
| boolean changed = false; |
| for (Object item = get(component, itemname); |
| item != null; item = getNextItem(component, item, leafname)) { |
| if (setBoolean(item, "selected", selected, false)) { |
| repaint(component, null, item); changed = true; |
| } |
| } |
| set(component, "anchor", null); |
| if (changed) {invoke(component, "action"); } |
| } |
| |
| /** |
| * |
| */ |
| private void selectItem(Object component, |
| Object row, String itemname, String leafname) { |
| boolean changed = false; |
| for (Object item = get(component, itemname); |
| item != null; item = getNextItem(component, item, leafname)) { |
| if (setBoolean(item, "selected", (item == row), false)) { |
| repaint(component, null, item); changed = true; |
| } |
| } |
| set(component, "anchor", null); |
| if (changed) { invoke(component, "action"); } |
| } |
| |
| /** |
| * |
| */ |
| private void extend(Object component, Object lead, |
| Object row, String itemname, String leafname) { |
| Object anchor = get(component, "anchor"); |
| if (anchor == null) { set(component, "anchor", anchor = lead); } |
| char select = 'n'; boolean changed = false; |
| for (Object item = get(component, itemname); // anchor - row |
| item != null; item = getNextItem(component, item, leafname)) { |
| if (item == anchor) select = (select == 'n') ? 'y' : 'r'; |
| if (item == row) select = (select == 'n') ? 'y' : 'r'; |
| if (setBoolean(item, "selected", (select != 'n'), false)) { |
| repaint(component, null, item); changed = true; |
| } |
| if (select == 'r') select = 'n'; |
| } |
| if (changed) { invoke(component, "action"); } |
| } |
| |
| /** |
| * |
| */ |
| private void setLead(Object component, Object oldlead, Object lead) { |
| if (oldlead != lead) { //? |
| if (oldlead != null) { repaint(component, null, oldlead); } |
| set(component, "lead", lead); |
| repaint(component, null, lead); |
| } |
| } |
| |
| /*public void repaint(int x, int y, int width, int height) { |
| System.out.println("repaint(" + x + ", " + y + ", " + width + ", " + height + ")"); |
| super.repaint(x, y, width, height); |
| }*/ |
| |
| /** |
| * |
| */ |
| private void handleMouseEvent(int x, int y, int clickcount, |
| boolean shiftdown, boolean controldown, boolean popuptrigger, |
| int id, Object component, Object part) { |
| if (id == MouseEvent.MOUSE_ENTERED) { |
| setTimer(750L); |
| } |
| else if (id == MouseEvent.MOUSE_EXITED) { |
| hideTip(); |
| } |
| if (!getBoolean(component, "enabled", true)) { return; } |
| String classname = getClass(component); |
| if (("button" == classname) || ("checkbox" == classname)) { |
| if ((id == MouseEvent.MOUSE_ENTERED) || |
| (id == MouseEvent.MOUSE_EXITED) || |
| (id == MouseEvent.MOUSE_PRESSED) || |
| (id == MouseEvent.MOUSE_RELEASED)) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| setFocus(component); |
| } |
| else if ((id == MouseEvent.MOUSE_RELEASED) && |
| (mouseinside == component)) { |
| if ("checkbox" == classname) { |
| changeCheck(component, true); |
| } |
| else invoke(component, "action"); |
| } |
| repaint(component); |
| } |
| } |
| else if ("combobox" == classname) { |
| boolean editable = getBoolean(component, "editable", true); |
| if (editable && (part == null)) { |
| Image icon = null; |
| int left = ((id == MouseEvent.MOUSE_PRESSED) && |
| ((icon = getIcon(component, "icon", null)) != null)) ? |
| icon.getWidth(this) : 0; |
| processField(x, y, clickcount, id, component, part, false, false, left); |
| } |
| else if (part != "icon") { // part = "down" |
| if (((id == MouseEvent.MOUSE_ENTERED) || |
| (id == MouseEvent.MOUSE_EXITED)) && (mousepressed == null)) { |
| if (editable) { repaint(component, "combobox", part); } |
| else { repaint(component); } |
| } |
| else if (id == MouseEvent.MOUSE_PRESSED) { |
| Object combolist = get(component, "combolist"); |
| if (combolist == null) { |
| setFocus(component); |
| repaint(component); |
| popup(component, classname); |
| } else { |
| closeup(component, combolist, null); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| if (mouseinside != component) { |
| Object combolist = get(component, "combolist"); |
| closeup(component, combolist, |
| (mouseinside == combolist) ? insidepart : null); |
| } else { |
| repaint(component); |
| } |
| } |
| } |
| } |
| else if ("combolist" == classname) { |
| if (!processScroll(x, y, id, component, part)) { |
| if ((id == MouseEvent.MOUSE_ENTERED) || (id == DRAG_ENTERED)) { |
| if (part != null) { |
| // repaint previous inside |
| set(component, "inside", part); |
| repaint(component, classname, part); |
| } |
| } |
| else if ((id == MouseEvent.MOUSE_EXITED) || (id == DRAG_EXITED)) { |
| if (part != null) { |
| set(component, "inside", null); |
| repaint(component, classname, part); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| closeup(get(component, "combobox"), component, part); |
| } |
| } |
| } |
| else if (("textfield" == classname) || ("passwordfield" == classname)) { |
| processField(x, y, clickcount, id, component, part, |
| false, ("passwordfield" == classname), 0); |
| } |
| else if ("textarea" == classname) { |
| if (!processScroll(x, y, id, component, part)) { |
| processField(x, y, clickcount, id, component, part, true, false, 0); |
| } |
| } |
| //java> |
| else if ("desktop" == classname) { |
| if (id == MouseEvent.MOUSE_ENTERED) { |
| setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
| } |
| else if (id == MouseEvent.MOUSE_EXITED) { |
| setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| } |
| } |
| //<java |
| else if ("spinbox" == classname) { |
| if (part == null) { |
| processField(x, y, clickcount, id, component, part, false, false, 0); |
| } |
| else { // part = "up" || "down" |
| if ((id == MouseEvent.MOUSE_ENTERED) || |
| (id == MouseEvent.MOUSE_EXITED) || |
| (id == MouseEvent.MOUSE_PRESSED) || |
| (id == MouseEvent.MOUSE_RELEASED)) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| setFocus(component); |
| if (processSpin(component, part)) { setTimer(375L); } |
| //settext: start end selection, parse exception... |
| } |
| else { |
| if (id == MouseEvent.MOUSE_RELEASED) { |
| setTimer(0L); |
| } |
| } |
| repaint(component, classname, part); |
| } |
| } |
| } |
| else if ("tabbedpane" == classname) { |
| if ((id == MouseEvent.MOUSE_ENTERED) || |
| (id == MouseEvent.MOUSE_EXITED)) { |
| if ((part != null) && getBoolean(part, "enabled", true) && |
| (getInteger(component, "selected", 0) != getIndex(component, "tab", part))) { |
| repaint(component, "tabbedpane", part); |
| } |
| } |
| else if ((part != null) && (id == MouseEvent.MOUSE_PRESSED) && |
| getBoolean(part, "enabled", true)) { |
| int selected = getInteger(component, "selected", 0); |
| int current = getIndex(component, "tab", part); |
| if (selected == current) { |
| setFocus(component); |
| repaint(component, "tabbedpane", part); |
| } |
| else { |
| setInteger(component, "selected", current, 0); |
| //Object tabcontent = getItemImpl(component, "component", current); |
| //setFocus((tabcontent != null) ? tabcontent : component); |
| setNextFocusable(component, false); |
| repaint(component); |
| invoke(component, "action"); |
| } |
| } |
| } |
| else if ("slider" == classname) { |
| if ((id == MouseEvent.MOUSE_PRESSED) || |
| (id == MouseEvent.MOUSE_DRAGGED)) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| setReference(component, block / 2, block / 2); |
| setFocus(component); |
| } |
| int minimum = getInteger(component, "minimum", 0); |
| int maximum = getInteger(component, "maximum", 100); |
| int value = getInteger(component, "value", 50); |
| Rectangle bounds = getRectangle(component, "bounds"); |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| int newvalue = minimum + |
| (horizontal ? (mousex - referencex) : (mousey - referencey)) * |
| (maximum - minimum) / |
| ((horizontal ? bounds.width : bounds.height) - block); //... +0.5 |
| newvalue = Math.max(minimum, Math.min(newvalue, maximum)); |
| if (value != newvalue) { |
| setInteger(component, "value", newvalue, 50); |
| invoke(component, "action"); |
| } |
| if ((value != newvalue) || (id == MouseEvent.MOUSE_PRESSED)) { |
| repaint(component); |
| } |
| } |
| } |
| else if ("splitpane" == classname) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| setReference(component, 2, 2); |
| } |
| else if (id == MouseEvent.MOUSE_DRAGGED) { |
| int divider = getInteger(component, "divider", -1); |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| int moveto = horizontal ? (mousex - referencex) : |
| (mousey - referencey); |
| Rectangle bounds = getRectangle(component, "bounds"); |
| moveto = Math.max(0, Math.min(moveto, |
| Math.abs(horizontal ? bounds.width : bounds.height) - 5)); |
| if (divider != moveto) { |
| setInteger(component, "divider", moveto, -1); |
| validate(component); |
| } |
| } |
| //java> |
| else if ((id == MouseEvent.MOUSE_ENTERED) && (mousepressed == null)) { |
| boolean horizontal = ("vertical" != get(component, "orientation")); |
| setCursor(Cursor.getPredefinedCursor(horizontal ? |
| Cursor.E_RESIZE_CURSOR : Cursor.S_RESIZE_CURSOR)); |
| } |
| else if (((id == MouseEvent.MOUSE_EXITED) && (mousepressed == null)) || |
| ((id == MouseEvent.MOUSE_RELEASED) && (mouseinside != component))) { |
| setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| } |
| //<java |
| } |
| else if (("list" == classname) || |
| ("table" == classname) || ("tree" == classname)) { |
| if (!processScroll(x, y, id, component, part)) { |
| if (((id == MouseEvent.MOUSE_PRESSED)|| |
| ((id == MouseEvent.MOUSE_DRAGGED) && |
| !shiftdown && !controldown)) && |
| !popuptrigger) { // e.getClickCount() |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle viewport = getRectangle(component, ":port"); |
| int my = mousey + view.y - referencey; |
| String itemname = ("list" == classname) ? "item" : |
| (("table" == classname) ? "row" : "node"); |
| String subitem = ("tree" == classname) ? "node" : null; |
| for (Object item = get(component, itemname); item != null;) { |
| Rectangle r = getRectangle(item, "bounds"); |
| if (my < r.y + r.height) { |
| if (id == MouseEvent.MOUSE_DRAGGED) { //!!! |
| scrollToVisible(component, r.x, r.y, 0, r.height - 1); |
| } |
| else if ("tree" == classname) { |
| int mx = mousex + view.x - referencex; |
| if (mx < r.x) { |
| if ((mx >= r.x - block) && (get(item, "node") != null)) { |
| boolean expanded = getBoolean(item, "expanded", true); |
| setBoolean(item, "expanded", !expanded, true); |
| selectItem(component, item, "node", "node"); |
| setLead(component, get(component, "lead"), item); |
| setFocus(component); |
| validate(component); |
| invoke(component, expanded ? "collapse" : "expand"); //item |
| } |
| break; |
| } |
| } |
| if ((id != MouseEvent.MOUSE_DRAGGED) || |
| !getBoolean(item, "selected", false)) { |
| select(component, item, itemname, subitem, shiftdown, controldown); |
| if (id != MouseEvent.MOUSE_DRAGGED) { |
| if (setFocus(component)) { repaint(component, classname, item); } //? |
| } |
| } |
| break; |
| } |
| item = getNextItem(component, item, subitem); |
| } |
| } |
| } |
| } |
| else if ("menubar" == classname) { |
| Object selected = get(component, "selected"); |
| if (((id == MouseEvent.MOUSE_ENTERED) || (id == MouseEvent.MOUSE_EXITED)) && |
| (part != null) && (selected == null)) { |
| repaint(component, classname, part); |
| } |
| else if ((part != null) && ((selected == null) ? |
| (id == MouseEvent.MOUSE_PRESSED) : |
| ((id == MouseEvent.MOUSE_ENTERED) || (id == DRAG_ENTERED)))) { |
| set(component, "selected", part); |
| popup(component, classname); |
| repaint(component, classname, part); |
| } |
| else if ((id == MouseEvent.MOUSE_PRESSED) && (selected != null)) { |
| closeup(component); |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| if ((part != insidepart) && |
| ((insidepart == null) || (getClass(insidepart) != "menu"))) { |
| if ((insidepart != null) && getBoolean(insidepart, "enabled", true)) { |
| if (getClass(insidepart) == "checkboxmenuitem") { |
| changeCheck(insidepart, false); |
| } |
| else invoke(insidepart, "action"); |
| } |
| closeup(component); |
| } |
| } |
| } |
| else if ("popupmenu" == classname) { |
| if (part != null) { |
| if ((id == MouseEvent.MOUSE_ENTERED) || (id == DRAG_ENTERED)) { |
| set(component, "selected", part); |
| popup(component, classname); |
| repaint(component, classname, part); |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| if ((insidepart == null) || (getClass(insidepart) != "menu")) { |
| Object menubar = part; |
| do { |
| menubar = getParent(menubar); |
| } while (getClass(menubar) != "menubar"); |
| if ((insidepart != null) && getBoolean(insidepart, "enabled", true)) { |
| if (getClass(insidepart) == "checkboxmenuitem") { |
| changeCheck(insidepart, false); |
| } |
| else invoke(insidepart, "action"); |
| } |
| closeup(menubar); |
| } |
| } |
| else if ((id == MouseEvent.MOUSE_EXITED) || (id == DRAG_EXITED)) { |
| if (getClass(part) != "menu") { |
| set(component, "selected", null); |
| } |
| repaint(component, classname, part); |
| } |
| } |
| } |
| else if ("dialog" == classname) { |
| if (part == "header") { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| referencex = mousex; referencey = mousey; |
| if (!getBoolean(component, "modal", false) && |
| (get(content, "component") != component)) { |
| removeItemImpl(content, "component", component); |
| insertItem(content, "component", component, 0); |
| set(component, ":parent", content); |
| repaint(component); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_DRAGGED) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| int dx = mousex - referencex; int dy = mousey - referencey; |
| repaint(component, |
| bounds.x + Math.min(0, dx), bounds.y + Math.min(0, dy), |
| bounds.width + Math.abs(dx), bounds.height + Math.abs(dy)); |
| bounds.x += dx; bounds.y += dy; |
| referencex = mousex; referencey = mousey; |
| } |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void setReference(Object component, int x, int y) { |
| referencex = x; referencey = y; |
| for (; component != null; component = getParent(component)) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| referencex += bounds.x; referencey += bounds.y; |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void select(Object component, Object row, String first, |
| String child, boolean shiftdown, boolean controldown) { |
| String selection = getString(component, "selection", "single"); |
| Object lead = null; |
| if (shiftdown && (selection != "single") && |
| ((lead = get(component, "lead")) != null)) { |
| extend(component, lead, row, first, child); |
| } |
| else { |
| if (controldown && (selection == "multiple")) { |
| setBoolean(row, "selected", |
| !getBoolean(row, "selected", false), false); |
| repaint(component, null, row); |
| invoke(component, "action"); |
| set(component, "anchor", null); |
| } |
| else if (controldown && getBoolean(row, "selected", false)) { |
| for (Object item = row; |
| item != null; item = getNextItem(component, item, child)) { |
| if (setBoolean(item, "selected", false, false)) { |
| repaint(component, null, item); |
| } |
| } |
| invoke(component, "action"); |
| set(component, "anchor", null); |
| } |
| else { |
| selectItem(component, row, first, child); |
| } |
| } |
| setLead(component, (lead != null) ? lead : get(component, "lead"), row); |
| } |
| |
| /** |
| * |
| */ |
| private Object getNextItem(Object component, |
| Object item, String subitem) { |
| if (subitem == null) { return get(item, ":next"); } |
| Object next = get(item, subitem); |
| if ((next == null) || !getBoolean(item, "expanded", true)) { |
| while ((item != component) && ((next = get(item, ":next")) == null)) { |
| item = getParent(item); |
| } |
| } |
| return next; |
| } |
| |
| /** |
| * |
| */ |
| private void processField(int x, int y, int clickcount, |
| int id, Object component, |
| Object part, boolean multiline, boolean hidden, int left) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| setReference(component, 2 + left, 2); |
| int mx = x - referencex; |
| int my = 0; |
| if (!multiline) { |
| mx += getInteger(component, "offset", 0); |
| } else { |
| Rectangle view = getRectangle(component, ":view"); |
| mx += view.x - 1; |
| my = y - referencey + view.y - 1; |
| } |
| int caretstart = getCaretLocation(component, mx, my, hidden); |
| int caretend = caretstart; |
| //java> |
| if (clickcount > 1) { |
| String text = getString(component, "text", ""); |
| while ((caretstart > 0) && ((clickcount == 2) ? |
| Character.isLetterOrDigit(text.charAt(caretstart - 1)) : |
| (text.charAt(caretstart - 1) != '\n'))) { caretstart--; } |
| while ((caretend < text.length()) && ((clickcount == 2) ? |
| Character.isLetterOrDigit(text.charAt(caretend)) : |
| (text.charAt(caretend) != '\n'))) { caretend++; } |
| } |
| //<java |
| setInteger(component, "start", caretstart, 0); |
| setInteger(component, "end", caretend, 0); |
| setFocus(component); |
| validate(component); // caret check only |
| } |
| else if (id == MouseEvent.MOUSE_DRAGGED) { |
| int mx = x - referencex; |
| int my = 0; |
| if (!multiline) { |
| mx += getInteger(component, "offset", 0); |
| } else { |
| Rectangle view = getRectangle(component, ":view"); |
| mx += view.x - 1; |
| my = y - referencey + view.y - 1; |
| } |
| int dragcaret = getCaretLocation(component, mx, my, hidden); |
| if (dragcaret != getInteger(component, "end", 0)) { |
| setInteger(component, "end", dragcaret, 0); |
| validate(component); // caret check only |
| } |
| } |
| //java> |
| else if ((id == MouseEvent.MOUSE_ENTERED) && (mousepressed == null)) { |
| setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); |
| } |
| else if (((id == MouseEvent.MOUSE_EXITED) && (mousepressed == null)) || |
| ((id == MouseEvent.MOUSE_RELEASED) && |
| ((mouseinside != component) || (insidepart != null)))) { |
| setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| } |
| //<java |
| } |
| |
| /** |
| * |
| */ |
| private int getCaretLocation(Object component, int x, int y, boolean hidden) { |
| String text = getString(component, "text", ""); |
| FontMetrics fm = getFontMetrics(getFont()); |
| for (int i = 0, j = 0; true; i = j + 1) { |
| j = text.indexOf('\n', i); |
| if ((j == -1) || y < fm.getHeight()) { |
| if (j == -1) { j = text.length(); } |
| for (int k = i; k < j; k++) { |
| int charwidth = fm.charWidth(hidden ? '*' : text.charAt(k)); |
| if (x <= (charwidth / 2)) { |
| return k; |
| } |
| x -= charwidth; |
| } |
| return j; |
| } |
| y -= fm.getHeight(); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private boolean processScroll(int x, int y, |
| int id, Object component, Object part) { |
| if ((part == "up") || (part == "down") || |
| (part == "left") || (part == "right")) { |
| if ((id == MouseEvent.MOUSE_ENTERED) || |
| (id == MouseEvent.MOUSE_EXITED) || |
| (id == MouseEvent.MOUSE_PRESSED) || |
| (id == MouseEvent.MOUSE_RELEASED)) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| if (processScroll(component, part)) { |
| setTimer(300L); return true; |
| } |
| } |
| else { |
| if (id == MouseEvent.MOUSE_RELEASED) { setTimer(0L); } |
| repaint(component, null, part); |
| } |
| } |
| } |
| else if ((part == "uptrack") || (part == "downtrack") || |
| (part == "lefttrack") || (part == "righttrack")) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| if (processScroll(component, part)) { |
| setTimer(300L); |
| } |
| } |
| else if (id == MouseEvent.MOUSE_RELEASED) { |
| setTimer(0L); |
| } |
| } |
| else if ((part == "vknob") || (part == "hknob")) { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| Rectangle port = getRectangle(component, ":port"); |
| Rectangle view = getRectangle(component, ":view"); |
| if (part == "hknob") { |
| referencex = x - |
| view.x * (port.width - 2 * block) / view.width; |
| } else { |
| referencey = y - |
| view.y * (port.height - 2 * block) / view.height; |
| } |
| } |
| else if (id == MouseEvent.MOUSE_DRAGGED) { |
| Rectangle port = getRectangle(component, ":port"); |
| Rectangle view = getRectangle(component, ":view"); |
| if (part == "hknob") { |
| int viewx = (x - referencex) * |
| view.width / (port.width - 2 * block); |
| viewx = Math.max(0, Math.min(viewx, view.width - port.width + 2)); |
| if (view.x != viewx) { |
| view.x = viewx; |
| repaint(component, null, "horizontal"); |
| } |
| } else { |
| int viewy = (y - referencey) * |
| view.height / (port.height - 2 * block); |
| viewy = Math.max(0, Math.min(viewy, view.height - port.height + 2)); |
| if (view.y != viewy) { |
| view.y = viewy; |
| repaint(component, null, "vertical"); |
| } |
| } |
| } |
| } |
| else if (part == "corner") { |
| part = "corner"; // compiler bug |
| } |
| else { |
| if (id == MouseEvent.MOUSE_PRESSED) { |
| Rectangle port = getRectangle(component, ":port"); |
| setReference(component, port.x + 1, port.y + 1); |
| } |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| private boolean processScroll(Object component, Object part) { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle port = ((part == "left") || (part == "up")) ? null : |
| getRectangle(component, ":port"); |
| int dx = 0; int dy = 0; |
| if (part == "left") { dx = -10; } |
| else if (part == "lefttrack") { dx = -port.width; } |
| else if (part == "right") { dx = 10; } |
| else if (part == "righttrack") { dx = port.width; } |
| else if (part == "up") { dy = -10; } |
| else if (part == "uptrack") { dy = -port.height; } |
| else if (part == "down") { dy = 10; } |
| else if (part == "downtrack") { dy = port.height; } |
| if (dx != 0) { |
| dx = (dx < 0) ? Math.max(-view.x, dx) : |
| Math.min(dx, view.width - port.width + 2 - view.x); |
| } |
| else if (dy != 0) { |
| dy = (dy < 0) ? Math.max(-view.y, dy) : |
| Math.min(dy, view.height - port.height + 2 - view.y); |
| } |
| else return false; |
| view.x += dx; view.y += dy; |
| repaint(component, null, (dx != 0) ? "horizontal" : "vertical"); |
| return (((part == "left") || (part == "lefttrack")) && (view.x > 0)) || |
| (((part == "right") || (part == "righttrack")) && |
| (view.x < view.width - port.width + 2)) || |
| (((part == "up") || (part == "uptrack")) && (view.y > 0)) || |
| (((part == "down") || (part == "downtrack")) && |
| (view.y < view.height - port.height + 2)); |
| } |
| |
| /** |
| * |
| */ |
| private boolean processSpin(Object component, Object part) { |
| String text = getString(component, "text", null); |
| if (text != null) { |
| try { |
| String value = String.valueOf( |
| Integer.parseInt(text) + ((part == "up") ? 1 : -1)); |
| setString(component, "text", value, null); |
| setInteger(component, "start", value.length(), 0); |
| setInteger(component, "end", 0, 0); |
| repaint(component, "spinbox", null); |
| invoke(component, "action"); |
| return true; |
| } catch (NumberFormatException nfe) {} |
| } |
| return false; |
| } |
| |
| //java> |
| /*public void setEventHandler(Object component, Object eventhandler) { |
| set(component, ":handler", eventhandler); |
| }*/ |
| |
| /** |
| * |
| */ |
| private void invoke(Object component, String event) { |
| Method method = (Method) get(component, event); |
| if (method != null) { |
| try { |
| method.invoke(this, null); |
| } catch (InvocationTargetException ite) { |
| ite.getTargetException().printStackTrace(); |
| } catch (Exception exc) { |
| exc.printStackTrace(); |
| } |
| } |
| } |
| //<java |
| /*midp |
| private void invoke(Object component, String event) { |
| String action = (String) get(component, event); |
| if (action != null) { handle(component, action); } |
| } |
| protected void handle(Object source, String action) { |
| } |
| midp*/ |
| |
| /** |
| * |
| */ |
| private boolean findComponent(Object component, int x, int y) { |
| if (component == content) { |
| mouseinside = insidepart = null; |
| mousex = x; mousey = y; |
| } |
| if (!getBoolean(component, "visible", true)) { return false; } |
| Rectangle bounds = getRectangle(component, "bounds"); |
| if ((bounds == null) || !(bounds.contains(x, y))) { return false; } //java |
| //midp if ((bounds == null) || (x < bounds.x) || (x - bounds.x >= bounds.width) || |
| //midp (y < bounds.y) || (y - bounds.y >= bounds.height)) { return false; } |
| mouseinside = component; |
| x -= bounds.x; y -= bounds.y; |
| String classname = getClass(component); |
| |
| if ("combobox" == classname) { |
| if (getBoolean(component, "editable", true) && (x <= bounds.width - block)) { |
| Image icon = getIcon(component, "icon", null); |
| insidepart = ((icon != null) && (x <= 2 + icon.getWidth(this))) ? |
| "icon" : null; |
| } else { |
| insidepart = "down"; |
| } |
| } |
| else if ("combolist" == classname) { |
| if (!findScrollPane(component, x, y, bounds)) { |
| y += getRectangle(component, ":view").y; |
| for (Object choice = get(get(component, "combobox"), "choice"); |
| choice != null; choice = get(choice, ":next")) { |
| Rectangle r = getRectangle(choice, "bounds"); |
| if ((y >= r.y) && (y < r.y + r.height)) { |
| insidepart = choice; break; |
| } |
| } |
| } |
| } |
| else if ("textarea" == classname) { |
| findScrollPane(component, x, y, bounds); |
| } |
| else if ("tabbedpane" == classname) { |
| Object tabcontent = getItemImpl(component, |
| "component", getInteger(component, "selected", 0)); |
| if ((tabcontent == null) || !findComponent(tabcontent, x, y)) { |
| for (Object comp = get(component, "tab"); |
| comp != null; comp = get(comp, ":next")) { |
| Rectangle r = getRectangle(comp, "bounds"); |
| if (r.contains(x, y)) { //java |
| //midp if ((x >= r.x) && (x - r.x < r.width) && (y >= r.y) && (y - r.y < r.height)) { |
| insidepart = comp; break; |
| } |
| } |
| } |
| } |
| else if (("panel" == classname) || ("desktop" == classname) || |
| ("dialog" == classname)) { |
| if (("dialog" == classname) && |
| (y < 4 + getInteger(component, "titleheight", 0))) { |
| insidepart = "header"; |
| } else { |
| for (Object comp = get(component, "component"); |
| comp != null; comp = get(comp, ":next")) { |
| if (findComponent(comp, x, y)) { break; } |
| if (("desktop" == classname) && |
| getBoolean(comp, "modal", false)) { break; } // && dialog |
| } |
| } |
| } |
| else if ("spinbox" == classname) { |
| insidepart = (x <= bounds.width - block) ? null : |
| ((y <= bounds.height / 2) ? "up" : "down"); |
| } |
| else if ("splitpane" == classname) { |
| Object comp1 = get(component, "component"); |
| if (comp1 != null) { |
| if (!findComponent(comp1, x, y)) { |
| Object comp2 = get(comp1, ":next"); |
| if (comp2 != null) { |
| findComponent(comp2, x, y); |
| } |
| } |
| } |
| } |
| else if ("list" == classname) { |
| findScrollPane(component, x, y, bounds); |
| } |
| else if ("table" == classname) { |
| findScrollPane(component, x, y, bounds); |
| } |
| else if ("tree" == classname) { |
| findScrollPane(component, x, y, bounds); |
| } |
| else if ("menubar" == classname) { |
| for (Object menu = get(component, "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Rectangle r = getRectangle(menu, "bounds"); |
| if ((x >= r.x) && (x < r.x + r.width)) { |
| insidepart = menu; break; |
| } |
| } |
| } |
| else if ("popupmenu" == classname) { |
| for (Object menu = get(get(component, "menu"), "menu"); |
| menu != null; menu = get(menu, ":next")) { |
| Rectangle r = getRectangle(menu, "bounds"); |
| if ((y >= r.y) && (y < r.y + r.height)) { |
| insidepart = menu; break; |
| } |
| } |
| } |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| private boolean findScrollPane(Object component, |
| int x, int y, Rectangle bounds) { |
| Rectangle port = getRectangle(component, ":port"); |
| if ((x < port.x) || (y < port.y) || |
| ((x >= port.x + port.width) && (y >= port.y + port.height))) { |
| insidepart = "corner"; |
| } |
| else if ((x >= port.x + port.width) || (y >= port.y + port.height)) { |
| boolean horizontal = (y >= port.y + port.height); |
| int p = horizontal ? (x - port.x) : (y - port.y); |
| int portsize = horizontal ? port.width : port.height; |
| int button = Math.min(block, portsize / 2); |
| if (p < button) { |
| insidepart = horizontal ? "left" : "up"; |
| } |
| else if (p >= portsize - button) { |
| insidepart = horizontal ? "right" : "down"; |
| } |
| else { |
| Rectangle view = getRectangle(component, ":view"); |
| int viewp = horizontal ? view.x : view.y; |
| int viewsize = horizontal ? view.width : view.height; |
| int track = portsize - (2 * button); |
| int knob = Math.min(track, |
| Math.max(track * (portsize - 2) / viewsize, 6)); |
| int decrease = viewp * (track - knob) / (viewsize - portsize + 2); |
| if (p < button + decrease) { |
| insidepart = horizontal ? "lefttrack" : "uptrack"; |
| } |
| else if (p < button + decrease + knob) { |
| insidepart = horizontal ? "hknob" : "vknob"; |
| } |
| else { |
| insidepart = horizontal ? "righttrack" : "downtrack"; |
| } |
| } |
| } |
| else { return false; } |
| return true; |
| } |
| |
| /** |
| * |
| */ |
| private void repaint(Object component, Object classname, Object part) { |
| Rectangle b = getRectangle(component, "bounds"); |
| if ((classname == "combobox") || (classname == "spinbox")) { |
| boolean down = (part == "up") || (part == "down"); // else text |
| repaint(component, down ? (b.x + b.width - block) : b.x, b.y, |
| down ? block : (b.width - block), b.height); |
| } |
| //else if (classname == "dialog") {} |
| //int titleheight = getInteger(component, "titleheight", 0); |
| //else if (classname == "splitpane") {} |
| else if ((classname == "tabbedpane") || |
| (classname == "menubar") || (classname == "popupmenu")) { |
| Rectangle r = getRectangle(part, "bounds"); |
| repaint(component, b.x + r.x, b.y + r.y, |
| (classname == "popupmenu") ? b.width : r.width, r.height); |
| } |
| else //if ((classname == "combolist") || (classname == "textarea") || |
| {//(classname == "list") || (classname == "table") || (classname == "tree")) { |
| Rectangle port = getRectangle(component, ":port"); |
| if (part == "left") { |
| repaint(component, b.x + port.x, b.y + b.height - block, block, block); |
| } |
| else if (part == "right") { |
| repaint(component, b.x + port.x + port.width - block, b.y + b.height - block, block, block); |
| } |
| else if (part == "up") { |
| repaint(component, b.x + b.width - block, b.y + port.y, block, block); |
| } |
| else if (part == "down") { |
| repaint(component, b.x + b.width - block, b.y + port.y + port.height - block, block, block); |
| } |
| else if (part == "horizontal") { // horizontaly center part |
| repaint(component, b.x + port.x, b.y, port.width, b.height); |
| } |
| else if (part == "vertical") { |
| repaint(component, b.x, b.y + port.y, b.width, port.height); |
| } |
| else if (part == "text") { //textarea |
| repaint(component, b.x + port.x, b.y + port.y, port.width, port.height); |
| } |
| else { |
| Rectangle view = getRectangle(component, ":view"); |
| Rectangle r = getRectangle(part, "bounds"); |
| if ((r.y + r.height >= view.y) && (r.y <= view.y + port.height)) { |
| repaint(component, b.x + port.x, b.y + port.y - view.y + 1 + r.y, |
| port.width, r.height); |
| //? need cut item rectangle above/bellow viewport |
| } |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void validate(Object component) { |
| repaint(component); |
| Rectangle bounds = getRectangle(component, "bounds"); |
| bounds.width = -1 * Math.abs(bounds.width); |
| } |
| |
| /** |
| * |
| */ |
| private void repaint(Object component) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| if (bounds != null) { |
| repaint(component, bounds.x, bounds.y, bounds.width, bounds.height); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void repaint(Object component, int x, int y, int width, int height) { |
| while ((component = getParent(component)) != null) { |
| Rectangle bounds = getRectangle(component, "bounds"); |
| x += bounds.x; |
| y += bounds.y; |
| } |
| repaint(x, y, width, height); |
| } |
| |
| /*private void clip(Graphics g, |
| Rectangle clip, int x, int y, int width, int height) { |
| int x1 = Math.max(clip.x, x); |
| int y1 = Math.max(clip.y, y); |
| int x2 = Math.min(clip.x + clip.width, x + width); |
| int y2 = Math.min(clip.y + clip.height, y + height); |
| g.setClip(x1, y1, x2 - x1, y2 - y1); |
| }*/ |
| |
| /** |
| * |
| */ |
| public boolean requestFocus(Object component) { |
| if (checkFocusable(component, true)) { |
| setFocus(component); return true; |
| } |
| return false; |
| } |
| |
| /** |
| * |
| */ |
| private boolean setFocus(Object component) { |
| if (!focusinside) { //java |
| requestFocus(); //java |
| } //java |
| if (focusowner != component) { |
| Object focused = focusowner; |
| focusowner = component; |
| if (focused != null) { |
| //mouseEvent(null, FocusEvent.FOCUS_LOST, focused, null, null); |
| repaint(focused); |
| //focusGained(component); |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * @return next focusable component is found (not the first of the desktop/dialog) |
| */ |
| private boolean setNextFocusable(Object current, boolean outgo) { |
| boolean consumed = true; |
| for (Object next = null, component = current; true; component = next) { |
| next = get(component, "component"); // check first subcomponent |
| if (next == null) { next = get(component, ":next"); } // check next component |
| while (next == null) { // find the next of the parents, or the topmost |
| component = getParent(component); // current is not on the desktop |
| if (component == null) { return false; } |
| if ((component == content) || ((getClass(component) == "dialog") && |
| (!outgo || getBoolean(component, "modal", false)))) { |
| consumed = false; // find next focusable but does not consume event |
| next = component; // the topmost (desktop or modal dialog) |
| } |
| else { |
| next = get(component, ":next"); |
| } |
| } |
| if (next == current) { return false; } // one fucusable, no loop |
| if (checkFocusable(next, false)) { |
| setFocus(next); |
| return consumed; |
| } |
| } |
| } |
| |
| //java> |
| /** |
| * @return previous focusable component is found (not the last of the desktop/dialog) |
| */ |
| private boolean setPreviousFocusable(Object component, boolean outgo) { |
| for (int i = 0; i < 2; i++) { // 0 is backward direction |
| Object previous = getPreviousFocusable(component, null, true, false, (i == 0), outgo); |
| if (previous != null) { |
| setFocus(previous); |
| return (i == 0); |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * For the starting component search its parent direction for a focusable component, and then |
| * its next component (if not search backward from the component).<br> |
| * For its parent components check its first component, the current one, and its parent direction |
| * (backward search), or its parent, then next component (forward direction).<br> |
| * For the rest components check the next, then the first subcomponent direction, and finally |
| * check whether the component is focusable. |
| */ |
| private Object getPreviousFocusable(Object component, |
| Object block, boolean start, boolean upward, boolean backward, boolean outgo) { |
| Object previous = null; |
| if ((component != null) && (component != block)) { |
| boolean go = ((getClass(component) != "dialog") || |
| (outgo && !getBoolean(component, "modal", false))); |
| if (!start && !upward && go) { |
| previous = getPreviousFocusable(get(component, ":next"), block, false, false, backward, outgo); |
| } |
| if ((previous == null) && ((upward && backward) || (!start && !upward))) { |
| previous = getPreviousFocusable(get(component, "component"), block, false, false, backward, outgo); |
| if ((previous == null) && checkFocusable(component, false)) { |
| previous = component; |
| } |
| } |
| if ((previous == null) && (start || upward) && go) { |
| previous = getPreviousFocusable(getParent(component), component, false, true, backward, outgo); |
| } |
| if ((previous == null) && (start || upward) && !backward && go) { |
| previous = getPreviousFocusable(get(component, ":next"), block, false, false, backward, outgo); |
| } |
| } |
| return previous; |
| } |
| //<java |
| |
| /** |
| * |
| */ |
| private boolean checkFocusable(Object component, boolean forced) { |
| String classname = getClass(component); |
| //midp forced=true; |
| if ((classname == "button") || (classname == "checkbox") || |
| (classname == "combobox") || (classname == "textfield") || |
| (classname == "passwordfield") || (classname == "textarea") || |
| (classname == "spinbox") || (classname == "slider") || |
| (classname == "list") || (classname == "table") || (classname == "tree") || |
| (classname == "tabbedpane") || (forced && (classname == "splitpane"))) { |
| for (Object comp = component; comp != null;) { |
| if (!getBoolean(comp, "enabled", true) || !getBoolean(comp, "visible", true)) { |
| return false; |
| } |
| Object parent = getParent(comp); |
| if ((getClass(parent) == "tabbedpane") && (getItemImpl(parent, |
| "component", getInteger(parent, "selected", 0)) != comp)) { return false; } |
| comp = parent; |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| /*if (cliparea == null) { add(cliparea = new TextArea()); } |
| cliparea.setText(content); |
| cliparea.selectAll(); |
| cliparea.dispatchEvent(new KeyEvent(this, KeyEvent.KEY_TYPED, 0L, KeyEvent.CTRL_MASK, 0, (char) 3)); |
| cliparea.selectAll(); |
| |
| if (cliparea == null) { add(cliparea = new TextArea()); } |
| cliparea.dispatchEvent(new KeyEvent(this, KeyEvent.KEY_TYPED, 0L, KeyEvent.CTRL_MASK, 0, (char) 22)); |
| cliparea.getText(); return cliparea.getText();*/ |
| |
| // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- |
| |
| /** |
| * |
| */ |
| public Object create(String classname) { |
| for (int i = 0; i < dtd.length; i += 3) { |
| if (dtd[i].equals(classname)) { |
| return createImpl((String) dtd[i]); |
| } |
| } |
| throw new IllegalArgumentException("unknown " + classname); |
| } |
| |
| /** |
| * @return classname |
| */ |
| public String getClass(Object component) { |
| return (String) get(component, ":class"); |
| } |
| |
| /** |
| * |
| */ |
| public Object getDesktop() { |
| return content; |
| } |
| |
| /** |
| * |
| */ |
| private Object createImpl(String classname) { |
| return new Object[] { ":class", classname, null }; |
| } |
| |
| /** |
| * |
| */ |
| private boolean set(Object component, Object key, Object value) { |
| Object[] previous = (Object[]) component; |
| for (Object[] entry = previous; entry != null; |
| entry = (Object[]) entry[2]) { |
| if (entry[0] == key) { |
| if (value != null) { // set the row's value |
| Object oldvalue = entry[1]; |
| entry[1] = value; |
| return !value.equals(oldvalue); |
| } |
| else { // remove the row |
| previous[2] = entry[2]; |
| entry[2] = null; |
| return true; |
| } |
| } |
| previous = entry; |
| } |
| if (value != null) { // append a new row |
| previous[2] = new Object[] { key, value, null }; |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * |
| */ |
| private Object get(Object component, Object key) { |
| for (Object[] entry = (Object[]) component; entry != null; |
| entry = (Object[]) entry[2]) { |
| if (entry[0] == key) { |
| return entry[1]; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * |
| */ |
| public int getCount(Object component) { |
| return getCount(component, null); |
| } |
| |
| /** |
| * |
| */ |
| public int getCount(Object component, String key) { |
| return getItemCountImpl(component, getComponentName(component, key)); |
| } |
| |
| /** |
| * |
| */ |
| public Object getParent(Object component) { |
| return get(component, ":parent"); |
| } |
| |
| /** |
| * @return the first selected index or -1 |
| */ |
| public int getSelectedIndex(Object component) { |
| int i = 0; |
| for (Object item = get(component, getComponentName(component, null)); |
| item != null; item = get(item, ":next")) { |
| if (getBoolean(item, "selected", false)) { return i; } |
| i++; |
| } |
| return -1; |
| } |
| |
| /** |
| * |
| */ |
| public void removeAll(Object component) { |
| removeAll(component, null); |
| } |
| |
| /** |
| * |
| */ |
| public void removeAll(Object component, String key) { |
| String list = getComponentName(component, key); |
| if (get(component, list) != null) { |
| set(component, list, null); |
| update(component, "validate"); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private int getItemCountImpl(Object component, Object key) { |
| int i = 0; |
| for (component = get(component, key); component != null; |
| component = get(component, ":next")) { |
| i++; |
| } |
| return i; |
| } |
| |
| /** |
| * |
| */ |
| public Object getItem(Object component, int index) { |
| return getItem(component, null, index); |
| } |
| |
| /** |
| * |
| */ |
| public Object[] getItems(Object component) { |
| return getItems(component, null); |
| } |
| |
| /** |
| * |
| */ |
| public Object getItem(Object component, String key, int index) { |
| return getItemImpl(component, getComponentName(component, key), index); |
| } |
| |
| /** |
| * |
| */ |
| public Object[] getItems(Object component, String key) { |
| key = getComponentName(component, key); |
| Object[] items = new Object[getItemCountImpl(component, key)]; |
| component = get(component, key); |
| for (int i = 0; i < items.length; i++) { |
| items[i] = component; |
| component = get(component, ":next"); |
| } |
| return items; |
| } |
| |
| /** |
| * |
| */ |
| private Object getItemImpl(Object component, Object key, int index) { |
| int i = 0; |
| for (Object item = get(component, key); |
| item != null; item = get(item, ":next")) { |
| if (i == index) { return item; } |
| i++; |
| } |
| return null; |
| } |
| |
| /** |
| * |
| */ |
| private int getIndex(Object component, Object key, Object value) { |
| int index = 0; |
| for (Object item = get(component, key); |
| item != null; item = get(item, ":next")) { |
| if (value == item) { return index; } |
| index++; |
| } |
| return -1; |
| } |
| |
| /** |
| * |
| */ |
| public void add(Object component) { |
| add(content, component, 0); |
| } |
| |
| /** |
| * |
| */ |
| public void add(Object parent, Object component) { |
| add(parent, component, -1); |
| } |
| |
| /** |
| * |
| */ |
| public void add(Object parent, Object component, int index) { |
| addImpl(parent, component, index); |
| update(component, "validate"); |
| if (parent == content) { |
| setNextFocusable(component, false); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void addItem(Object parent, Object key, Object component) { |
| insertItem(parent, key, component, -1); |
| } |
| |
| /** |
| * |
| */ |
| private void insertItem(Object parent, |
| Object key, Object component, int index) { |
| Object target = get(parent, key); |
| if (index == -1) { |
| while (target != null) { |
| target = get(parent = target, key = ":next"); |
| } |
| } |
| else { |
| for (int i = 0; i < index; i++) { |
| target = get(parent = target, key = ":next"); |
| } |
| set(component, ":next", get(parent, key)); |
| } |
| set(parent, key, component); |
| } |
| |
| /** |
| * |
| */ |
| public void remove(Object component) { |
| Object parent = getParent(component); |
| String parentclass = getClass(parent); |
| String classname = getClass(component); |
| String listkey = ("combobox" == parentclass) ? "choice" : |
| (("tabbedpane" == parentclass) && ("tab" == classname)) ? "tab" : |
| ("list" == parentclass) ? "item" : |
| (("table" == parentclass) && ("column" == classname)) ? "column" : |
| (("table" == parentclass) && ("row" == classname)) ? "row" : |
| ("row" == parentclass) ? "cell" : |
| (("tree" == parentclass) || ("node" == parentclass)) ? "node" : |
| (("menubar" == parentclass) || ("menu" == parentclass)) ? "menu" : |
| (("panel" == parentclass) || ("desktop" == parentclass) || |
| ("splitpane" == parentclass) || ("dialog" == parentclass) || |
| ("tabbedpane" == parentclass)) ? "component" : null; |
| if (listkey == null) { throw new IllegalArgumentException("unknown " + classname); } |
| update(component, "validate"); |
| removeItemImpl(parent, listkey, component); |
| // reuest focus for its parent if the component (or subcomponent) is currently focused |
| for (Object comp = focusowner; comp != null; comp = getParent(comp)) { |
| if (comp == component) { |
| setNextFocusable(parent, false); break; |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| private void removeItemImpl(Object parent, Object key, Object component) { |
| Object target = get(parent, key); |
| while (target != component) { |
| target = get(parent = target, key = ":next"); // (target != null) |
| } |
| set(parent, key, get(target, ":next")); |
| set(target, ":next", null); |
| set(target, ":parent", null); |
| } |
| |
| /* |
| private void removeItemImpl(Object parent, String key, int index) { |
| Object target = get(parent, key); |
| for (int i = 0; i < index; i++) { |
| target = get(parent = target, key = ":next"); |
| } |
| set(parent, key, get(target, ":next")); |
| set(target, ":next", null); |
| }*/ |
| |
| /** |
| * |
| */ |
| private String getComponentName(Object parent, Object classname) { |
| String parentclass = getClass(parent); |
| String compname = ("combobox" == parentclass) ? "choice" : |
| ("list" == parentclass) ? "item" : |
| ("row" == parentclass) ? "cell" : |
| (("tree" == parentclass) || ("node" == parentclass)) ? "node" : |
| (("menubar" == parentclass) || ("menu" == parentclass)) ? "menu" : |
| (("panel" == parentclass) || ("desktop" == parentclass) || |
| ("splitpane" == parentclass) || ("dialog" == parentclass)) ? |
| "component" : null; |
| if ((compname != null) && ((classname == null) || |
| compname.equals(classname))) { return compname; } |
| if ("tabbedpane" == parentclass) { |
| if ("tab".equals(classname)) { return "tab"; } |
| if ((classname == null) || "component".equals(classname)) { return "component"; } |
| } |
| else if ("table" == parentclass) { |
| if ("column".equals(classname)) { return "column"; } |
| if ((classname == null) || "row".equals(classname)) { return "row"; } |
| } |
| throw new IllegalArgumentException("unknown " + classname); |
| } |
| |
| /** |
| * |
| */ |
| public Object find(String name) { |
| return find(content, name); |
| } |
| |
| /** |
| * |
| */ |
| public Object find(Object component, String name) { |
| if (name.equals(get(component, "name"))) { return component; } |
| String classname = getClass(component); |
| String childname = null; String childname2 = null; |
| if (("panel" == classname) || ("desktop" == classname) || |
| ("splitpane" == classname) || ("dialog" == classname)) { childname = "component"; } |
| else if ("combobox" == classname) { childname = "choice"; } |
| else if ("tabbedpane" == classname) { childname = "tab"; childname2 = "component"; } |
| else if ("list" == classname) { childname = "item"; } |
| else if ("table" == classname) { childname = "column"; childname2 = "row"; } |
| else if ("row" == classname) { childname = "cell"; } |
| else if (("tree" == classname) || ("node" == classname)) { childname = "node"; } |
| else if (("menubar" == classname) || ("menu" == classname)) { childname = "menu"; } |
| while (childname != null) { |
| for (Object comp = get(component, childname); |
| comp != null; comp = get(comp, ":next")) { |
| Object found = find(comp, name); |
| if (found != null) { return found; } |
| } |
| childname = childname2; childname2 = null; |
| } |
| return null; |
| } |
| |
| // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- |
| |
| /*public String toXML(Object component) { |
| StringBuffer xml = new StringBuffer(); |
| Object[] entry = (Object[]) component; |
| String classname = (String) entry[1]; |
| while ((entry = (Object[]) entry[2]) != null) { |
| try { |
| Object[] definition = getDefinition(component, (String) entry[0], null); |
| if (definition != null) { |
| xml.append(" " + entry[0] + "=\"" + entry[1] + "\""); |
| } |
| } catch (IllegalArgumentException exc) {} |
| } |
| return xml.toString(); |
| }*/ |
| |
| /** |
| * |
| */ |
| public Object parse(String path) throws Exception { |
| InputStream inputstream = null; |
| try { //java |
| //midp inputstream = getClass().getResourceAsStream(path); |
| inputstream = getClass().getResourceAsStream(path); //java |
| //System.out.println("> " + path + " " + inputstream); |
| } catch (Throwable e) {} //java |
| //if (inputstream == null) { // applet code |
| // inputstream = new URL(getCodeBase(), path).openStream(); |
| //} |
| return parse(inputstream); //, Object handler |
| } |
| |
| /** |
| * |
| */ |
| public Object parse(InputStream inputstream) throws Exception { |
| return parse(inputstream, true); |
| } |
| |
| /** |
| * |
| */ |
| protected void parseXML(InputStream inputstream) throws Exception { |
| parse(inputstream, false); |
| } |
| |
| /** |
| * |
| */ |
| protected void startElement(String name, Hashtable attributelist) {} |
| |
| /** |
| * |
| */ |
| protected void characters(String text) {} |
| |
| /** |
| * |
| */ |
| protected void endElement() {} |
| |
| /** |
| * |
| */ |
| private Object parse(InputStream inputstream, boolean validate) throws Exception { |
| BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream)); //java |
| //midp InputStreamReader reader = new InputStreamReader(inputstream); |
| Object[] parentlist = null; |
| Object current = null; |
| Hashtable attributelist = null; |
| StringBuffer text = new StringBuffer(); |
| for (int c = reader.read(); c != -1;) { |
| if (c == '<') { |
| if ((c = reader.read()) == '/') { //endtag |
| if (text.length() > 0) { |
| if (text.charAt(text.length() - 1) == ' ') { |
| text.setLength(text.length() - 1); |
| } |
| if (!validate) { |
| characters(text.toString()); |
| }// else { |
| //addContent(current, text.toString()); |
| //} |
| text.setLength(0); |
| } |
| String tagname = (String) parentlist[2]; //getClass(current); |
| for (int i = 0; i < tagname.length(); i++) { // current-tag |
| if ((c = reader.read()) != tagname.charAt(i)) { |
| throw new IllegalArgumentException(tagname); |
| } |
| } |
| while (" \t\n\r".indexOf(c = reader.read()) != -1); // whitespace |
| if (c != '>') throw new IllegalArgumentException(); // '>' |
| c = reader.read(); |
| if (!validate) { endElement(); } |
| if (parentlist[0] == null) { |
| reader.close(); |
| return current; |
| } |
| current = parentlist[0]; |
| parentlist = (Object[]) parentlist[1]; |
| } |
| else { //start or standalone tag |
| boolean instruction = (c == '?'); // Processing Instructions |
| if (c == '!') { while ((c = reader.read()) != '>'); continue; } // DOCTYPE |
| if (instruction) { c = reader.read(); } |
| text.setLength(0); |
| boolean iscomment = false; |
| while (">/ \t\n\r".indexOf(c) == -1) { |
| text.append((char) c); |
| if ((text.length() == 3) && (text.charAt(0) == '!') && |
| (text.charAt(1) == '-') && (text.charAt(2) == '-')) { |
| int m = 0; |
| while (true) { |
| c = reader.read(); |
| if (c == '-') { m++; } |
| else if ((c == '>') && (m >= 2)) { break; } |
| else { m = 0; } |
| } |
| iscomment = true; |
| } |
| c = reader.read(); |
| } |
| if (iscomment) { continue; } |
| if (!instruction) { |
| String tagname = text.toString(); |
| parentlist = new Object[] { current, parentlist, tagname }; |
| if (validate) { |
| current = (current != null) ? |
| addElement(current, tagname) : create(tagname); |
| } else { |
| current = tagname; |
| } |
| } |
| text.setLength(0); |
| while (true) { |
| boolean whitespace = false; |
| while (" \t\n\r".indexOf(c) != -1) { |
| c = reader.read(); |
| whitespace = true; |
| } |
| if (c == '>') { |
| if (instruction) throw new IllegalArgumentException(); // '?>' |
| if (!validate) { |
| startElement((String) current, attributelist); attributelist = null; |
| } |
| c = reader.read(); |
| break; |
| } |
| else if (c == '/') { |
| if (instruction) throw new IllegalArgumentException(); // '?>' |
| if ((c = reader.read()) != '>') { |
| throw new IllegalArgumentException(); // '>' |
| } |
| if (!validate) { |
| startElement((String) current, attributelist); attributelist = null; |
| endElement(); |
| } |
| if (parentlist[0] == null) { |
| reader.close(); |
| return current; |
| } |
| current = parentlist[0]; |
| parentlist = (Object[]) parentlist[1]; |
| c = reader.read(); |
| break; |
| } |
| else if (instruction && (c == '?')) { |
| if ((c = reader.read()) != '>') { |
| throw new IllegalArgumentException(); // '>' |
| } |
| c = reader.read(); |
| break; |
| } |
| else if (whitespace) { |
| while ("= \t\n\r".indexOf(c) == -1) { |
| text.append((char) c); |
| c = reader.read(); |
| } |
| String key = text.toString(); |
| text.setLength(0); |
| while (" \t\n\r".indexOf(c) != -1) c = reader.read(); |
| if (c != '=') throw new IllegalArgumentException(); |
| while (" \t\n\r".indexOf(c = reader.read()) != -1); |
| char quote = (char) c; |
| if ((c != '\"') && (c != '\'')) throw new IllegalArgumentException(); |
| while (quote != (c = reader.read())) { |
| if (c == '&') { |
| StringBuffer eb = new StringBuffer(); |
| while (';' != (c = reader.read())) { eb.append((char) c); } |
| String entity = eb.toString(); |
| if ("lt".equals(entity)) { text.append('<'); } |
| else if ("gt".equals(entity)) { text.append('>'); } |
| else if ("amp".equals(entity)) { text.append('&'); } |
| else if ("quot".equals(entity)) { text.append('"'); } |
| else if ("apos".equals(entity)) { text.append('\''); } |
| else if (entity.startsWith("#")) { |
| text.append((char) Integer.parseInt(entity.substring(1))); |
| } |
| else throw new IllegalArgumentException("unknown " + "entity " + entity); |
| } |
| else text.append((char) c); |
| } |
| if (!instruction) { |
| if (validate) { |
| addAttribute(current, key, text.toString()); |
| } else { |
| if (attributelist == null) { attributelist = new Hashtable(); } |
| attributelist.put(key, text.toString()); |
| } |
| } |
| text.setLength(0); |
| c = reader.read(); |
| } |
| else throw new IllegalArgumentException(); |
| } |
| } |
| } |
| else { |
| if (" \t\n\r".indexOf(c) != -1) { |
| if ((text.length() > 0) && (text.charAt(text.length() - 1) != ' ')) { |
| text.append(' '); |
| } |
| } |
| else { |
| text.append((char) c); |
| } |
| c = reader.read(); |
| } |
| } |
| throw new IllegalArgumentException(); |
| } |
| |
| /** |
| * Convert entities. |
| */ |
| private static String convert(StringBuffer text) { |
| return null; |
| } |
| |
| /*private InputStream inputreader; |
| private byte[] data; |
| private int inputfrom = 0, inputto = 0; |
| private int read() throws Exception { |
| if (data == null) { data = new byte[1024]; } |
| if (inputfrom >= inputto) { |
| inputfrom = 0; |
| inputto = inputreader.read(data); |
| } |
| inputfrom++; |
| return data[inputfrom - 1]; |
| }*/ |
| |
| /** |
| * |
| */ |
| private void addImpl(Object parent, Object component, int index) { |
| String parentclass = getClass(parent); |
| String classname = getClass(component); |
| //System.out.println("add " + classname + " -> " + parentclass); |
| if ((("combobox" == parentclass) && ("choice" == classname)) || |
| (("tabbedpane" == parentclass) && ("tab" == classname)) || |
| (("list" == parentclass) && ("item" == classname)) || |
| (("table" == parentclass) && (("column" == classname) || ("row" == classname))) || |
| (("row" == parentclass) && ("cell" == classname)) || |
| ((("tree" == parentclass) || ("node" == parentclass)) && ("node" == classname)) || |
| (("menubar" == parentclass) && ("menu" == classname))) { |
| classname = classname; // compiler bug |
| } |
| else if (("menu" == parentclass) && (("menu" == classname) || ("menuitem" == classname) || |
| ("checkboxmenuitem" == classname) || ("separator" == classname))) { |
| classname = "menu"; |
| } |
| else if (("panel" == parentclass) || ("desktop" == parentclass) || |
| ("splitpane" == parentclass) || ("dialog" == parentclass) || |
| ("tabbedpane" == parentclass)) { |
| while ("component" != classname) { |
| String extendclass = null; |
| for (int i = 0; i < dtd.length; i += 3) { |
| if (classname == dtd[i]) { |
| extendclass = (String) dtd[i + 1]; break; |
| } |
| } |
| if (extendclass == null) throw new IllegalArgumentException(classname + " not component"); |
| classname = extendclass; |
| } |
| } |
| else throw new IllegalArgumentException(classname + " add " + parentclass); |
| insertItem(parent, (String) classname, component, index); |
| set(component, ":parent", parent); |
| //if (parent == content) System.out.println(getClass(parent) + ".add(" + getClass(component) + ") : " + classname); |
| } |
| |
| /** |
| * |
| */ |
| private Object addElement(Object parent, String name) { |
| //System.out.println("create '" + name + "'"); |
| Object component = create(name); |
| addImpl(parent, component, -1); |
| return component; |
| } |
| |
| /** |
| * |
| */ |
| private void addAttribute(Object component, String key, String value) { |
| //System.out.println("attribute '" + key + "'='" + value + "'"); |
| Object[] definition = getDefinition(component, key, null); |
| key = (String) definition[1]; |
| if ("string" == definition[0]) { |
| setString(component, key, value, (String) definition[3]); |
| } |
| else if ("choice" == definition[0]) { |
| String[] values = (String[]) definition[3]; |
| setChoice(component, key, value, values, values[0]); |
| } |
| else if ("boolean" == definition[0]) { |
| if ("true".equals(value)) { |
| if (definition[3] == Boolean.FALSE) { |
| set(component, key, Boolean.TRUE); |
| } |
| } |
| else if ("false".equals(value)) { |
| if (definition[3] == Boolean.TRUE) { |
| set(component, key, Boolean.FALSE); |
| } |
| } |
| else throw new IllegalArgumentException(value); |
| } |
| else if ("integer" == definition[0]) { |
| set(component, key, Integer.valueOf(value)); |
| } |
| else if ("icon" == definition[0]) { |
| set(component, key, getIcon(value)); |
| } |
| else if ("method" == definition[0]) { |
| try { //java |
| set(component, key, getClass().getMethod(value, null)); //java |
| } catch (Exception exc) { System.err.println(value); exc.printStackTrace(); } //java |
| //midp setMethod(component, key, value); |
| } |
| //java> |
| else if ("bean" == definition[0]) { |
| try { |
| set(component, key, (Component) Class.forName(value).newInstance()); |
| } catch (Exception exc) { System.err.println(value); exc.printStackTrace(); } |
| } |
| //<java |
| else throw new IllegalArgumentException((String) definition[0]); |
| } |
| |
| /** |
| * |
| */ |
| private Object[] getDefinition(Object component, String key, String type) { |
| Object classname = getClass(component); |
| Object currentname = classname; |
| while (classname != null) { |
| for (int i = 0; i < dtd.length; i += 3) { |
| if (dtd[i] == classname) { |
| Object[][] attributes = (Object[][]) dtd[i + 2]; |
| for (int j = 0; j < attributes.length; j++) { |
| if (attributes[j][1].equals(key)) { |
| if ((type != null) && (type != attributes[j][0])) { |
| throw new IllegalArgumentException(attributes[j][0].toString()); |
| } |
| return attributes[j]; |
| } |
| } |
| classname = dtd[i + 1]; |
| break; |
| } |
| } |
| } |
| throw new IllegalArgumentException("unknown " + key + " " + type + |
| " for " + currentname); |
| } |
| |
| /** |
| * |
| */ |
| //private void addContent(Object component, String content) { |
| //set(component, "content", content); |
| //} |
| |
| // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- |
| |
| /** |
| * |
| */ |
| public void setString(Object component, String key, String value) { |
| Object[] definition = getDefinition(component, key, "string"); |
| if (setString(component, (String) definition[1], |
| value, (String) definition[3])) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public String getString(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "string"); |
| return getString(component, (String) definition[1], |
| (String) definition[3]); |
| } |
| |
| /** |
| * |
| */ |
| public void setChoice(Object component, String key, String value) { |
| Object[] definition = getDefinition(component, key, "choice"); |
| String[] values = (String[]) definition[3]; |
| if (setChoice(component, (String) definition[1], |
| value, values, values[0])) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public String getChoice(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "choice"); |
| return getString(component, (String) definition[1], |
| ((String[]) definition[3])[0]); |
| } |
| |
| /** |
| * |
| */ |
| public void setBoolean(Object component, String key, boolean value) { |
| Object[] definition = getDefinition(component, key, "boolean"); |
| if (setBoolean(component, (String) definition[1], |
| value, (definition[3] == Boolean.TRUE))) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public boolean getBoolean(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "boolean"); |
| return getBoolean(component, (String) definition[1], |
| (definition[3] == Boolean.TRUE)); |
| } |
| |
| /** |
| * |
| */ |
| public void setInteger(Object component, String key, int value) { |
| Object[] definition = getDefinition(component, key, "integer"); |
| if (setInteger(component, (String) definition[1], |
| value, ((Integer) definition[3]).intValue())) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public int getInteger(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "integer"); |
| return getInteger(component, (String) definition[1], |
| ((Integer) definition[3]).intValue()); |
| } |
| |
| /** |
| * |
| */ |
| public void setIcon(Object component, String key, Image icon) { |
| Object[] definition = getDefinition(component, key, "icon"); |
| if (set(component, (String) definition[1], icon)) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public Image getIcon(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "icon"); |
| return getIcon(component, (String) definition[1], (Image) definition[3]); |
| } |
| |
| /** |
| * |
| */ |
| public void setMethod(Object component, String key, Method method) { //java |
| //midp public void setMethod(Object component, String key, String method) { |
| Object[] definition = getDefinition(component, key, "method"); |
| if (set(component, (String) definition[1], method)) { |
| update(component, definition[2]); |
| } |
| } |
| |
| /** |
| * |
| */ |
| public Method getMethod(Object component, String key) { //java |
| //midp public String getMethod(Object component, String key) { |
| Object[] definition = getDefinition(component, key, "method"); |
| return (Method) get(component, (String) definition[1]); //java |
| //midp return (String) get(component, (String) definition[1]); |
| } |
| |
| /** |
| * |
| */ |
| private void update(Object component, Object mode) { |
| if ("parent" == mode) { |
| component = getParent(component); |
| mode = "validate"; |
| } |
| boolean firstpaint = true; |
| int x = 0; int y = 0; int width = 0; int height = 0; |
| while (component != null) { |
| if (!getBoolean(component, "visible", true)) { break; } |
| if ("paint" == mode) {//|| (firstpaint && (component == content)) |
| Rectangle bounds = getRectangle(component, "bounds"); |
| if (bounds == null) { return; } |
| if (firstpaint) { |
| x = bounds.x; y = bounds.y; |
| width = Math.abs(bounds.width); height = bounds.height; |
| firstpaint = false; |
| } else { |
| x += bounds.x; y += bounds.y; |
| } |
| if (component == content) { |
| repaint(x, y, width, height); |
| } |
| } |
| Object parent = getParent(component); |
| String classname = getClass(parent); |
| if ("combobox" == classname) { |
| parent = get(parent, "combolist"); |
| } |
| else if ("menu" == classname) { |
| parent = get(parent, "popupmenu"); |
| } |
| else if (("paint" == mode) && ("tabbedpane" == classname)) { |
| if (getItemImpl(parent, "component", |
| getInteger(parent, "selected", 0)) != component) { break; } |
| } |
| if (("layout" == mode) || (("validate" == mode) && |
| (("list" == classname) || ("table" == classname) || |
| ("tree" == classname) || ("dialog" == classname) || (parent == content)))) { |
| Rectangle bounds = getRectangle(parent, "bounds"); |
| if (bounds == null) { return; } |
| bounds.width = -1 * Math.abs(bounds.width); |
| mode = "paint"; |
| } |
| component = parent; |
| } |
| } |
| |
| // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- |
| |
| /** |
| * |
| */ |
| private boolean setString(Object component, |
| String key, String value, String defaultvalue) { |
| /*boolean changed = set(component, key, value); |
| if (changed && ("name" == key)) { |
| //for (Class cls = getClass(); cls != null; cls = cls.getSuperclass()) { |
| Field[] fields = getClass().getDeclaredFields(); |
| for (int i = 0; i < fields.length; i++) { |
| if ((fields[i].getType() == Object.class) && |
| fields[i].getName().equals(value)) { |
| try { |
| fields[i].set(this, component); |
| return true; |
| } catch (IllegalAccessException iae) {} |
| } |
| } |
| //} |
| try { |
| getClass().getField(value).set(this, component); |
| } catch (Exception exc) {} |
| } |
| return changed;*/ |
| return set(component, key, value); |
| } |
| |
| /** |
| * |
| */ |
| private String getString(Object component, |
| String key, String defaultvalue) { |
| Object value = get(component, key); |
| return (value == null) ? defaultvalue : (String) value; |
| } |
| |
| /** |
| * |
| */ |
| private boolean setChoice(Object component, |
| String key, String value, String[] values, String defaultvalue) { |
| if (value == null) { |
| return set(component, key, defaultvalue); |
| } |
| for (int i = 0; i < values.length; i++) { |
| if (value.equals(values[i])) { |
| return set(component, key, values[i]); |
| } |
| } |
| throw new IllegalArgumentException("unknown " + value + " for " + key); |
| } |
| |
| /** |
| * |
| */ |
| private boolean setIcon(Object component, |
| String key, String path, Image defaultvalue) { |
| return set(component, key, (path != null) ? getIcon(path) : defaultvalue); |
| } |
| |
| /** |
| * |
| */ |
| private Image getIcon(Object component, String key, Image defaultvalue) { |
| Object value = get(component, key); |
| return (value == null) ? defaultvalue : (Image) value; |
| } |
| |
| /** |
| * |
| */ |
| private boolean setBoolean(Object component, |
| String key, boolean value, boolean defaultvalue) { |
| return set(component, key, (value == defaultvalue) ? null : |
| (value ? Boolean.TRUE : Boolean.FALSE)); |
| } |
| |
| /** |
| * |
| */ |
| private boolean getBoolean(Object component, |
| String key, boolean defaultvalue) { |
| Object value = get(component, key); |
| return (value == null) ? defaultvalue : ((Boolean) value).booleanValue(); |
| } |
| |
| /** |
| * |
| */ |
| private boolean setInteger(Object component, |
| String key, int value, int defaultvalue) { |
| return set(component, key, (value == defaultvalue) ? null : new Integer(value)); |
| } |
| |
| /** |
| * |
| */ |
| private int getInteger(Object component, String key, int defaultvalue) { |
| Object value = get(component, key); |
| return (value == null) ? defaultvalue : ((Integer) value).intValue(); |
| } |
| |
| /** |
| * |
| */ |
| private void setRectangle(Object component, |
| String key, int x, int y, int width, int height) { |
| Rectangle rectangle = getRectangle(component, key); |
| if (rectangle != null) { |
| rectangle.x = x; rectangle.y = y; |
| rectangle.width = width; rectangle.height = height; |
| } |
| else { |
| set(component, key, new Rectangle(x, y, width, height)); //java |
| //midp set(component, key, new int[] { width, height, x, y }); |
| } |
| } |
| |
| /** |
| * |
| */ |
| private Rectangle getRectangle(Object component, String key) { |
| return (Rectangle) get(component, key); //java |
| //midp return (int[]) get(component, key); |
| } |
| |
| // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- |
| |
| /** |
| * |
| */ |
| public Image getIcon(String path) { |
| return getIcon(path, true); |
| } |
| |
| /** |
| * |
| */ |
| public Image getIcon(String path, boolean preload) { |
| if ((path == null) || (path.length() == 0)) { |
| return null; |
| } |
| Image image = null; //(Image) imagepool.get(path); |
| //midp try { |
| //midp image = Image.createImage(path); |
| //midp } catch (IOException ioe) {} |
| //java> |
| try { |
| image = Toolkit.getDefaultToolkit().getImage(getClass().getResource(path)); |
| //image = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(path)); |
| } catch (Throwable e) {} |
| if (image == null) { |
| try { |
| InputStream is = getClass().getResourceAsStream(path); |
| //InputStream is = ClassLoader.getSystemResourceAsStream(path); |
| if (is != null) { |
| byte[] data = new byte[is.available()]; |
| is.read(data, 0, data.length); |
| image = getToolkit().createImage(data); |
| is.close(); |
| } |
| } catch (Throwable e) {} |
| } |
| //if (image == null) { // applet code |
| // try { |
| // image = getImage(getCodeBase(), path); |
| // } catch (Throwable e) {} |
| //} |
| if (preload && (image != null)) { |
| MediaTracker mediatracker = new MediaTracker(this); |
| mediatracker.addImage(image, 1); |
| try { |
| mediatracker.waitForID(1, 50); |
| } catch (InterruptedException ie) { } |
| //imagepool.put(path, image); |
| } |
| //<java |
| return image; |
| } |
| |
| /** |
| * |
| */ |
| public boolean destroy() { |
| return true; |
| } |
| |
| private static Object[] dtd; |
| static { |
| Integer integer_1 = new Integer(-1); |
| Integer integer0 = new Integer(0); |
| Integer integer1 = new Integer(1); |
| String[] orientation = { "horizontal", "vertical" }; |
| String[] leftcenterright = { "left", "center", "right" }; |
| String[] selections = { "single", "interval", "multiple" }; |
| dtd = new Object[] { |
| "component", null, new Object[][] { |
| { "string", "name", "", null }, |
| { "boolean", "enabled", "paint", Boolean.TRUE }, |
| { "boolean", "visible", "parent", Boolean.TRUE }, |
| { "string", "tooltip", "", null }, |
| { "integer", "width", "validate", integer0 }, |
| { "integer", "height", "validate", integer0 }, |
| { "integer", "colspan", "validate", integer1 }, |
| { "integer", "rowspan", "validate", integer1 }, |
| { "integer", "weightx", "validate", integer0 }, |
| { "integer", "weighty", "validate", integer0 }, |
| { "choice", "halign", "validate", |
| new String[] { "fill", "center", "left", "right" } }, |
| { "choice", "valign", "validate", |
| new String[] { "fill", "center", "top", "bottom" } } |
| // component class String null* |
| // parent Object null |
| // (bounds) Rectangle 0 0 0 0 |
| }, |
| "label", "component", new Object[][] { |
| { "string", "text", "validate", null }, |
| { "icon", "icon", "validate", null }, |
| { "choice", "alignment", "validate", leftcenterright }, |
| { "integer", "mnemonic", "paint", integer_1 } }, |
| "button", "label", new Object[][] { |
| { "choice", "alignment", "validate", new String[] { "center", "left", "right" } }, |
| { "method", "action", "", null }, |
| //{ "choice", "type", "", new String[] { "normal", "default", "cancel" } } |
| },//... |
| "checkbox", "label", new Object[][] { |
| { "boolean", "selected", "paint", Boolean.FALSE }, //...group |
| { "string", "group", "paint", null }, //...group |
| { "method", "action", "", null } }, |
| "combobox", "textfield", new Object[][] { |
| { "icon", "icon", "validate", null }, |
| { "integer", "selected", "layout", integer_1 } }, |
| "choice", null, new Object[][] { |
| { "string", "name", "", null }, |
| { "boolean", "enabled", "paint", Boolean.TRUE }, |
| { "string", "text", "", null }, |
| { "icon", "icon", "", null }, |
| { "choice", "alignment", "", leftcenterright }, |
| { "string", "tooltip", "", null } }, |
| "textfield", "component", new Object[][] { |
| { "string", "text", "layout", "" }, |
| { "integer", "columns", "validate", integer0 }, |
| { "boolean", "editable", "paint", Boolean.TRUE }, |
| { "integer", "start", "layout", integer0 }, |
| { "integer", "end", "layout", integer0 }, |
| { "method", "action", "", null } }, |
| "passwordfield", "textfield", new Object[][] {}, |
| "textarea", "textfield", new Object[][] { |
| { "integer", "rows", "validate", integer0 }, |
| { "boolean", "wrap", "layout", Boolean.FALSE } }, |
| "tabbedpane", "component", new Object[][] { |
| { "choice", "placement", "validate", |
| new String[] { "top", "left", "bottom", "right" } }, |
| { "integer", "selected", "paint", integer0 }, |
| { "method", "action", "", null } }, //...focus |
| "tab", "choice", new Object[][] { |
| { "integer", "mnemonic", "paint", integer_1 } }, |
| "panel", "component", new Object[][] { |
| { "integer", "columns", "validate", integer0 }, |
| { "integer", "top", "validate", integer0 }, |
| { "integer", "left", "validate", integer0 }, |
| { "integer", "bottom", "validate", integer0 }, |
| { "integer", "right", "validate", integer0 }, |
| { "integer", "gap", "validate", integer0 } }, |
| "desktop", "component", new Object[][] {}, |
| "dialog", "panel", new Object[][] { |
| { "string", "text", "", null }, |
| { "icon", "icon", "", null }, |
| { "boolean", "modal", "", Boolean.FALSE } }, |
| "spinbox", "textfield", new Object[][] {}, //... |
| "progressbar", "component", new Object[][] { |
| { "choice", "orientation", "validate", orientation }, |
| { "integer", "minimum", "paint", integer0 }, //...checkvalue |
| { "integer", "maximum", "paint", new Integer(100) }, |
| { "integer", "value", "paint", integer0 } }, |
| // change stringpainted |
| "slider", "progressbar", new Object[][] { |
| { "integer", "unit", "", new Integer(5) }, |
| { "integer", "block", "", new Integer(25) }, |
| { "method", "action", "", null } }, |
| // minor/majortickspacing |
| // inverted |
| // labelincrement labelstart |
| "splitpane", "component", new Object[][] { |
| { "choice", "orientation", "validate", orientation }, |
| { "integer", "divider", "layout", integer_1 } }, |
| "list", "component", new Object[][] { |
| { "choice", "selection", "paint", selections }, |
| { "method", "action", "", null } }, //...? |
| "item", "choice", new Object[][] { |
| { "boolean", "selected", "", Boolean.FALSE } }, |
| "table", "component", new Object[][] { |
| { "choice", "selection", "paint", selections }, |
| { "method", "action", "", null } |
| /*{ "choice", "selection", |
| new String[] { "singlerow", "rowinterval", "multiplerow", |
| "cell", "cellinterval", |
| "singlecolumn", "columninterval", "multiplecolumn" } }*/ }, |
| "column", "choice", new Object[][] { |
| { "integer", "width", "", new Integer(80) }}, |
| "row", null, new Object[][] { |
| { "boolean", "selected", "", Boolean.FALSE } }, |
| "cell", "choice", new Object[][] {}, |
| "tree", "component", new Object[][] { |
| { "choice", "selection", "paint", selections }, |
| { "method", "action", "", null }, |
| { "method", "expand", "", null }, |
| { "method", "collapse", "", null } }, |
| "node", "choice", new Object[][] { |
| { "boolean", "selected", "", Boolean.FALSE }, |
| { "boolean", "expanded", "", Boolean.TRUE } }, |
| "separator", "component", new Object[][] {}, |
| "menubar", "component", new Object[][] {}, |
| "menu", "choice", new Object[][] { |
| { "integer", "mnemonic", "paint", integer_1 } }, |
| "menuitem", "choice", new Object[][] { |
| { "string", "accelerator", "", null }, |
| { "method", "action", "", null }, |
| { "integer", "mnemonic", "paint", integer_1 } |
| //... KeyStroke=keyCode+modifiers(SHIFT CTRL META ALT_MASK) |
| }, |
| "checkboxmenuitem", "menuitem", new Object[][] { |
| { "boolean", "selected", "paint", Boolean.FALSE }, //...group |
| { "string", "group", "paint", null } }, //...group |
| "bean", "component", new Object[][] { |
| { "bean", "bean", "", null } |
| } |
| }; |
| } |
| } |