docs: public void onModuleLoad() {
      asyncGetJson(AGGREGATORS_URL, new GotJsonCallback() {
        public void got(final JSONValue json) {
          // Do we need more manual type checking?  Not sure what will happen
          // in the browser if something other than an array is returned.
          final JSONArray aggs = json.isArray();
          for (int i = 0; i < aggs.size(); i++) {
            aggregators.add(aggs.get(i).isString().stringValue());
          }
          ((MetricForm) metrics.getWidget(0)).setAggregators(aggregators);
          refreshFromQueryString();
          refreshGraph();
        }
      });
  
      // All UI elements need to regenerate the graph when changed.
      {
        final ValueChangeHandler<Date> vch = new ValueChangeHandler<Date>() {
          public void onValueChange(final ValueChangeEvent<Date> event) {
            refreshGraph();
          }
        };
        TextBox tb = start_datebox.getTextBox();
        tb.addBlurHandler(refreshgraph);
        tb.addKeyPressHandler(refreshgraph);
        start_datebox.addValueChangeHandler(vch);
        tb = end_datebox.getTextBox();
        tb.addBlurHandler(refreshgraph);
        tb.addKeyPressHandler(refreshgraph);
        end_datebox.addValueChangeHandler(vch);
      }
      autoreoload_interval.addBlurHandler(refreshgraph);
      autoreoload_interval.addKeyPressHandler(refreshgraph);
      yrange.addBlurHandler(refreshgraph);
      yrange.addKeyPressHandler(refreshgraph);
      y2range.addBlurHandler(refreshgraph);
      y2range.addKeyPressHandler(refreshgraph);
      ylog.addClickHandler(new AdjustYRangeCheckOnClick(ylog, yrange));
      y2log.addClickHandler(new AdjustYRangeCheckOnClick(y2log, y2range));
      ylog.addClickHandler(refreshgraph);
      y2log.addClickHandler(refreshgraph);
      ylabel.addBlurHandler(refreshgraph);
      ylabel.addKeyPressHandler(refreshgraph);
      y2label.addBlurHandler(refreshgraph);
      y2label.addKeyPressHandler(refreshgraph);
      yformat.addBlurHandler(refreshgraph);
      yformat.addKeyPressHandler(refreshgraph);
      y2format.addBlurHandler(refreshgraph);
      y2format.addKeyPressHandler(refreshgraph);
      wxh.addBlurHandler(refreshgraph);
      wxh.addKeyPressHandler(refreshgraph);
      global_annotations.addBlurHandler(refreshgraph);
      global_annotations.addKeyPressHandler(refreshgraph);
      horizontalkey.addClickHandler(refreshgraph);
      keybox.addClickHandler(refreshgraph);
      nokey.addClickHandler(refreshgraph);
      smooth.addClickHandler(refreshgraph);
      styles.addChangeHandler(refreshgraph);
  
      yrange.setValidationRegexp("^("                            // Nothing or
                                 + "|\\[([-+.0-9eE]+|\\*)?"      // "[start
                                 + ":([-+.0-9eE]+|\\*)?\\])$");  //   :end]"
      yrange.setVisibleLength(5);
      yrange.setMaxLength(44);  // MAX=2^26=20 chars: "[-$MAX:$MAX]"
      yrange.setText("[0:]");
  
      y2range.setValidationRegexp("^("                            // Nothing or
                                  + "|\\[([-+.0-9eE]+|\\*)?"      // "[start
                                  + ":([-+.0-9eE]+|\\*)?\\])$");  //   :end]"
      y2range.setVisibleLength(5);
      y2range.setMaxLength(44);  // MAX=2^26=20 chars: "[-$MAX:$MAX]"
      y2range.setText("[0:]");
      y2range.setEnabled(false);
      y2log.setEnabled(false);
  
      ylabel.setVisibleLength(10);
      ylabel.setMaxLength(50);  // Arbitrary limit.
      y2label.setVisibleLength(10);
      y2label.setMaxLength(50);  // Arbitrary limit.
      y2label.setEnabled(false);
  
      yformat.setValidationRegexp("^(|.*%..*)$");  // Nothing or at least one %?
      yformat.setVisibleLength(10);
      yformat.setMaxLength(16);  // Arbitrary limit.
      y2format.setValidationRegexp("^(|.*%..*)$");  // Nothing or at least one %?
      y2format.setVisibleLength(10);
      y2format.setMaxLength(16);  // Arbitrary limit.
      y2format.setEnabled(false);
  
      wxh.setValidationRegexp("^[1-9][0-9]{2,}x[1-9][0-9]{2,}$");  // 100x100
      wxh.setVisibleLength(9);
      wxh.setMaxLength(11);  // 99999x99999
      wxh.setText((Window.getClientWidth() - 20) + "x"
                  + (Window.getClientHeight() * 4 / 5));
  
      final FlexTable table = new FlexTable();
      table.setText(0, 0, "From");
      {
        final HorizontalPanel hbox = new HorizontalPanel();
        hbox.add(new InlineLabel("To"));
        final Anchor now = new Anchor("(now)");
        now.addClickHandler(new ClickHandler() {
          public void onClick(final ClickEvent event) {
            end_datebox.setValue(new Date());
            refreshGraph();
          }
        });
        hbox.add(now);
        hbox.add(autoreload);
        hbox.setWidth("100%");
        table.setWidget(0, 1, hbox);
      }
      autoreload.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
        @Override
        public void onValueChange(final ValueChangeEvent<Boolean> event) {
          if (autoreload.getValue()) {
            final HorizontalPanel hbox = new HorizontalPanel();
            hbox.setWidth("100%");
            hbox.add(new InlineLabel("Every:"));
            hbox.add(autoreoload_interval);
            hbox.add(new InlineLabel("seconds"));
            table.setWidget(1, 1, hbox);
            if (autoreoload_interval.getValue().isEmpty()) {
              autoreoload_interval.setValue("15");
            }
            autoreoload_interval.setFocus(true);
            lastgraphuri = "";  // Force refreshGraph.
            refreshGraph();     // Trigger the 1st auto-reload
          } else {
            table.setWidget(1, 1, end_datebox);
          }
        }
      });
      autoreoload_interval.setValidationRegexp("^([5-9]|[1-9][0-9]+)$");  // >=5s
      autoreoload_interval.setMaxLength(4);
      autoreoload_interval.setVisibleLength(8);
  
      table.setWidget(1, 0, start_datebox);
      table.setWidget(1, 1, end_datebox);
      {
        final HorizontalPanel hbox = new HorizontalPanel();
        hbox.add(new InlineLabel("WxH:"));
        hbox.add(wxh);
        table.setWidget(0, 3, hbox);
      }
      {
        final HorizontalPanel hbox = new HorizontalPanel();
        hbox.add(global_annotations);
        table.setWidget(0, 4, hbox);
      }
      {
        addMetricForm("metric 1", 0);
        metrics.selectTab(0);
        metrics.add(new InlineLabel("Loading..."), "+");
        metrics.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() {
          public void onBeforeSelection(final BeforeSelectionEvent<Integer> event) {
            final int item = event.getItem();
            final int nitems = metrics.getWidgetCount();
            if (item == nitems - 1) {  // Last item: the "+" was clicked.
              event.cancel();
              final MetricForm metric = addMetricForm("metric " + nitems, item);
              metrics.selectTab(item);
              metric.setFocus(true);
            }
          }
        });
        table.setWidget(2, 0, metrics);
      }
      table.getFlexCellFormatter().setColSpan(2, 0, 2);
      table.getFlexCellFormatter().setRowSpan(1, 3, 2);
      final DecoratedTabPanel optpanel = new DecoratedTabPanel();
      optpanel.add(makeAxesPanel(), "Axes");
      optpanel.add(makeKeyPanel(), "Key");
      optpanel.add(makeStylePanel(), "Style");
      optpanel.selectTab(0);
      table.setWidget(1, 3, optpanel);
      table.getFlexCellFormatter().setColSpan(1, 3, 2);
  
      final DecoratorPanel decorator = new DecoratorPanel();
      decorator.setWidget(table);
      final VerticalPanel graphpanel = new VerticalPanel();
      graphpanel.add(decorator);
      {
        final VerticalPanel graphvbox = new VerticalPanel();
        graphvbox.add(graphstatus);
  
        graph.setVisible(false);
  
        // Put the graph image element and the zoombox elements inside the absolute panel
        graphbox.add(graph, 0, 0);
        zoom_box.setVisible(false);
        graphbox.add(zoom_box, 0, 0);
        graph.addMouseOverHandler(new MouseOverHandler() {
          public void onMouseOver(final MouseOverEvent event) {
            final Style style = graphbox.getElement().getStyle();
            style.setCursor(Cursor.CROSSHAIR);
          }
        });
        graph.addMouseOutHandler(new MouseOutHandler() {
          public void onMouseOut(final MouseOutEvent event) {
            final Style style = graphbox.getElement().getStyle();
            style.setCursor(Cursor.AUTO);
          }
        });
  
        graphvbox.add(graphbox);
        graph.addErrorHandler(new ErrorHandler() {
          public void onError(final ErrorEvent event) {
            graphstatus.setText("Oops, failed to load the graph.");
          }
        });
        graph.addLoadHandler(new LoadHandler() {
          public void onLoad(final LoadEvent event) {
            graphbox.setWidth(graph.getWidth() + "px");
            graphbox.setHeight(graph.getHeight() + "px");
          }
        });
  
        graphpanel.add(graphvbox);
      }
      final DecoratedTabPanel mainpanel = new DecoratedTabPanel();
      mainpanel.setWidth("100%");
      mainpanel.add(graphpanel, "Graph");
      mainpanel.add(stats_table, "Stats");
      mainpanel.add(logs, "Logs");
      mainpanel.add(build_data, "Version");
      mainpanel.selectTab(0);
      mainpanel.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() {
        public void onBeforeSelection(final BeforeSelectionEvent<Integer> event) {
          clearError();
          final int item = event.getItem();
          switch (item) {
            case 1: refreshStats(); return;
            case 2: refreshLogs(); return;
            case 3: refreshVersion(); return;
          }
        }
      });
      final VerticalPanel root = new VerticalPanel();
      root.setWidth("100%");
      root.add(current_error);
      current_error.setVisible(false);
      current_error.addStyleName("dateBoxFormatError");
      root.add(mainpanel);
      RootPanel.get("queryuimain").add(root);
      // Must be done at the end, once all the widgets are attached.
      ensureSameWidgetSize(optpanel);
  
      History.addHistoryListener(this);
    }