/* * Copyright 2011-17 Fraunhofer ISE, energy & meteo Systems GmbH and other contributors * * 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 org.openmuc.openiec61850.clientgui.databind; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.DocumentFilter; import javax.swing.text.PlainDocument; import org.openmuc.openiec61850.BasicDataAttribute; import org.openmuc.openiec61850.BdaType; import org.openmuc.openiec61850.clientgui.BasicDataBind; public abstract class TextFieldDataBind extends BasicDataBind { private final DocumentFilter filter; protected JTextField inputField; public TextFieldDataBind(E data, BdaType type, AbstractFilter filter) { super(data, type); this.filter = filter; } @Override protected JComponent init() { inputField = new JTextField(); PlainDocument doc = (PlainDocument) inputField.getDocument(); doc.setDocumentFilter(filter); resetImpl(); return inputField; } protected static abstract class AbstractFilter extends DocumentFilter { @Override public final void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { Document doc = fb.getDocument(); StringBuilder sb = new StringBuilder(); sb.append(doc.getText(0, doc.getLength())); sb.insert(offset, string); if (test(sb.toString())) { super.insertString(fb, offset, string, attr); } } @Override public final void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { Document doc = fb.getDocument(); StringBuilder sb = new StringBuilder(); sb.append(doc.getText(0, doc.getLength())); sb.replace(offset, offset + length, text); if (test(sb.toString())) { super.replace(fb, offset, length, text, attrs); } } @Override public final void remove(FilterBypass fb, int offset, int length) throws BadLocationException { Document doc = fb.getDocument(); StringBuilder sb = new StringBuilder(); sb.append(doc.getText(0, doc.getLength())); sb.delete(offset, offset + length); if (test(sb.toString())) { super.remove(fb, offset, length); } } protected abstract boolean test(String text); } }