com.google.zxing.web.generator.client.Generator.java Source code

Java tutorial

Introduction

Here is the source code for com.google.zxing.web.generator.client.Generator.java

Source

/*
 * Copyright (C) 2008 ZXing authors
 *
 * 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 com.google.zxing.web.generator.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import java.util.ArrayList;
import java.util.List;

public final class Generator implements EntryPoint {

    private final List<GeneratorSource> generators = new ArrayList<>();
    private final ListBox genList = new ListBox();
    private final ListBox sizeList = new ListBox();
    private final ListBox ecLevelList = new ListBox();
    private final ListBox encodingList = new ListBox();
    private final Image result = new Image("");
    private final HTMLTable topPanel = new Grid(5, 1);
    private GeneratorSource selectedGenerator = null;
    private final VerticalPanel rightPanel = new VerticalPanel();
    private final TextBox urlResult = new TextBox();
    private final Widget downloadText = new HTML(
            "<a href=\"\" id=\"downloadlink\" >Download</a> or embed with this URL:");
    private final TextArea rawTextResult = new TextArea();

    @Override
    public void onModuleLoad() {
        loadGenerators();

        setupLeftPanel();
        topPanel.getElement().setId("leftpanel");
        Widget leftPanel = topPanel;

        HorizontalPanel mainPanel = new HorizontalPanel();
        mainPanel.add(leftPanel);

        SimplePanel div2 = new SimplePanel();
        div2.add(result);
        div2.getElement().setId("innerresult");
        SimplePanel div = new SimplePanel();
        div.add(div2);
        div.getElement().setId("imageresult");

        urlResult.getElement().setId("urlresult");
        rawTextResult.getElement().setId("rawtextresult");
        rawTextResult.setCharacterWidth(50);
        rawTextResult.setVisibleLines(8);
        downloadText.getElement().setId("downloadText");
        rightPanel.add(div);
        rightPanel.add(downloadText);
        rightPanel.add(urlResult);
        rightPanel.add(rawTextResult);
        mainPanel.add(rightPanel);
        mainPanel.getElement().setId("mainpanel");
        RootPanel.get("ui").add(mainPanel);
        setWidget(1);
        invalidateBarcode();
    }

    private void setWidget(int id) {
        if (id >= 0 && id < generators.size()) {
            topPanel.setWidget(1, 0, generators.get(id).getWidget());
            genList.setSelectedIndex(id);
            selectedGenerator = generators.get(id);
            eraseErrorMessage();
            invalidateBarcode();
            genList.setFocus(false);
            selectedGenerator.setFocus();
        }
    }

    private void loadGenerators() {
        generators.add(new CalendarEventGenerator(changeHandler, keyPressHandler));
        generators.add(new ContactInfoGenerator(changeHandler, keyPressHandler));
        generators.add(new EmailGenerator(changeHandler, keyPressHandler));
        generators.add(new GeoLocationGenerator(changeHandler, keyPressHandler));
        generators.add(new PhoneNumberGenerator(changeHandler, keyPressHandler));
        generators.add(new SmsAddressGenerator(changeHandler, keyPressHandler));
        generators.add(new TextGenerator(changeHandler));
        generators.add(new UrlGenerator(changeHandler, keyPressHandler));
        generators.add(new WifiGenerator(changeHandler, keyPressHandler));
    }

    void setupLeftPanel() {
        topPanel.setHTML(2, 0, "<span id=\"errorMessageID\" class=\"" + StylesDefs.ERROR_MESSAGE + "\"></span>");

        // fills up the list of generators
        for (GeneratorSource generator : generators) {
            genList.addItem(generator.getName());
            setGridStyle(generator.getWidget());
        }

        sizeList.addItem("Small", "120");
        sizeList.addItem("Medium", "230");
        sizeList.addItem("Large", "350");
        sizeList.setSelectedIndex(2);

        ecLevelList.addItem("L");
        ecLevelList.addItem("M");
        ecLevelList.addItem("Q");
        ecLevelList.addItem("H");
        ecLevelList.setSelectedIndex(0);

        encodingList.addItem("UTF-8");
        encodingList.addItem("ISO-8859-1");
        encodingList.addItem("Shift_JIS");
        encodingList.setSelectedIndex(0);

        // updates the second row of the table with the content of the selected generator
        genList.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent Event) {
                int i = genList.getSelectedIndex();
                setWidget(i);
            }
        });

        // grid for the generator picker
        HTMLTable selectionTable = new Grid(1, 2);
        selectionTable.setText(0, 0, "Contents");
        selectionTable.setWidget(0, 1, genList);
        setGridStyle(selectionTable);

        topPanel.setWidget(0, 0, selectionTable);

        // grid for the generate button
        HTMLTable generateGrid = new Grid(1, 2);
        setGridStyle(generateGrid);

        Button generateButton = new Button("Generate &rarr;");
        generateButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                generate();
            }
        });
        generateGrid.setWidget(0, 1, generateButton);
        topPanel.setWidget(4, 0, generateGrid);

        HTMLTable configTable = new Grid(3, 2);
        configTable.setText(0, 0, "Barcode size");
        configTable.setWidget(0, 1, sizeList);
        configTable.setText(1, 0, "Error correction");
        configTable.setWidget(1, 1, ecLevelList);
        configTable.setText(2, 0, "Character encoding");
        configTable.setWidget(2, 1, encodingList);
        setGridStyle(configTable);
        topPanel.setWidget(3, 0, configTable);
    }

    private static void setGridStyle(HTMLTable grid) {
        grid.getColumnFormatter().addStyleName(0, "firstColumn");
        grid.getColumnFormatter().addStyleName(1, "secondColumn");
        HTMLTable.CellFormatter cellFormatter = grid.getCellFormatter();
        for (int i = 0; i < grid.getRowCount(); ++i) {
            cellFormatter.addStyleName(i, 0, "firstColumn");
            cellFormatter.addStyleName(i, 1, "secondColumn");
        }
    }

    private static String getUrl(int sizeX, int sizeY, String ecLevel, String encoding, String content) {
        StringBuilder result = new StringBuilder(100);
        result.append("http://zxing.org/w/chart?cht=qr");
        result.append("&chs=").append(sizeX).append('x').append(sizeY);
        result.append("&chld=").append(ecLevel);
        result.append("&choe=").append(encoding);
        result.append("&chl=").append(URL.encodeQueryString(content));
        return result.toString();
    }

    private void generate() {
        try {
            String text = selectedGenerator.getText();
            eraseErrorMessage();
            int size = Integer.parseInt(sizeList.getValue(sizeList.getSelectedIndex()));
            String ecLevel = ecLevelList.getValue(ecLevelList.getSelectedIndex());
            String encoding = encodingList.getValue(encodingList.getSelectedIndex());
            String url = getUrl(size, size, ecLevel, encoding, text);
            result.setUrl(url);
            result.setVisible(true);
            urlResult.setText(url);
            urlResult.setVisible(true);
            rawTextResult.setText(text);
            rawTextResult.setVisible(true);
            Element linkElement = DOM.getElementById("downloadlink");
            linkElement.setAttribute("href", url);
            downloadText.setVisible(true);
        } catch (GeneratorException ex) {
            invalidateBarcode();
            String error = ex.getMessage();
            showErrorMessage(error);
        }
    }

    void invalidateBarcode() {
        result.setVisible(false);
        urlResult.setText("");
        urlResult.setVisible(false);
        rawTextResult.setText("");
        rawTextResult.setVisible(false);
        Element linkElement = DOM.getElementById("downloadlink");
        linkElement.setAttribute("href", "");
        downloadText.setVisible(false);
    }

    private static void showErrorMessage(String error) {
        Element errorElement = DOM.getElementById("errorMessageID");
        errorElement.setInnerHTML(error);
    }

    private static void eraseErrorMessage() {
        Element errorElement = DOM.getElementById("errorMessageID");
        errorElement.setInnerHTML("&nbsp;");
    }

    private final ChangeHandler changeHandler = new ChangeHandler() {
        @Override
        public void onChange(ChangeEvent event) {
            try {
                selectedGenerator.validate((Widget) event.getSource());
                eraseErrorMessage();
            } catch (GeneratorException ex) {
                String error = ex.getMessage();
                showErrorMessage(error);
                invalidateBarcode();
            }
        }
    };

    private final KeyPressHandler keyPressHandler = new KeyPressHandler() {
        @Override
        public void onKeyPress(KeyPressEvent event) {
            if (event.getCharCode() == '\n' || event.getCharCode() == '\r') {
                generate();
            }
        }
    };
}