From 7211bdd1901fba4dfd528a77109be3e22893bed2 Mon Sep 17 00:00:00 2001 From: Jouni Koivuviita Date: Thu, 14 Jun 2007 12:54:26 +0000 Subject: [PATCH] Proper implementation for TextField component (some bugs exist). svn changeset:1719/svn branch:trunk --- .../gwt/client/DefaultWidgetFactory.java | 9 +- .../gwt/client/ui/TkPasswordField.java | 25 +++++ .../terminal/gwt/client/ui/TkTextArea.java | 27 ++++++ .../terminal/gwt/client/ui/TkTextField.java | 95 ++++++++++--------- 4 files changed, 112 insertions(+), 44 deletions(-) create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/TkPasswordField.java create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextArea.java diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index ecb50865ac..369a60917d 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -2,6 +2,7 @@ package com.itmill.toolkit.terminal.gwt.client; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.ui.TkPasswordField; import com.itmill.toolkit.terminal.gwt.client.ui.TkButton; import com.itmill.toolkit.terminal.gwt.client.ui.TkCheckBox; import com.itmill.toolkit.terminal.gwt.client.ui.TkEmbedded; @@ -13,6 +14,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.TkPanel; import com.itmill.toolkit.terminal.gwt.client.ui.TkSelect; import com.itmill.toolkit.terminal.gwt.client.ui.TkTable; import com.itmill.toolkit.terminal.gwt.client.ui.TkTabsheet; +import com.itmill.toolkit.terminal.gwt.client.ui.TkTextArea; import com.itmill.toolkit.terminal.gwt.client.ui.TkTextField; import com.itmill.toolkit.terminal.gwt.client.ui.TkTree; import com.itmill.toolkit.terminal.gwt.client.ui.TkUnknownComponent; @@ -51,8 +53,13 @@ public class DefaultWidgetFactory implements WidgetFactory { return new TkTabsheet(); if ("embedded".equals(tag)) return new TkEmbedded(); - if ("textfield".equals(tag)) + if ("textfield".equals(tag)) { + if(uidl.hasAttribute("multiline")) + return new TkTextArea(); + else if(uidl.hasAttribute("secret") && uidl.getBooleanAttribute("secret")) + return new TkPasswordField(); return new TkTextField(); + } if ("table".equals(tag)) return new TkTable(); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkPasswordField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkPasswordField.java new file mode 100644 index 0000000000..7d6c0becb5 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkPasswordField.java @@ -0,0 +1,25 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import com.google.gwt.user.client.DOM; +import com.itmill.toolkit.terminal.gwt.client.Client; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +/** + * This class represents a password field. + * + * @author IT Mill Ltd. + * + */ +public class TkPasswordField extends TkTextField { + + public TkPasswordField() { + super(DOM.createInputPassword()); + } + + public void updateFromUIDL(UIDL uidl, Client client) { + // Call parent renderer explicitly + super.updateFromUIDL(uidl, client); + + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextArea.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextArea.java new file mode 100644 index 0000000000..797e0a93f7 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextArea.java @@ -0,0 +1,27 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import com.google.gwt.user.client.DOM; +import com.itmill.toolkit.terminal.gwt.client.Client; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +/** + * This class represents a multiline textfield (textarea). + * + * @author IT Mill Ltd. + * + */ +public class TkTextArea extends TkTextField { + + public TkTextArea() { + super(DOM.createTextArea()); + } + + public void updateFromUIDL(UIDL uidl, Client client) { + // Call parent renderer explicitly + super.updateFromUIDL(uidl, client); + + if(uidl.hasAttribute("rows")) + setHeight(uidl.getStringAttribute("rows")+"em"); + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextField.java index 64361d055f..5ce96f8e0f 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextField.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/TkTextField.java @@ -1,72 +1,81 @@ package com.itmill.toolkit.terminal.gwt.client.ui; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ChangeListener; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.TextArea; -import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.FocusListener; import com.google.gwt.user.client.ui.TextBoxBase; -import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.Client; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; -public class TkTextField extends Composite implements - Paintable, ChangeListener { - - String id; - - Client client; +/** + * This class represents a basic text input field with one row. + * + * @author IT Mill Ltd. + * + */ +public class TkTextField extends TextBoxBase implements + Paintable, ChangeListener, FocusListener { - TextBoxBase field; - Label caption = new Label(); - - private VerticalPanel p; + /** + * The input node CSS classname. + */ + private static final String CLASSNAME = "itk-textfield"; - private boolean multiline = false; + /** + * This CSS classname is added to the input node on hover. + */ + private static final String CLASSNAME_FOCUS = "itk-textfield-focus"; + + private String id; + + private Client client; private boolean immediate = false; public TkTextField() { - p = new VerticalPanel(); - p.add(caption); - initWidget(p); + this(DOM.createInputText()); + } + + protected TkTextField(Element node) { + super(node); + setStyleName(CLASSNAME); + addChangeListener(this); + addFocusListener(this); } public void updateFromUIDL(UIDL uidl, Client client) { this.client = client; id = uidl.getId(); + + if(client.replaceComponentWithCorrectImplementation(this, uidl)) + return; + if(uidl.hasAttribute("immediate") && uidl.getBooleanAttribute("immediate")) immediate = true; - if(uidl.hasAttribute("caption")) - caption.setText(uidl.getStringAttribute("caption")); - else - caption.setVisible(false); - if(field != null && (uidl.hasAttribute("rows") && !multiline )) { - // field type has changed - p.remove(p.getWidgetIndex(field)); - } - if(field == null) { - if(uidl.hasAttribute("rows")) { - field = new TextArea(); - multiline = true; - } else { - field = new TextBox(); - } - p.add(field); - } - if(multiline) - field.setHeight(uidl.getStringAttribute("height")+"em"); + if(uidl.hasAttribute("cols")) - field.setWidth(uidl.getStringAttribute("cols")+"em"); - field.setText(uidl.getStringVariable("text")); - - field.addChangeListener(this); + setWidth(uidl.getStringAttribute("cols")+"em"); + + setText(uidl.getStringVariable("text")); + + // TODO if either caption, description, icon or error is present, + // ask the parent to kindly add those to its list + // getParentLayout().updateComponentAdditionals(this); } public void onChange(Widget sender) { - client.updateVariable(id, "text", field.getText() , immediate); + client.updateVariable(id, "text", getText() , immediate); + } + + public void onFocus(Widget sender) { + addStyleName(CLASSNAME_FOCUS); + } + + public void onLostFocus(Widget sender) { + removeStyleName(CLASSNAME_FOCUS); } } -- 2.39.5