home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / text.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  7.5 KB  |  286 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 39
  2. /* Copyright (c) 1990-1992 by the University of Illinois Board of Trustees */
  3. #pragma load EUDORA_LOAD
  4. #pragma segment Text
  5.  
  6.     Boolean TextClose(MyWindowPtr win);
  7.     MyWindowPtr FindText(short vRef,UPtr name);
  8.     Boolean TextSave(MyWindowPtr win);
  9.     Boolean TextSaveAs(MyWindowPtr win);
  10.     Boolean TextMenu(MyWindowPtr win, int menu, int item, short modifiers);
  11.     Boolean TextPosition(Boolean save,MyWindowPtr win);
  12.     void TextChanged(MyWindowPtr win);
  13.  
  14. /************************************************************************
  15.  * OpenText - open a text window
  16.  ************************************************************************/
  17. short OpenText(short vRef,UPtr name,MyWindowPtr win,Boolean showIt,UPtr alias)
  18. {
  19.     long bytes;
  20.     UHandle textH=nil;
  21.     short refN=0;
  22.     short err=noErr;
  23.     TextDHandle th=nil;
  24.     MyWindowPtr oldWin;
  25.     
  26.     if (vRef)
  27.     {
  28.         if (oldWin=FindText(vRef,name))
  29.         {
  30.             ShowMyWindow(oldWin);
  31.             SelectWindow(oldWin);
  32.             return(noErr);
  33.         }
  34.             
  35.         if (err=FSHOpen(name,vRef,0,&refN,fsRdPerm))
  36.             FileSystemError(TEXT_READ,name,err);
  37.         else if (err=GetEOF(refN,&bytes))
  38.             FileSystemError(TEXT_READ,name,err);
  39.         else if (bytes>INFINITY)
  40.         {
  41.             WarnUser(TEXT_TOO_BIG,bytes);
  42.             err=INFINITY;
  43.         }
  44.     }
  45.     else
  46.         bytes = 0;
  47.     if (err==noErr)
  48.     {
  49.         if (!(win = GetNewMyWindow(MESSAGE_WIND,win,InFront,False,False)))
  50.             err=1;
  51.         else if (!(th=NewZH(TextDesc)))
  52.             WarnUser(MEM_ERR,err=MemError());
  53.         else
  54.         {
  55.             ((WindowPeek)win)->windowKind = TEXT_WIN;
  56.             if (!(textH=NuHandle(bytes)))
  57.                 WarnUser(MEM_ERR,err=MemError());
  58.             else if (vRef && (err=FSRead(refN,&bytes,LDRef(textH))))
  59.                 FileSystemError(TEXT_READ,name,err);
  60.             else
  61.             {
  62.                 UL(textH);
  63.                 FSClose(refN);
  64.                 refN = 0;
  65.                 if ((win->ste=NewSTE(win,nil,False,True,True))==nil)
  66.                     WarnUser(MESS_TE,err=MemError());
  67.                 else
  68.                 {
  69.                     (*(STEHandle)win->ste)->growBox = True;
  70.                     (*(STEHandle)win->ste)->dontFrame = True;
  71.                     STEInstallText(textH,win->ste); textH = nil;
  72.                     win->didResize = TextDidResize;
  73.                     win->zoomSize = CompZoomSize;
  74.                     win->close = TextClose;
  75.                     win->menu = TextMenu;
  76.                     SetWTitle(win,alias?alias:name);
  77.                     (*th)->vRef = vRef;
  78.                     PCopy((*th)->fileName,name);
  79.                     win->qWindow.refCon = (long)th; th=nil;
  80.                     win->position = alias ? PositionPrefsTitle : TextPosition;
  81.                     win->textChanged = TextChanged;
  82.                     if (showIt)
  83.                         ShowMyWindow(win);
  84.                     UpdateMyWindow(win);
  85.                     TEActivate(WinTEH(win));
  86.                 }
  87.             }
  88.         }
  89.     }
  90.     if (refN) FSClose(refN);
  91.     if (textH) DisposHandle(textH);
  92.     if (th) DisposHandle(th);
  93.     return(err);
  94. }
  95.  
  96. /************************************************************************
  97.  * FindText - find a window containing the contents of a text file
  98.  ************************************************************************/
  99. MyWindowPtr FindText(short vRef,UPtr name)
  100. {
  101.     MyWindowPtr win;
  102.     TextDHandle th;
  103.     
  104.     for (win=FrontWindow();win;win=win->qWindow.nextWindow)
  105.         if (IsMyWindow(win) && win->qWindow.windowKind==TEXT_WIN)
  106.         {
  107.             th = (TextDHandle) win->qWindow.refCon;
  108.             if ((*th)->vRef==vRef&& EqualString(name,LDRef(th)->fileName,False,True))
  109.             {
  110.                 UL(th);
  111.                 return(win);
  112.             }
  113.             else
  114.                 UL(th);
  115.         }
  116.     return(nil);
  117. }
  118.     
  119. /**********************************************************************
  120.  * TextDidResize - handle the resizing of a message window
  121.  **********************************************************************/
  122. void TextDidResize(MyWindowPtr win,Rect *oldContR)
  123. {
  124. #pragma unused(oldContR)
  125.     Rect r = win->contR;
  126.     r.top--;
  127.     r.right++;
  128.     ResizeSTE(win->ste,&r);
  129. }
  130.  
  131. #pragma segment Main
  132. /************************************************************************
  133.  * TextClose - close a text window
  134.  ************************************************************************/
  135. Boolean TextClose(MyWindowPtr win)
  136. {
  137.     short which;
  138.     if (win->isDirty)
  139.     {
  140.         which = WannaSave(win);
  141.         if (which==WANNA_SAVE_CANCEL || which==CANCEL_ITEM) return(False);
  142.         if (which==WANNA_SAVE_SAVE && !TextSave(win)) return(False);
  143.     }
  144.     if (win->ste) STEDispose(win->ste);
  145.     return(True);
  146. }
  147. #pragma segment Text
  148.  
  149. /************************************************************************
  150.  * TextSave - save the contents of a text window
  151.  ************************************************************************/
  152. Boolean TextSave(MyWindowPtr win)
  153. {
  154.     TextDHandle th=(TextDHandle)win->qWindow.refCon;
  155.     TEHandle teh = WinTEH(win);
  156.     short refN,err;
  157.     long bytes;
  158.     
  159.     if (!(*th)->vRef) return(TextSaveAs(win));
  160.     LDRef(th);
  161.     if (err=FSOpen((*th)->fileName,(*th)->vRef,&refN))
  162.         FileSystemError(TEXT_WRITE,(*th)->fileName,err);
  163.     else
  164.     {
  165.         bytes = (*teh)->teLength;
  166.         if (err=FSWrite(refN,&bytes,LDRef((*teh)->hText)))
  167.             FileSystemError(TEXT_WRITE,(*th)->fileName,err);
  168.         else if (err=SetEOF(refN,bytes))
  169.             FileSystemError(TEXT_WRITE,(*th)->fileName,err);
  170.         UL((*teh)->hText);
  171.         FSClose(refN);
  172.         win->isDirty = err!=noErr;
  173.     }
  174.     UL(th);
  175.     return(err==noErr);
  176. }
  177.  
  178. /************************************************************************
  179.  * TextChanged - notice when text has changed
  180.  ************************************************************************/
  181. void TextChanged(MyWindowPtr win)
  182. {
  183.     STETextChanged(win->ste);
  184. }
  185.  
  186. /************************************************************************
  187.  * TextSaveAs - save the contents of a text window, giving a new name
  188.  ************************************************************************/
  189. Boolean TextSaveAs(MyWindowPtr win)
  190. {
  191.     short vRef,refN,err;
  192.     Str31 name;
  193.     Str31 scratch;
  194.     long creator,bytes;
  195.     TextDHandle th;
  196.     TEHandle teh = WinTEH(win);
  197.     
  198.     /*
  199.      * standard file stuff
  200.      */
  201.     GetPref(scratch,PREF_CREATOR);
  202.     if (*scratch!=4) GetRString(scratch,TEXT_CREATOR);
  203.     BlockMove(scratch+1,&creator,4);
  204.     th = (TextDHandle)win->qWindow.refCon;
  205.     PCopy(name,(*th)->fileName);
  206.     if (err=SFPutOpen(name,&vRef,creator,'TEXT',&refN,DlgFilter,SFPUTFILE_ID))
  207.         return(False);
  208.     bytes = (*teh)->teLength;
  209.     if (err=FSWrite(refN,&bytes,LDRef((*teh)->hText)))
  210.         FileSystemError(TEXT_WRITE,name,err);
  211.     else if (err=SetEOF(refN,bytes))
  212.         FileSystemError(TEXT_WRITE,name,err);
  213.     else
  214.     {
  215.         (*th)->vRef = vRef;
  216.         PCopy((*th)->fileName,name);
  217.         SetWTitle(win,name);
  218.         win->isDirty = False;
  219.     }
  220.     UL((*teh)->hText);
  221.     FSClose(refN);
  222.     return(err==noErr);
  223. }
  224.  
  225. /************************************************************************
  226.  * TextMenu - handle menu choices peculiar to Text windows
  227.  ************************************************************************/
  228. Boolean TextMenu(MyWindowPtr win, int menu, int item, short modifiers)
  229. {
  230. #pragma unused(modifiers)
  231.     switch (menu)
  232.     {
  233.         case FILE_MENU:
  234.             switch (item)
  235.             {
  236.                 case FILE_SAVE_ITEM:
  237.                     (void) TextSave(win);
  238.                     break;
  239.                 case FILE_SAVE_AS_ITEM:
  240.                     TextSaveAs(win);
  241.                     break;
  242.                 case FILE_PRINT_ITEM:
  243.                 case FILE_PRINT_SELECT_ITEM:
  244.                     PrintOneMessage(win,item==FILE_PRINT_SELECT_ITEM);
  245.                     break;
  246.                 default:
  247.                     return(False);
  248.             }
  249.             break;
  250.         case EDIT_MENU:
  251.             if (item==TEWRAP && modifiers&optionKey) item=TEUNWRAP;
  252.             return(TESomething(win,item,0,modifiers));
  253.             break;
  254.         default:
  255.             return(False);
  256.     }
  257.     return(True);
  258. }
  259.  
  260. /************************************************************************
  261.  * TextPosition - remember the position of a text window
  262.  ************************************************************************/
  263. Boolean TextPosition(Boolean save,MyWindowPtr win)
  264. {
  265.     Rect r;
  266.     Boolean zoomed;
  267.     TextDHandle textH = (TextDPtr) win->qWindow.refCon;
  268.     Str31 name;
  269.     
  270.     PCopy(name,(*textH)->fileName);
  271.     if (!*name) return(False);
  272.     if (save)
  273.     {
  274.         utl_SaveWindowPos(win,&r,&zoomed);
  275.         SavePosFork((*textH)->vRef,0,name,&r,zoomed);
  276.     }
  277.     else
  278.     {
  279.         if (!RestorePosFork((*textH)->vRef,0,name,&r,&zoomed))
  280.             return(False);
  281.         utl_RestoreWindowPos(win,&r,zoomed,1,FigureZoom,DefPosition);
  282.     }
  283.     return(True);
  284. }
  285.  
  286.