/* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ /* * Created on Jan 15, 2006 */ package org.lobobrowser.html.renderer; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Insets; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.JTextComponent; import org.lobobrowser.html.domimpl.ElementImpl; import org.lobobrowser.html.domimpl.HTMLBaseInputElement; import org.lobobrowser.util.gui.WrapperLayout; abstract class BaseInputTextControl extends BaseInputControl { private static final long serialVersionUID = -4852316720577045230L; private static final float DEFAULT_FONT_SIZE = 14.0f; protected final JTextComponent widget; public BaseInputTextControl(final HTMLBaseInputElement modelNode) { super(modelNode); this.setLayout(WrapperLayout.getInstance()); final JTextComponent widget = this.createTextField(); final Font font = widget.getFont(); widget.setFont(font.deriveFont(DEFAULT_FONT_SIZE)); widget.setDocument(new LimitedDocument()); // Note: Value attribute cannot be set in reset() method. // Otherwise, layout revalidation causes typed values to // be lost (including revalidation due to hover.) final ElementImpl element = this.controlElement; final String value = element.getAttribute("value"); widget.setText(value); this.widget = widget; this.add(widget); } @Override public void reset(final int availWidth, final int availHeight) { super.reset(availWidth, availHeight); final String maxLengthText = this.controlElement.getAttribute("maxlength"); if (maxLengthText != null) { try { this.maxLength = Integer.parseInt(maxLengthText); } catch (final NumberFormatException nfe) { // ignore } } } protected abstract JTextComponent createTextField(); private int maxLength = -1; /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#getMaxLength() */ @Override public int getMaxLength() { return this.maxLength; } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#getReadOnly() */ @Override public boolean getReadOnly() { return !this.widget.isEditable(); } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#getValue() */ @Override public String getValue() { return this.widget.getText(); } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#select() */ @Override public void select() { this.widget.selectAll(); } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#setDisabled(boolean) */ @Override public void setDisabled(final boolean disabled) { super.setDisabled(disabled); this.widget.setEnabled(!disabled); } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#setMaxLength(int) */ @Override public void setMaxLength(final int maxLength) { this.maxLength = maxLength; } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#setReadOnly(boolean) */ @Override public void setReadOnly(final boolean readOnly) { this.widget.setEditable(!readOnly); } /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.InputContext#setValue(java.lang.String) */ @Override public void setValue(final String value) { this.widget.setText(value); } @Override public java.awt.Dimension getPreferredSize() { final int size = this.size; final JTextComponent widget = this.widget; final FontMetrics fm = widget.getFontMetrics(widget.getFont()); final Insets insets = widget.getInsets(); int pw, ph; if (size == -1) { pw = 100; } else { pw = insets.left + insets.right + (fm.charWidth('0') * size); } ph = fm.getHeight() + insets.top + insets.bottom; return new java.awt.Dimension(pw, ph); } public void resetInput() { this.widget.setText(""); } /** * Implements maxlength functionality. */ private class LimitedDocument extends javax.swing.text.PlainDocument { private static final long serialVersionUID = 5095817476961455383L; /* * (non-Javadoc) * * @see javax.swing.text.PlainDocument#insertString(int, java.lang.String, * javax.swing.text.AttributeSet) */ @Override public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException { final int max = BaseInputTextControl.this.maxLength; if (max != -1) { final int docLength = this.getLength(); if (docLength >= max) { return; } final int strLen = str.length(); if ((docLength + strLen) > max) { final String shorterStr = str.substring(0, max - docLength); super.insertString(offs, shorterStr, a); } else { super.insertString(offs, str, a); } } else { super.insertString(offs, str, a); } } } }