You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VDebugConsole.java 29KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.Set;
  8. import com.google.gwt.core.client.GWT;
  9. import com.google.gwt.core.client.JsArray;
  10. import com.google.gwt.core.client.Scheduler.ScheduledCommand;
  11. import com.google.gwt.dom.client.Style;
  12. import com.google.gwt.dom.client.Style.FontWeight;
  13. import com.google.gwt.dom.client.Style.Overflow;
  14. import com.google.gwt.dom.client.Style.Position;
  15. import com.google.gwt.dom.client.Style.Unit;
  16. import com.google.gwt.event.dom.client.ClickEvent;
  17. import com.google.gwt.event.dom.client.ClickHandler;
  18. import com.google.gwt.event.dom.client.KeyCodes;
  19. import com.google.gwt.event.shared.HandlerRegistration;
  20. import com.google.gwt.event.shared.UmbrellaException;
  21. import com.google.gwt.http.client.Request;
  22. import com.google.gwt.http.client.RequestBuilder;
  23. import com.google.gwt.http.client.RequestCallback;
  24. import com.google.gwt.http.client.RequestException;
  25. import com.google.gwt.http.client.Response;
  26. import com.google.gwt.http.client.UrlBuilder;
  27. import com.google.gwt.user.client.Cookies;
  28. import com.google.gwt.user.client.DOM;
  29. import com.google.gwt.user.client.Element;
  30. import com.google.gwt.user.client.Event;
  31. import com.google.gwt.user.client.Event.NativePreviewEvent;
  32. import com.google.gwt.user.client.Event.NativePreviewHandler;
  33. import com.google.gwt.user.client.EventPreview;
  34. import com.google.gwt.user.client.Window;
  35. import com.google.gwt.user.client.Window.Location;
  36. import com.google.gwt.user.client.ui.Button;
  37. import com.google.gwt.user.client.ui.CheckBox;
  38. import com.google.gwt.user.client.ui.FlowPanel;
  39. import com.google.gwt.user.client.ui.HTML;
  40. import com.google.gwt.user.client.ui.HorizontalPanel;
  41. import com.google.gwt.user.client.ui.Label;
  42. import com.google.gwt.user.client.ui.Panel;
  43. import com.google.gwt.user.client.ui.RootPanel;
  44. import com.google.gwt.user.client.ui.VerticalPanel;
  45. import com.google.gwt.user.client.ui.Widget;
  46. import com.vaadin.terminal.gwt.client.ui.VLazyExecutor;
  47. import com.vaadin.terminal.gwt.client.ui.VOverlay;
  48. /**
  49. * A helper console for client side development. The debug console can also be
  50. * used to resolve layout issues, inspect the communication between browser and
  51. * the server, start GWT dev mode and restart application.
  52. *
  53. * <p>
  54. * This implementation is used vaadin is in debug mode (see manual) and
  55. * developer appends "?debug" query parameter to url. Debug information can also
  56. * be shown on browsers internal console only, by appending "?debug=quiet" query
  57. * parameter.
  58. * <p>
  59. * This implementation can be overridden with GWT deferred binding.
  60. *
  61. */
  62. public class VDebugConsole extends VOverlay implements Console {
  63. private final class HighlightModeHandler implements NativePreviewHandler {
  64. private final Label label;
  65. private HighlightModeHandler(Label label) {
  66. this.label = label;
  67. }
  68. public void onPreviewNativeEvent(NativePreviewEvent event) {
  69. if (event.getTypeInt() == Event.ONKEYDOWN
  70. && event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
  71. highlightModeRegistration.removeHandler();
  72. VUIDLBrowser.deHiglight();
  73. return;
  74. }
  75. if (event.getTypeInt() == Event.ONMOUSEMOVE) {
  76. VUIDLBrowser.deHiglight();
  77. Element eventTarget = Util.getElementFromPoint(event
  78. .getNativeEvent().getClientX(), event.getNativeEvent()
  79. .getClientY());
  80. if (getElement().isOrHasChild(eventTarget)) {
  81. return;
  82. }
  83. for (ApplicationConnection a : ApplicationConfiguration
  84. .getRunningApplications()) {
  85. VPaintableWidget paintable = Util.getPaintableForElement(a,
  86. a.getView(), eventTarget);
  87. if (paintable == null) {
  88. paintable = Util.getPaintableForElement(a,
  89. RootPanel.get(), eventTarget);
  90. }
  91. if (paintable != null) {
  92. String pid = VPaintableMap.get(a).getPid(paintable);
  93. VUIDLBrowser.highlight(paintable);
  94. label.setText("Currently focused :"
  95. + paintable.getClass() + " ID:" + pid);
  96. event.cancel();
  97. event.consume();
  98. event.getNativeEvent().stopPropagation();
  99. return;
  100. }
  101. }
  102. }
  103. if (event.getTypeInt() == Event.ONCLICK) {
  104. VUIDLBrowser.deHiglight();
  105. event.cancel();
  106. event.consume();
  107. event.getNativeEvent().stopPropagation();
  108. highlightModeRegistration.removeHandler();
  109. Element eventTarget = Util.getElementFromPoint(event
  110. .getNativeEvent().getClientX(), event.getNativeEvent()
  111. .getClientY());
  112. for (ApplicationConnection a : ApplicationConfiguration
  113. .getRunningApplications()) {
  114. VPaintableWidget paintable = Util.getPaintableForElement(a,
  115. a.getView(), eventTarget);
  116. if (paintable == null) {
  117. paintable = Util.getPaintableForElement(a,
  118. RootPanel.get(), eventTarget);
  119. }
  120. if (paintable != null) {
  121. a.highlightComponent(paintable);
  122. return;
  123. }
  124. }
  125. }
  126. event.cancel();
  127. }
  128. }
  129. private static final String POS_COOKIE_NAME = "VDebugConsolePos";
  130. private HandlerRegistration highlightModeRegistration;
  131. Element caption = DOM.createDiv();
  132. private Panel panel;
  133. private Button clear = new Button("C");
  134. private Button restart = new Button("R");
  135. private Button forceLayout = new Button("FL");
  136. private Button analyzeLayout = new Button("AL");
  137. private Button savePosition = new Button("S");
  138. private Button highlight = new Button("H");
  139. private CheckBox hostedMode = new CheckBox("GWT");
  140. private CheckBox autoScroll = new CheckBox("Autoscroll ");
  141. private HorizontalPanel actions;
  142. private boolean collapsed = false;
  143. private boolean resizing;
  144. private int startX;
  145. private int startY;
  146. private int initialW;
  147. private int initialH;
  148. private boolean moving = false;
  149. private int origTop;
  150. private int origLeft;
  151. private static final String help = "Drag title=move, shift-drag=resize, doubleclick title=min/max."
  152. + "Use debug=quiet to log only to browser console.";
  153. public VDebugConsole() {
  154. super(false, false);
  155. getElement().getStyle().setOverflow(Overflow.HIDDEN);
  156. clear.setTitle("Clear console");
  157. restart.setTitle("Restart app");
  158. forceLayout.setTitle("Force layout");
  159. analyzeLayout.setTitle("Analyze layouts");
  160. savePosition.setTitle("Save pos");
  161. }
  162. private EventPreview dragpreview = new EventPreview() {
  163. public boolean onEventPreview(Event event) {
  164. onBrowserEvent(event);
  165. return false;
  166. }
  167. };
  168. private boolean quietMode;
  169. @Override
  170. public void onBrowserEvent(Event event) {
  171. super.onBrowserEvent(event);
  172. switch (DOM.eventGetType(event)) {
  173. case Event.ONMOUSEDOWN:
  174. if (DOM.eventGetShiftKey(event)) {
  175. resizing = true;
  176. DOM.setCapture(getElement());
  177. startX = DOM.eventGetScreenX(event);
  178. startY = DOM.eventGetScreenY(event);
  179. initialW = VDebugConsole.this.getOffsetWidth();
  180. initialH = VDebugConsole.this.getOffsetHeight();
  181. DOM.eventCancelBubble(event, true);
  182. DOM.eventPreventDefault(event);
  183. DOM.addEventPreview(dragpreview);
  184. } else if (DOM.eventGetTarget(event) == caption) {
  185. moving = true;
  186. startX = DOM.eventGetScreenX(event);
  187. startY = DOM.eventGetScreenY(event);
  188. origTop = getAbsoluteTop();
  189. origLeft = getAbsoluteLeft();
  190. DOM.eventCancelBubble(event, true);
  191. DOM.eventPreventDefault(event);
  192. DOM.addEventPreview(dragpreview);
  193. }
  194. break;
  195. case Event.ONMOUSEMOVE:
  196. if (resizing) {
  197. int deltaX = startX - DOM.eventGetScreenX(event);
  198. int detalY = startY - DOM.eventGetScreenY(event);
  199. int w = initialW - deltaX;
  200. if (w < 30) {
  201. w = 30;
  202. }
  203. int h = initialH - detalY;
  204. if (h < 40) {
  205. h = 40;
  206. }
  207. VDebugConsole.this.setPixelSize(w, h);
  208. DOM.eventCancelBubble(event, true);
  209. DOM.eventPreventDefault(event);
  210. } else if (moving) {
  211. int deltaX = startX - DOM.eventGetScreenX(event);
  212. int detalY = startY - DOM.eventGetScreenY(event);
  213. int left = origLeft - deltaX;
  214. if (left < 0) {
  215. left = 0;
  216. }
  217. int top = origTop - detalY;
  218. if (top < 0) {
  219. top = 0;
  220. }
  221. VDebugConsole.this.setPopupPosition(left, top);
  222. DOM.eventCancelBubble(event, true);
  223. DOM.eventPreventDefault(event);
  224. }
  225. break;
  226. case Event.ONLOSECAPTURE:
  227. case Event.ONMOUSEUP:
  228. if (resizing) {
  229. DOM.releaseCapture(getElement());
  230. resizing = false;
  231. } else if (moving) {
  232. DOM.releaseCapture(getElement());
  233. moving = false;
  234. }
  235. DOM.removeEventPreview(dragpreview);
  236. break;
  237. case Event.ONDBLCLICK:
  238. if (DOM.eventGetTarget(event) == caption) {
  239. if (collapsed) {
  240. panel.setVisible(true);
  241. setToDefaultSizeAndPos();
  242. } else {
  243. panel.setVisible(false);
  244. setPixelSize(120, 20);
  245. setPopupPosition(Window.getClientWidth() - 125,
  246. Window.getClientHeight() - 25);
  247. }
  248. collapsed = !collapsed;
  249. }
  250. break;
  251. default:
  252. break;
  253. }
  254. }
  255. private void setToDefaultSizeAndPos() {
  256. String cookie = Cookies.getCookie(POS_COOKIE_NAME);
  257. int width, height, top, left;
  258. boolean autoScrollValue = false;
  259. if (cookie != null) {
  260. String[] split = cookie.split(",");
  261. left = Integer.parseInt(split[0]);
  262. top = Integer.parseInt(split[1]);
  263. width = Integer.parseInt(split[2]);
  264. height = Integer.parseInt(split[3]);
  265. autoScrollValue = Boolean.valueOf(split[4]);
  266. } else {
  267. width = 400;
  268. height = 150;
  269. top = Window.getClientHeight() - 160;
  270. left = Window.getClientWidth() - 410;
  271. }
  272. setPixelSize(width, height);
  273. setPopupPosition(left, top);
  274. autoScroll.setValue(autoScrollValue);
  275. }
  276. @Override
  277. public void setPixelSize(int width, int height) {
  278. if (height < 20) {
  279. height = 20;
  280. }
  281. if (width < 2) {
  282. width = 2;
  283. }
  284. panel.setHeight((height - 20) + "px");
  285. panel.setWidth((width - 2) + "px");
  286. getElement().getStyle().setWidth(width, Unit.PX);
  287. }
  288. /*
  289. * (non-Javadoc)
  290. *
  291. * @see com.vaadin.terminal.gwt.client.Console#log(java.lang.String)
  292. */
  293. public void log(String msg) {
  294. if (msg == null) {
  295. msg = "null";
  296. }
  297. // remoteLog(msg);
  298. logToDebugWindow(msg, false);
  299. GWT.log(msg);
  300. consoleLog(msg);
  301. }
  302. private List<String> msgQueue = new LinkedList<String>();
  303. private ScheduledCommand doSend = new ScheduledCommand() {
  304. public void execute() {
  305. if (!msgQueue.isEmpty()) {
  306. RequestBuilder requestBuilder = new RequestBuilder(
  307. RequestBuilder.POST, getRemoteLogUrl());
  308. try {
  309. String requestData = "";
  310. for (String str : msgQueue) {
  311. requestData += str;
  312. requestData += "\n";
  313. }
  314. requestBuilder.sendRequest(requestData,
  315. new RequestCallback() {
  316. public void onResponseReceived(Request request,
  317. Response response) {
  318. // TODO Auto-generated method stub
  319. }
  320. public void onError(Request request,
  321. Throwable exception) {
  322. // TODO Auto-generated method stub
  323. }
  324. });
  325. } catch (RequestException e) {
  326. // TODO Auto-generated catch block
  327. e.printStackTrace();
  328. }
  329. msgQueue.clear();
  330. }
  331. }
  332. };
  333. private VLazyExecutor sendToRemoteLog = new VLazyExecutor(350, doSend);
  334. protected String getRemoteLogUrl() {
  335. return "http://sun-vehje.local:8080/remotelog/";
  336. }
  337. protected void remoteLog(String msg) {
  338. msgQueue.add(msg);
  339. sendToRemoteLog.trigger();
  340. }
  341. /**
  342. * Logs the given message to the debug window.
  343. *
  344. * @param msg
  345. * The message to log. Must not be null.
  346. */
  347. private void logToDebugWindow(String msg, boolean error) {
  348. Widget row;
  349. if (error) {
  350. row = createErrorHtml(msg);
  351. } else {
  352. row = new HTML(msg);
  353. }
  354. panel.add(row);
  355. if (autoScroll.getValue()) {
  356. row.getElement().scrollIntoView();
  357. }
  358. }
  359. private HTML createErrorHtml(String msg) {
  360. HTML html = new HTML(msg);
  361. html.getElement().getStyle().setColor("#f00");
  362. html.getElement().getStyle().setFontWeight(FontWeight.BOLD);
  363. return html;
  364. }
  365. /*
  366. * (non-Javadoc)
  367. *
  368. * @see com.vaadin.terminal.gwt.client.Console#error(java.lang.String)
  369. */
  370. public void error(String msg) {
  371. if (msg == null) {
  372. msg = "null";
  373. }
  374. logToDebugWindow(msg, true);
  375. GWT.log(msg);
  376. consoleErr(msg);
  377. }
  378. /*
  379. * (non-Javadoc)
  380. *
  381. * @see com.vaadin.terminal.gwt.client.Console#printObject(java.lang.
  382. * Object)
  383. */
  384. public void printObject(Object msg) {
  385. String str;
  386. if (msg == null) {
  387. str = "null";
  388. } else {
  389. str = msg.toString();
  390. }
  391. panel.add((new Label(str)));
  392. consoleLog(str);
  393. }
  394. /*
  395. * (non-Javadoc)
  396. *
  397. * @see com.vaadin.terminal.gwt.client.Console#dirUIDL(com.vaadin
  398. * .terminal.gwt.client.UIDL)
  399. */
  400. public void dirUIDL(ValueMap u, ApplicationConfiguration conf) {
  401. if (panel.isAttached()) {
  402. VUIDLBrowser vuidlBrowser = new VUIDLBrowser(u, conf);
  403. vuidlBrowser.setText("Response:");
  404. panel.add(vuidlBrowser);
  405. }
  406. consoleDir(u);
  407. // consoleLog(u.getChildrenAsXML());
  408. }
  409. private static native void consoleDir(ValueMap u)
  410. /*-{
  411. if($wnd.console && $wnd.console.log) {
  412. if($wnd.console.dir) {
  413. $wnd.console.dir(u);
  414. } else {
  415. $wnd.console.log(u);
  416. }
  417. }
  418. }-*/;
  419. private static native void consoleLog(String msg)
  420. /*-{
  421. if($wnd.console && $wnd.console.log) {
  422. $wnd.console.log(msg);
  423. }
  424. }-*/;
  425. private static native void consoleErr(String msg)
  426. /*-{
  427. if($wnd.console) {
  428. if ($wnd.console.error)
  429. $wnd.console.error(msg);
  430. else if ($wnd.console.log)
  431. $wnd.console.log(msg);
  432. }
  433. }-*/;
  434. public void printLayoutProblems(ValueMap meta, ApplicationConnection ac,
  435. Set<VPaintableWidget> zeroHeightComponents,
  436. Set<VPaintableWidget> zeroWidthComponents) {
  437. JsArray<ValueMap> valueMapArray = meta
  438. .getJSValueMapArray("invalidLayouts");
  439. int size = valueMapArray.length();
  440. panel.add(new HTML("<div>************************</di>"
  441. + "<h4>Layouts analyzed on server, total top level problems: "
  442. + size + " </h4>"));
  443. if (size > 0) {
  444. SimpleTree root = new SimpleTree("Root problems");
  445. for (int i = 0; i < size; i++) {
  446. printLayoutError(valueMapArray.get(i), root, ac);
  447. }
  448. panel.add(root);
  449. }
  450. if (zeroHeightComponents.size() > 0 || zeroWidthComponents.size() > 0) {
  451. panel.add(new HTML("<h4> Client side notifications</h4>"
  452. + " <em>The following relative sized components were "
  453. + "rendered to a zero size container on the client side."
  454. + " Note that these are not necessarily invalid "
  455. + "states, but reported here as they might be.</em>"));
  456. if (zeroHeightComponents.size() > 0) {
  457. panel.add(new HTML(
  458. "<p><strong>Vertically zero size:</strong><p>"));
  459. printClientSideDetectedIssues(zeroHeightComponents, ac);
  460. }
  461. if (zeroWidthComponents.size() > 0) {
  462. panel.add(new HTML(
  463. "<p><strong>Horizontally zero size:</strong><p>"));
  464. printClientSideDetectedIssues(zeroWidthComponents, ac);
  465. }
  466. }
  467. log("************************");
  468. }
  469. private void printClientSideDetectedIssues(
  470. Set<VPaintableWidget> zeroHeightComponents, ApplicationConnection ac) {
  471. for (final VPaintableWidget paintable : zeroHeightComponents) {
  472. final Container layout = Util.getLayout(paintable
  473. .getWidgetForPaintable());
  474. VerticalPanel errorDetails = new VerticalPanel();
  475. errorDetails.add(new Label("" + Util.getSimpleName(paintable)
  476. + " inside " + Util.getSimpleName(layout)));
  477. final CheckBox emphasisInUi = new CheckBox(
  478. "Emphasize components parent in UI (the actual component is not visible)");
  479. emphasisInUi.addClickHandler(new ClickHandler() {
  480. public void onClick(ClickEvent event) {
  481. if (paintable != null) {
  482. Element element2 = layout.getWidgetForPaintable()
  483. .getElement();
  484. Widget.setStyleName(element2, "invalidlayout",
  485. emphasisInUi.getValue());
  486. }
  487. }
  488. });
  489. errorDetails.add(emphasisInUi);
  490. panel.add(errorDetails);
  491. }
  492. }
  493. private void printLayoutError(ValueMap valueMap, SimpleTree root,
  494. final ApplicationConnection ac) {
  495. final String pid = valueMap.getString("id");
  496. final VPaintableWidget paintable = (VPaintableWidget) VPaintableMap
  497. .get(ac).getPaintable(pid);
  498. SimpleTree errorNode = new SimpleTree();
  499. VerticalPanel errorDetails = new VerticalPanel();
  500. errorDetails.add(new Label(Util.getSimpleName(paintable) + " id: "
  501. + pid));
  502. if (valueMap.containsKey("heightMsg")) {
  503. errorDetails.add(new Label("Height problem: "
  504. + valueMap.getString("heightMsg")));
  505. }
  506. if (valueMap.containsKey("widthMsg")) {
  507. errorDetails.add(new Label("Width problem: "
  508. + valueMap.getString("widthMsg")));
  509. }
  510. final CheckBox emphasisInUi = new CheckBox("Emphasize component in UI");
  511. emphasisInUi.addClickHandler(new ClickHandler() {
  512. public void onClick(ClickEvent event) {
  513. if (paintable != null) {
  514. Element element2 = paintable.getWidgetForPaintable()
  515. .getElement();
  516. Widget.setStyleName(element2, "invalidlayout",
  517. emphasisInUi.getValue());
  518. }
  519. }
  520. });
  521. errorDetails.add(emphasisInUi);
  522. errorNode.add(errorDetails);
  523. if (valueMap.containsKey("subErrors")) {
  524. HTML l = new HTML(
  525. "<em>Expand this node to show problems that may be dependent on this problem.</em>");
  526. errorDetails.add(l);
  527. JsArray<ValueMap> suberrors = valueMap
  528. .getJSValueMapArray("subErrors");
  529. for (int i = 0; i < suberrors.length(); i++) {
  530. ValueMap value = suberrors.get(i);
  531. printLayoutError(value, errorNode, ac);
  532. }
  533. }
  534. root.add(errorNode);
  535. }
  536. public void log(Throwable e) {
  537. if (e instanceof UmbrellaException) {
  538. UmbrellaException ue = (UmbrellaException) e;
  539. for (Throwable t : ue.getCauses()) {
  540. log(t);
  541. }
  542. return;
  543. }
  544. log(Util.getSimpleName(e) + ": " + e.getMessage());
  545. GWT.log(e.getMessage(), e);
  546. }
  547. public void error(Throwable e) {
  548. if (e instanceof UmbrellaException) {
  549. UmbrellaException ue = (UmbrellaException) e;
  550. for (Throwable t : ue.getCauses()) {
  551. error(t);
  552. }
  553. return;
  554. }
  555. error(Util.getSimpleName(e) + ": " + e.getMessage());
  556. GWT.log(e.getMessage(), e);
  557. }
  558. public void init() {
  559. panel = new FlowPanel();
  560. if (!quietMode) {
  561. DOM.appendChild(getContainerElement(), caption);
  562. setWidget(panel);
  563. caption.setClassName("v-debug-console-caption");
  564. setStyleName("v-debug-console");
  565. getElement().getStyle().setZIndex(20000);
  566. getElement().getStyle().setOverflow(Overflow.HIDDEN);
  567. sinkEvents(Event.ONDBLCLICK);
  568. sinkEvents(Event.MOUSEEVENTS);
  569. panel.setStyleName("v-debug-console-content");
  570. caption.setInnerHTML("Debug window");
  571. caption.getStyle().setHeight(25, Unit.PX);
  572. caption.setTitle(help);
  573. show();
  574. setToDefaultSizeAndPos();
  575. actions = new HorizontalPanel();
  576. Style style = actions.getElement().getStyle();
  577. style.setPosition(Position.ABSOLUTE);
  578. style.setBackgroundColor("#666");
  579. style.setLeft(135, Unit.PX);
  580. style.setHeight(25, Unit.PX);
  581. style.setTop(0, Unit.PX);
  582. actions.add(clear);
  583. actions.add(restart);
  584. actions.add(forceLayout);
  585. actions.add(analyzeLayout);
  586. actions.add(highlight);
  587. highlight
  588. .setTitle("Select a component and print details about it to the server log and client side console.");
  589. actions.add(savePosition);
  590. savePosition
  591. .setTitle("Saves the position and size of debug console to a cookie");
  592. actions.add(autoScroll);
  593. actions.add(hostedMode);
  594. if (Location.getParameter("gwt.codesvr") != null) {
  595. hostedMode.setValue(true);
  596. }
  597. hostedMode.addClickHandler(new ClickHandler() {
  598. public void onClick(ClickEvent event) {
  599. if (hostedMode.getValue()) {
  600. addHMParameter();
  601. } else {
  602. removeHMParameter();
  603. }
  604. }
  605. private void addHMParameter() {
  606. UrlBuilder createUrlBuilder = Location.createUrlBuilder();
  607. createUrlBuilder.setParameter("gwt.codesvr",
  608. "localhost:9997");
  609. Location.assign(createUrlBuilder.buildString());
  610. }
  611. private void removeHMParameter() {
  612. UrlBuilder createUrlBuilder = Location.createUrlBuilder();
  613. createUrlBuilder.removeParameter("gwt.codesvr");
  614. Location.assign(createUrlBuilder.buildString());
  615. }
  616. });
  617. autoScroll
  618. .setTitle("Automatically scroll so that new messages are visible");
  619. panel.add(actions);
  620. panel.add(new HTML("<i>" + help + "</i>"));
  621. clear.addClickHandler(new ClickHandler() {
  622. public void onClick(ClickEvent event) {
  623. int width = panel.getOffsetWidth();
  624. int height = panel.getOffsetHeight();
  625. panel = new FlowPanel();
  626. panel.setPixelSize(width, height);
  627. panel.setStyleName("v-debug-console-content");
  628. panel.add(actions);
  629. setWidget(panel);
  630. }
  631. });
  632. restart.addClickHandler(new ClickHandler() {
  633. public void onClick(ClickEvent event) {
  634. String queryString = Window.Location.getQueryString();
  635. if (queryString != null
  636. && queryString.contains("restartApplications")) {
  637. Window.Location.reload();
  638. } else {
  639. String url = Location.getHref();
  640. String separator = "?";
  641. if (url.contains("?")) {
  642. separator = "&";
  643. }
  644. if (!url.contains("restartApplication")) {
  645. url += separator;
  646. url += "restartApplication";
  647. }
  648. if (!"".equals(Location.getHash())) {
  649. String hash = Location.getHash();
  650. url = url.replace(hash, "") + hash;
  651. }
  652. Window.Location.replace(url);
  653. }
  654. }
  655. });
  656. forceLayout.addClickHandler(new ClickHandler() {
  657. public void onClick(ClickEvent event) {
  658. // TODO for each client in appconf force layout
  659. // VDebugConsole.this.client.forceLayout();
  660. }
  661. });
  662. analyzeLayout.addClickHandler(new ClickHandler() {
  663. public void onClick(ClickEvent event) {
  664. List<ApplicationConnection> runningApplications = ApplicationConfiguration
  665. .getRunningApplications();
  666. for (ApplicationConnection applicationConnection : runningApplications) {
  667. applicationConnection.analyzeLayouts();
  668. }
  669. }
  670. });
  671. analyzeLayout
  672. .setTitle("Analyzes currently rendered view and "
  673. + "reports possible common problems in usage of relative sizes."
  674. + "Will cause server visit/rendering of whole screen and loss of"
  675. + " all non committed variables form client side.");
  676. savePosition.addClickHandler(new ClickHandler() {
  677. public void onClick(ClickEvent event) {
  678. String pos = getAbsoluteLeft() + "," + getAbsoluteTop()
  679. + "," + getOffsetWidth() + "," + getOffsetHeight()
  680. + "," + autoScroll.getValue();
  681. Cookies.setCookie(POS_COOKIE_NAME, pos);
  682. }
  683. });
  684. highlight.addClickHandler(new ClickHandler() {
  685. public void onClick(ClickEvent event) {
  686. final Label label = new Label("--");
  687. log("<i>Use mouse to select a component or click ESC to exit highlight mode.</i>");
  688. panel.add(label);
  689. highlightModeRegistration = Event
  690. .addNativePreviewHandler(new HighlightModeHandler(
  691. label));
  692. }
  693. });
  694. }
  695. log("Starting Vaadin client side engine. Widgetset: "
  696. + GWT.getModuleName());
  697. log("Widget set is built on version: "
  698. + ApplicationConfiguration.VERSION);
  699. logToDebugWindow("<div class=\"v-theme-version v-theme-version-"
  700. + ApplicationConfiguration.VERSION.replaceAll("\\.", "_")
  701. + "\">Warning: widgetset version "
  702. + ApplicationConfiguration.VERSION
  703. + " does not seem to match theme version </div>", true);
  704. }
  705. public void setQuietMode(boolean quietDebugMode) {
  706. quietMode = quietDebugMode;
  707. }
  708. }