Java tutorial
/* * 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(); } }