home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / exedt040.zip / src / toolbar.c < prev    next >
C/C++ Source or Header  |  1999-01-24  |  10KB  |  405 lines

  1. #define INCL_PM
  2. #include <memory.h>
  3. #include <string.h>
  4. #include <os2.h>
  5. #include "exedit.h"
  6.  
  7. void RegisterToolBar(HAB anHab)
  8. {
  9.  WinRegisterClass(anHab,WC_TOOL,&WinToolProc,CS_SIZEREDRAW,4);
  10. }
  11.  
  12. MRESULT EXPENTRY WinToolProc(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2)
  13. {
  14. TTool *Tool;
  15. Tool=WinQueryWindowPtr(hwnd,QWL_USER);
  16.  
  17. switch(msg)
  18. {
  19.  
  20.  case WM_CREATE:
  21.  {
  22.   long fl = FCF_BORDER;
  23.   RGB rgb = { 78, 255, 255 };
  24.  
  25.   Tool = (TTool*)malloc(sizeof(TTool));
  26.  
  27.   Tool->usSzStruct=sizeof(TTool);
  28.   Tool->Items=NULL;
  29.   Tool->MiddleShadow=(LONG)WinQuerySysColor(HWND_DESKTOP,SYSCLR_SHADOWHILITEBGND, 0L);
  30.   Tool->DarkShadow=0;
  31.   Tool->LightShadow=0x00ffffff;
  32.   Tool->OnTool = FALSE;
  33.   Tool->TipOn = FALSE;
  34.  
  35.   Tool->hTipFr = WinCreateStdWindow(HWND_DESKTOP,
  36.                                     0L,
  37.                                     &fl,
  38.                                     WC_STATIC,
  39.                                     "",
  40.                                     SS_TEXT | SS_AUTOSIZE | DT_LEFT | DT_VCENTER,
  41.                                     NULLHANDLE,
  42.                                     0L,
  43.                                     &Tool->hTipCli);
  44.  
  45.   WinSetPresParam(Tool->hTipCli,PP_FONTNAMESIZE,7,"8.Helv");
  46.   WinSetPresParam(Tool->hTipCli,PP_BACKGROUNDCOLOR,3,&rgb);
  47.   WinSetWindowPos(Tool->hTipFr,HWND_TOP,0,0,500,16,SWP_SIZE);
  48.  
  49.   WinQueryWindowRect(hwnd,&Tool->rcl);
  50.   WinSetWindowPtr(hwnd,QWL_USER,Tool);
  51.  }
  52.  break;
  53.  
  54.  case WM_BUTTON1DOWN:
  55.   if (Tool->OnItem)
  56.   {
  57.    Tool->PressedItem=Tool->OnItem;
  58.    Tool->OnItem->Status=TIT_PRESSED;
  59.    WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->OnItem,0);
  60.   }
  61.  break;
  62.  
  63.  case WM_BUTTON1UP:
  64.   if ((Tool->PressedItem == Tool->OnItem) && Tool->OnItem)
  65.   {
  66.    Tool->PressedItem->Status = TIT_NORMAL;
  67.    WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->PressedItem,0);
  68.    WinPostMsg(WinQueryWindow(hwnd,QW_OWNER),WM_COMMAND,MPFROM2SHORT(Tool->PressedItem->Id,0),0);
  69.    Tool->PressedItem=NULL;
  70.   }
  71.   else Tool->PressedItem = NULL;
  72.  break;
  73.  
  74.  case WM_TIMER:
  75.  {
  76.    switch(SHORT1FROMMP(mp1)) {
  77.     case 1 :
  78.       {
  79.       POINTL ptl;
  80.       SWP    swp;
  81.  
  82.       WinQueryWindowPos(hwnd, &swp);
  83.       WinQueryPointerPos(HWND_DESKTOP, &ptl);
  84.       WinMapWindowPoints(HWND_DESKTOP, WinQueryWindow(hwnd,QW_PARENT), &ptl, 1);
  85.  
  86.       if (swp.x > ptl.x || swp.x + swp.cx < ptl.x ||
  87.           swp.y > ptl.y || swp.y + swp.cy < ptl.y)       {
  88.         if (Tool->PressedItem) {
  89.                                  Tool->PressedItem->Status = TIT_NORMAL;
  90.                                  WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->PressedItem,0);
  91.                                  Tool->PressedItem=NULL;
  92.                                }
  93.  
  94.         if (Tool->TipOn) WinShowWindow(Tool->hTipFr,(Tool->TipOn = FALSE));
  95.  
  96.         Tool->OnTool = FALSE;
  97.         Tool->OnItem = NULL;
  98.  
  99.        WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 1);
  100.       }
  101.       break;
  102.       }
  103.     case 2 :
  104.      if (Tool->OnTool && !Tool->TipOn) {
  105.      if (Tool->OnItem)
  106.         if (Tool->OnItem->text)
  107.           { POINTL pos;
  108.             RECTL r;
  109.             HPS hps;
  110.  
  111.             r.xLeft = 0;
  112.             r.xRight = 400;
  113.             r.yBottom = 0;
  114.             r.yTop = 12;
  115.             hps = WinGetPS(Tool->hTipCli);
  116.             if (!hps) DosBeep(1000,20);
  117.  
  118.             WinDrawText(hps,strlen(Tool->OnItem->text),Tool->OnItem->text,&r,0L,0L,DT_QUERYEXTENT);
  119.             WinReleasePS(hps);
  120.  
  121.             WinSetWindowText(Tool->hTipCli,Tool->OnItem->text);
  122.             pos.x = Tool->OnItem->pos.x; pos.y = Tool->OnItem->pos.y;
  123.             WinMapWindowPoints(hwnd,HWND_DESKTOP,&pos,1);
  124.             WinSetWindowPos(Tool->hTipFr,HWND_TOP,pos.x,pos.y-16,r.xRight + 3,16,SWP_MOVE | SWP_SIZE | SWP_ZORDER | SWP_SHOW);
  125.             Tool->TipOn = TRUE; }
  126.      }
  127.      WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 2);
  128.      break;
  129.     }
  130.  }
  131.  break;
  132.  
  133.  case WM_MOUSEMOVE:
  134.  {
  135.   SHORT x=SHORT1FROMMP(mp1),y=SHORT2FROMMP(mp1);
  136.   TToolItem *Item;
  137.  
  138.   WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 50);
  139.   WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 2, 750);
  140.  
  141.   Tool->OnTool = TRUE;
  142.  
  143.  
  144.   Item = Tool->Items;
  145.   while (Item)
  146.   {
  147.    if ((Item->BType == TIT_BUTTON) && (Item->Status != TIT_HIDE))
  148.     if (x > Item->pos.x && x<Item->pos.x+TIT_CXCY && y > Item->pos.y && y<Item->pos.y+TIT_CXCY)
  149.     {
  150.  
  151.      if ((Item != Tool->OnItem) && Tool->TipOn) WinShowWindow(Tool->hTipFr,(Tool->TipOn = FALSE));
  152.  
  153.      Tool->OnItem=Item;
  154.  
  155.      if (Tool->PressedItem)
  156.        if (Tool->OnItem != Tool->PressedItem)
  157.          { Tool->PressedItem->Status = TIT_NORMAL;
  158.            WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->PressedItem,0); }
  159.        else
  160.          { Tool->PressedItem->Status = TIT_PRESSED;
  161.            WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->PressedItem,0); }
  162.  
  163.      return((MRESULT) TRUE);
  164.     }
  165.    Item=Item->Next;
  166.   }
  167.  
  168.  
  169.   Tool->OnItem = NULL;
  170.  
  171.   if (Tool->TipOn) WinShowWindow(Tool->hTipFr,(Tool->TipOn = FALSE));
  172.  
  173.   if (Tool->PressedItem)
  174.     { Tool->PressedItem->Status = TIT_NORMAL;
  175.       WinSendMsg(hwnd,TM_DRAWITEM,(MPARAM)Tool->PressedItem,0); }
  176.  }
  177.  break;
  178.  
  179. // ********************* Internal Toolbar Commands ************************************
  180.  
  181.  //mp1 SHORT1 Id SHORT2 BitmapId Item index
  182.  //mp2 Description
  183.  case TM_INSERTITEM:
  184.  {
  185.   TToolItem *Item,*NewItem;
  186.   char *text=(char*) mp2;
  187.   HPS hps;
  188.  
  189.   NewItem=(TToolItem*)malloc(sizeof(TToolItem));
  190.   if (!Tool->Items) Tool->Items=NewItem;
  191.   else
  192.   {
  193.    Item=Tool->Items;
  194.    while (Item->Next) Item=Item->Next;
  195.    Item->Next=NewItem;
  196.   }
  197.  
  198.   if ((LONG)mp1!=TIT_SEPARATOR)
  199.   {
  200.    NewItem->Id=SHORT1FROMMP(mp1);
  201.  
  202.    hps=WinGetPS(hwnd);
  203.    NewItem->hbm=GpiLoadBitmap(hps,NULLHANDLE,SHORT2FROMMP(mp1),TIT_CXCY-2,TIT_CXCY-2);
  204.    WinReleasePS(hps);
  205.  
  206.    NewItem->BType = TIT_BUTTON;
  207.    if (text) NewItem->text=strdup(text);
  208.   }
  209.   else NewItem->BType = TIT_SEPARATOR;
  210.  
  211.   NewItem->Status = TIT_NORMAL;
  212.  }
  213.  break;
  214.  
  215.  case TM_HIDEITEM:
  216.  {
  217.   TToolItem *Item=Tool->Items;
  218.   USHORT Id=SHORT1FROMMP(mp1);
  219.  
  220.   while(Item)
  221.   {
  222.    if (Item->Id==Id)
  223.    {
  224.      Item->Status=(BOOL)mp2;
  225.      break;
  226.    }
  227.    Item=Item->Next;
  228.   }
  229.  }
  230.  break;
  231.  
  232.  case TM_DRAWITEM:
  233.  {
  234.   HPS hps=WinGetPS(hwnd);
  235.   GpiCreateLogColorTable(hps,0L, LCOLF_RGB, 0L, 0L, (PLONG)NULL);
  236.   DrawItem(hps,(TToolItem*)mp1,Tool);
  237.   WinReleasePS(hps);
  238.  }
  239.  break;
  240.  
  241.  case WM_SIZE:
  242.   WinQueryWindowRect(hwnd,&Tool->rcl);
  243.  break;
  244.  
  245.  case WM_PAINT :
  246.  {
  247.   TToolItem *Item;
  248.   HPS hps=WinBeginPaint(hwnd,(HPS)NULL,NULL);
  249.   POINTL point[3];
  250.  
  251.   GpiCreateLogColorTable(hps,0L, LCOLF_RGB, 0L, 0L, (PLONG)NULL);
  252.   WinFillRect(hps,&Tool->rcl,SYSCLR_DIALOGBACKGROUND);
  253.  
  254.   point[0].x=Tool->rcl.xLeft;
  255.   point[0].y=Tool->rcl.yBottom;
  256.   point[1].x=Tool->rcl.xRight;
  257.   point[1].y=Tool->rcl.yBottom;
  258.  
  259.   GpiSetColor(hps,Tool->DarkShadow);
  260.   GpiMove(hps,&point[0]);
  261.   GpiLine(hps,&point[1]);
  262.   GpiSetColor(hps,Tool->MiddleShadow);
  263.   point[0].y++;
  264.   point[1].y++;  GpiMove(hps,&point[0]);
  265.   GpiLine(hps,&point[1]);
  266.  
  267.   Item=Tool->Items;
  268.   if (Item)
  269.   {
  270.   Item->pos.x=TIT_FIRSTX;
  271.   Item->pos.y=TIT_FIRSTY;
  272.  
  273.   while (Item)
  274.   {
  275.  
  276.    if (Item->BType==TIT_SEPARATOR)
  277.    {
  278.     if (!Item->Next) break;
  279.     Item->Next->pos.y=TIT_FIRSTY;
  280.     Item->Next->pos.x=Item->pos.x+TIT_DISTANCE+TIT_CXSEPARATOR;
  281.     Item=Item->Next;
  282.    }
  283.    else if (Item->Status==TIT_HIDE)
  284.    {
  285.     if (!Item->Next) break;
  286.     Item->Next->pos.y=TIT_FIRSTY;
  287.     Item->Next->pos.x=Item->pos.x;
  288.     Item=Item->Next;
  289.    }
  290.    else
  291.    {
  292.     DrawItem(hps,Item,Tool);
  293.     if (!Item->Next) break;
  294.     Item->Next->pos.y=TIT_FIRSTY;
  295.     Item->Next->pos.x=Item->pos.x+TIT_DISTANCE+TIT_CXCY;
  296.     Item=Item->Next;
  297.    }
  298.  
  299.    }
  300.   }
  301.   WinEndPaint(hps);
  302.  }
  303.  break;
  304.  
  305.  case WM_ERASEBACKGROUND:
  306.  return (MPARAM)FALSE;
  307.  
  308.  case WM_DESTROY:
  309.  {
  310.   TToolItem *Item=Tool->Items;
  311.   TToolItem *Temp;
  312.  
  313.   while (Item)
  314.   {
  315.    if (Item->text) DosFreeMem(Item->text);
  316.    if (Item->hbm) GpiDeleteBitmap(Item->hbm);
  317.    Temp=Item;
  318.    Item=Item->Next;
  319.    DosFreeMem(Temp);
  320.   }
  321.   WinDestroyWindow(Tool->hTipFr);
  322.   DosFreeMem(Tool);
  323.  }
  324.  break;
  325.  
  326.  default :
  327.  return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  328.  }
  329.  return WinDefWindowProc(hwnd, msg, mp1, mp2);
  330. }
  331.  
  332. void DrawItem(HPS hps,TToolItem *Item,TTool *Tool)
  333. {
  334.   POINTL point[3];
  335.  
  336.   if (Item->Status==TIT_NORMAL)
  337.    {
  338.    GpiSetColor(hps,Tool->LightShadow);
  339.    point[0].x=Item->pos.x;
  340.    point[0].y=Item->pos.y+TIT_CXCY;
  341.    point[1].x=Item->pos.x+TIT_CXCY;
  342.    point[1].y=Item->pos.y+TIT_CXCY;
  343.    GpiMove(hps,&Item->pos);
  344.    GpiPolyLine(hps,2,point);
  345.  
  346.    GpiSetColor(hps,Tool->DarkShadow);
  347.    point[0].x=Item->pos.x+TIT_CXCY;
  348.    point[0].y=Item->pos.y;
  349.    GpiMove(hps,&Item->pos);
  350.    GpiPolyLine(hps,2,point);
  351.    GpiSetColor(hps,Tool->MiddleShadow);
  352.    point[0].y++;
  353.    point[0].x--;
  354.    point[1].x--;
  355.    point[1].y--;
  356.    point[2].x=Item->pos.x+1;
  357.    point[2].y=Item->pos.y+1;
  358.    GpiMove(hps,&point[2]);
  359.    GpiPolyLine(hps,2,point);
  360.  
  361.    point[2].x=Item->pos.x+1;
  362.    point[2].y=Item->pos.y+2;
  363.  
  364.    WinDrawBitmap(hps,Item->hbm,NULL,&point[2],0,0,DBM_NORMAL);
  365.    }
  366.  
  367.   else if (Item->Status==TIT_PRESSED)
  368.    {
  369.    GpiSetColor(hps,Tool->MiddleShadow);
  370.    point[0].x=Item->pos.x;
  371.    point[0].y=Item->pos.y+TIT_CXCY;
  372.    point[1].x=Item->pos.x+TIT_CXCY;
  373.    point[1].y=Item->pos.y+TIT_CXCY;
  374.    GpiMove(hps,&Item->pos);
  375.    GpiPolyLine(hps,2,point);
  376.  
  377.    GpiSetColor(hps,Tool->DarkShadow);
  378.    point[2].x=Item->pos.x+1;
  379.    point[2].y=Item->pos.y+1;
  380.    point[0].y--;
  381.    point[0].x++;
  382.    point[1].x--;
  383.    point[1].y--;
  384.    GpiMove(hps,&point[2]);
  385.    GpiPolyLine(hps,2,point);
  386.  
  387.  
  388.    GpiSetColor(hps,Tool->LightShadow);
  389.    point[0].x=Item->pos.x+TIT_CXCY;
  390.    point[0].y=Item->pos.y;
  391.    point[1].x++;
  392.    point[1].y++;
  393.    GpiMove(hps,&Item->pos);
  394.    GpiPolyLine(hps,2,point);
  395.  
  396.  
  397.    point[2].x=Item->pos.x+2;
  398.    point[2].y=Item->pos.y+1;
  399.  
  400.    WinDrawBitmap(hps,Item->hbm,NULL,&point[2],0,0,DBM_NORMAL);
  401.    }
  402. }
  403.  
  404.  
  405.