home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / skel_azt.sha / teadjdest.c < prev    next >
C/C++ Source or Header  |  1986-07-08  |  4KB  |  123 lines

  1.  
  2. /*
  3.  *    teadjdest.c -- adjust the textedit destination rectangle to match
  4.  *                    the size of the text that hText contains, and
  5.  *                    adjust the scrollbar control values to match also
  6.  */
  7.  
  8. #include <quickdraw.h>
  9. #include <control.h>
  10. #include <event.h>
  11. #include <textedit.h>
  12. #include <window.h>
  13.  
  14. #include "def.h"
  15.  
  16. void
  17. teadjdest()
  18. {
  19.     extern    TEHandle    hTE;
  20.     extern ControlHandle    hscroll[NWINDOWS];
  21.     int                    i;
  22.     extern long            lastTEadj;
  23.     int                    ls;            /* line start */
  24.     int                    mll;        /* maximum line length */
  25.     extern int        scrollTEstart;    /* keep track of insertion point
  26.                                      * character index
  27.                                      */
  28.     Rect                sel;
  29.     int                    tll;        /* this line length */
  30.     extern Point        tlp[NWINDOWS];
  31.     extern ControlHandle    vscroll[NWINDOWS];
  32.     extern Boolean        wantTEadj;
  33.     extern WindowPtr    wp[NWINDOWS];
  34.  
  35.     /* If typing is occurring, don't slow down the scrolling by doing
  36.      * all these calculations for every key-stroke.
  37.      * This method is a little jumpy, but better than nothing.
  38.      * If the typing stops, the main event loop will make the final
  39.      * (well, temporarily final) call of teadjdest.
  40.      */
  41.  
  42.     if (TickCount() - lastTEadj < 60) {
  43.         wantTEadj = TRUE;
  44.         return;
  45.     };
  46.     wantTEadj = FALSE;
  47.     lastTEadj = TickCount();
  48.     ls = (*hTE)->lineStarts[0];
  49.     HLock((*hTE)->hText);
  50.     if ((*hTE)->nLines < 2)
  51.         mll = TextWidth(*(*hTE)->hText, 0, (*hTE)->teLength);
  52.     else {
  53.         mll = 1;
  54.         for (i = 1;  i <= (*hTE)->nLines;  i++) {
  55.  
  56.             /* search for the longest line */
  57.  
  58.             tll = -ls;
  59.             ls = (*hTE)->lineStarts[i];
  60.             tll += ls;
  61.             tll = TextWidth(*(*hTE)->hText, ls - tll, tll);
  62.             if (tll > mll)
  63.                 mll = tll;
  64.         };
  65.     };
  66.     (*hTE)->destRect.right = mll + (*hTE)->destRect.left + 8 +
  67.         (*hTE)->lineHeight * 5;    /* room for typing at right margin */
  68.     (*hTE)->destRect.bottom = ((*hTE)->nLines + 1) * (*hTE)->lineHeight +
  69.         (*hTE)->destRect.top + 8;
  70.  
  71.     /* We use the selRect field of the TE structure to determine
  72.      * whether there is a caret insertion point and where that point
  73.      * is.  Unfortunately, Apple hasn't been able to document selRect
  74.      * yet, as it hasn't been around enough years yet!  So we do
  75.      * some guessing about it based on observing it with MacsBug.
  76.      */
  77.  
  78.     BlockMove(&(*hTE)->selRect, &sel, (long)sizeof(Rect));
  79.     if (sel.left == 0x8002)        /* some special value ??  Anyway, it's
  80.                                  * what's there when an empty line is
  81.                                  * selected as the insertion point by
  82.                                  * TEClick
  83.                                  */
  84.         sel.left = (*hTE)->destRect.left + 4;
  85.     if (sel.right == -0x8002)    /* some special value ??  Anyway, it's
  86.                                  * what's there when the caret is off
  87.                                  * the left side of the window after
  88.                                  * TEClick selects the insertion point
  89.                                  */
  90.         sel.right = sel.left + 1;
  91.     if (sel.right - sel.left == 1 &&
  92.             sel.bottom - sel.top == (*hTE)->lineHeight &&
  93.             (*hTE)->selStart != scrollTEstart) {
  94.  
  95.         /* make sure the insertion point caret is in the window */
  96.  
  97.         scrollTEstart = (*hTE)->selStart;
  98.         if (sel.top + tlp[1].v + (*hTE)->destRect.top <
  99.                 wp[1]->portRect.top)
  100.             SetCtlValue(vscroll[1], sel.top + tlp[1].v);
  101.         if (sel.bottom + tlp[1].v + (*hTE)->destRect.top >
  102.                 wp[1]->portRect.bottom - 16) {
  103.             i = wp[1]->portRect.bottom - wp[1]->portRect.top - 16;
  104.             if (sel.top > GetCtlMax(vscroll[1]))
  105.                 SetCtlMax(vscroll[1], (*hTE)->destRect.bottom - i - 5 -
  106.                     (*hTE)->destRect.top);
  107.             SetCtlValue(vscroll[1], sel.bottom + tlp[1].v - i);
  108.         };
  109.         if (sel.right + tlp[1].h + (*hTE)->destRect.left <
  110.                 wp[1]->portRect.left ||
  111.                 sel.left + tlp[1].h + (*hTE)->destRect.left >
  112.                 wp[1]->portRect.right - 16) {
  113.             i = wp[1]->portRect.right - wp[1]->portRect.left - 16;
  114.             if (sel.right > GetCtlMax(hscroll[1]))
  115.                 SetCtlMax(hscroll[1], (*hTE)->destRect.right -
  116.                     i - 5 - (*hTE)->destRect.left);
  117.             SetCtlValue(hscroll[1], sel.left + tlp[1].h - (i >> 1));
  118.         };
  119.     };
  120.     HUnlock((*hTE)->hText);
  121.     checkscroll(1);
  122. } /* end of teadjdest */
  123.