Bi-Directional Text
/* 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); } } } }