123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- /*
- @ITMillApache2LicenseForJavaFiles@
- */
-
- package com.vaadin.terminal.gwt.client;
-
- import java.util.List;
- import java.util.Set;
-
- import com.google.gwt.core.client.JsArray;
- import com.google.gwt.user.client.DOM;
- import com.google.gwt.user.client.Element;
- import com.google.gwt.user.client.Event;
- import com.google.gwt.user.client.EventPreview;
- import com.google.gwt.user.client.Window;
- import com.google.gwt.user.client.Window.Location;
- import com.google.gwt.user.client.ui.Button;
- import com.google.gwt.user.client.ui.CheckBox;
- import com.google.gwt.user.client.ui.ClickListener;
- import com.google.gwt.user.client.ui.FlowPanel;
- import com.google.gwt.user.client.ui.HTML;
- import com.google.gwt.user.client.ui.HorizontalPanel;
- import com.google.gwt.user.client.ui.Label;
- import com.google.gwt.user.client.ui.Panel;
- import com.google.gwt.user.client.ui.Tree;
- import com.google.gwt.user.client.ui.TreeItem;
- import com.google.gwt.user.client.ui.VerticalPanel;
- import com.google.gwt.user.client.ui.Widget;
- import com.vaadin.terminal.gwt.client.ui.VOverlay;
-
- public final class VDebugConsole extends VOverlay implements Console {
-
- /**
- * Builds number. For example 0-custom_tag in 5.0.0-custom_tag.
- */
- public static final String VERSION;
-
- /* Initialize version numbers from string replaced by build-script. */
- static {
- if ("@VERSION@".equals("@" + "VERSION" + "@")) {
- VERSION = "5.9.9-INTERNAL-NONVERSIONED-DEBUG-BUILD";
- } else {
- VERSION = "@VERSION@";
- }
- }
-
- Element caption = DOM.createDiv();
-
- private Panel panel;
-
- private Button clear = new Button("Clear console");
- private Button restart = new Button("Restart app");
- private Button forceLayout = new Button("Force layout");
- private Button analyzeLayout = new Button("Analyze layouts");
- private HorizontalPanel actions;
- private boolean collapsed = false;
-
- private boolean resizing;
- private int startX;
- private int startY;
- private int initialW;
- private int initialH;
-
- private boolean moving = false;
-
- private int origTop;
-
- private int origLeft;
-
- private ApplicationConnection client;
-
- private static final String help = "Drag=move, shift-drag=resize, doubleclick=min/max."
- + "Use debug=quiet to log only to browser console.";
-
- public VDebugConsole(ApplicationConnection client,
- ApplicationConfiguration cnf, boolean showWindow) {
- super(false, false);
-
- this.client = client;
-
- panel = new FlowPanel();
- if (showWindow) {
- DOM.appendChild(getContainerElement(), caption);
- setWidget(panel);
- caption.setClassName("v-debug-console-caption");
- setStyleName("v-debug-console");
- DOM.setStyleAttribute(getElement(), "zIndex", 20000 + "");
- DOM.setStyleAttribute(getElement(), "overflow", "hidden");
-
- sinkEvents(Event.ONDBLCLICK);
-
- sinkEvents(Event.MOUSEEVENTS);
-
- panel.setStyleName("v-debug-console-content");
-
- caption.setInnerHTML("Debug window");
- caption.setTitle(help);
-
- show();
- minimize();
-
- actions = new HorizontalPanel();
- actions.add(clear);
- actions.add(restart);
- actions.add(forceLayout);
- actions.add(analyzeLayout);
-
- panel.add(actions);
-
- panel.add(new HTML("<i>" + help + "</i>"));
-
- clear.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
- int width = panel.getOffsetWidth();
- int height = panel.getOffsetHeight();
- panel = new FlowPanel();
- panel.setPixelSize(width, height);
- panel.setStyleName("v-debug-console-content");
- panel.add(actions);
- setWidget(panel);
- }
- });
-
- restart.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
-
- String queryString = Window.Location.getQueryString();
- if (queryString != null
- && queryString.contains("restartApplications")) {
- Window.Location.reload();
- } else {
- String url = Location.getHref();
- String separator = "?";
- if (url.contains("?")) {
- separator = "&";
- }
- if (!url.contains("restartApplication")) {
- url += separator;
- url += "restartApplication";
- }
- if (!"".equals(Location.getHash())) {
- String hash = Location.getHash();
- url = url.replace(hash, "") + hash;
- }
- Window.Location.replace(url);
- }
-
- }
- });
-
- forceLayout.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
- VDebugConsole.this.client.forceLayout();
- }
- });
-
- analyzeLayout.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
- List<ApplicationConnection> runningApplications = ApplicationConfiguration
- .getRunningApplications();
- for (ApplicationConnection applicationConnection : runningApplications) {
- applicationConnection.analyzeLayouts();
- }
- }
- });
- analyzeLayout
- .setTitle("Analyzes currently rendered view and "
- + "reports possible common problems in usage of relative sizes."
- + "Will cause server visit/rendering of whole screen + lose of"
- + " all non committed variables form client side.");
-
- }
-
- log("Vaadin application servlet version: " + cnf.getServletVersion());
- log("Widget set is built on version: " + VERSION);
- log("Application version: " + cnf.getApplicationVersion());
-
- if (!cnf.getServletVersion().equals(VERSION)) {
- error("Warning: your widget set seems to be built with a different "
- + "version than the one used on server. Unexpected "
- + "behavior may occur.");
- }
- }
-
- private EventPreview dragpreview = new EventPreview() {
-
- public boolean onEventPreview(Event event) {
- onBrowserEvent(event);
- return false;
- }
- };
-
- @Override
- public void onBrowserEvent(Event event) {
- super.onBrowserEvent(event);
- switch (DOM.eventGetType(event)) {
- case Event.ONMOUSEDOWN:
- if (DOM.eventGetShiftKey(event)) {
- resizing = true;
- DOM.setCapture(getElement());
- startX = DOM.eventGetScreenX(event);
- startY = DOM.eventGetScreenY(event);
- initialW = VDebugConsole.this.getOffsetWidth();
- initialH = VDebugConsole.this.getOffsetHeight();
- DOM.eventCancelBubble(event, true);
- DOM.eventPreventDefault(event);
- DOM.addEventPreview(dragpreview);
- } else if (DOM.eventGetTarget(event) == caption) {
- moving = true;
- startX = DOM.eventGetScreenX(event);
- startY = DOM.eventGetScreenY(event);
- origTop = getAbsoluteTop();
- origLeft = getAbsoluteLeft();
- DOM.eventCancelBubble(event, true);
- DOM.eventPreventDefault(event);
- DOM.addEventPreview(dragpreview);
- }
-
- break;
- case Event.ONMOUSEMOVE:
- if (resizing) {
- int deltaX = startX - DOM.eventGetScreenX(event);
- int detalY = startY - DOM.eventGetScreenY(event);
- int w = initialW - deltaX;
- if (w < 30) {
- w = 30;
- }
- int h = initialH - detalY;
- if (h < 40) {
- h = 40;
- }
- VDebugConsole.this.setPixelSize(w, h);
- DOM.eventCancelBubble(event, true);
- DOM.eventPreventDefault(event);
- } else if (moving) {
- int deltaX = startX - DOM.eventGetScreenX(event);
- int detalY = startY - DOM.eventGetScreenY(event);
- int left = origLeft - deltaX;
- if (left < 0) {
- left = 0;
- }
- int top = origTop - detalY;
- if (top < 0) {
- top = 0;
- }
- VDebugConsole.this.setPopupPosition(left, top);
- DOM.eventCancelBubble(event, true);
- DOM.eventPreventDefault(event);
- }
- break;
- case Event.ONLOSECAPTURE:
- case Event.ONMOUSEUP:
- if (resizing) {
- DOM.releaseCapture(getElement());
- resizing = false;
- } else if (moving) {
- DOM.releaseCapture(getElement());
- moving = false;
- }
- DOM.removeEventPreview(dragpreview);
- break;
- case Event.ONDBLCLICK:
- if (DOM.eventGetTarget(event) == caption) {
- if (collapsed) {
- panel.setVisible(true);
- setPixelSize(220, 300);
- } else {
- panel.setVisible(false);
- setPixelSize(120, 20);
- }
- collapsed = !collapsed;
- }
- break;
- default:
- break;
- }
-
- }
-
- private void minimize() {
- setPixelSize(400, 150);
- setPopupPosition(Window.getClientWidth() - 410, Window
- .getClientHeight() - 160);
- }
-
- @Override
- public void setPixelSize(int width, int height) {
- panel.setHeight((height - 20) + "px");
- panel.setWidth((width - 2) + "px");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.terminal.gwt.client.Console#log(java.lang.String)
- */
- public void log(String msg) {
- panel.add(new HTML(msg));
- System.out.println(msg);
- consoleLog(msg);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.terminal.gwt.client.Console#error(java.lang.String)
- */
- public void error(String msg) {
- panel.add((new HTML(msg)));
- System.err.println(msg);
- consoleErr(msg);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.terminal.gwt.client.Console#printObject(java.lang.
- * Object)
- */
- public void printObject(Object msg) {
- panel.add((new Label(msg.toString())));
- consoleLog(msg.toString());
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.terminal.gwt.client.Console#dirUIDL(com.vaadin
- * .terminal.gwt.client.UIDL)
- */
- public void dirUIDL(UIDL u) {
- if (panel.isAttached()) {
- panel.add(new VUIDLBrowser(u));
- }
- consoleDir(u);
- // consoleLog(u.getChildrenAsXML());
- }
-
- private static native void consoleDir(UIDL u)
- /*-{
- if($wnd.console && $wnd.console.log) {
- if($wnd.console.dir) {
- $wnd.console.dir(u);
- } else {
- $wnd.console.log(u);
- }
- }
-
- }-*/;
-
- private static native void consoleLog(String msg)
- /*-{
- if($wnd.console && $wnd.console.log) {
- $wnd.console.log(msg);
- }
- }-*/;
-
- private static native void consoleErr(String msg)
- /*-{
- if($wnd.console) {
- if ($wnd.console.error)
- $wnd.console.error(msg);
- else if ($wnd.console.log)
- $wnd.console.log(msg);
- }
- }-*/;
-
- public void printLayoutProblems(ValueMap meta, ApplicationConnection ac,
- Set<Paintable> zeroHeightComponents,
- Set<Paintable> zeroWidthComponents) {
- JsArray<ValueMap> valueMapArray = meta
- .getJSValueMapArray("invalidLayouts");
- int size = valueMapArray.length();
- panel.add(new HTML("<div>************************</di>"
- + "<h4>Layouts analyzed on server, total top level problems: "
- + size + " </h4>"));
- if (size > 0) {
- Tree tree = new Tree();
-
- // Position relative does not work here in IE7
- DOM.setStyleAttribute(tree.getElement(), "position", "");
-
- TreeItem root = new TreeItem("Root problems");
- for (int i = 0; i < size; i++) {
- printLayoutError(valueMapArray.get(i), root, ac);
- }
- panel.add(tree);
- tree.addItem(root);
-
- }
- if (zeroHeightComponents.size() > 0 || zeroWidthComponents.size() > 0) {
- panel.add(new HTML("<h4> Client side notifications</h4>"
- + " <em>Following relative sized components where "
- + "rendered to zero size container on client side."
- + " Note that these are not necessary invalid "
- + "states. Just reported here as they might be.</em>"));
- if (zeroHeightComponents.size() > 0) {
- panel.add(new HTML(
- "<p><strong>Vertically zero size:</strong><p>"));
- printClientSideDetectedIssues(zeroHeightComponents, ac);
- }
- if (zeroWidthComponents.size() > 0) {
- panel.add(new HTML(
- "<p><strong>Horizontally zero size:</strong><p>"));
- printClientSideDetectedIssues(zeroWidthComponents, ac);
- }
- }
- log("************************");
- }
-
- private void printClientSideDetectedIssues(
- Set<Paintable> zeroHeightComponents, ApplicationConnection ac) {
- for (final Paintable paintable : zeroHeightComponents) {
- final Container layout = Util.getLayout((Widget) paintable);
-
- VerticalPanel errorDetails = new VerticalPanel();
- errorDetails.add(new Label("" + Util.getSimpleName(paintable)
- + " inside " + Util.getSimpleName(layout)));
- final CheckBox emphasisInUi = new CheckBox(
- "Emphasis components parent in UI (actual component is not visible)");
- emphasisInUi.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
- if (paintable != null) {
- Element element2 = ((Widget) layout).getElement();
- Widget.setStyleName(element2, "invalidlayout",
- emphasisInUi.isChecked());
- }
- }
- });
- errorDetails.add(emphasisInUi);
- panel.add(errorDetails);
- }
- }
-
- private void printLayoutError(ValueMap valueMap, TreeItem parent,
- final ApplicationConnection ac) {
- final String pid = valueMap.getString("id");
- final Paintable paintable = ac.getPaintable(pid);
-
- TreeItem errorNode = new TreeItem();
- VerticalPanel errorDetails = new VerticalPanel();
- errorDetails.add(new Label(Util.getSimpleName(paintable) + " id: "
- + pid));
- if (valueMap.containsKey("heightMsg")) {
- errorDetails.add(new Label("Height problem: "
- + valueMap.getString("heightMsg")));
- }
- if (valueMap.containsKey("widthMsg")) {
- errorDetails.add(new Label("Width problem: "
- + valueMap.getString("widthMsg")));
- }
- final CheckBox emphasisInUi = new CheckBox("Emphasis component in UI");
- emphasisInUi.addClickListener(new ClickListener() {
- public void onClick(Widget sender) {
- if (paintable != null) {
- Element element2 = ((Widget) paintable).getElement();
- Widget.setStyleName(element2, "invalidlayout", emphasisInUi
- .isChecked());
- }
- }
- });
- errorDetails.add(emphasisInUi);
- errorNode.setWidget(errorDetails);
- if (valueMap.containsKey("subErrors")) {
- HTML l = new HTML(
- "<em>Expand this node to show problems that may be dependent on this problem.</em>");
- errorDetails.add(l);
- JsArray<ValueMap> suberrors = valueMap
- .getJSValueMapArray("subErrors");
- for (int i = 0; i < suberrors.length(); i++) {
- ValueMap value = suberrors.get(i);
- printLayoutError(value, errorNode, ac);
- }
-
- }
- parent.addItem(errorNode);
- }
- }
|