/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.forms.containers; import com.eas.client.forms.Anchors; import com.eas.client.forms.Forms; import com.eas.client.forms.HasChildren; import com.eas.client.forms.HasContainerEvents; import com.eas.client.forms.HasJsName; import com.eas.client.forms.Ordering; import com.eas.client.forms.Widget; import com.eas.client.forms.events.ActionEvent; import com.eas.client.forms.events.ComponentEvent; import com.eas.client.forms.events.MouseEvent; import com.eas.client.forms.events.rt.ControlEventsIProxy; import com.eas.client.forms.layouts.MarginLayout; import com.eas.client.forms.layouts.Margin; import com.eas.client.forms.layouts.MarginConstraints; import com.eas.design.Undesignable; import com.eas.script.AlreadyPublishedException; import com.eas.script.EventMethod; import com.eas.script.HasPublished; import com.eas.script.NoPublisherException; import com.eas.script.ScriptFunction; import com.eas.script.Scripts; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ContainerEvent; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JPopupMenu; import jdk.nashorn.api.scripting.JSObject; import jdk.nashorn.internal.runtime.JSType; /** * * @author mg */ public class AnchorsPane extends JPanel implements HasPublished, HasContainerEvents, HasChildren, HasJsName, Widget { private static final String CONSTRUCTOR_JSDOC = "" + "/**\n" + " * A container with Anchors Layout.\n" + " */"; @ScriptFunction(jsDoc = CONSTRUCTOR_JSDOC, params = {}) public AnchorsPane() { super(new MarginLayout()); } @ScriptFunction(jsDoc = JS_NAME_DOC) @Override public String getName() { return super.getName(); } @ScriptFunction @Override public void setName(String name) { super.setName(name); } @ScriptFunction(jsDoc = GET_NEXT_FOCUSABLE_COMPONENT_JSDOC) @Override public JComponent getNextFocusableComponent() { return (JComponent) super.getNextFocusableComponent(); } @ScriptFunction @Override public void setNextFocusableComponent(JComponent aValue) { super.setNextFocusableComponent(aValue); } protected String errorMessage; @ScriptFunction(jsDoc = ERROR_JSDOC) @Override public String getError() { return errorMessage; } @ScriptFunction @Override public void setError(String aValue) { errorMessage = aValue; } @ScriptFunction(jsDoc = BACKGROUND_JSDOC) @Override public Color getBackground() { return super.getBackground(); } @ScriptFunction @Override public void setBackground(Color aValue) { super.setBackground(aValue); } @ScriptFunction(jsDoc = FOREGROUND_JSDOC) @Override public Color getForeground() { return super.getForeground(); } @ScriptFunction @Override public void setForeground(Color aValue) { super.setForeground(aValue); } @ScriptFunction(jsDoc = VISIBLE_JSDOC) @Override public boolean getVisible() { return super.isVisible(); } @ScriptFunction @Override public void setVisible(boolean aValue) { super.setVisible(aValue); } @ScriptFunction(jsDoc = FOCUSABLE_JSDOC) @Override public boolean getFocusable() { return super.isFocusable(); } @ScriptFunction @Override public void setFocusable(boolean aValue) { super.setFocusable(aValue); } @ScriptFunction(jsDoc = ENABLED_JSDOC) @Override public boolean getEnabled() { return super.isEnabled(); } @ScriptFunction @Override public void setEnabled(boolean aValue) { super.setEnabled(aValue); } @ScriptFunction(jsDoc = TOOLTIP_TEXT_JSDOC) @Override public String getToolTipText() { return super.getToolTipText(); } @ScriptFunction @Override public void setToolTipText(String aValue) { super.setToolTipText(aValue); } @ScriptFunction(jsDoc = OPAQUE_TEXT_JSDOC) @Override public boolean getOpaque() { return super.isOpaque(); } @ScriptFunction @Override public void setOpaque(boolean aValue) { super.setOpaque(aValue); } @ScriptFunction(jsDoc = COMPONENT_POPUP_MENU_JSDOC) @Override public JPopupMenu getComponentPopupMenu() { return super.getComponentPopupMenu(); } @ScriptFunction @Override public void setComponentPopupMenu(JPopupMenu aMenu) { super.setComponentPopupMenu(aMenu); } @ScriptFunction(jsDoc = FONT_JSDOC) @Override public Font getFont() { return super.getFont(); } @ScriptFunction @Override public void setFont(Font aFont) { super.setFont(aFont); } @ScriptFunction(jsDoc = CURSOR_JSDOC) @Override public Cursor getCursor() { return super.getCursor(); } @ScriptFunction @Override public void setCursor(Cursor aCursor) { super.setCursor(aCursor); } @ScriptFunction(jsDoc = LEFT_JSDOC) @Override public int getLeft() { return super.getLocation().x; } @ScriptFunction @Override public void setLeft(int aValue) { if (super.getParent() != null && super.getParent().getLayout() instanceof MarginLayout) { MarginLayout.ajustLeft(this, aValue); } super.setLocation(aValue, getTop()); } @ScriptFunction(jsDoc = TOP_JSDOC) @Override public int getTop() { return super.getLocation().y; } @ScriptFunction @Override public void setTop(int aValue) { if (super.getParent() != null && super.getParent().getLayout() instanceof MarginLayout) { MarginLayout.ajustTop(this, aValue); } super.setLocation(getLeft(), aValue); } @ScriptFunction(jsDoc = WIDTH_JSDOC) @Override public int getWidth() { return super.getWidth(); } @ScriptFunction @Override public void setWidth(int aValue) { Widget.setWidth(this, aValue); } @ScriptFunction(jsDoc = HEIGHT_JSDOC) @Override public int getHeight() { return super.getHeight(); } @ScriptFunction @Override public void setHeight(int aValue) { Widget.setHeight(this, aValue); } @ScriptFunction(jsDoc = FOCUS_JSDOC) @Override public void focus() { super.requestFocus(); } // Native API @ScriptFunction(jsDoc = NATIVE_COMPONENT_JSDOC) @Undesignable @Override public JComponent getComponent() { return this; } @ScriptFunction(jsDoc = NATIVE_ELEMENT_JSDOC) @Undesignable @Override public Object getElement() { return null; } private static final String ADD_JSDOC = "" + "/**\n" + " * Appends the specified component to the container with specified placement.\n" + " * @param component the component to add.\n" + " * @param anchors the anchors object for the component, can contain the following properties: left, width, right, top, height, bottom.\n" + " */"; @ScriptFunction(jsDoc = ADD_JSDOC, params = {"component", "anchors"}) public void add(JComponent aComp, Object oAnchors) { if (aComp != null) { MarginConstraints c; if (oAnchors != null) { if (oAnchors instanceof MarginConstraints) { c = (MarginConstraints) oAnchors; } else { c = oAnchors instanceof Anchors ? anchors2MarginConstraints((Anchors) oAnchors) : scriptable2MarginConstraints((JSObject) oAnchors); } } else { Point location = aComp.getLocation(); Dimension size = aComp.getSize(); c = new MarginConstraints(new Margin(location.x, true), new Margin(location.y, true), null, null, new Margin(size.width, true), new Margin(size.height, true)); } super.add(aComp, c); super.revalidate(); super.repaint(); } } private boolean paintingChildren; @Override public Component getComponent(int n) { if (paintingChildren) { int count = super.getComponentCount() - 1; return super.getComponent(count - n); } else { return super.getComponent(n); } } @Override protected void paintChildren(Graphics g) { paintingChildren = true; try { super.paintChildren(g); } finally { paintingChildren = false; } } @ScriptFunction(jsDoc = CHILD_JSDOC, params = "index") @Override public JComponent child(int aIndex) { return (JComponent) super.getComponent(aIndex); } @ScriptFunction(jsDoc = CHILDREN_JSDOC) @Undesignable @Override public JComponent[] children() { List<JComponent> ch = new ArrayList<>(); for (int i = 0; i < getCount(); i++) { ch.add(child(i)); } return ch.toArray(new JComponent[]{}); } @ScriptFunction(jsDoc = REMOVE_JSDOC, params = {"component"}) @Override public void remove(JComponent aComp) { super.remove(aComp); super.revalidate(); super.repaint(); } @ScriptFunction(jsDoc = CLEAR_JSDOC) @Override public void clear() { super.removeAll(); super.revalidate(); super.repaint(); } @ScriptFunction(jsDoc = COUNT_JSDOC) @Undesignable @Override public int getCount() { return super.getComponentCount(); } protected MarginConstraints scriptable2MarginConstraints(JSObject aAnchors) { Object oLeft = aAnchors.hasMember("left") ? aAnchors.getMember("left") : null; Object oWidth = aAnchors.hasMember("width") ? aAnchors.getMember("width") : null; Object oTop = aAnchors.hasMember("top") ? aAnchors.getMember("top") : null; Object oHeight = aAnchors.hasMember("height") ? aAnchors.getMember("height") : null; Object oRight = aAnchors.hasMember("right") ? aAnchors.getMember("right") : null; Object oBottom = aAnchors.hasMember("bottom") ? aAnchors.getMember("bottom") : null; Margin left = Margin.parse(oLeft != null ? JSType.toString(oLeft) : null); Margin width = Margin.parse(oWidth != null ? JSType.toString(oWidth) : null); Margin right = Margin.parse(oRight != null ? JSType.toString(oRight) : null); Margin top = Margin.parse(oTop != null ? JSType.toString(oTop) : null); Margin height = Margin.parse(oHeight != null ? JSType.toString(oHeight) : null); Margin bottom = Margin.parse(oBottom != null ? JSType.toString(oBottom) : null); return new MarginConstraints(left, top, right, bottom, width, height); } protected MarginConstraints anchors2MarginConstraints(Anchors aAnchors) { Object oLeft = aAnchors.getLeft(); Object oWidth = aAnchors.getWidth(); Object oTop = aAnchors.getTop(); Object oHeight = aAnchors.getHeight(); Object oRight = aAnchors.getRight(); Object oBottom = aAnchors.getBottom(); Margin left = Margin.parse(oLeft != null ? JSType.toString(oLeft) : null); Margin width = Margin.parse(oWidth != null ? JSType.toString(oWidth) : null); Margin right = Margin.parse(oRight != null ? JSType.toString(oRight) : null); Margin top = Margin.parse(oTop != null ? JSType.toString(oTop) : null); Margin height = Margin.parse(oHeight != null ? JSType.toString(oHeight) : null); Margin bottom = Margin.parse(oBottom != null ? JSType.toString(oBottom) : null); return new MarginConstraints(left, top, right, bottom, width, height); } public void toFront(JComponent aComp) { Ordering.toFront(this, aComp); } public void toBack(JComponent aComp) { Ordering.toBack(this, aComp); } private static final String TO_FRONT_JSDOC = "" + "/**\n" + "* Brings the specified component to front on this panel.\n" + "* @param component the component.\n" + "* @param count steps to move the component (optional).\n" + "*/"; @ScriptFunction(jsDoc = TO_FRONT_JSDOC, params = {"component", "count"}) public void toFront(JComponent aComp, int aCount) { Ordering.toFront(this, aComp, aCount); } private static final String TO_BACK_JSDOC = "" + "/**\n" + "* Brings the specified component to back on this panel.\n" + "* @param component the component.\n" + "* @param count steps to move the component (optional).\n" + "*/"; @ScriptFunction(jsDoc = TO_BACK_JSDOC) public void toBack(JComponent aComp, int aCount) { Ordering.toBack(this, aComp, aCount); } protected JSObject published; @Override public JSObject getPublished() { if (published == null) { JSObject publisher = Scripts.getSpace().getPublisher(this.getClass().getName()); if (publisher == null || !publisher.isFunction()) { throw new NoPublisherException(); } published = (JSObject) publisher.call(null, new Object[]{this}); } return published; } @Override public void setPublished(JSObject aValue) { if (published != null) { throw new AlreadyPublishedException(); } published = aValue; } protected ControlEventsIProxy eventsProxy = new ControlEventsIProxy(this); @ScriptFunction(jsDoc = ON_MOUSE_CLICKED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseClicked() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseClicked); } @ScriptFunction @Override public void setOnMouseClicked(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseClicked, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_DRAGGED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseDragged() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseDragged); } @ScriptFunction @Override public void setOnMouseDragged(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseDragged, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_ENTERED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseEntered() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseEntered); } @ScriptFunction @Override public void setOnMouseEntered(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseEntered, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_EXITED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseExited() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseExited); } @ScriptFunction @Override public void setOnMouseExited(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseExited, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_MOVED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseMoved() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseMoved); } @ScriptFunction @Override public void setOnMouseMoved(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseMoved, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_PRESSED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMousePressed() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mousePressed); } @ScriptFunction @Override public void setOnMousePressed(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mousePressed, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_RELEASED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseReleased() { return eventsProxy.getHandlers().get(ControlEventsIProxy.mouseReleased); } @ScriptFunction @Override public void setOnMouseReleased(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.mouseReleased, aValue); } @ScriptFunction(jsDoc = ON_MOUSE_WHEEL_MOVED_JSDOC) @EventMethod(eventClass = MouseEvent.class) @Undesignable @Override public JSObject getOnMouseWheelMoved() { return eventsProxy.getOnMouseWheelMoved(); } @ScriptFunction @Override public void setOnMouseWheelMoved(JSObject aValue) { eventsProxy.setOnMouseWheelMoved(aValue); } @ScriptFunction(jsDoc = ON_ACTION_PERFORMED_JSDOC) @EventMethod(eventClass = ActionEvent.class) @Undesignable @Override public JSObject getOnActionPerformed() { return eventsProxy.getHandlers().get(ControlEventsIProxy.actionPerformed); } @ScriptFunction @Override public void setOnActionPerformed(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.actionPerformed, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_HIDDEN_JSDOC) @EventMethod(eventClass = ComponentEvent.class) @Undesignable @Override public JSObject getOnComponentHidden() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentHidden); } @ScriptFunction @Override public void setOnComponentHidden(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentHidden, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_MOVED_JSDOC) @EventMethod(eventClass = ComponentEvent.class) @Undesignable @Override public JSObject getOnComponentMoved() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentMoved); } @ScriptFunction @Override public void setOnComponentMoved(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentMoved, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_RESIZED_JSDOC) @EventMethod(eventClass = ComponentEvent.class) @Undesignable @Override public JSObject getOnComponentResized() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentResized); } @ScriptFunction @Override public void setOnComponentResized(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentResized, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_SHOWN_JSDOC) @EventMethod(eventClass = ComponentEvent.class) @Undesignable @Override public JSObject getOnComponentShown() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentShown); } @ScriptFunction @Override public void setOnComponentShown(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentShown, aValue); } @ScriptFunction(jsDoc = ON_FOCUS_GAINED_JSDOC) @EventMethod(eventClass = FocusEvent.class) @Undesignable @Override public JSObject getOnFocusGained() { return eventsProxy.getHandlers().get(ControlEventsIProxy.focusGained); } @ScriptFunction @Override public void setOnFocusGained(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.focusGained, aValue); } @ScriptFunction(jsDoc = ON_FOCUS_LOST_JSDOC) @EventMethod(eventClass = FocusEvent.class) @Undesignable @Override public JSObject getOnFocusLost() { return eventsProxy != null ? eventsProxy.getHandlers().get(ControlEventsIProxy.focusLost) : null; } @ScriptFunction @Override public void setOnFocusLost(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.focusLost, aValue); } @ScriptFunction(jsDoc = ON_KEY_PRESSED_JSDOC) @EventMethod(eventClass = KeyEvent.class) @Undesignable @Override public JSObject getOnKeyPressed() { return eventsProxy.getHandlers().get(ControlEventsIProxy.keyPressed); } @ScriptFunction @Override public void setOnKeyPressed(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.keyPressed, aValue); } @ScriptFunction(jsDoc = ON_KEY_RELEASED_JSDOC) @EventMethod(eventClass = KeyEvent.class) @Undesignable @Override public JSObject getOnKeyReleased() { return eventsProxy.getHandlers().get(ControlEventsIProxy.keyReleased); } @ScriptFunction @Override public void setOnKeyReleased(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.keyReleased, aValue); } @ScriptFunction(jsDoc = ON_KEY_TYPED_JSDOC) @EventMethod(eventClass = KeyEvent.class) @Undesignable @Override public JSObject getOnKeyTyped() { return eventsProxy.getHandlers().get(ControlEventsIProxy.keyTyped); } @ScriptFunction @Override public void setOnKeyTyped(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.keyTyped, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_ADDED_JSDOC) @EventMethod(eventClass = ContainerEvent.class) @Undesignable @Override public JSObject getOnComponentAdded() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentAdded); } @ScriptFunction @Override public void setOnComponentAdded(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentAdded, aValue); } @ScriptFunction(jsDoc = ON_COMPONENT_REMOVED_JSDOC) @EventMethod(eventClass = ContainerEvent.class) @Undesignable @Override public JSObject getOnComponentRemoved() { return eventsProxy.getHandlers().get(ControlEventsIProxy.componentRemoved); } @ScriptFunction @Override public void setOnComponentRemoved(JSObject aValue) { eventsProxy.getHandlers().put(ControlEventsIProxy.componentRemoved, aValue); } // published parent @ScriptFunction(name = "parent", jsDoc = PARENT_JSDOC) @Override public Widget getParentWidget() { return Forms.lookupPublishedParent(this); } @Override public String toString() { return String.format("%s [%s] count:%d", super.getName() != null ? super.getName() : "", getClass().getSimpleName(), getCount()); } }