/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2009 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.ui.components;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.JTextComponent;
/**
* Document filter used to update properly a text component displaying a
* time.
*/
public class TimeDocumentFilter extends DocumentFilter
{
private JTextComponent tf;
/**
* Constructor.
* @param tf the text component associated with the document.
*/
public TimeDocumentFilter(JTextComponent tf)
{
this.tf = tf;
}
/**
* {@inheritDoc}
*/
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String text, AttributeSet attr)
throws BadLocationException
{
int previousLength = fb.getDocument().getLength();
fb.insertString(offset, text.replaceAll("[^0-9]", ""), attr);
trimPosition(fb, text, offset, previousLength);
}
/**
* {@inheritDoc}
*/
public void remove(DocumentFilter.FilterBypass fb, int offset,
int length)
throws BadLocationException
{
String text = fb.getDocument().getText(offset, length);
int index = text.indexOf(":");
if (index == -1)
{
fb.remove(offset, length);
}
else
{
// index value is relative to offset
if (index > 0)
{
fb.remove(offset, index);
}
if (index < length - 1)
{
fb.remove(offset + index + 1, length - index -1);
}
}
updateCaretPosition(fb);
}
/**
* {@inheritDoc}
*/
public void replace(DocumentFilter.FilterBypass fb, int offset,
int length, String text, AttributeSet attr)
throws BadLocationException
{
int previousLength = fb.getDocument().getLength();
String t = fb.getDocument().getText(offset, length);
int index = t.indexOf(":");
fb.replace(offset, length, text.replaceAll("[^0-9]", ""), attr);
if (index != -1)
{
if (fb.getDocument().getLength() >= 2)
{
fb.insertString(2, ":", attr);
}
else
{
fb.insertString(fb.getDocument().getLength(), ":", attr);
}
}
trimPosition(fb, text, offset, previousLength);
}
private void trimPosition(DocumentFilter.FilterBypass fb, String newText,
int offset, int previousLength)
throws BadLocationException
{
String allText =
fb.getDocument().getText(0, fb.getDocument().getLength());
int index = allText.indexOf(':');
if ((index != -1) && (newText.length() == 1))
{
int minuteLength = allText.length() - index - 1;
int hourLength = index;
if ((minuteLength > 2) || (hourLength > 2))
{
if (offset < previousLength)
{
fb.remove(offset + 1, 1);
}
else
{
fb.remove(previousLength, 1);
}
}
}
updateCaretPosition(fb);
}
private void updateCaretPosition(DocumentFilter.FilterBypass fb)
throws BadLocationException
{
String allText =
fb.getDocument().getText(0, fb.getDocument().getLength());
int index = allText.indexOf(':');
if (index != -1)
{
int minuteLength = allText.length() - index - 1;
int hourLength = index;
int caretPosition = tf.getCaretPosition();
if ((minuteLength >= 2) &&
(caretPosition == allText.length()))
{
tf.setCaretPosition(0);
}
else if (hourLength == caretPosition)
{
if (hourLength >= 2)
{
tf.setCaretPosition(3);
}
else if (hourLength == 1)
{
char c = allText.charAt(0);
if (c != '0' && c != '1' && c != '2')
{
tf.setCaretPosition(2);
}
}
}
else if (hourLength + 1 == caretPosition)
{
if (hourLength == 1)
{
char c = allText.charAt(0);
if (c == '0' || c == '1' || c == '2')
{
tf.setCaretPosition(caretPosition - 1);
}
}
else if (hourLength == 0)
{
tf.setCaretPosition(caretPosition - 1);
}
}
}
if (allText.length() == 1)
{
tf.setCaretPosition(0);
}
}
}