home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / aplusplus-1.01-src.lha / GNU / src / amiga / APlusPlus-1.01 / libsource / TextView.cxx < prev    next >
C/C++ Source or Header  |  1994-05-08  |  6KB  |  250 lines

  1. /******************************************************************************
  2.  **
  3.  **    C++ Class Library for the Amiga© system software.
  4.  **
  5.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  6.  **    All Rights Reserved.
  7.  **
  8.  **    $Source: apphome:APlusPlus/RCS/libsource/TextView.cxx,v $
  9.  **    $Revision: 1.4 $
  10.  **    $Date: 1994/05/08 13:49:01 $
  11.  **    $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15.  
  16. extern "C" {
  17. #ifdef __GNUG__
  18. #include <inline/graphics.h>
  19. #endif
  20.  
  21. #ifdef __SASC
  22. #include <proto/graphics.h>
  23. #endif
  24. }
  25.  
  26. #include <APlusPlus/graphics/TextView.h>
  27.  
  28.  
  29. volatile static char rcs_id[] = "$Id: TextView.cxx,v 1.4 1994/05/08 13:49:01 Armin_Vogt Exp Armin_Vogt $";
  30.  
  31.  
  32. TextView::TextView(GOB_OWNER, AttrList& attrs)
  33.     : Canvas(gob_owner,attrs), font((UBYTE*)intuiAttrs().getTagData(TXV_FontName),(UWORD)intuiAttrs().getTagData(TXV_FontSize))
  34. {
  35.     if (Ok())
  36.     {
  37.         Canvas::setAttributes( AttrList(CNV_GranularityY,font.ySize(),
  38.                 CNV_ScrollGratX,FALSE,CNV_ScrollGratY,TRUE,TAG_END) );
  39.         setFont(font);
  40.         crsrx = intuiAttrs().getTagData(TXV_CursorX,1);
  41.         crsrx = max(crsrx,1);
  42.         crsry = intuiAttrs().getTagData(TXV_CursorY,1);
  43.         crsry = max(crsry,1);
  44.         lineCount = intuiAttrs().getTagData(TXV_Lines,0);
  45.         crsrOn = (UBYTE)intuiAttrs().getTagData(TXV_CursorOn,FALSE);
  46.         cBoxLeft = cBoxRight = 0;
  47.         cviewx = 1; cviewy = 1;
  48.         setIOType(IOTYPE_TEXTVIEW);
  49.     }
  50. }
  51.  
  52. TextView::~TextView()
  53. {
  54.     
  55. }
  56.  
  57. ULONG TextView::setAttributes(AttrList& attrs)
  58. {
  59.     Canvas::setAttributes(attrs);
  60.  
  61.     AttrIterator next(attrs);
  62.     while (next())
  63.     {
  64.         switch (next.tag())
  65.         {    
  66.             case TXV_CursorY : setCursor(next.data(),-1); break;
  67.             case TXV_CursorX : setCursor(-1,next.data()); break;
  68.             case TXV_Lines : lineCount = next.data(); break;
  69.             case TXV_CursorOn : crsrOn = (UBYTE)next.data(); break;            
  70.         }
  71.     }
  72.     return 1L;
  73. }
  74.  
  75. ULONG TextView::getAttribute(Tag tag,ULONG& dataStore)
  76. {
  77.     return Canvas::getAttribute(tag,dataStore);
  78. }
  79.  
  80. void TextView::writeLine(LONG line)
  81. {
  82.     setStdClip();
  83.     
  84.     moveTx((line-1)*granularityY(),0);
  85.     UWORD len;
  86.     UBYTE *str = getLineString(line,len);
  87.     formatOutput(str,len);
  88.  
  89.     resetStdClip();
  90. }
  91.  
  92. void TextView::print(UBYTE *partString,UWORD length)
  93. {
  94.     text(partString,length);
  95. }
  96.  
  97. void TextView::formatOutput(UBYTE *textString, UWORD length)
  98. {
  99.     setAPen(1);setDrMd(JAM1);
  100.     text(textString,length);
  101. }
  102.  
  103. void TextView::drawSelf()
  104. {
  105.     _dout("TextView::drawSelf(viewY="<<viewY()<<" visibleY="<<visibleY()<<" granularityY="<<granlarityY()<<")\n");
  106.     for (LONG ll=1,line=viewY()+1; ll<=visibleY() && line <= lines(); ll++,line++)
  107.     {
  108.         moveTx(0,(line-1)*granularityY());
  109.         UWORD len;
  110.         UBYTE *str = getLineString(line,len);
  111.         formatOutput(str,len);
  112.     }
  113.     // prevent erasing a cursor that is already drawn over.
  114.     cBoxRight = 0;
  115. }
  116.  
  117. void TextView::callback(const IntuiMessageC *imsg)
  118. {
  119.     Canvas::callback(imsg);
  120.     
  121.     switch (imsg->getClass())
  122.     {
  123.         case CLASS_MOUSEBUTTONS :
  124.             cout << "TV::MOUSEBUTTONS\n";
  125.             break;
  126.         case CLASS_MOUSEMOVE :
  127.             cout << "TV::MOUSEMOVE\n";
  128.             break;
  129.         case CLASS_GADGETDOWN :
  130.             cout << "TV:GADGETDOWN\n";
  131.             findCursor();
  132.             break;
  133.         case CLASS_GADGETUP :
  134.             cout << "TV:GADGETUP\n";
  135.             if (!forceActiveGadget(imsg))
  136.             {
  137.                 cout << " - loose active status..\n";
  138.                 eraseCBox();            
  139.             }
  140.             break;
  141.         case CLASS_VANILLAKEY :
  142.             break;
  143.         case CLASS_RAWKEY :
  144.             if (key.isEmpty()) key.decode(imsg);
  145.             switch (key.key())
  146.             {
  147.                 case CURSOR_UP : 
  148.                     setCursor(cursorY()-1,-1);
  149.                     break;
  150.                 case CURSOR_DOWN :
  151.                     setCursor(cursorY()+1,-1);
  152.                     break;
  153.                 case CURSOR_RIGHT :
  154.                     setCursor(-1,cursorX()+1);
  155.                     break;
  156.                 case CURSOR_LEFT :
  157.                     setCursor(-1,cursorX()-1);
  158.                     break;                
  159.             }
  160.             key.clear();    // clear for next RAWKEY message
  161.             break;
  162.     }
  163. }
  164.  
  165. BOOL TextView::setCursor(LONG lineNr,LONG characterNr)
  166. {
  167.     if (characterNr == -1) characterNr = crsrx;
  168.     if (lineNr == -1) lineNr = crsry;
  169.     
  170.     if (lineNr >= 1 && lineNr <= lines() && characterNr >= 1)
  171.     {    
  172.         eraseCBox();
  173.         // if new pos outside view move view so that cursor remains at his place within view 
  174.         if (lineNr < topLine())
  175.         {
  176.             cviewy = crsry-topLine()+1;
  177.             if (lineNr < cviewy) cviewy = lineNr;
  178.             Canvas::setAttributes(AttrList(CNV_ViewY,lineNr-cviewy,TAG_END));
  179.         }
  180.         else if (lineNr > topLine()+visibleLines()-1)
  181.         {
  182.             cviewy = crsry-topLine()+1;
  183.             if (lines()-lineNr < visibleLines()-cviewy) cviewy = visibleLines()-(lines()-lineNr);
  184.             Canvas::setAttributes(AttrList(CNV_ViewY,lineNr-cviewy,TAG_END));
  185.         }    
  186.         else cviewy = lineNr-topLine()+1;
  187.         
  188.         // if new
  189.         UWORD length;
  190.         UBYTE *lineString = getLineString(lineNr,length);
  191.         crsrx = min(characterNr,length); crsry = lineNr;
  192.  
  193.         XYVAL cpos = cBoxLeft/granularityX()-viewX();
  194.         cBoxRight = TextLength(rp(),(STRPTR)lineString,crsrx);
  195.         cBoxLeft = cBoxRight - TextLength(rp(),(STRPTR)&lineString[crsrx-1],1);
  196.                 
  197.         XYVAL newViewX = cBoxLeft/granularityX();
  198.         XYVAL xOffset = viewX()*granularityX();
  199.         if (cBoxLeft < xOffset || cBoxRight > xOffset+visibleX()*granularityX())
  200.         {
  201.             if (newViewX <= cpos)
  202.             {    
  203.                 newViewX = 0;
  204.             }
  205.             else        
  206.                 newViewX -= cpos;
  207.             Canvas::setAttributes(AttrList(CNV_ViewX,newViewX,TAG_END));            
  208.             cviewx = newViewX;
  209.         }
  210.         
  211.         drawCBox();
  212.         return TRUE;
  213.     }
  214.     else return TRUE;
  215. }
  216.  
  217. void TextView::findCursor()
  218. {
  219.     crsry = topLine()+cviewy-1;
  220.     // find character nearest to the cursor position relative to view boundaries
  221.     struct TextExtent textExtent;
  222.     UWORD length;
  223.     UBYTE *lineString = getLineString(crsry,length);
  224.     crsrx = 1+TextFit(rp(),(STRPTR)lineString,length,&textExtent,NULL,1,
  225.                 (LONG)cBoxLeft+(-((LONG)cviewx)+viewX())*granularityX(),font.ySize()+1);
  226.  
  227.     setCursor(crsry,crsrx);    
  228. }
  229. /*
  230. void TextView::cursorPos(UWORD mx,UWORD my)
  231. {
  232.     struct TextExtent textExtent;
  233.     crsry = my+1;
  234.     
  235.     UWORD length;
  236.     UBYTE *lineString = getLineString(crsry,length);
  237.     cColumn = TextFit(rp(),lineString,length,&textExtent,NULL,1,mx,font.ySize()+1);
  238.     
  239.     if (cColumn == length){}
  240. }    
  241. */
  242. void TextView::toggleCBox()
  243. {
  244.     // if cursor is on, erase cbox
  245.     adjustStdClip();
  246.     setStdClip();    
  247.     setDrMd(COMPLEMENT);
  248.     rectFill(cBoxLeft,(crsry-1)*granularityY(),cBoxRight,crsry*granularityY());
  249.     resetStdClip();
  250. }