/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.utils.ui; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import com.opendoorlogistics.api.ui.UIFactory.TextChangedListener; import com.opendoorlogistics.core.utils.strings.Strings; public class TextEntryPanel extends JPanel { public static int PREFERRED_WIDTH =200; protected final JTextField textField; protected final JLabel oLabel; protected final JLabel postfixLabel; private TextChangedListener listener; private final FlowLayout flowLayout; public enum EntryType { String, IntNumber, DoubleNumber } public TextEntryPanel(String label, String initialValue, TextChangedListener textChangedListener) { this(label, initialValue, null, textChangedListener); } public TextEntryPanel(String label, String initialValue, String tooltip, TextChangedListener textChangedListener) { this(label, initialValue, tooltip, EntryType.String, textChangedListener); } public TextEntryPanel(String label, String initialValue, String tooltip, EntryType entryType, TextChangedListener textChangedListener) { this(label, null, initialValue, tooltip, entryType, textChangedListener); } public void setPreferredTextboxWidth(int width) { textField.setPreferredSize(new Dimension(width, 28)); } public TextEntryPanel(String prefixLabel, String postfixLabel, String initialValue, String tooltip, EntryType entryType, final TextChangedListener textChangedListener) { flowLayout = new FlowLayout(FlowLayout.LEFT, 0, 0); setLayout(flowLayout); setAlignmentX(Component.LEFT_ALIGNMENT); this.listener = textChangedListener; if (prefixLabel != null) { oLabel = new JLabel(prefixLabel); add(oLabel); } else { oLabel = null; } textField = new JTextField(); textField.setText(initialValue); setPreferredTextboxWidth(PREFERRED_WIDTH); if (listener != null) { textField.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { if (listener != null) { listener.textChange(textField.getText()); } } @Override public void insertUpdate(DocumentEvent e) { if (listener != null) { listener.textChange(textField.getText()); } } @Override public void changedUpdate(DocumentEvent e) { if (listener != null) { listener.textChange(textField.getText()); } } }); } add(textField); if (Strings.isEmpty(postfixLabel) == false) { this.postfixLabel = new JLabel(postfixLabel); add(this.postfixLabel); } else { this.postfixLabel = null; } if (!Strings.isEmpty(tooltip)) { textField.setToolTipText(tooltip); if(oLabel!=null){ oLabel.setToolTipText(tooltip); } } if (entryType == EntryType.IntNumber) { ((AbstractDocument) textField.getDocument()).setDocumentFilter(new DocumentFilter() { @Override public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) throws BadLocationException { // remove non-digits fb.insertString(off, str.replaceAll("\\D++", ""), attr); } @Override public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) throws BadLocationException { // remove non-digits fb.replace(off, len, str.replaceAll("\\D++", ""), attr); } }); } else if (entryType == EntryType.DoubleNumber) { ((AbstractDocument) textField.getDocument()).setDocumentFilter(new DocumentFilter() { @Override public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) throws BadLocationException { // remove non-digits fb.insertString(off, filter(str), attr); } private String filter(String str) { return Strings.getFiltered(str, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'); } @Override public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) throws BadLocationException { // remove non-digits fb.replace(off, len, filter(str), attr); } }); } } @Override public void setToolTipText(String text) { super.setToolTipText(text); if (oLabel != null) { oLabel.setToolTipText(text); } if (postfixLabel != null) { postfixLabel.setToolTipText(text); } textField.setToolTipText(text); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); textField.setEnabled(enabled); if (oLabel != null) { oLabel.setEnabled(enabled); } if (postfixLabel != null) { postfixLabel.setEnabled(enabled); } } public String getText() { return textField.getText(); } public void setText(String text, boolean fireListener) { TextChangedListener tmp = listener; if (!fireListener) { listener = null; } textField.setText(text); listener = tmp; } }