/*
* Copyright (c) 2010, Michael Grossmann
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the jo-widgets.org nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package org.jowidgets.spi.impl.swing.common.widgets.util;
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
import org.jowidgets.common.verify.IInputVerifier;
import org.jowidgets.spi.impl.controller.InputObservable;
import org.jowidgets.util.Assert;
public class InputModifierDocument extends PlainDocument {
private static final InputObservable DUMMY_INPUT_OBSERVABLE = new InputObservable();
private static final long serialVersionUID = 6900501331487160350L;
private final JTextComponent textComponent;
private final IInputVerifier inputVerifier;
private InputObservable inputObservable;
private final Integer maxLength;
private boolean programaticChangeState;
public InputModifierDocument(
final JTextComponent textComponent,
final IInputVerifier inputVerifier,
final InputObservable inputObservable,
final Integer maxLength) {
super();
Assert.paramNotNull(textComponent, "textComponent");
this.programaticChangeState = false;
this.textComponent = textComponent;
this.inputVerifier = inputVerifier;
this.maxLength = maxLength;
setInputObservable(inputObservable);
}
@Override
public void remove(final int offs, final int len) throws BadLocationException {
final String currentText = textComponent.getText();
if (inputVerifier == null || inputVerifier.verify(currentText, "", offs, offs + len) || programaticChangeState) {
super.remove(offs, len);
inputObservable.fireInputChanged(textComponent.getText());
}
}
@Override
public void replace(final int offset, final int length, final String text, final AttributeSet attrs) throws BadLocationException {
final String currentText = textComponent.getText();
if (maxLength != null) {
int entireLength = currentText != null ? currentText.length() : 0;
entireLength = entireLength + (text != null ? text.length() : 0) - length;
if (entireLength > maxLength.intValue()) {
Toolkit.getDefaultToolkit().beep();
return;
}
}
if (inputVerifier == null || inputVerifier.verify(currentText, text, offset, offset + length) || programaticChangeState) {
super.replace(offset, length, text, attrs);
inputObservable.fireInputChanged(textComponent.getText());
}
}
public void setInputObservable(final InputObservable inputObservable) {
if (inputObservable == null) {
this.inputObservable = DUMMY_INPUT_OBSERVABLE;
}
else {
this.inputObservable = inputObservable;
}
}
public void setProgramaticChangeState(final boolean programaticChangeState) {
this.programaticChangeState = programaticChangeState;
}
}