com.expressui.core.view.util.CodePopup.java Source code

Java tutorial

Introduction

Here is the source code for com.expressui.core.view.util.CodePopup.java

Source

/*
 * Copyright (c) 2012 Brown Bag Consulting.
 * This file is part of the ExpressUI project.
 * Author: Juan Osuna
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License Version 3
 * as published by the Free Software Foundation with the addition of the
 * following permission added to Section 15 as permitted in Section 7(a):
 * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
 * Brown Bag Consulting, Brown Bag Consulting DISCLAIMS THE WARRANTY OF
 * NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License.
 *
 * You can be released from the requirements of the license by purchasing
 * a commercial license. Buying such a license is mandatory as soon as you
 * develop commercial activities involving the ExpressUI software without
 * disclosing the source code of your own applications. These activities
 * include: offering paid services to customers as an ASP, providing
 * services from a web application, shipping ExpressUI with a closed
 * source product.
 *
 * For more information, please contact Brown Bag Consulting at this
 * address: juan@brownbagconsulting.com.
 */

package com.expressui.core.view.util;

import com.expressui.core.MainApplication;
import com.expressui.core.util.ApplicationProperties;
import com.expressui.core.util.StringUtil;
import com.vaadin.terminal.ExternalResource;
import com.vaadin.terminal.Sizeable;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.*;
import com.vaadin.ui.themes.BaseTheme;
import org.springframework.stereotype.Component;
import org.vaadin.codelabel.CodeLabel;

import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;

/**
 * Used in demo applications for popping up sample code associated with UI components.
 */
@Component
public class CodePopup {

    @Resource
    private ApplicationProperties applicationProperties;

    @Resource
    public MessageSource uiMessageSource;

    /**
     * Creates a popup code button.
     *
     * @param classes classes for displaying related source code and Javadoc. If
     *                class is within com.expressui.core or com.expressui.domain,
     *                then Javadoc is displayed, otherwise source code.
     * @return popup code button
     */
    public Button createPopupCodeButton(final Class... classes) {
        Button codeButton = new Button(null, new Button.ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent event) {
                open(classes);
            }
        });
        codeButton.setIcon(new ThemeResource("../expressui/icons/32/java.png"));
        codeButton.setStyleName(BaseTheme.BUTTON_LINK);
        codeButton.setDescription(uiMessageSource.getToolTip("codePopup.toolTip"));
        return codeButton;
    }

    /**
     * Opens popup for given classes.
     *
     * @param classes classes for displaying related source code and Javadoc. If
     *                class is within com.expressui.core or com.expressui.domain,
     *                then Javadoc is displayed, otherwise source code.
     */
    public void open(Class... classes) {

        Window codeWindow = new Window();
        codeWindow.addStyleName("code-popup");
        codeWindow.setPositionX(20);
        codeWindow.setPositionY(40);
        codeWindow.setWidth("90%");
        codeWindow.setHeight("90%");

        TabSheet codePopupTabSheet = new TabSheet();
        String id = StringUtil.generateDebugId("e", this, codePopupTabSheet, "codePopupTabSheet");
        codePopupTabSheet.setDebugId(id);

        codePopupTabSheet.setSizeFull();
        codeWindow.addComponent(codePopupTabSheet);

        String windowCaption = "";
        Set<String> shownUrls = new HashSet<String>();
        for (Class clazz : classes) {
            String tabCaption;
            String url;
            if (clazz.getName().startsWith("com.expressui.core")
                    || clazz.getName().startsWith("com.expressui.domain")) {
                url = applicationProperties.getDocUrl(clazz);
                if (shownUrls.contains(url))
                    continue;
                tabCaption = clazz.getSimpleName() + " API";
                Embedded embedded = getEmbeddedDoc(url);
                codePopupTabSheet.addTab(embedded, tabCaption);
            } else {
                url = applicationProperties.getCodeUrl(clazz);
                if (shownUrls.contains(url))
                    continue;
                tabCaption = clazz.getSimpleName() + ".java";
                String code = getCodeContents(url);
                Label label = new CodeLabel(code);
                codePopupTabSheet.addTab(label, tabCaption);
            }
            shownUrls.add(url);
            if (windowCaption.length() > 0)
                windowCaption += ", ";

            windowCaption += tabCaption;
        }

        codeWindow.setCaption(windowCaption);
        MainApplication.getInstance().getMainWindow().addWindow(codeWindow);
    }

    private String getCodeContents(String urlStr) {
        try {
            URL url = new URL(urlStr);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

            StringBuilder builder = new StringBuilder();
            boolean startBuilder = false;
            String line;
            while ((line = in.readLine()) != null) {
                if (startBuilder) {
                    builder.append(line);
                    builder.append("\n");
                } else if (line.matches("^\\s*@.*$") || line.matches("^.*\\s+class\\s+.*$")) {
                    startBuilder = true;
                    builder.append(line);
                    builder.append("\n");
                }
            }

            in.close();
            return builder.toString();
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private Embedded getEmbeddedDoc(String u) {
        try {
            URL url = new URL(u);
            Embedded browser = new Embedded("", new ExternalResource(url));
            browser.setHeight(15000, Sizeable.UNITS_PIXELS);
            browser.setType(Embedded.TYPE_BROWSER);
            return browser;
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }
}