Ignore:
Timestamp:
Apr 8, 2000, 8:32:55 PM (25 years ago)
Author:
cbratschi
Message:

new functionality, bug fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/treeview.cpp

    r3285 r3351  
    1 /* $Id: treeview.cpp,v 1.6 2000-03-31 14:44:25 cbratschi Exp $ */
     1/* $Id: treeview.cpp,v 1.7 2000-04-08 18:32:55 cbratschi Exp $ */
    22/* Treeview control
    33 *
     
    1212 *   Using DPA to store the item ptr would be good.
    1313 *  -check custom draw
    14                         uHotItem
    1514 *   use separate routine to get item text/image.
    1615 *
     
    2019   -treehelper: stack corruption makes big window.
    2120 *
    22  * Status: in progress
     21 * Status: complete (many things untested)
    2322 * Version: 5.80
    2423 */
     
    3534 - VK_LEFT in WinHlp32 displays expanded icon
    3635 - expand not finished
    37  - TVS_FULLROWSELECT
    38  - TVS_TRACKSELECT (called hottrack)
    3936 - WM_ENABLE: draw disabled control
    4037*/
     
    661658}
    662659
     660static VOID TREEVIEW_DrawHottrackLine(HDC hdc,TREEVIEW_ITEM *item)
     661{
     662  HPEN hPen,hOldPen;
     663  INT rop;
     664
     665  if (!item->visible) return;
     666
     667  rop = SetROP2(hdc,R2_XORPEN);
     668  hPen = CreatePen(PS_SOLID,2,RGB(0,0,0));
     669  hOldPen = SelectObject(hdc,hPen);
     670
     671  MoveToEx(hdc,item->text.left,item->text.bottom-1,NULL);
     672  LineTo(hdc,item->text.right,item->text.bottom-1);
     673
     674  DeleteObject(hPen);
     675  SelectObject(hdc,hOldPen);
     676  SetROP2(hdc,rop);
     677}
     678
    663679static void
    664680TREEVIEW_DrawItem(HWND hwnd,HDC hdc,TREEVIEW_ITEM *item,DWORD dwStyle,TREEVIEW_INFO *infoPtr)
     
    935951  /* Draw insertion mark if necessary */
    936952
    937   //if (infoPtr->insertMarkItem)
    938   //              TRACE ("item:%d,mark:%d\n", (int)wineItem->hItem,
    939   //                             (int) infoPtr->insertMarkItem);
    940953  if (item->hItem == infoPtr->insertMarkItem)
    941954  {
     
    964977    SelectObject(hdc, hOldPen);
    965978  }
     979
     980  //draw hot item if necessary
     981  if (item->hItem == infoPtr->hotItem)
     982    TREEVIEW_DrawHottrackLine(hdc,item);
    966983
    967984  if (cditem & CDRF_NOTIFYPOSTPAINT)
     
    12911308
    12921309  r.left = xpos;
    1293   if ((item->mask & TVIF_TEXT) && (item->pszText))
     1310  if ((item->mask & TVIF_TEXT) && item->pszText)
    12941311  {
    12951312    UINT  uTextJustify = DT_LEFT;
     
    32853302  {
    32863303    case TVE_COLLAPSE:
     3304    {
     3305      POINT oldLeftTop = infoPtr->lefttop;
     3306
    32873307      if (!wineItem->state & TVIS_EXPANDED)
    32883308        return 0;
     
    32933313        TREEVIEW_RemoveAllChildren (hwnd, wineItem);
    32943314      } else wineItem->state &= ~TVIS_EXPANDED;
     3315
     3316      //update window
     3317      //CB: todo: optimize!
     3318      TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE);
     3319      //CB: todo: precalc expanded items here
     3320      TREEVIEW_CalcItems(hwnd,0,infoPtr);
     3321      TREEVIEW_Refresh(hwnd);
     3322      //CB: todo: check cx and cy to fit ranges!
     3323
     3324      //check selection
     3325      HTREEITEM hItem = infoPtr->selectedItem;
     3326
     3327      if (!TREEVIEW_ValidItem (infoPtr, hItem))
     3328        hItem = wineItem->hItem;
     3329      else
     3330      {
     3331        while (hItem)
     3332        {
     3333          hItem = infoPtr->items[(INT)hItem].parent;
     3334
     3335          if (hItem == wineItem->hItem)
     3336            break;
     3337        }
     3338      }
     3339
     3340      if (hItem)
     3341        TREEVIEW_DoSelectItem(hwnd,TVGN_CARET,hItem,TVC_UNKNOWN);
     3342
    32953343      break;
     3344    }
    32963345
    32973346    case TVE_EXPAND:
     3347    {
     3348      POINT oldLeftTop = infoPtr->lefttop;
     3349
    32983350      if (wineItem->state & TVIS_EXPANDED)
    32993351        return 0;
     
    33013353      if (flag & TVE_EXPANDPARTIAL)
    33023354      {
    3303 return FALSE; //CB: to check
     3355return FALSE; //CB: how does this work??? (only display one level? nonsense in MSDN docu)
    33043356        wineItem->state ^=TVIS_EXPANDED;
    33053357        wineItem->state |=TVIS_EXPANDEDONCE;
     
    33353387
    33363388        wineItem->state |= TVIS_EXPANDEDONCE;
    3337         //TRACE(treeview, "  TVN_ITEMEXPANDING sent...\n");
    33383389
    33393390        TREEVIEW_SendTreeviewNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_ITEMEXPANDEDW:TVN_ITEMEXPANDEDA,TVE_EXPAND,0,(HTREEITEM)expand);
    3340 
    3341         //TRACE(treeview, "  TVN_ITEMEXPANDED sent...\n");
    3342 
    33433391      } else
    33443392      {
     
    33463394        wineItem->state |= TVIS_EXPANDED;
    33473395      }
     3396
     3397      //update window
     3398      //CB: todo: optimize!
     3399      TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE);
     3400      //CB: todo: precalc expanded items here
     3401      TREEVIEW_CalcItems(hwnd,0,infoPtr);
     3402      TREEVIEW_Refresh(hwnd);
     3403      //CB: todo: check cx and cy to fit ranges!
     3404
    33483405      break;
     3406    }
    33493407
    33503408    default:
    33513409      return FALSE;
    33523410  }
    3353 
    3354   /* If item was collapsed we probably need to change selection */
    3355   if (flag & TVE_COLLAPSE)
    3356   {
    3357      HTREEITEM hItem = infoPtr->selectedItem;
    3358 
    3359      if (!TREEVIEW_ValidItem (infoPtr, hItem))
    3360         hItem = wineItem->hItem;
    3361      else
    3362      {
    3363         while ( hItem )
    3364         {
    3365            hItem = infoPtr->items[(INT)hItem].parent;
    3366 
    3367            if (hItem == wineItem->hItem)
    3368               break;
    3369         }
    3370      }
    3371 
    3372      if (hItem)
    3373         TREEVIEW_DoSelectItem(hwnd, TVGN_CARET, hItem, TVC_UNKNOWN);
    3374   }
    3375 
    3376   //CB: todo: optimize!
    3377   TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE);
    3378   //CB: todo: precalc expanded items here
    3379   infoPtr->uInternalStatus |= TV_CALCALL;
    3380   TREEVIEW_CalcItems(hwnd,0,infoPtr);
    3381   TREEVIEW_Refresh(hwnd);
    3382   //CB: todo: check cx and cy to fit ranges!
    33833411
    33843412  return TRUE;
     
    38793907}
    38803908
     3909HTREEITEM TREEVIEW_GetHottrackItem(HWND hwnd,TREEVIEW_INFO *infoPtr,POINT pt)
     3910{
     3911  TVHITTESTINFO ht;
     3912
     3913  ht.pt = pt;
     3914  TREEVIEW_HitTest(hwnd,&ht,FALSE);
     3915
     3916  return (ht.hItem && (ht.flags & TVHT_ONITEM)) ? ht.hItem:0;
     3917}
     3918
    38813919static LRESULT TREEVIEW_MouseMove(HWND hwnd,WPARAM wParam,LPARAM lParam)
    38823920{
     
    39063944  if (dwStyle & TVS_TRACKSELECT)
    39073945  {
    3908     //CB: todo: hottracking
     3946    HTREEITEM hItem = TREEVIEW_GetHottrackItem(hwnd,infoPtr,pt);
     3947
     3948    if (infoPtr->hotItem != hItem)
     3949    {
     3950      TREEVIEW_ITEM *item;
     3951      HDC hdc = 0;
     3952
     3953      item =  TREEVIEW_ValidItem(infoPtr,infoPtr->hotItem);
     3954      if (item)
     3955      {
     3956        if (!hdc) hdc = GetDC(hwnd);
     3957        TREEVIEW_DrawHottrackLine(hdc,item);
     3958      }
     3959      if (hItem)
     3960      {
     3961        item = &infoPtr->items[(INT)hItem];
     3962        if (item)
     3963        {
     3964          if (!hdc) hdc = GetDC(hwnd);
     3965          TREEVIEW_DrawHottrackLine(hdc,item);
     3966        }
     3967      }
     3968      if (hdc) ReleaseDC(hwnd,hdc);
     3969    }
    39093970  }
    39103971
     
    41314192  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    41324193  INT prevSelect;
     4194  BOOL refreshPrev = FALSE,refreshNew = FALSE;
    41334195
    41344196  wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)newSelect);
     
    41644226
    41654227      if (prevItem)
     4228      {
     4229        refreshPrev = prevItem->state & TVIS_SELECTED;
    41664230        prevItem->state &= ~TVIS_SELECTED;
     4231      }
    41674232      if (wineItem)
     4233      {
     4234        refreshNew = !(wineItem->state & TVIS_SELECTED);
    41684235        wineItem->state |=  TVIS_SELECTED;
     4236      }
    41694237
    41704238      infoPtr->selectedItem = (HTREEITEM)newSelect;
     
    41824250
    41834251      TREEVIEW_UnqueueRefresh(hwnd,TRUE,TRUE);
    4184       TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);
    4185       TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
     4252      if (dwStyle & TVS_FULLROWSELECT)
     4253      {
     4254        TREEVIEW_ITEM *item;
     4255
     4256        //deselect last selected row
     4257        if (prevItem)
     4258        {
     4259          if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);
     4260          if (prevItem->upsibling)
     4261          {
     4262            item = &infoPtr->items[(INT)prevItem->upsibling];
     4263            while (item)
     4264            {
     4265              if (item->state & TVIS_SELECTED)
     4266              {
     4267                item->state &= ~TVIS_SELECTED;
     4268                TREEVIEW_RefreshItem(hwnd,item,FALSE);
     4269              }
     4270              item = &infoPtr->items[(INT)item->upsibling];
     4271            }
     4272          }
     4273          if (prevItem->sibling)
     4274          {
     4275            item = &infoPtr->items[(INT)prevItem->sibling];
     4276            while (item)
     4277            {
     4278              if (item->state & TVIS_SELECTED)
     4279              {
     4280                item->state &= ~TVIS_SELECTED;
     4281                TREEVIEW_RefreshItem(hwnd,item,FALSE);
     4282              }
     4283              item = &infoPtr->items[(INT)item->sibling];
     4284            }
     4285          }
     4286        }
     4287
     4288        //select new row
     4289        if (wineItem)
     4290        {
     4291          if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
     4292          if (wineItem->upsibling)
     4293          {
     4294            item = &infoPtr->items[(INT)wineItem->upsibling];
     4295            while (item)
     4296            {
     4297              if (!(item->state & TVIS_SELECTED))
     4298              {
     4299                item->state |= TVIS_SELECTED;
     4300                TREEVIEW_RefreshItem(hwnd,item,FALSE);
     4301              }
     4302              item = &infoPtr->items[(INT)item->upsibling];
     4303            }
     4304          }
     4305          if (wineItem->sibling)
     4306          {
     4307            item =  &infoPtr->items[(INT)wineItem->sibling];
     4308            while (item)
     4309            {
     4310              if (!(item->state & TVIS_SELECTED))
     4311              {
     4312                item->state |= TVIS_SELECTED;
     4313                TREEVIEW_RefreshItem(hwnd,item,FALSE);
     4314              }
     4315              item = &infoPtr->items[(INT)item->sibling];
     4316            }
     4317          }
     4318        }
     4319      } else
     4320      {
     4321        if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);
     4322        if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
     4323      }
    41864324
    41874325      TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_SELCHANGEDW:TVN_SELCHANGEDA,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect);
     
    41934331
    41944332      if (prevItem)
     4333      {
     4334        refreshPrev = prevItem->state & TVIS_DROPHILITED;
    41954335        prevItem->state &= ~TVIS_DROPHILITED;
     4336      }
    41964337
    41974338      infoPtr->dropItem = (HTREEITEM)newSelect;
    41984339
    41994340      if (wineItem)
     4341      {
     4342        refreshNew = !(wineItem->state & TVIS_DROPHILITED);
    42004343        wineItem->state |=TVIS_DROPHILITED;
     4344      }
    42014345
    42024346      TREEVIEW_UnqueueRefresh(hwnd,TRUE,TRUE);
    4203       TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);
    4204       TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
     4347      if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);
     4348      if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
    42054349
    42064350      break;
     
    42424386TREEVIEW_SelectItem (HWND hwnd, WPARAM wParam, LPARAM lParam)
    42434387{
    4244  return TREEVIEW_DoSelectItem (hwnd, wParam, (HTREEITEM) lParam, TVC_UNKNOWN);
     4388  return TREEVIEW_DoSelectItem (hwnd, wParam, (HTREEITEM) lParam, TVC_UNKNOWN);
    42454389}
    42464390
     
    42484392TREEVIEW_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
    42494393{
    4250  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
    4251 
    4252 // TRACE (treeview,"%x\n",infoPtr->hFont);
    4253  return infoPtr->hFont;
     4394  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     4395
     4396  return infoPtr->hFont;
    42544397}
    42554398
Note: See TracChangeset for help on using the changeset viewer.