home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / awt / textwindow.java < prev    next >
Text File  |  1995-08-11  |  6KB  |  253 lines

  1. /*
  2.  * @(#)TextWindow.java    1.25 95/02/23 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19. package awt;
  20.  
  21. import java.util.*;
  22. import java.io.*;
  23.  
  24. /**
  25.  * A class that displays formatted text in a window. Also has a
  26.  * SmoothScroller associated with it.
  27.  *
  28.  * @see Formatter
  29.  * @see Text
  30.  * @see SmoothScroller
  31.  * @version 1.25 23 Feb 1995
  32.  * @author Jonathan Payne
  33.  */
  34. public class TextWindow extends DisplayItemWindow {
  35.     Vector    lineYValues = new Vector();
  36.     Vector    lineItemIndexes = new Vector();
  37.  
  38.     public Formatter    formatter;  /* formatter for this text */
  39.  
  40.     public TextWindow(Window parent, String client) {
  41.     super(parent, client);
  42.     }
  43.  
  44.     public TextWindow(Frame parent, String client) {
  45.     super(parent, client);
  46.     }
  47.  
  48.     public synchronized void setFormatter(Formatter f) {
  49.     formatter = f;
  50.     invalidate();
  51.     }
  52.  
  53.     public void validate() {
  54.     if (!valid) {
  55.         layoutDocument();
  56.         super.validate();
  57.     }
  58.     }
  59.  
  60.     public void clearItems() {
  61.     super.clearItems();
  62.     lineYValues.setSize(0);
  63.     lineItemIndexes.setSize(0);
  64.     }
  65.  
  66.     protected void layoutDocument() {
  67.     if (formatter == null) {
  68.         //setFormatter(new Formatter(this));
  69.         return;
  70.     }
  71.     clearItems();
  72.     paintRange(0, height);
  73.     formatter.layout();
  74.     }
  75.  
  76.     public void startNewLine(int n) {
  77.     startNewLine(n, formatter.getYCoordinate());
  78.     }
  79.  
  80.     public void startNewLine(int n, int y) {
  81.     int size = lineYValues.size();
  82.     if (size > 0 && ((Integer) (lineYValues.elementAt(size - 1))).intValue() == y)
  83.         return;
  84.     lineYValues.addElement(new Integer(y));
  85.     lineItemIndexes.addElement(new Integer(n));
  86.     }
  87.  
  88.     /** Return the index of the first item in a line whose
  89.     y value is < the specified y. */
  90.     int findItemBefore(int y) {
  91.     int lo = 0;
  92.     int hi = lineYValues.size();
  93.  
  94.     while (true) {
  95.         int diff = hi - lo;
  96.         int mid = (lo + hi) / 2;
  97.  
  98.         if (diff < 2) {
  99.         return lo;
  100.         }
  101.         Integer i = (Integer) lineYValues.elementAt(mid);
  102.  
  103.         if (i.intValue() < y) {
  104.         lo = mid;
  105.         } else {
  106.         hi = mid;
  107.         }
  108.     } 
  109.     }
  110.  
  111.     void paintRange(int y0, int y1) {
  112.     int cnt;
  113.     int i, j;
  114.     int line0, line1;
  115.  
  116.     if (y1 < 0 || y0 > height)
  117.         return;
  118.     setForeground(background);
  119.     fillRect(0, y0, width, y1 - y0);
  120.  
  121.     if (count() == 0) {
  122.         return;
  123.     }
  124.  
  125.     y0 -= scrollY;
  126.     y1 -= scrollY;
  127.  
  128.     /* Now try to find the range of items to print. */
  129.     line0 = findItemBefore(y0);
  130.     i = ((Integer) lineItemIndexes.elementAt(line0)).intValue();
  131.     cnt = lineYValues.size() - line0;
  132.     for (line1 = line0 + 1; --cnt > 0; line1 += 1) {
  133.         Integer anInt = (Integer) lineYValues.elementAt(line1);
  134.  
  135.         if (anInt.intValue() >= y1) {
  136.         break;
  137.         }
  138.     }
  139.     if (cnt > 0) {
  140.         j = ((Integer) lineItemIndexes.elementAt(line1)).intValue();
  141.     } else {
  142.         j = count();
  143.     }
  144.  
  145. //    System.out.println("Painting from " + i + " to " + j);
  146.     /* Now paint them as fast as we can! */
  147.     cnt = j - i;
  148.     while (--cnt >= 0) {
  149.         DisplayItem    di = items[i++];
  150.  
  151.         if (di.y + di.height < y0 || di.y > y1) {
  152.         continue;
  153.         }
  154.         di.paint(this, di.x + scrollX, di.y + scrollY);
  155.     }
  156.     update();
  157.     }
  158.  
  159.     public synchronized void print(PSGraphics pg) {
  160.     int lTop, lBottom;
  161.     int yTop, yBottom;
  162.     int iTop, iBottom;
  163.     int linecount = lineYValues.size() - 1;
  164.     // REMIND: This is an extreme hack.  We replace the graphics
  165.     // context and background color of the TextWindow and ask it to
  166.     // redraw itself.
  167.     Graphics g = graphics;
  168.     Color c = background;
  169.     graphics = (Graphics) pg;
  170.     background = Color.white;
  171.     try {
  172.         pg.setForeground(Color.black);
  173.         pg.setBackground(Color.white);
  174.         lTop = 0;
  175.         while (lTop < linecount) {
  176.         yTop = ((Integer) lineYValues.elementAt(lTop)).intValue();
  177.         yBottom = yTop + pg.outputDim.height;
  178.         for (lBottom = lTop + 1; lBottom < linecount; lBottom++) {
  179.             int yThis = ((Integer) lineYValues.elementAt(lBottom))
  180.             .intValue();
  181.             if (yThis >= yBottom) {
  182.             lBottom--;
  183.             break;
  184.             }
  185.         }
  186.         if (lTop == lBottom) {
  187.             lBottom++;
  188.         }
  189.         iTop = ((Integer) lineItemIndexes.elementAt(lTop)).intValue();
  190.         iBottom = ((Integer) lineItemIndexes.elementAt(lBottom))
  191.             .intValue();
  192.         pg.startPage();
  193.         while (iTop < iBottom) {
  194.             DisplayItem di = items[iTop++];
  195.             if (di instanceof NativeDisplayItem) {
  196.             continue;
  197.             }
  198.             di.paint(this, di.x, di.y - yTop);
  199.         }
  200.         lTop = lBottom;
  201.         pg.endPage();
  202.         }
  203.     } finally {
  204.         graphics = g;
  205.         background = c;
  206.     }
  207.     }
  208.  
  209.     public void dumpItemInfo() {
  210.     int i = 0;
  211.     int cnt = count();
  212.  
  213.     while (--cnt >= 0) {
  214.         DisplayItem    d = nthItem(i);
  215.  
  216.         System.out.println(i + ": " + d);
  217.         i += 1;
  218.     }
  219.     System.out.println("Line table:");
  220.     cnt = lineYValues.size();
  221.     i = 0;
  222.     while (--cnt >= 0) {
  223.         System.out.println(i + ": " + lineYValues.elementAt(i) + ", item = " + lineItemIndexes.elementAt(i));
  224.         i += 1;
  225.     }
  226.     }
  227.  
  228.     public void keyPressed(Event e) {
  229.     switch (e.key) {
  230.     case 'a' & 0x1f:
  231.         dumpItemInfo();
  232.         break;
  233.  
  234.     case 'd' & 0x1f:    /* control-D */
  235.         thrust(true);
  236.         break;
  237.  
  238.     case 'u' & 0x1f:    /* control-U */
  239.         thrust(false);
  240.         break;
  241.  
  242.     case 's' & 0x1f:    /* control-S */
  243.         if (scroller != null)
  244.         scroller.brake(100);
  245.         break;
  246.  
  247.       default:
  248.         super.keyPressed(e);
  249.         break;
  250.     }
  251.     }
  252. }
  253.