home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d540 / browser.lha / Browser / BrowserII_Src.LZH / Windows.c < prev   
C/C++ Source or Header  |  1991-07-21  |  11KB  |  379 lines

  1. /*
  2.  *    Windows.c - Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    27 Feb 1991  09:35:12
  5.  *    Modified:    21 Jul 1991  17:19:13
  6.  *
  7.  *    Make>> make
  8.  */
  9.  
  10. #include "Global.h"
  11. #include "proto/Windows.h"
  12. #include "proto/File.h"
  13. #include "proto/Draw.h"
  14. #include "proto/Menus.h"
  15. #include "proto/String.h"
  16.  
  17.  
  18. #define XPOS_COL1    0
  19. #define XPOS_COL2    282
  20.  
  21.  
  22. extern struct Screen *Screen;
  23. extern struct MsgPort *MainPort;
  24. extern struct MinList WindowList;
  25. extern struct BrowserWindow *CurrentWin;
  26. extern struct Config Config;
  27. extern struct Menu Menu1;
  28. extern char *ReqTitle;
  29. extern char *Copyright;
  30. extern BOOL CustomScreen;
  31. extern short SelectNum;
  32. extern long SelectBytes, SelectBlocks;
  33.  
  34.  
  35. static long IDCMPFlags = GADGETDOWN|GADGETUP|MOUSEBUTTONS|MENUPICK|RAWKEY|NEWSIZE|CLOSEWINDOW|ACTIVEWINDOW|DISKINSERTED|DISKREMOVED;
  36.  
  37. static struct NewScreen NewBrowserScreen = {
  38.     0,0,            /* screen XY origin relative to View */
  39.     640,256,        /* screen width and height */
  40.     2,                /* screen depth (number of bitplanes) */
  41.     0,1,            /* detail and block pens */
  42.     HIRES,            /* display modes for this screen */
  43.     CUSTOMSCREEN,    /* screen type */
  44.     NULL,            /* pointer to default screen font */
  45.     NULL,            /* screen title */
  46.     NULL,            /* first in list of custom screen gadgets */
  47.     NULL            /* pointer to custom BitMap structure */
  48. };
  49.  
  50.  
  51. struct NewWindow NewBrowserWindow = {
  52.     0,0,            /* window XY origin relative to TopLeft of screen */
  53.     280,57,            /* window width and height */
  54.     0,1,            /* detail and block pens */
  55.     NULL,            /* IDCMP flags */
  56.     WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH|NOCAREREFRESH|ACTIVATE,    /* other window flags */
  57.     NULL,            /* first gadget in gadget list */
  58.     NULL,            /* custom CHECKMARK imagery */
  59.     NULL,            /* window title */
  60.     NULL,            /* custom screen pointer */
  61.     NULL,            /* custom bitmap */
  62.     110,57,            /* minimum width and height */
  63.     -1,-1,            /* maximum width and height */
  64.     WBENCHSCREEN    /* destination screen type */
  65. };
  66.  
  67.  
  68. static short PointerMatrix[36] = {
  69.     0, 0, 4294967168, 4294967168, 16640, 0,
  70.     25344, 8704, 30464, 13824, 32512, 15872, 23808, 7168, 23808, 7168, 18688,
  71.     2048, 23808, 7168, 21760, 5120, 30464, 13824, 25344, 8704, 27392, 10752,
  72.     32512, 15872, 4294967168, 4294967168, 0, 0, 0, 0
  73. };
  74.  
  75.  
  76. #define WAIT_XOFFSET    -1L
  77. #define WAIT_YOFFSET     0L
  78. #define WAIT_SIZE        72L
  79.  
  80.  
  81. static void SafeCloseWindow(struct Window *win)
  82. {
  83.     register struct IntuiMessage *msg, *succ;
  84.     register struct MsgPort    *mp = win->UserPort;
  85.  
  86.     Forbid();
  87.     msg = (struct IntuiMessage *)mp->mp_MsgList.lh_Head;
  88.     while (succ=(struct IntuiMessage *)msg->ExecMessage.mn_Node.ln_Succ) {
  89.         if (msg->IDCMPWindow == win) {
  90.             Remove((struct Node *)msg);
  91.             ReplyMsg((struct Message *)msg);
  92.         }
  93.         msg = succ;
  94.     }
  95.     win->UserPort = NULL;
  96.     ModifyIDCMP(win, 0);
  97.     Permit();
  98.     CloseWindow(win);
  99. }
  100.  
  101.  
  102. void SetWaitPointer(BOOL on)
  103. {
  104.     static short *ChipPointerMatrix = NULL;
  105.     static short NestCnt = 0;
  106.     register struct IntuiMessage *msg, *succ;
  107.     struct BrowserWindow *Win, *Next;
  108.  
  109.     if (on == TRUE) {
  110.         NestCnt++;
  111.         if (NestCnt > 1)
  112.             return;
  113.     }
  114.     else if (on == FALSE) {
  115.         NestCnt--;
  116.         if (NestCnt >= 1)
  117.             return;
  118.         /* remove some pending messages to avoid careless mistakes */
  119.         Forbid();
  120.         msg = (struct IntuiMessage *)MainPort->mp_MsgList.lh_Head;
  121.         while (succ=(struct IntuiMessage *)msg->ExecMessage.mn_Node.ln_Succ) {
  122.             switch(msg->Class) {
  123.             case MOUSEBUTTONS:
  124.             case MENUPICK:
  125.             case RAWKEY:
  126.                 Remove((struct Node *)msg);
  127.                 ReplyMsg((struct Message *)msg);
  128.                 break;
  129.             }
  130.             msg = succ;
  131.         }
  132.         Permit();
  133.     }
  134.     if (!ChipPointerMatrix) {
  135.         ChipPointerMatrix = ArpAllocMem(WAIT_SIZE, MEMF_PUBLIC|MEMF_CHIP);
  136.         CopyMem(PointerMatrix, ChipPointerMatrix, WAIT_SIZE);
  137.     }
  138.     Win = (struct BrowserWindow *)WindowList.mlh_Head;
  139.     while(Next = (struct BrowserWindow *)Win->bw_Node.mln_Succ) {
  140.         if (on == TRUE)
  141.             SetPointer(Win->bw_Window, ChipPointerMatrix, 16L, 16L, WAIT_XOFFSET, WAIT_YOFFSET);
  142.         else
  143.             ClearPointer(Win->bw_Window);
  144.         Win = Next;
  145.     }
  146. }
  147.  
  148.  
  149. struct BrowserWindow *FindWindow(struct Window *W)
  150. {
  151.     struct BrowserWindow *Win;
  152.  
  153.     Win = (struct BrowserWindow *)WindowList.mlh_Head;
  154.     while(Win && Win->bw_Window != W) {
  155.         Win = (struct BrowserWindow *)Win->bw_Node.mln_Succ;
  156.     }
  157.     return Win;
  158. }
  159.  
  160.  
  161. struct BrowserWindow *FindDir(BPTR DirLock)
  162. {
  163.     struct BrowserWindow *Win;
  164.  
  165.     if (!DirLock)
  166.         return NULL;
  167.     Win = (struct BrowserWindow *)WindowList.mlh_Head->mln_Succ;    /* Skip main window */
  168.     while(Win->bw_Node.mln_Succ) {
  169.         if (!CompareLock(DirLock, Win->bw_DirLock)) {
  170.             return Win;
  171.         }
  172.         Win = (struct BrowserWindow *)Win->bw_Node.mln_Succ;
  173.     }
  174.     return NULL;
  175. }
  176.  
  177.  
  178. static void FreeWindowMem(struct BrowserWindow *Win)
  179. {
  180.     struct ScrollEntry *S;
  181.     short n;
  182.  
  183.     if (Win->bw_Type == BW_MAIN) {
  184.         if ((n = Win->bw_NumEntries) > 0) {
  185.             if (Win->bw_EntryArray) {
  186.                 if (Win->bw_EntryArray[0]) {
  187.                     if (Win->bw_EntryArray[0]->se_Print)
  188.                         FreeMem(Win->bw_EntryArray[0]->se_Print, n*(Win->bw_PrintStringLen+1));
  189.                     FreeMem(Win->bw_EntryArray[0], n*sizeof(struct ScrollEntry));
  190.                 }
  191.                 FreeMem(Win->bw_EntryArray, n<<2);
  192.             }
  193.             SelectNum -= Win->bw_SelectNum;
  194.         }
  195.     }
  196.     else {
  197.         FreePrintStrings(Win);
  198.         while(S = (struct ScrollEntry *)RemTail((struct List *)&Win->bw_EntryList)) {
  199.             /* if entry was selected, sub infos from global selected infos */
  200.             if (S->se_State & STATE_SELECTED) {
  201.                 SelectBytes -= S->se_FileInfo.fi_Size;
  202.                 SelectBlocks -= S->se_FileInfo.fi_NumBlocks;
  203.                 SelectNum--;
  204.             }
  205.             CleanFileInfo(&S->se_FileInfo);
  206.             FreeMem(S, sizeof(struct ScrollEntry));
  207.         }
  208.         while(S = (struct ScrollEntry *)RemTail((struct List *)&Win->bw_NewEntryList)) {
  209.             CleanFileInfo(&S->se_FileInfo);
  210.             FreeMem(S, sizeof(struct ScrollEntry));
  211.         }
  212.         if (Win->bw_NumEntries > 0)
  213.             FreeMem(Win->bw_EntryArray, Win->bw_NumEntries<<2);
  214.     }
  215.     Win->bw_EntryArray = NULL;
  216. }
  217.  
  218.  
  219. void ResetWindow(struct BrowserWindow *Win)
  220. {
  221.     FreeWindowMem(Win);
  222.     Win->bw_Flags = 0;
  223.     Win->bw_NumCol = 1;            /* Prevent Zero divide in refresh */
  224.     Win->bw_ColWidth = 1;        /* Prevent Zero divide in refresh */
  225.     Win->bw_ShownEntries = 0;
  226.     Win->bw_NumEntries = 0;
  227.     Win->bw_NumNewEntries = 0;
  228.     Win->bw_NumDeleted = 0;
  229.     Win->bw_NumDirs = 0;
  230.     Win->bw_NumFiles = 0;
  231.     Win->bw_NumBytes = 0;
  232.     Win->bw_NumBlocks = 0;
  233.     Win->bw_SelectBytes = 0;
  234.     Win->bw_SelectBlocks = 0;
  235.     Win->bw_SelectNum = 0;
  236.     Win->bw_MaxFilenameLen = 0;
  237.     Win->bw_BottomText[0] = '\0';
  238.     NewMinList(&Win->bw_EntryList);
  239.     NewMinList(&Win->bw_NewEntryList);
  240.     RefreshWindow(Win);
  241. }
  242.  
  243.  
  244. void CloseBrowserWindow(struct BrowserWindow *Win)
  245. {
  246.     if (Win->bw_Window) {
  247.         ClearMenuStrip(Win->bw_Window);
  248.         SafeCloseWindow(Win->bw_Window);
  249.     }
  250.     FreeWindowMem(Win);
  251.     Remove((struct Node *)Win);                /* Unlink window from list */
  252.     if (Win->bw_Type == BW_DIR) {
  253.         FreeStr((char *)Win->bw_Window->Title);
  254.         UnLock(Win->bw_DirLock);
  255.         UnLock(Win->bw_RootLock);
  256.     }
  257.     FreeMem(Win, sizeof(struct BrowserWindow));
  258.     /* make the main window the current one until next ACTIVATE msg */
  259.     CurrentWin = (struct BrowserWindow *)WindowList.mlh_Head;
  260. }
  261.  
  262.  
  263. struct BrowserWindow *OpenBrowserWindow(struct BrowserWindow *Parent, BPTR DirLock, BPTR RootLock, short Position)
  264. {
  265.     struct BrowserWindow *Win, *BW;
  266.     struct Screen *wb;
  267.     struct Window *W;
  268.     char *Title;
  269.     char buf[REQ_DSIZE];
  270.     short x,y,y1=0,y2=0;
  271.  
  272.     if (!(Win = AllocMem(sizeof(struct BrowserWindow), MEMF_PUBLIC|MEMF_CLEAR)))
  273.         return NULL;
  274.     if (!Parent) {                /* This is main window */
  275.         wb = Screen = OpenWorkBench();
  276.         if (Config.Screen == BROWSER_CUSTOM) {
  277.             NewBrowserScreen.Width = wb->Width;
  278.             NewBrowserScreen.Height = wb->Height;
  279.             NewBrowserScreen.ViewModes = wb->ViewPort.Modes;
  280.             if (Screen = OpenScreen(&NewBrowserScreen)) {
  281.                 NewBrowserWindow.Screen = Screen;
  282.                 NewBrowserWindow.Type = CUSTOMSCREEN;
  283.                 CustomScreen = TRUE;
  284.             }
  285.             else {
  286.                 SimpleRequest(ReqTitle, "Couldn't open screen!");
  287.                 Screen = wb;
  288.             }
  289.         }
  290.         NewBrowserWindow.LeftEdge = Screen->Width-NewBrowserWindow.Width;
  291.         NewBrowserWindow.TopEdge = Screen->Height-NewBrowserWindow.Height;
  292.         Title = "BrowserII";
  293.         Win->bw_Type = BW_MAIN;
  294.         Win->bw_Sort = Config.Sort;
  295.         Win->bw_EntryInfoFlags = Config.EntryInfoFlags;
  296.         Win->bw_FiltersInfo = Config.DefaultFilters;
  297.     }
  298.     else {
  299.         /* if dir already opened, bring window to front, and activate it */
  300.         if (BW = FindDir(DirLock)) {
  301.             WindowToFront(BW->bw_Window);
  302.             ActivateWindow(BW->bw_Window);
  303.             FreeMem(Win, sizeof(struct BrowserWindow));
  304.             return NULL;
  305.         }
  306.         Win->bw_DirLock = DirLock;
  307.         Win->bw_RootLock = RootLock;
  308.         PathName(Win->bw_DirLock, buf, REQ_DSIZE-1);
  309.         Title = CopyStr(buf);
  310.         NewBrowserWindow.Flags |= WINDOWCLOSE;
  311.  
  312.         /* Copy default flags from parent window */
  313.         Win->bw_FiltersInfo = Parent->bw_FiltersInfo;
  314.         Win->bw_Sort = Parent->bw_Sort;
  315.         Win->bw_EntryInfoFlags = Parent->bw_EntryInfoFlags;
  316.  
  317.         /* Compute window TopLeft corner */
  318.         switch(Position) {
  319.         case POS_NEWDEV:
  320.             BW = (struct BrowserWindow *)WindowList.mlh_Head->mln_Succ; /* Skip main window */
  321.             while(BW->bw_Node.mln_Succ) {
  322.                 if (BW->bw_Window->LeftEdge == XPOS_COL1)
  323.                     y1 = MAX(y1, BW->bw_Window->TopEdge);
  324.                 else if (BW->bw_Window->LeftEdge == XPOS_COL2)
  325.                     y2 = MAX(y2, BW->bw_Window->TopEdge);
  326.                 BW = (struct BrowserWindow *)BW->bw_Node.mln_Succ;
  327.             }
  328.             if (y1>y2) {
  329.                 x = XPOS_COL2;
  330.                 y = y2+11;
  331.             }
  332.             else {
  333.                 x = XPOS_COL1;
  334.                 y = y1+11;
  335.             }
  336.             break;
  337.         case POS_SUBDIR:
  338.             x = Parent->bw_Window->LeftEdge;
  339.             y = Parent->bw_Window->TopEdge+11;
  340.             break;
  341.         case POS_PARENTDIR:
  342.             x = Parent->bw_Window->LeftEdge;
  343.             y = Parent->bw_Window->TopEdge-11;
  344.             break;
  345.         }
  346.         if (y < 0)
  347.             y = 0;
  348.         else if (y + NewBrowserWindow.Height > Screen->Height)
  349.             y = Screen->Height-NewBrowserWindow.Height;
  350.         NewBrowserWindow.LeftEdge = x;
  351.         NewBrowserWindow.TopEdge = y;
  352.     }
  353.     NewBrowserWindow.Title = (UBYTE *)Title;
  354.     NewBrowserWindow.FirstGadget = NULL;
  355.     Win->bw_ScrollStruct.LineSpacing = 9;
  356.     Win->bw_ScrollStruct.RedrawAll = RedrawAll;
  357.     Win->bw_ScrollStruct.ScrollAndDraw = ScrollAndDraw;
  358.     Win->bw_ScrollStruct.PropGadget = &Win->bw_Prop.Gadget;
  359.     LinkPropGadget(&Win->bw_Prop, &NewBrowserWindow, 16, -19, GADGHCOMP|GRELRIGHT|GRELHEIGHT, -15, 10);
  360.     Win->bw_Prop.Info.Flags = AUTOKNOB|FREEVERT;
  361.     AddTail((struct List *)&WindowList, (struct Node *)Win);
  362.     if (!(W = Win->bw_Window = OpenWindow(&NewBrowserWindow))) {
  363.         CloseBrowserWindow(Win);
  364.         return NULL;
  365.     }
  366.     W->BorderBottom = 9;
  367.     W->UserPort = MainPort;
  368.     ModifyIDCMP(W, IDCMPFlags);
  369.     IDCMPFlags &= ~(DISKINSERTED|DISKREMOVED); /* Make only main window receive these */
  370.     SetWindowTitles(W, Title, Copyright);
  371.     SetMenuStrip(W, &Menu1);
  372.     SetMenus(Win);
  373.     NewMinList(&Win->bw_EntryList);
  374.     NewMinList(&Win->bw_NewEntryList);
  375.     CurrentWin = Win;
  376.     return Win;
  377. }
  378.  
  379.