Adding gwt QR Code generator, and appspot configuration files.
[zxing.git] / zxing.appspot.com / generator / src / com / google / zxing / web / generator / client / Generator.java
1 /*
2  * Copyright (C) 2008 ZXing authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.google.zxing.web.generator.client;
18
19 import com.google.gwt.core.client.EntryPoint;
20 import com.google.gwt.dom.client.Element;
21 import com.google.gwt.http.client.URL;
22 import com.google.gwt.user.client.DOM;
23 import com.google.gwt.user.client.ui.Button;
24 import com.google.gwt.user.client.ui.ChangeListener;
25 import com.google.gwt.user.client.ui.ClickListener;
26 import com.google.gwt.user.client.ui.Grid;
27 import com.google.gwt.user.client.ui.HTML;
28 import com.google.gwt.user.client.ui.HorizontalPanel;
29 import com.google.gwt.user.client.ui.Image;
30 import com.google.gwt.user.client.ui.ListBox;
31 import com.google.gwt.user.client.ui.RootPanel;
32 import com.google.gwt.user.client.ui.SimplePanel;
33 import com.google.gwt.user.client.ui.TextBox;
34 import com.google.gwt.user.client.ui.VerticalPanel;
35 import com.google.gwt.user.client.ui.Widget;
36 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
37
38 import java.util.ArrayList;
39 import java.util.List;
40
41 /**
42  * Entry point classes define <code>onModuleLoad()</code>. Setup the page, and loads
43  * all different generators.
44  * 
45  * @author Yohann Coppel
46  */
47 public class Generator implements EntryPoint {
48 //  public static final StringConstants S = GWT.create(StringConstants.class);
49   private final List<GeneratorSource> generators = new ArrayList<GeneratorSource>();
50   ListBox genList = new ListBox();
51   ListBox sizeList = new ListBox();
52   Image result = new Image("");//http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=http://google.com");
53   Grid topPanel = new Grid(5, 1);
54   GeneratorSource selectedGenerator = null;
55   private Button generateButton;
56   VerticalPanel rightPanel = new VerticalPanel();
57   TextBox urlResult = new TextBox();
58   HTML downloadText = new HTML("<a href=\"\" id=\"downloadlink\" >Download</a> or embed with this URL:");
59   //Element errorElement = null;
60   
61   public void onModuleLoad() {
62     loadGenerators();
63     
64     HorizontalPanel mainPanel = new HorizontalPanel();
65     setupLeftPanel();
66     topPanel.getElement().setId("leftpanel");
67     Widget leftPanel = topPanel;
68     
69     mainPanel.add(leftPanel);
70     
71     SimplePanel div = new SimplePanel();
72     SimplePanel div2 = new SimplePanel();
73     div2.add(result);
74     div2.getElement().setId("innerresult");
75     div.add(div2);
76     div.getElement().setId("imageresult");
77     
78     urlResult.getElement().setId("urlresult");
79     downloadText.getElement().setId("downloadText");
80     rightPanel.add(div);
81     rightPanel.add(downloadText);
82     rightPanel.add(urlResult);
83     mainPanel.add(rightPanel);
84     mainPanel.getElement().setId("mainpanel");
85     RootPanel.get("ui").add(mainPanel);
86     //RootPanel.get().add(output);
87     //output.setHeight("200px");
88     //output.setWidth("500px");
89     setWidget(1);
90     invalidateBarcode();
91   }
92
93   private void setWidget(int id) {
94     if (id >= 0 && id < generators.size()) {
95       topPanel.setWidget(1, 0, generators.get(id).getWidget());
96       genList.setSelectedIndex(id);
97       selectedGenerator = generators.get(id);
98       eraseErrorMessage();
99       invalidateBarcode();
100       genList.setFocus(false);
101       selectedGenerator.setFocus();
102     }
103   }
104
105   private void loadGenerators() {
106     generators.add(new CalendarEventGenerator(changeListener));
107     generators.add(new ContactInfoGenerator(changeListener));
108     generators.add(new EmailGenerator(changeListener));
109     generators.add(new GeoLocationGenerator(changeListener));
110     generators.add(new PhoneNumberGenerator(changeListener));
111     generators.add(new SmsAddressGenerator(changeListener));
112     generators.add(new TextGenerator(changeListener));
113     generators.add(new UrlGenerator(changeListener));
114   }
115   
116   public void setupLeftPanel() {
117     topPanel.setHTML(2, 0,
118         "<span id=\"errorMessageID\" class=\""+StylesDefs.ERROR_MESSAGE+"\"></span>");
119     
120     // fills up the list of generators
121     for(GeneratorSource generator: generators) {
122       genList.addItem(generator.getName());
123       setGridStyle(generator.getWidget());
124     }
125
126     sizeList.addItem("S", "120");
127     sizeList.addItem("M", "230");
128     sizeList.addItem("L", "350");
129     sizeList.setSelectedIndex(2);
130     
131     // updates the second row of the table with the content of the selected
132     // generator
133     genList.addChangeListener(new ChangeListener() {
134       public void onChange(Widget sender) {
135         int i = genList.getSelectedIndex();
136         setWidget(i);
137       }
138     });
139
140     // grid for the generator picker
141     Grid selectionTable = new Grid(1, 2);
142     selectionTable.setText(0, 0, "Contents");
143     selectionTable.setWidget(0, 1, genList);
144     setGridStyle(selectionTable);
145     
146     topPanel.setWidget(0, 0, selectionTable);
147     
148     // grid for the generate button
149     Grid generateGrid = new Grid(1, 2);
150     setGridStyle(generateGrid);
151     
152     generateButton = new Button("Generate &rarr;");
153     generateButton.addClickListener(new ClickListener() {
154       public void onClick(Widget sender) {
155         generate();
156       }
157     });
158     generateGrid.setWidget(0,1,generateButton);
159     topPanel.setWidget(4, 0, generateGrid);
160     
161     Grid sizeTable = new Grid(1, 2);
162     sizeTable.setText(0, 0, "Barcode size");
163     sizeTable.setWidget(0, 1, sizeList);
164     setGridStyle(sizeTable);
165     topPanel.setWidget(3, 0, sizeTable);
166   }
167
168   protected void setGridStyle(Grid grid) {
169     grid.getColumnFormatter().addStyleName(0, "firstColumn");
170     grid.getColumnFormatter().addStyleName(1, "secondColumn");
171     CellFormatter cellFormatter = grid.getCellFormatter();
172     for(int i = 0; i < grid.getRowCount(); ++i) {
173       cellFormatter.addStyleName(i, 0, "firstColumn");
174       cellFormatter.addStyleName(i, 1, "secondColumn");
175     }
176   }
177
178   protected String getUrl(int sizeX, int sizeY, String content) {
179     String result = "http://chart.apis.google.com/chart?cht=qr&chs=";
180     result += sizeX;
181     result += "x";
182     result += sizeY;
183     result += "&chl=";
184     result += URL.encode(content);
185     return result;
186   }
187   
188   private void generate() {
189     try {
190       String text = selectedGenerator.getText();
191       eraseErrorMessage();
192       int size = Integer.parseInt(sizeList
193           .getValue(sizeList.getSelectedIndex()));
194       String url = getUrl(size, size, text);
195       result.setUrl(url);
196       result.setVisible(true);
197       urlResult.setText(url);
198       urlResult.setVisible(true);
199       Element linkElement = DOM.getElementById("downloadlink");
200       linkElement.setAttribute("href", url);
201       downloadText.setVisible(true);
202     } catch (GeneratorException ex) {
203       invalidateBarcode();
204       String error = ex.getMessage();
205       showErrorMessage(error);
206     }
207   }
208   
209   public void invalidateBarcode() {
210     result.setVisible(false);
211     urlResult.setText("");
212     urlResult.setVisible(false);
213     Element linkElement = DOM.getElementById("downloadlink");
214     linkElement.setAttribute("href", "");
215     downloadText.setVisible(false);
216   }
217   
218   public void showErrorMessage(String error) {
219     Element errorElement = DOM.getElementById("errorMessageID");
220     errorElement.setInnerHTML(error);
221   }
222   
223   public void eraseErrorMessage() {
224     Element errorElement = DOM.getElementById("errorMessageID");
225     errorElement.setInnerHTML("&nbsp;");
226   }
227   
228   public ChangeListener changeListener = new ChangeListener() {
229     public void onChange(Widget sender) {
230       try {
231         selectedGenerator.validate(sender);
232         eraseErrorMessage();
233       } catch (GeneratorException ex) {
234         String error = ex.getMessage();
235         showErrorMessage(error);
236         invalidateBarcode();
237       }
238     }
239   };
240   
241 }