home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / code / pshar_li.sit < prev    next >
Encoding:
Text File  |  1988-06-20  |  16.8 KB  |  519 lines

  1. 18-Jun-88 14:34:31-MDT,17678;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 14:34:03 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA22333; Sat, 18 Jun 88 14:34:05 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA24673; Sat, 18 Jun 88 14:34:01 MDT
  8. Date: Sat, 18 Jun 88 14:34:01 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8806182034.AA24673@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: ListMgrExample.p.shar
  13.  
  14. #! /bin/sh
  15. #
  16. # This is a shell archive.  Save this into a file, edit it
  17. # and delete all lines above this comment.  Then give this
  18. # file to sh by executing the command "sh file".  The files
  19. # will be extracted into the current directory owned by
  20. # you with default permissions.
  21. #
  22. # The files contained herein are:
  23. #
  24. #   15 ListMgrExample.p
  25. #    2 ListMgrExample.r
  26. #
  27. echo 'Extracting ListMgrExample.p'
  28. if test -f ListMgrExample.p; then echo 'shar: will not overwrite ListMgrExample.p'; else
  29. cat << '________This_Is_The_END________' > ListMgrExample.p
  30. {$X-}
  31. {This is list/Test.text, an example program which uses the List Manager}
  32. PROGRAM Test;
  33.  
  34.    USES {$U-}
  35.       {$U Obj/Memtypes      } Memtypes,
  36.       {$U Obj/QuickDraw      } QuickDraw,
  37.       {$U Obj/OSIntf      } OSIntf,
  38.       {$U Obj/ToolIntf      } ToolIntf,
  39.       {$U Obj/PackIntf      } PackIntf,
  40.       {$U Obj/ListIntf      } ListIntf;
  41.  
  42.    CONST
  43.       appleMenu = 1; { menu ID for desk accessory menu }
  44.       fileMenu = 256; { menu ID for File menu }
  45.       editMenu = 257; { menu ID for Edit menu }
  46.       mungeMenu = 258; { munu for rows and columns }
  47.       selectMenu = 259;
  48.       MakeNewMenu = 260;    { menu to set up new window }
  49.       lastMenu = 6;     { the number of menus }
  50.  
  51.       len255 = 255;
  52.  
  53.    VAR
  54.       myMenus: ARRAY [1..lastMenu] OF MenuHandle;
  55.       dragRect,r,b,sizeLimits: Rect;
  56.       doneFlag,temp,sHoriz,sVert,groBox,drawIt: BOOLEAN;
  57.       myEvent: EventRecord;
  58.       code,refNum,i,j: INTEGER;
  59.       wRecord: WindowRecord;
  60.       myWindow,whichWindow: WindowPtr;
  61.       theMenu,theItem: INTEGER;
  62.       myList: ListHandle;
  63.       c,cc: Cell;
  64.       CellName,cutStr,iStr,jStr: str255;
  65.       cutStrLen :INTEGER;
  66.       h1,h2: handle;
  67.       x: OSErr;
  68.       cSize: Point;
  69.       theMark: char;
  70.       tFlag: INTEGER;
  71.       tempFlags, newSize: LONGINT;
  72.  
  73.  
  74.    PROCEDURE CellValue( var c: Cell; h,v: INTEGER);
  75.    BEGIN
  76.         c.h := h;
  77.         c.v := v;
  78.    END;
  79.  
  80.    PROCEDURE ClrAllCells;
  81.    VAR c: cell;
  82.    BEGIN CellValue(c,0,0);
  83.          WHILE LGetSelect(TRUE,c,myList) DO   { get next selected cell }
  84.                LSetSelect(FALSE,c,myList);    { and deselect it }
  85.    END;
  86.  
  87.    PROCEDURE SetCell( c: Cell );
  88.    VAR iStr,jStr: str255;
  89.    BEGIN
  90.        NumToString(c.h,iStr);
  91.        NumToString(c.v,jStr);
  92.        cellName:= concat('Cell ',jStr,',',iStr);
  93.        LSetCell(POINTER(ORD(@CellName)+1),LENGTH(cellName),c,myList);
  94.    END;
  95.  
  96.    PROCEDURE SetCellValues;  { number all the cells in the array}
  97.    VAR  c: cell;
  98.    BEGIN
  99.         CellValue(c,0,0);
  100.         REPEAT SetCell(c);
  101.         UNTIL NOT LNextCell(TRUE,TRUE,c,myList);     { increment v and h }
  102.    END;
  103.  
  104.    FUNCTION CountSelections: INTEGER;
  105.    VAR c: cell;
  106.        i: INTEGER;
  107.    BEGIN CellValue(c,0,0); i := 0;
  108.          REPEAT IF LGetSelect(TRUE,c,myList) THEN i:=i+1;
  109.          UNTIL NOT LNextCell(TRUE,TRUE,c,myList);
  110.          countSelections := i;
  111.    END;
  112.  
  113.    PROCEDURE FlipSelections;
  114.    { A little razzle-dazzle to test double-click }
  115.    VAR c: cell;
  116.        i,flipStrLen: INTEGER;
  117.        flipStr: Str255;
  118.        a: char;
  119.        b: BOOLEAN;
  120.    BEGIN CellValue(c,0,0);
  121.          {WHILE LGetSelect(TRUE,c,myList) DO}
  122.                c:=LLastClick(myList);
  123.                BEGIN flipStrLen := 255;
  124.                      LGetCell(POINTER(ORD(@flipStr)+1),flipStrLen,c,myList);
  125.                      FOR i := 1 TO flipStrLen DIV 2 DO BEGIN
  126.                          a := flipStr[i];
  127.                          flipStr[i] := flipStr[flipStrLen-i+1];
  128.                          flipStr[flipStrLen-i+1] := a;
  129.                      END;
  130.                      LSetCell(POINTER(ORD(@flipStr)+1),flipStrLen,c,myList);
  131.                      b := LNextCell(TRUE,TRUE,c,myList);
  132.                END; { while }
  133.    END;
  134.  
  135.    PROCEDURE SetUpMenus;
  136.    { Once-only initialization for menus }
  137.  
  138.       VAR
  139.          i: INTEGER;
  140.  
  141.       BEGIN
  142.          InitMenus; { initialize Menu Manager }
  143.          myMenus[1] := GetMenu(appleMenu);
  144.          AddResMenu(myMenus[1],'DRVR'); { desk accessories }
  145.          myMenus[2] := GetMenu(fileMenu);
  146.          myMenus[3] := GetMenu(editMenu);
  147.          myMenus[4] := GetMenu(mungeMenu);
  148.          myMenus[5] := GetMenu(selectMenu);
  149.          myMenus[6] := GetMenu(makeNewMenu);
  150.          FOR i := 1 TO lastMenu DO InsertMenu(myMenus[i],0);
  151.          DrawMenuBar;
  152.       END; { of SetUpMenus }
  153.  
  154.    PROCEDURE CloseTheList;
  155.      BEGIN
  156.         IF myList^ <> NIL THEN BEGIN
  157.            LDispose(myList);
  158.            CloseWindow(myWindow);
  159.            myList^ := NIL;
  160.            myWindow := NIL;
  161.         END;
  162.      END; { closeTheList }
  163.  
  164.    PROCEDURE OpenNewList;
  165.      BEGIN
  166.         myWindow := GetNewWindow(256,@wRecord,POINTER(-1));
  167.         SetPort(myWindow);
  168.         r := myWindow^.portRect;
  169.         { because drawGrowIcon draws lines for both scrollbars, we must leave room }
  170.         { for both of them if we have a grow box (oh well...) }
  171.         IF sVert OR groBox THEN r.right := r.right-15;        { room for vert scroll bar }
  172.         IF sHoriz OR groBox THEN r.bottom := r.bottom-15;   { leave room for horiz scroll bar }
  173.         SetRect(b,0,0,10,50);              { make room for 10*50 items }
  174.         csize.v := (r.bottom-r.top) DIV 16;      { 16 rows      }
  175.         csize.h := (r.right-r.left) DIV 5;      { and 5 columns }
  176.         { make a list with content r, bounds b, proc 0, and two scrollbars; drawing false}
  177.         myList := LNew(r,b,cSize,0,myWindow,FALSE,groBox,sHoriz,sVert);
  178.         SetCellValues;                  { number all the cells }
  179.         LDoDraw(drawIt,MyList);               { set draw state for update }
  180.      END;
  181.  
  182.    PROCEDURE DoCommand(mResult: LongInt);
  183.  
  184.       VAR
  185.          name: STR255;
  186.          i,temp: INTEGER;
  187.          c: cell;
  188.          b: BOOLEAN;
  189.  
  190.       BEGIN
  191.          theMenu := HiWord(mResult); theItem := LoWord(mResult);
  192.          CASE theMenu OF
  193.  
  194.             appleMenu:
  195.                BEGIN
  196.                GetItem(myMenus[1],theItem,name);
  197.                refNum := OpenDeskAcc(name);
  198.                END;
  199.  
  200.             fileMenu: doneFlag := TRUE; { Quit }
  201.  
  202.             editMenu:
  203.                IF NOT SystemEdit(theItem-1) THEN
  204.                   BEGIN
  205.                   SetPort(myWindow);
  206.                   CellValue(cc,0,0);
  207.                   CASE theItem OF
  208.                         {cut}
  209.                      3: WHILE LGetSelect(TRUE,cc,myList) DO
  210.                             BEGIN cutStrLen := len255; {cut up to 255 chars}
  211.                                 LGetCell(POINTER(ORD(@cutStr)+1),cutStrLen,cc,myList);
  212.                                 LClrCell(cc,myList);
  213.                                 b := LNextCell(TRUE,TRUE,cc,myList);
  214.                             END;
  215.                         {copy}
  216.                      4: IF  LGetSelect(TRUE,cc,myList)
  217.                             THEN BEGIN cutStrLen := len255; {copy up to 255 chars}
  218.                                 LGetCell(POINTER(ORD(@cutStr)+1),cutStrLen,cc,myList);
  219.                             END;
  220.                         {paste}
  221.                      5: WHILE LGetSelect(TRUE,cc,myList) DO
  222.                             BEGIN LSetCell(POINTER(ORD(@cutStr)+1),cutStrLen,cc,myList);
  223.                                 b := LNextCell(TRUE,TRUE,cc,myList);
  224.                             END;
  225.                      6: IF LSearch(POINTER(ORD(@cutStr)+1),cutStrLen,NIL,cc,myList)
  226.                            THEN BEGIN ClrAllCells;
  227.                                       LSetSelect(TRUE,cc,myList);
  228.                                       LAutoScroll(myList);
  229.                                 END;
  230.                      7: BEGIN ClrAllCells;
  231.                               WHILE LSearch(POINTER(ORD(@cutStr)+1),cutStrLen,NIL,cc,myList) DO
  232.                                     BEGIN LSetSelect(TRUE,cc,myList);
  233.                                           b := LNextCell(TRUE,TRUE,cc,myList);
  234.                                     END;
  235.                         END;
  236.                   END; { of item case }
  237.                END; { of editMenu }
  238.  
  239.             mungeMenu:
  240.                 BEGIN
  241.                     CellValue(c,0,0); {search for first selected cell}
  242.                     IF NOT LGetSelect(TRUE,c,myList) THEN
  243.                         CellValue(c,myList^^.dataBounds.right, myList^^.dataBounds.bottom);
  244.                     CASE theItem OF
  245.                         1:  BEGIN c.h := countSelections; IF c.h = 0 THEN c.h := 1;
  246.                                 c.v:=LAddRow(c.h,c.v,myList);
  247.                                 c.h := 0;
  248.                                 REPEAT SetCell(c);
  249.                                 UNTIL NOT LNextCell(TRUE,FALSE,c,myList);   { increment h }
  250.                             END;
  251.                         2:  LDelRow(CountSelections,c.v,myList);
  252.                         3:  BEGIN c.v := countSelections; IF c.v = 0 THEN c.v := 1;
  253.                                   c.h:=LAddColumn(c.v,c.h,myList);
  254.                                   c.v := 0;
  255.                                   REPEAT SetCell(c);
  256.                                   UNTIL NOT LNextCell(FALSE,TRUE,c,myList);   { increment v }
  257.                             END;
  258.                         4:  LDelColumn(CountSelections,c.h,myList);
  259.                         5:  ClrAllCells;
  260.                         6:  BEGIN LDoDraw(FALSE,myList); SetCellValues; LDoDraw(drawIt,myList);
  261.                                   InvalRect(myWindow^.portRect) END;
  262.                         7:  InvalRect(myWindow^.portRect);
  263.                     END; {of case}
  264.             END; { of mungeMenu }
  265.  
  266.             selectMenu:
  267.                 BEGIN  GetItemMark(myMenus[5],theItem,theMark);
  268.                        tempFlags := ORD(myList^^.selFlags);
  269.                        IF ORD(theMark) = checkMark
  270.                           THEN BEGIN theMark := CHR(0);
  271.                                ClearBit(tempFlags,theItem-1) END
  272.                           ELSE BEGIN theMark := CHR(checkMark);
  273.                                SetBit(tempFlags,theItem-1) END;
  274.                        SetItemMark(myMenus[5],theItem,theMark);
  275.                        tFlag := loWord(tempFlags);
  276.                        myList^^.selFlags := BYTE(tFlag);
  277.                 END; { of selectMenu }
  278.  
  279.             makeNewMenu:
  280.                 BEGIN   GetItemMark(myMenus[6],theItem,theMark);
  281.                         CASE theItem OF
  282.                             1:  BEGIN closeTheList; openNewList END;
  283.                             2:  IF ORD(theMark) = checkMark
  284.                                    THEN BEGIN theMark := CHR(0); SHoriz:=FALSE END
  285.                                    ELSE BEGIN theMark := CHR(checkMark); SHoriz:=TRUE END;
  286.                             3:  IF ORD(theMark) = checkMark
  287.                                    THEN BEGIN theMark := CHR(0); SVert:= FALSE END
  288.                                    ELSE BEGIN theMark := CHR(checkMark); SVert:=TRUE END;
  289.                             4:  IF ORD(theMark) = checkMark
  290.                                    THEN BEGIN theMark := CHR(0); GroBox:=FALSE END
  291.                                    ELSE BEGIN theMark := CHR(checkMark); GroBox:=TRUE END;
  292.                             5:  IF ORD(theMark) = checkMark
  293.                                    THEN BEGIN theMark := CHR(0); drawIt:=FALSE; LDoDraw(drawIt,myList) END
  294.                                    ELSE BEGIN theMark := CHR(checkMark); drawIt:=TRUE; LDoDraw(drawIt,myList) END;
  295.                         END; {case}
  296.                         SetItemMark(myMenus[6],theItem,theMark)
  297.                 END; {newMenu}
  298.  
  299.          END; { of menu case }
  300.  
  301.          HiliteMenu(0);
  302.  
  303.       END; { of DoCommand }
  304.  
  305.    BEGIN { main program }
  306.       InitGraf(@thePort);
  307.       InitFonts;
  308.       FlushEvents(everyEvent,0);
  309.       InitWindows;
  310.       SetUpMenus;
  311.       TEInit;
  312.       InitDialogs(NIL);
  313.       InitCursor;
  314.  
  315.       InitPack(0);            { so list manager package gets initialized }
  316.       h1 := GetResource('PACK',0);
  317.       { x := MoveHHi(h1); HLock(h1);  if you want to move it out of the way }
  318.  
  319.       sizeLimits.left := 60;               { set minimum window size to 60x40}
  320.       sizeLimits.top := 40;
  321.       sizeLimits.right := 500;               { and max size to 500x300 }
  322.       sizeLimits.bottom := 300;
  323.  
  324.       doneFlag := FALSE; groBox:=FALSE; sHoriz:=FALSE; sVert:=FALSE; drawIt:=FALSE;
  325.       cutStr := ''; cutStrLen := 0; { init string for cut/copy/paste }
  326.       SetRect(dragRect,4,24,screenBits.bounds.right-4,screenBits.bounds.bottom-4);
  327.  
  328.       OpenNewList; { make a new window (myWindow) and a new list (myList) }
  329.  
  330.       REPEAT
  331.          SystemTask;
  332.          IF GetNextEvent(everyEvent,myEvent) THEN
  333.          CASE myEvent.what OF
  334.  
  335.             mouseDown:
  336.                BEGIN
  337.                code := FindWindow(myEvent.where,whichWindow);
  338.                CASE code OF
  339.  
  340.                   inMenuBar: DoCommand(MenuSelect(myEvent.where));
  341.  
  342.                   inSysWindow: SystemClick(myEvent,whichWindow);
  343.  
  344.                   inDrag: DragWindow(whichWindow,myEvent.where,dragRect);
  345.  
  346.                   inGoAway: IF TrackGoAway(myWindow,myEvent.where) THEN CloseTheList;
  347.  
  348.                   inContent,inGrow:
  349.                      IF (code = inGrow) AND (groBox = TRUE) THEN BEGIN
  350.                         newSize := GrowWindow(whichWindow,myEvent.where,sizeLimits);
  351.                         IF newSize <> 0 THEN BEGIN
  352.                             SizeWindow(whichWindow,LoWord(newSize),HiWord(newSize),TRUE);
  353.                             i:=LoWord(newSize); IF sHoriz OR groBox THEN i:= i-15;
  354.                             j:=HiWord(newSize); IF sVert OR groBox THEN j:=j-15;
  355.                             LSize(i,j,myList);
  356.                             IF groBox THEN DrawGrowIcon(myWindow);
  357.                         END;
  358.                      END
  359.                      ELSE BEGIN
  360.                           IF whichWindow<>FrontWindow THEN
  361.                             SelectWindow(whichWindow)
  362.                           ELSE BEGIN
  363.                             GlobalToLocal(myEvent.where);
  364.                             IF LClick(myEvent.where, myEvent.Modifiers, myList)
  365.                                THEN BEGIN FlipSelections; {and invalidate next dclick }
  366.                                     myList^^.clikTime := myList^^.clikTime - GetDblTime;
  367.                                END;
  368.                          END;
  369.                      END;
  370.  
  371.                END; { of code case }
  372.             END; { of mouseDown }
  373.  
  374.             keyDown,autoKey:
  375.                 IF MyWindow = FrontWindow THEN;
  376.  
  377.             activateEvt:
  378.                BEGIN LActivate(ODD(myEvent.modifiers),myList);
  379.                      IF groBox THEN DrawGrowIcon(myWindow);
  380.                END;
  381.  
  382.             updateEvt:
  383.                BEGIN
  384.                   IF myWindow <> NIL THEN BEGIN
  385.                     SetPort(myWindow);
  386.                     BeginUpdate(myWindow);
  387.                     IF groBox THEN DrawGrowIcon(myWindow);
  388.                     LUpdate(thePort^.visRgn,myList);
  389.                     EndUpdate(myWindow);
  390.                   END;
  391.                END; { of updateEvt }
  392.  
  393.          END; { of event case }
  394.  
  395.       UNTIL doneFlag;
  396.  
  397.       CloseTheList;
  398.       ExitToShell;
  399.    END.
  400. ________This_Is_The_END________
  401. if test `wc -l < ListMgrExample.p` -ne 370; then
  402.     echo 'shar: ListMgrExample.p was damaged during transit'
  403.   echo '      (should have been 370 bytes)'
  404. fi
  405. fi        ; : end of overwriting check
  406. echo 'Extracting ListMgrExample.r'
  407. if test -f ListMgrExample.r; then echo 'shar: will not overwrite ListMgrExample.r'; else
  408. cat << '________This_Is_The_END________' > ListMgrExample.r
  409. *
  410. *
  411. *  TestR -- Resource input for List Manager Testing
  412. *            EHB March 85
  413. *
  414. List/test.Rsrc
  415.  
  416. Type MENU
  417.   ,1
  418.   \14
  419.  
  420.   ,256
  421.   File
  422.     Quit
  423.  
  424.   ,257
  425.   Edit
  426.     Undo
  427.     (-
  428.     Cut
  429.     Copy
  430.     Paste
  431.     Find First
  432.     Find All
  433.  
  434.   ,258
  435.   Munge
  436.     Add Row
  437.     Delete Row
  438.     Add Column
  439.     Delete Column
  440.     Clear Selections
  441.     Renumber Cells
  442.     Update List
  443.  
  444.   ,259
  445.   Selections
  446.     Unused Bit
  447.     Don't Hilite Empty Cells
  448.     Use Cell Sense
  449.     No Rect Extend
  450.     No Extend Select
  451.     No Disjoint
  452.     Drag Extend
  453.     No Multiple Selections
  454.  
  455.   ,260
  456.   New List
  457.     New List
  458.     Horiz. Scroll
  459.     Vert. Scroll
  460.     Grow Box
  461.     Drawing On
  462.     (Bounds Rect
  463.     (View Rect
  464.  
  465.  
  466.  
  467. Type WIND
  468.   ,256
  469.   A Sample
  470.   50 40 321 500
  471.   Visible GoAway
  472.   0
  473.   0
  474.  
  475.  
  476. Type LDEF = WDEF
  477.   obj/ldproc0,0
  478.  
  479.  
  480. Type TEST = STR
  481. ,0
  482. Test Version 1.0    - 4 June 85
  483.  
  484. Type CODE
  485.  List/testL,0
  486.  
  487. Type DLOG
  488.   ,128
  489.   100 100 190 400
  490.   visible 1 nogoaway 0
  491.   200
  492.  
  493.  
  494. Type DITL
  495.   ,200
  496.   3
  497.   BtnItem Enabled
  498.   60 230 80 290
  499.   OK
  500.  
  501.   StatText Disabled
  502.   15 20 36 300
  503.   Enter the string to search for:
  504.  
  505.   EditText Enabled
  506.   35 20 56 300
  507.  
  508.  
  509.  
  510.  
  511.  
  512. ________This_Is_The_END________
  513. if test `wc -l < ListMgrExample.r` -ne 103; then
  514.     echo 'shar: ListMgrExample.r was damaged during transit'
  515.   echo '      (should have been 103 bytes)'
  516. fi
  517. fi        ; : end of overwriting check
  518. exit 0
  519.