/*
* Copyright 2006-2008 Kees de Kooter
*
* 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 net.boplicity.xmleditor;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
/**
* JTextPane implementation that can handle xml text. The IndentKeyListener
* implements smart indenting.
*
* @author kees
* @date 27-jan-2006
*
*/
public class XmlTextPane extends JTextPane {
private static final Logger LOGGER = Logger.getLogger(XmlTextPane.class.getName());
private static final Character NEW_LINE = '\n';
/**
* Constructs a new {@code XmlTextPane}.
*/
public XmlTextPane() {
// Set editor kit
this.setEditorKitForContentType("text/xml", new XmlEditorKit());
this.setContentType("text/xml");
addKeyListener(new IndentKeyListener());
}
private class IndentKeyListener implements KeyListener {
private boolean enterFlag;
@Override
public void keyPressed(KeyEvent event) {
enterFlag = false;
if ((event.getKeyCode() == KeyEvent.VK_ENTER)
&& (event.getModifiers() == 0)
&& getSelectionStart() == getSelectionEnd()) {
enterFlag = true;
event.consume();
}
}
@Override
public void keyReleased(KeyEvent event) {
if ((event.getKeyCode() == KeyEvent.VK_ENTER)
&& (event.getModifiers() == 0) && enterFlag) {
event.consume();
int start, end;
String text = getText();
int caretPosition = getCaretPosition();
try {
if (text.charAt(caretPosition) == NEW_LINE) {
caretPosition--;
}
} catch (IndexOutOfBoundsException e) {
LOGGER.log(Level.FINE, e.toString());
}
start = text.lastIndexOf(NEW_LINE, caretPosition) + 1;
end = start;
try {
if (text.charAt(start) != NEW_LINE) {
while ((end < text.length())
&& (Character.isWhitespace(text.charAt(end)))
&& (text.charAt(end) != NEW_LINE)) {
end++;
}
if (end > start) {
getDocument()
.insertString(
getCaretPosition(),
NEW_LINE
+ text.substring(start,
end), null);
} else {
getDocument().insertString(getCaretPosition(),
NEW_LINE.toString(), null);
}
} else {
getDocument().insertString(getCaretPosition(),
NEW_LINE.toString(), null);
}
} catch (IndexOutOfBoundsException e) {
try {
getDocument().insertString(getCaretPosition(),
NEW_LINE.toString(), null);
} catch (BadLocationException e1) {
LOGGER.log(Level.WARNING, e1.toString());
}
} catch (BadLocationException e) {
LOGGER.log(Level.WARNING, e.toString());
}
}
}
@Override
public void keyTyped(KeyEvent e) {
// Do nothing
}
}
}