Mega Code Archive

 
Categories / Java / Swing JFC
 

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);       }     }   } }