Java tutorial
package org.openxdata.designer.client.view; import com.google.gwt.core.client.GWT; import java.util.ArrayList; import java.util.List; import org.openxdata.designer.client.Context; import org.openxdata.sharedlib.client.model.Locale; import org.openxdata.sharedlib.client.util.FormUtil; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasAlignment; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; 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 com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import org.openxdata.sharedlib.client.locale.FormsConstants; /** * Widget for editing locales. * * www.openxdata.org - Licensed as written in license.txt and original sources * of this file and its authors are found in sources.txt. * */ public class LocalesDialog extends DialogBox { private final FormsConstants i18n = GWT.create(FormsConstants.class); private FlexTable table = new FlexTable(); /** Button to add a new language. */ private Button btnAdd = new Button(i18n.addNew()); /** * Creates a new instance of the locale dialog box. */ public LocalesDialog() { super(false, true); VerticalPanel panel = new VerticalPanel(); panel.setSpacing(5); setWidget(panel); table.setWidget(0, 0, new Label("Name")); table.setWidget(0, 1, new Label("Key")); table.setWidget(0, 2, new Label("Delete")); table.getCellFormatter().setStyleName(0, 0, "getting-started-label"); table.getCellFormatter().setStyleName(0, 1, "getting-started-label"); table.getCellFormatter().setStyleName(0, 2, "getting-started-label"); table.setStyleName("cw-FlexTable"); panel.add(table); HorizontalPanel horzPanel = new HorizontalPanel(); FormUtil.maximizeWidget(horzPanel); panel.add(horzPanel); Button btn = new Button(i18n.save(), new ClickHandler() { public void onClick(ClickEvent event) { save(); hide(); } }); horzPanel.add(btn); horzPanel.setCellHorizontalAlignment(btn, HasAlignment.ALIGN_LEFT); btn = new Button(i18n.cancel(), new ClickHandler() { public void onClick(ClickEvent event) { hide(); } }); horzPanel.add(btn); horzPanel.setCellHorizontalAlignment(btn, HasAlignment.ALIGN_RIGHT); setText(i18n.languages()); loadLocales(); btnAdd.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { addNewLocale(); } }); } private void addNewLocale() { table.removeRow(table.getRowCount() - 1); TextBox textBox = addNewLocale("", "", table.getRowCount()); textBox.setFocus(true); addAddButton(); } private TextBox addNewLocale(String name, String key, int row) { TextBox txtName = new TextBox(); txtName.setText(name); table.setWidget(row, 0, txtName); TextBox txtKey = new TextBox(); txtKey.setText(key); table.setWidget(row, 1, txtKey); HorizontalPanel panel = new HorizontalPanel(); Button btn = new Button("Delete"); panel.add(btn); table.setWidget(row, 2, panel); table.getCellFormatter().setHorizontalAlignment(row, 3, HasHorizontalAlignment.ALIGN_CENTER); btn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { deleteLocale(((Button) event.getSource()).getParent()); } }); txtName.addKeyDownHandler(new KeyDownHandler() { public void onKeyDown(KeyDownEvent event) { int keyCode = event.getNativeKeyCode(); if (keyCode == KeyCodes.KEY_ENTER || keyCode == KeyCodes.KEY_DOWN) moveToNextWidget((Widget) event.getSource(), 0, keyCode == KeyCodes.KEY_DOWN); else if (keyCode == KeyCodes.KEY_UP) moveToPrevWidget((Widget) event.getSource(), 0); } }); txtKey.addKeyDownHandler(new KeyDownHandler() { public void onKeyDown(KeyDownEvent event) { int keyCode = event.getNativeKeyCode(); if (keyCode == KeyCodes.KEY_ENTER || keyCode == KeyCodes.KEY_DOWN) moveToNextWidget((Widget) event.getSource(), 1, keyCode == KeyCodes.KEY_DOWN); else if (keyCode == KeyCodes.KEY_UP) moveToPrevWidget((Widget) event.getSource(), 1); } }); return txtName; } @Override public boolean onKeyDownPreview(char key, int modifiers) { // Use the popup's key preview hooks to close the dialog when either // enter or escape is pressed. switch (key) { case KeyCodes.KEY_ESCAPE: hide(); break; } return true; } private void loadLocales() { int index = 1; for (Locale locale : Context.getLocales()) { addNewLocale(locale.getName(), locale.getKey(), index); index++; } addAddButton(); } private void deleteLocale(Widget widget) { if (!Window.confirm( "Do you really want to delete the " + getLanguageName(widget) + " " + i18n.language() + "?")) return; table.removeRow(getWidgetIndex(widget)); } private String getLanguageName(Widget widget) { int rowCount = table.getRowCount(); for (int row = 0; row < rowCount; row++) { if (widget == table.getWidget(row, 2)) return ((TextBox) table.getWidget(row, 0)).getText(); } return null; } private int getWidgetIndex(Widget widget) { int rowCount = table.getRowCount(); for (int row = 0; row < rowCount; row++) { if (widget == table.getWidget(row, 2)) return row; } return -1; } private void save() { List<Locale> locales = new ArrayList<Locale>(); int rowCount = table.getRowCount() - 1; for (int row = 1; row < rowCount; row++) { Locale locale = new Locale(((TextBox) table.getWidget(row, 1)).getText(), ((TextBox) table.getWidget(row, 0)).getText()); if (locale.getName().trim().length() == 0) continue; if (locale.getKey().trim().length() == 0) locale.setKey(locale.getName()); locales.add(locale); } Context.setLocales(locales); } /** * Adds the add new button to the table widget. */ private void addAddButton() { FlexCellFormatter cellFormatter = table.getFlexCellFormatter(); int row = table.getRowCount(); cellFormatter.setColSpan(row, 0, 3); cellFormatter.setHorizontalAlignment(row, 0, HasHorizontalAlignment.ALIGN_CENTER); table.setWidget(row, 0, btnAdd); } /** * Moves input focus to the next widget. * * @param sender * the widget after which to move the input focus. * @param col * the index of the column which currently has input focus. * @param sameCol * set to true to move to the next widget in the same column. */ private void moveToNextWidget(Widget sender, int col, boolean sameCol) { if (sameCol) { int rowCount = table.getRowCount(); for (int row = 1; row < rowCount; row++) { if (sender == table.getWidget(row, col)) { if (row == (rowCount - 2)) return; TextBox textBox = ((TextBox) table.getWidget(row + 1, col)); textBox.setFocus(true); textBox.selectAll(); break; } } } else { int rowCount = table.getRowCount(); for (int row = 1; row < rowCount; row++) { if (sender == table.getWidget(row, col)) { TextBox textBox = ((TextBox) table.getWidget(row, col)); if (col == 1) { if (row == (rowCount - 2)) { if (textBox.getText() != null && textBox.getText().trim().length() > 0) addNewLocale(); return; } row++; col = 1; // 0; } else { if (textBox.getText() == null || textBox.getText().trim().length() == 0) return; else if (row == (rowCount - 2)) { addNewLocale(); return; } else row++; col = 0; // 1; } textBox = ((TextBox) table.getWidget(row, col)); textBox.setFocus(true); textBox.selectAll(); break; } } } } /** * Moves input focus to the widget before. * * @param sender * the widget before which to move the input focus. * @param col * the index of the column which currently has input focus. */ private void moveToPrevWidget(Widget sender, int col) { int rowCount = table.getRowCount(); // Starting from index 1 since 0 is the header row. for (int row = 1; row < rowCount; row++) { if (sender == table.getWidget(row, col)) { if (row == 1) return; TextBox textBox = ((TextBox) table.getWidget(row - 1, col)); textBox.setFocus(true); textBox.selectAll(); break; } } } }