In barcode generaotor (zxing.appspot.com), generate barcode upon pressing enter....
[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.event.dom.client.KeyPressEvent;
22 import com.google.gwt.event.dom.client.KeyPressHandler;
23 import com.google.gwt.http.client.URL;
24 import com.google.gwt.user.client.DOM;
25 import com.google.gwt.user.client.ui.Button;
26 import com.google.gwt.user.client.ui.ChangeListener;
27 import com.google.gwt.user.client.ui.ClickListener;
28 import com.google.gwt.user.client.ui.Grid;
29 import com.google.gwt.user.client.ui.HTML;
30 import com.google.gwt.user.client.ui.HorizontalPanel;
31 import com.google.gwt.user.client.ui.Image;
32 import com.google.gwt.user.client.ui.ListBox;
33 import com.google.gwt.user.client.ui.RootPanel;
34 import com.google.gwt.user.client.ui.SimplePanel;
35 import com.google.gwt.user.client.ui.TextBox;
36 import com.google.gwt.user.client.ui.VerticalPanel;
37 import com.google.gwt.user.client.ui.Widget;
38 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
39
40 import java.util.ArrayList;
41 import java.util.List;
42
43 /**
44  * Entry point classes define <code>onModuleLoad()</code>. Setup the page, and loads
45  * all different generators.
46  * 
47  * @author Yohann Coppel
48  */
49 public class Generator implements EntryPoint {
50 //  public static final StringConstants S = GWT.create(StringConstants.class);
51   private final List<GeneratorSource> generators = new ArrayList<GeneratorSource>();
52   ListBox genList = new ListBox();
53   ListBox sizeList = new ListBox();
54   Image result = new Image("");//http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=http://google.com");
55   Grid topPanel = new Grid(5, 1);
56   GeneratorSource selectedGenerator = null;
57   private Button generateButton;
58   VerticalPanel rightPanel = new VerticalPanel();
59   TextBox urlResult = new TextBox();
60   HTML downloadText = new HTML("<a href=\"\" id=\"downloadlink\" >Download</a> or embed with this URL:");
61   //Element errorElement = null;
62   
63   public void onModuleLoad() {
64     loadGenerators();
65     
66     HorizontalPanel mainPanel = new HorizontalPanel();
67     setupLeftPanel();
68     topPanel.getElement().setId("leftpanel");
69     Widget leftPanel = topPanel;
70     
71     mainPanel.add(leftPanel);
72     
73     SimplePanel div = new SimplePanel();
74     SimplePanel div2 = new SimplePanel();
75     div2.add(result);
76     div2.getElement().setId("innerresult");
77     div.add(div2);
78     div.getElement().setId("imageresult");
79     
80     urlResult.getElement().setId("urlresult");
81     downloadText.getElement().setId("downloadText");
82     rightPanel.add(div);
83     rightPanel.add(downloadText);
84     rightPanel.add(urlResult);
85     mainPanel.add(rightPanel);
86     mainPanel.getElement().setId("mainpanel");
87     RootPanel.get("ui").add(mainPanel);
88     //RootPanel.get().add(output);
89     //output.setHeight("200px");
90     //output.setWidth("500px");
91     setWidget(1);
92     invalidateBarcode();
93   }
94
95   private void setWidget(int id) {
96     if (id >= 0 && id < generators.size()) {
97       topPanel.setWidget(1, 0, generators.get(id).getWidget());
98       genList.setSelectedIndex(id);
99       selectedGenerator = generators.get(id);
100       eraseErrorMessage();
101       invalidateBarcode();
102       genList.setFocus(false);
103       selectedGenerator.setFocus();
104     }
105   }
106
107   private void loadGenerators() {
108     generators.add(new CalendarEventGenerator(changeListener, keyPressHandler));
109     generators.add(new ContactInfoGenerator(changeListener, keyPressHandler));
110     generators.add(new EmailGenerator(changeListener, keyPressHandler));
111     generators.add(new GeoLocationGenerator(changeListener, keyPressHandler));
112     generators.add(new PhoneNumberGenerator(changeListener, keyPressHandler));
113     generators.add(new SmsAddressGenerator(changeListener, keyPressHandler));
114     generators.add(new TextGenerator(changeListener));
115     generators.add(new UrlGenerator(changeListener, keyPressHandler));
116   }
117   
118   public void setupLeftPanel() {
119     topPanel.setHTML(2, 0,
120         "<span id=\"errorMessageID\" class=\""+StylesDefs.ERROR_MESSAGE+"\"></span>");
121     
122     // fills up the list of generators
123     for(GeneratorSource generator: generators) {
124       genList.addItem(generator.getName());
125       setGridStyle(generator.getWidget());
126     }
127
128     sizeList.addItem("S", "120");
129     sizeList.addItem("M", "230");
130     sizeList.addItem("L", "350");
131     sizeList.setSelectedIndex(2);
132     
133     // updates the second row of the table with the content of the selected
134     // generator
135     genList.addChangeListener(new ChangeListener() {
136       public void onChange(Widget sender) {
137         int i = genList.getSelectedIndex();
138         setWidget(i);
139       }
140     });
141
142     // grid for the generator picker
143     Grid selectionTable = new Grid(1, 2);
144     selectionTable.setText(0, 0, "Contents");
145     selectionTable.setWidget(0, 1, genList);
146     setGridStyle(selectionTable);
147     
148     topPanel.setWidget(0, 0, selectionTable);
149     
150     // grid for the generate button
151     Grid generateGrid = new Grid(1, 2);
152     setGridStyle(generateGrid);
153     
154     generateButton = new Button("Generate &rarr;");
155     generateButton.addClickListener(new ClickListener() {
156       public void onClick(Widget sender) {
157         generate();
158       }
159     });
160     generateGrid.setWidget(0,1,generateButton);
161     topPanel.setWidget(4, 0, generateGrid);
162     
163     Grid sizeTable = new Grid(1, 2);
164     sizeTable.setText(0, 0, "Barcode size");
165     sizeTable.setWidget(0, 1, sizeList);
166     setGridStyle(sizeTable);
167     topPanel.setWidget(3, 0, sizeTable);
168   }
169
170   protected void setGridStyle(Grid grid) {
171     grid.getColumnFormatter().addStyleName(0, "firstColumn");
172     grid.getColumnFormatter().addStyleName(1, "secondColumn");
173     CellFormatter cellFormatter = grid.getCellFormatter();
174     for(int i = 0; i < grid.getRowCount(); ++i) {
175       cellFormatter.addStyleName(i, 0, "firstColumn");
176       cellFormatter.addStyleName(i, 1, "secondColumn");
177     }
178   }
179
180   protected String getUrl(int sizeX, int sizeY, String content) {
181     StringBuilder result = new StringBuilder();
182     result.append("http://chart.apis.google.com/chart?cht=qr&chs=");
183     result.append(sizeX).append('x').append(sizeY);
184     result.append("&chl=");
185     result.append(URL.encodeComponent(content));
186     return result.toString();
187   }
188   
189   private void generate() {
190     try {
191       String text = selectedGenerator.getText();
192       eraseErrorMessage();
193       int size = Integer.parseInt(sizeList
194           .getValue(sizeList.getSelectedIndex()));
195       String url = getUrl(size, size, text);
196       result.setUrl(url);
197       result.setVisible(true);
198       urlResult.setText(url);
199       urlResult.setVisible(true);
200       Element linkElement = DOM.getElementById("downloadlink");
201       linkElement.setAttribute("href", url);
202       downloadText.setVisible(true);
203     } catch (GeneratorException ex) {
204       invalidateBarcode();
205       String error = ex.getMessage();
206       showErrorMessage(error);
207     }
208   }
209   
210   public void invalidateBarcode() {
211     result.setVisible(false);
212     urlResult.setText("");
213     urlResult.setVisible(false);
214     Element linkElement = DOM.getElementById("downloadlink");
215     linkElement.setAttribute("href", "");
216     downloadText.setVisible(false);
217   }
218   
219   public void showErrorMessage(String error) {
220     Element errorElement = DOM.getElementById("errorMessageID");
221     errorElement.setInnerHTML(error);
222   }
223   
224   public void eraseErrorMessage() {
225     Element errorElement = DOM.getElementById("errorMessageID");
226     errorElement.setInnerHTML("&nbsp;");
227   }
228   
229   public ChangeListener changeListener = new ChangeListener() {
230     public void onChange(Widget sender) {
231       try {
232         selectedGenerator.validate(sender);
233         eraseErrorMessage();
234       } catch (GeneratorException ex) {
235         String error = ex.getMessage();
236         showErrorMessage(error);
237         invalidateBarcode();
238       }
239     }
240   };
241   
242   public KeyPressHandler keyPressHandler = new KeyPressHandler() {
243     @Override
244     public void onKeyPress(KeyPressEvent event) {
245       if (event.getCharCode() == '\n' || event.getCharCode() == '\r') {
246         generate();
247       }
248     }
249   };
250 }