blob: b2b33b81e6a1a31a4f7d7df5d387f4b03493792e [file] [log] [blame]
/*
* 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.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
/**
* A Generator for contact informations, output is in MeCard format.
*
* @author Yohann Coppel
* @author Sean Owen
*/
public final class ContactInfoGenerator implements GeneratorSource {
private Grid table;
private final ListBox encoding = new ListBox();
private final TextBox name = new TextBox();
private final TextBox company = new TextBox();
private final TextBox title = new TextBox();
private final TextBox tel = new TextBox();
private final TextBox url = new TextBox();
private final TextBox email = new TextBox();
private final TextBox address = new TextBox();
private final TextBox address2 = new TextBox();
private final TextBox memo = new TextBox();
public ContactInfoGenerator(ChangeHandler changeHandler, KeyPressHandler keyListener) {
TextBox[] widgets = {name, company, tel, url, email, address, address2, memo};
for (TextBox w: widgets) {
w.addChangeHandler(changeHandler);
w.addKeyPressHandler(keyListener);
}
encoding.addItem("MECARD");
encoding.addItem("vCard");
encoding.setSelectedIndex(0);
}
@Override
public String getName() {
return "Contact information";
}
@Override
public String getText() throws GeneratorException {
String name = getNameField();
String company = getCompanyField();
String title = getTitleField();
String tel = getTelField();
String url = getUrlField();
String email = getEmailField();
String address = getAddressField();
String address2 = getAddress2Field();
String memo = getMemoField();
// Build the output with obtained data.
// note that some informations may just be "" if they were not specified.
if ("vCard".equals(encoding.getValue(encoding.getSelectedIndex()))) {
return getVCard(name, company, title, tel, url, email, address, address2, memo);
}
return getMeCard(name, company, title, tel, url, email, address, address2, memo);
}
private static String getMeCard(String name,
String company,
String title,
String tel,
String url,
String email,
String address,
String address2,
String memo) {
StringBuilder output = new StringBuilder(100);
output.append("MECARD:");
maybeAppendMECARD(output, "N", name.replace(",", ""));
maybeAppendMECARD(output, "ORG", company);
maybeAppendMECARD(output, "TEL", tel);
maybeAppendMECARD(output, "URL", url);
maybeAppendMECARD(output, "EMAIL", email);
maybeAppendMECARD(output, "ADR", buildAddress(address, address2));
StringBuilder memoContents = new StringBuilder();
if (memo != null) {
memoContents.append(memo);
}
if (title != null) {
if (memoContents.length() > 0) {
memoContents.append('\n');
}
memoContents.append(title);
}
maybeAppendMECARD(output, "NOTE", memoContents.toString());
output.append(';');
return output.toString();
}
private static String buildAddress(String address, String address2) {
if (!address.isEmpty()) {
if (!address2.isEmpty()) {
return address + ' ' + address2;
}
return address;
}
if (!address2.isEmpty()) {
return address2;
}
return "";
}
private static void maybeAppendMECARD(StringBuilder output, String prefix, String value) {
if (!value.isEmpty()) {
value = value.replaceAll("([\\\\:;])", "\\\\$1");
value = value.replaceAll("\\n", "");
output.append(prefix).append(':').append(value).append(';');
}
}
private static String getVCard(String name,
String company,
String title,
String tel,
String url,
String email,
String address,
String address2,
String memo) {
StringBuilder output = new StringBuilder(100);
output.append("BEGIN:VCARD\n");
output.append("VERSION:3.0\n");
maybeAppendvCard(output, "N", name);
maybeAppendvCard(output, "ORG", company);
maybeAppendvCard(output, "TITLE", title);
maybeAppendvCard(output, "TEL", tel);
maybeAppendvCard(output, "URL", url);
maybeAppendvCard(output, "EMAIL", email);
maybeAppendvCard(output, "ADR", buildAddress(address, address2));
maybeAppendvCard(output, "NOTE", memo);
output.append("END:VCARD");
return output.toString();
}
private static void maybeAppendvCard(StringBuilder output, String prefix, String value) {
if (!value.isEmpty()) {
value = value.replaceAll("([\\\\,;])", "\\\\$1");
value = value.replaceAll("\\n", "\\\\n");
output.append(prefix).append(':').append(value).append('\n');
}
}
private String getNameField() throws GeneratorException {
String input = name.getText();
if (input.length() < 1) {
throw new GeneratorException("Name must be at least 1 character.");
}
return input;
}
private String getCompanyField() {
return company.getText();
}
private String getTitleField() {
return title.getText();
}
private String getTelField() throws GeneratorException {
String input = Validators.filterNumber(tel.getText());
if (input.length() < 1) {
return "";
}
Validators.validateNumber(input);
if (input.contains(";")) {
throw new GeneratorException("Tel must not contains ; characters");
}
return input;
}
private String getUrlField() throws GeneratorException {
String input = url.getText();
if (input != null && !input.isEmpty()) {
Validators.validateUrl(input);
}
return input;
}
private String getEmailField() throws GeneratorException {
String input = email.getText();
if (input.length() < 1) {
return "";
}
Validators.validateEmail(input);
if (input.contains(";")) {
throw new GeneratorException("Email must not contains ; characters");
}
return input;
}
private String getAddressField() {
return address.getText();
}
private String getAddress2Field() {
return address2.getText();
}
private String getMemoField() {
return memo.getText();
}
@Override
public Grid getWidget() {
if (table != null) {
// early termination if the table has already been constructed
return table;
}
table = new Grid(10, 2);
table.setText(0, 0, "Name");
table.setWidget(0, 1, name);
table.setText(1, 0, "Company");
table.setWidget(1, 1, company);
table.setText(2, 0, "Title");
table.setWidget(2, 1, title);
table.setText(3, 0, "Phone number");
table.setWidget(3, 1, tel);
table.setText(4, 0, "Email");
table.setWidget(4, 1, email);
table.setText(5, 0, "Address");
table.setWidget(5, 1, address);
table.setText(6, 0, "Address 2");
table.setWidget(6, 1, address2);
table.setText(7, 0, "Website");
table.setWidget(7, 1, url);
table.setText(8, 0, "Memo");
table.setWidget(8, 1, memo);
table.setText(9, 0, "Encoding");
table.setWidget(9, 1, encoding);
name.addStyleName(StylesDefs.INPUT_FIELD_REQUIRED);
return table;
}
@Override
public void validate(Widget widget) throws GeneratorException {
if (widget == name) {
getNameField();
}
if (widget == company) {
getCompanyField();
}
if (widget == title) {
getTitleField();
}
if (widget == tel) {
getTelField();
}
if (widget == email) {
getEmailField();
}
if (widget == address) {
getAddressField();
}
if (widget == address2) {
getAddress2Field();
}
if (widget == url) {
getUrlField();
}
if (widget == memo) {
getMemoField();
}
}
@Override
public void setFocus() {
name.setFocus(true);
}
}