/*
Core SWING Advanced Programming
By Kim Topley
ISBN: 0 13 083292 8
Publisher: Prentice Hall
*/
/*
Bi-Directional Text. Model Order and Visual Order. Caret Position and the Selection.
How Bi-Directional Text Is Handled in the Swing Text Components.
*/
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import javax.swing.text.View;
public class BidiTextExample {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {}
JFrame f = new JFrame("Bi-directional Text");
final JTextPane tp = new JTextPane();
if (args.length > 0 && args[0].equalsIgnoreCase("Arabic")) {
GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
System.out.println("Using physical font");
Font font = new Font("Lucida Sans Regular", Font.PLAIN, 32);
tp.setFont(font);
} else {
Font font = new Font("Serif", Font.PLAIN, 32);
tp.setFont(font);
}
String s = new String(new char[] { (char) 'A', (char) 0xFE76,
(char) 0xFE77, (char) 0xFE78, (char) 'Z' });
final AbstractDocument doc = (AbstractDocument) tp.getDocument();
System.out.println("i18n property is " + doc.getProperty("i18n"));
// Turn on bi-directional text
doc.putProperty("i18n", Boolean.TRUE);
try {
doc.insertString(0, s, null);
} catch (Exception e) {
}
f.getContentPane().add(new JScrollPane(tp));
f.setSize(300, 300);
f.setVisible(true);
tp.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent evt) {
System.out.println("Caret position is " + evt.getDot());
}
});
try {
Thread.sleep(10000);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Dump the model
doc.dump(System.out);
// Show the views
ViewDisplayer.displayViews(tp, System.out);
}
});
} catch (Exception e) {
}
}
}
class ViewDisplayer {
public static void displayViews(JTextComponent comp, PrintStream out) {
View rootView = comp.getUI().getRootView(comp);
displayView(rootView, 0, comp.getDocument(), out);
}
public static void displayView(View view, int indent, Document doc,
PrintStream out) {
String name = view.getClass().getName();
for (int i = 0; i < indent; i++) {
out.print("\t");
}
int start = view.getStartOffset();
int end = view.getEndOffset();
out.println(name + "; offsets [" + start + ", " + end + "]");
int viewCount = view.getViewCount();
if (viewCount == 0) {
int length = Math.min(32, end - start);
try {
String txt = doc.getText(start, length);
for (int i = 0; i < indent + 1; i++) {
out.print("\t");
}
out.println("[" + txt + "]");
} catch (BadLocationException e) {
}
} else {
for (int i = 0; i < viewCount; i++) {
displayView(view.getView(i), indent + 1, doc, out);
}
}
}
}
|