next.interfaces.controller.DemoUtils.java Source code

Java tutorial

Introduction

Here is the source code for next.interfaces.controller.DemoUtils.java

Source

/*
 * Copyright 2011 Vancouver Ywebb Consulting Ltd
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package next.interfaces.controller;

import next.i.view.CellData;
import next.i.view.XDragScrollView;
import next.i.view.widgets.XButton;
import next.i.view.widgets.XButton.XButtonType;
import next.i.view.widgets.XFlexTable;
import next.i.view.widgets.XPopup;
import next.i.view.widgets.XSpinner;
import next.interfaces.Globals;
import next.interfaces.HTTP;
import next.interfaces.ResponseReader;

import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;

public class DemoUtils {

    public static CellData[] DATA;

    static {
        DATA = populate();
    }

    private static CellData[] populate() {

        String[] names = { "Argentina", "Bolivia", "Brazil", "Chile", "Colombia", "Costa Rica", "Cuba",
                "Dominican Republic", "Ecuador", "El Salvador", "Guatemala", "Honduras", "Mexico", "Nicaragua",
                "Panama", "Paraguay", "Peru", "Puerto Rico", "Uruguay", "Venezuela" };

        int len = names.length;
        CellData[] arr = new CellData[len];
        for (int i = 0; i < len; i++) {
            arr[i] = new CellData(names[i]);
        }

        return arr;
    }

    public static native void openURL(String url)/*-{
                                                 $wnd.open(url, 'target=_blank');
                                                 }-*/;

    public static void openGit(final String url) {
        openGit(null, url);
    }

    public static void openGit(String source, final String url) {

        final XFlexTable tbl = new XFlexTable();

        final XButton btnCopy = new XButton("Copy", XButtonType.Shadow);
        btnCopy.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                markText(tbl.getWidget(0, 0).getElement());
            }
        });

        final XButton btnGit = new XButton("View in GitHub", XButtonType.Shadow);
        btnGit.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                // Window.open(Globals.GIT_HOST + url + ".java", "_tab", "");
                // Utils.loadUrl(Globals.GIT_HOST + url + ".java");

                // This click handler seems to work best
                openURL(Globals.GIT_HOST + url + ".java");
            }
        });

        tbl.getElement().setId("codeText");
        String codeUrl = url.substring(url.lastIndexOf("/") + 1);
        HTTP.doGet(Globals.SOURCE_PATH.replace("$", codeUrl), new ResponseReader() {
            public void onSuccess(Response resp) {
                tbl.setWidget(0, 0, new HTML("<pre>" + toHighlighted(resp.getText()) + "</pre>"));
                tbl.setWidget(1, 0, btnCopy);
                tbl.setWidget(1, 1, btnGit);
            }
        });

        final XPopup popup = new XPopup();
        XDragScrollView view = new XDragScrollView();
        view.addStyleName("codeDemo");

        tbl.setWidget(0, 0, new XSpinner());
        tbl.setCellSpacing(10);

        FlexCellFormatter fcf = tbl.getFlexCellFormatter();
        fcf.setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_TOP);
        fcf.setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT);
        fcf.setVerticalAlignment(1, 0, HasVerticalAlignment.ALIGN_TOP);
        fcf.setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT);
        fcf.setVerticalAlignment(1, 1, HasVerticalAlignment.ALIGN_TOP);
        fcf.setHorizontalAlignment(1, 1, HasHorizontalAlignment.ALIGN_LEFT);
        fcf.setColSpan(0, 0, 2);
        fcf.setWidth(1, 0, "50%");
        fcf.setWidth(1, 1, "50%");
        view.add(tbl);

        int h = Window.getClientHeight();
        int w = Window.getClientWidth();
        popup.setWidget(view);

        // mobile phone
        if (h + w < 1000) {
            popup.setTop("35px");
            popup.setRight("5%");
            popup.setLeft("5%");
            popup.setBottom("40px");

        } else {
            popup.setTop("35px");
            popup.setRight("5%");
            popup.setLeft("10%");
            popup.setBottom("30%");
        }

        popup.show();
    }

    private static native void markText(Element elem) /*-{
                                                      if ($doc.selection && $doc.selection.createRange) {
                                                      var range = $doc.selection.createRange();
                                                      range.moveToElementText(elem);
                                                      range.select();
                                                      } else if ($doc.createRange && $wnd.getSelection) {
                                                      var range = $doc.createRange();
                                                      range.selectNode(elem);
                                                      var selection = $wnd.getSelection();
                                                      selection.removeAllRanges();
                                                      selection.addRange(range);
                                                      }
                                                      }-*/;

    private static String toHighlighted(String code) {

        String[] keywords = { "new ", "public ", "private ", "return ", "static ", "class ", "native ", "final ",
                "extends " };

        code = code.replace("=", "<span class='codeGray'>=</span>");
        code = code.replace(".", "<span class='codeGray'>.</span>");
        code = code.replace(":", "<span class='codeGray'>:</span>");
        code = code.replace(",", "<span class='codeGray'>,</span>");
        code = code.replace(";", "<span class='codeGray'>;</span>");
        code = code.replace("@Override", "<span class='codeGray'>@Override</span>");
        code = code.replace("true", "<span class='codePink'>true</span>");
        code = code.replace("false", "<span class='codePink'>false</span>");
        for (String k : keywords) {
            code = code.replace(k, "<span class='codeWord'>" + k.trim() + "</span> ");
        }

        code = replaceEclosed('"', "codeQuot", code);
        code = code.replace("/*-{", "<span class='codeJSNI'>/*-{");
        code = code.replace("}-*/", "}-*/</span>");
        code = code.replace("/***", "<span class='codeGray'>//");
        code = code.replace("***/", "</span>");

        return code;
    }

    private static String replaceEclosed(char char_, String className, String code) {
        int count = 0;
        char[] chars = code.toCharArray();

        StringBuilder buff = new StringBuilder();

        for (char c : chars) {
            if (char_ == c) {
                if (count % 2 == 0) {
                    buff.append("<span class='" + className + "'>\"");

                } else {
                    buff.append("\"</span>");

                }
                count++;
            } else {
                buff.append(c);
            }
        }

        return buff.toString();
    }

}