Changeset 110 for trunk/src/comctl32/tooltips.c
- Timestamp:
- Jun 16, 1999, 10:25:45 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/tooltips.c
r94 r110 1 /* $Id: tooltips.c,v 1. 4 1999-06-10 16:22:02 achimhaExp $ */1 /* $Id: tooltips.c,v 1.5 1999-06-16 20:25:44 cbratschi Exp $ */ 2 2 /* 3 3 * Tool tip control … … 5 5 * Copyright 1998 Eric Kohl 6 6 * Copyright 1999 Achim Hasenmueller 7 * Copyright 1999 Christoph Bratschi 7 8 * 8 9 * TODO: … … 53 54 54 55 if (infoPtr->nMaxTipWidth > -1) 55 56 uFlags |= DT_WORDBREAK; 56 57 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 57 58 uFlags |= DT_NOPREFIX; 58 59 GetClientRect (hwnd, &rc); 59 60 … … 76 77 SelectObject (hdc, hOldFont); 77 78 if (oldBkMode != TRANSPARENT) 78 79 SetBkMode (hdc, oldBkMode); 79 80 } 80 81 … … 86 87 87 88 if ((toolPtr->hinst) && (HIWORD((UINT)toolPtr->lpszText) == 0)) { 88 89 // 90 // 91 92 89 /* load a resource */ 90 // TRACE (tooltips, "load res string %x %x\n", 91 // toolPtr->hinst, (int)toolPtr->lpszText); 92 LoadStringW (toolPtr->hinst, (UINT)toolPtr->lpszText, 93 infoPtr->szTipText, INFOTIPSIZE); 93 94 } 94 95 else if (toolPtr->lpszText) { 95 96 97 98 99 100 101 102 103 104 105 106 107 // 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 toolPtr->lpszText =COMCTL32_Alloc ((len+1)* sizeof(WCHAR));125 126 127 128 129 130 131 132 133 134 135 136 137 toolPtr->lpszText =COMCTL32_Alloc ((len+1)*sizeof(WCHAR));138 139 140 141 142 // 143 144 145 146 147 148 // 149 150 96 if (toolPtr->lpszText == LPSTR_TEXTCALLBACKW) { 97 NMTTDISPINFOA ttnmdi; 98 99 /* fill NMHDR struct */ 100 ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOA)); 101 ttnmdi.hdr.hwndFrom = hwnd; 102 ttnmdi.hdr.idFrom = toolPtr->uId; 103 ttnmdi.hdr.code = TTN_GETDISPINFOA; 104 ttnmdi.lpszText = (LPSTR)&ttnmdi.szText; 105 ttnmdi.uFlags = toolPtr->uFlags; 106 ttnmdi.lParam = toolPtr->lParam; 107 108 // TRACE (tooltips, "hdr.idFrom = %x\n", ttnmdi.hdr.idFrom); 109 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 110 (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi); 111 112 if ((ttnmdi.hinst) && (HIWORD((UINT)ttnmdi.szText) == 0)) { 113 LoadStringW (ttnmdi.hinst, (UINT)ttnmdi.szText, 114 infoPtr->szTipText, INFOTIPSIZE); 115 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 116 toolPtr->hinst = ttnmdi.hinst; 117 toolPtr->lpszText = (LPWSTR)ttnmdi.szText; 118 } 119 } 120 else if (ttnmdi.szText[0]) { 121 lstrcpynAtoW (infoPtr->szTipText, ttnmdi.szText, 80); 122 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 123 INT len = lstrlenA (ttnmdi.szText); 124 toolPtr->hinst = 0; 125 toolPtr->lpszText = COMCTL32_Alloc ((len+1)* sizeof(WCHAR)); 126 lstrcpyAtoW (toolPtr->lpszText, ttnmdi.szText); 127 } 128 } 129 else if (ttnmdi.lpszText == 0) { 130 /* no text available */ 131 infoPtr->szTipText[0] = L'\0'; 132 } 133 else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) { 134 lstrcpynAtoW (infoPtr->szTipText, ttnmdi.lpszText, INFOTIPSIZE); 135 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 136 INT len = lstrlenA (ttnmdi.lpszText); 137 toolPtr->hinst = 0; 138 toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 139 lstrcpyAtoW (toolPtr->lpszText, ttnmdi.lpszText); 140 } 141 } 142 else { 143 // ERR (tooltips, "recursive text callback!\n"); 144 infoPtr->szTipText[0] = '\0'; 145 } 146 } 147 else { 148 /* the item is a usual (unicode) text */ 149 // lstrcpynW (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE); 150 strncpy(infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE); 151 } 151 152 } 152 153 else { 153 154 154 /* no text available */ 155 infoPtr->szTipText[0] = L'\0'; 155 156 } 156 157 … … 168 169 169 170 if (infoPtr->nMaxTipWidth > -1) { 170 171 171 rc.right = infoPtr->nMaxTipWidth; 172 uFlags |= DT_WORDBREAK; 172 173 } 173 174 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 174 175 uFlags |= DT_NOPREFIX; 175 176 // TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText)); 176 177 … … 181 182 ReleaseDC (hwnd, hdc); 182 183 183 lpSize->cx = rc.right - rc.left + 4 + 184 184 lpSize->cx = rc.right - rc.left + 4 + 185 infoPtr->rcMargin.left + infoPtr->rcMargin.right; 185 186 lpSize->cy = rc.bottom - rc.top + 4 + 186 187 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top; 187 188 } 188 189 … … 198 199 199 200 if (infoPtr->nTool == -1) { 200 // 201 201 // TRACE (tooltips, "invalid tool (-1)!\n"); 202 return; 202 203 } 203 204 … … 209 210 210 211 if (infoPtr->szTipText[0] == L'\0') { 211 212 212 infoPtr->nCurrentTool = -1; 213 return; 213 214 } 214 215 … … 220 221 hdr.code = TTN_SHOW; 221 222 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 222 223 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 223 224 224 225 // TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText)); … … 228 229 229 230 if (toolPtr->uFlags & TTF_CENTERTIP) { 230 231 232 233 234 235 236 237 238 239 231 RECT rc; 232 233 if (toolPtr->uFlags & TTF_IDISHWND) 234 GetWindowRect ((HWND)toolPtr->uId, &rc); 235 else { 236 rc = toolPtr->rect; 237 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rc, 2); 238 } 239 rect.left = (rc.left + rc.right - size.cx) / 2; 240 rect.top = rc.bottom + 2; 240 241 } 241 242 else { 242 243 243 GetCursorPos ((LPPOINT)&rect); 244 rect.top += 20; 244 245 } 245 246 … … 252 253 253 254 AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE), 254 255 FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE)); 255 256 256 257 SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, 257 258 258 rect.right - rect.left, rect.bottom - rect.top, 259 SWP_SHOWWINDOW | SWP_NOACTIVATE); 259 260 260 261 /* repaint the tooltip */ … … 274 275 275 276 if (infoPtr->nCurrentTool == -1) 276 277 return; 277 278 278 279 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; … … 284 285 hdr.code = TTN_POP; 285 286 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 286 287 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 287 288 288 289 infoPtr->nCurrentTool = -1; 289 290 290 291 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 291 292 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 292 293 } 293 294 … … 303 304 304 305 if (infoPtr->nTrackTool == -1) { 305 // 306 306 // TRACE (tooltips, "invalid tracking tool (-1)!\n"); 307 return; 307 308 } 308 309 … … 312 313 313 314 if (infoPtr->szTipText[0] == L'\0') { 314 315 315 infoPtr->nTrackTool = -1; 316 return; 316 317 } 317 318 … … 323 324 hdr.code = TTN_SHOW; 324 325 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 325 326 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 326 327 327 328 // TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText)); … … 331 332 332 333 if (toolPtr->uFlags & TTF_ABSOLUTE) { 333 334 335 336 337 338 339 334 rect.left = infoPtr->xTrackPos; 335 rect.top = infoPtr->yTrackPos; 336 337 if (toolPtr->uFlags & TTF_CENTERTIP) { 338 rect.left -= (size.cx / 2); 339 rect.top -= (size.cy / 2); 340 } 340 341 } 341 342 else { 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 343 RECT rcTool; 344 345 if (toolPtr->uFlags & TTF_IDISHWND) 346 GetWindowRect ((HWND)toolPtr->uId, &rcTool); 347 else { 348 rcTool = toolPtr->rect; 349 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rcTool, 2); 350 } 351 352 GetCursorPos ((LPPOINT)&rect); 353 rect.top += 20; 354 355 if (toolPtr->uFlags & TTF_CENTERTIP) { 356 rect.left -= (size.cx / 2); 357 rect.top -= (size.cy / 2); 358 } 359 360 /* smart placement */ 361 if ((rect.left + size.cx > rcTool.left) && (rect.left < rcTool.right) && 362 (rect.top + size.cy > rcTool.top) && (rect.top < rcTool.bottom)) 363 rect.left = rcTool.right; 363 364 } 364 365 … … 369 370 370 371 AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE), 371 372 FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE)); 372 373 373 374 SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, 374 375 375 rect.right - rect.left, rect.bottom - rect.top, 376 SWP_SHOWWINDOW | SWP_NOACTIVATE ); 376 377 377 378 hdc = GetDC (hwnd); … … 388 389 389 390 if (infoPtr->nTrackTool == -1) 390 391 return; 391 392 392 393 toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; … … 397 398 hdr.code = TTN_POP; 398 399 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 399 400 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 400 401 401 402 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 402 403 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 403 404 } 404 405 … … 411 412 412 413 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 413 414 415 if (!(toolPtr->uFlags & TTF_IDISHWND) && 416 417 418 414 toolPtr = &infoPtr->tools[nTool]; 415 416 if (!(toolPtr->uFlags & TTF_IDISHWND) && 417 (lpToolInfo->hwnd == toolPtr->hwnd) && 418 (lpToolInfo->uId == toolPtr->uId)) 419 return nTool; 419 420 } 420 421 421 422 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 422 423 424 425 426 423 toolPtr = &infoPtr->tools[nTool]; 424 425 if ((toolPtr->uFlags & TTF_IDISHWND) && 426 (lpToolInfo->uId == toolPtr->uId)) 427 return nTool; 427 428 } 428 429 … … 438 439 439 440 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 440 441 442 if (!(toolPtr->uFlags & TTF_IDISHWND) && 443 444 445 441 toolPtr = &infoPtr->tools[nTool]; 442 443 if (!(toolPtr->uFlags & TTF_IDISHWND) && 444 (lpToolInfo->hwnd == toolPtr->hwnd) && 445 (lpToolInfo->uId == toolPtr->uId)) 446 return nTool; 446 447 } 447 448 448 449 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 449 450 451 452 453 450 toolPtr = &infoPtr->tools[nTool]; 451 452 if ((toolPtr->uFlags & TTF_IDISHWND) && 453 (lpToolInfo->uId == toolPtr->uId)) 454 return nTool; 454 455 } 455 456 … … 465 466 466 467 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 467 468 469 470 471 472 473 474 475 468 toolPtr = &infoPtr->tools[nTool]; 469 470 if (!(toolPtr->uFlags & TTF_IDISHWND)) { 471 if (hwnd != toolPtr->hwnd) 472 continue; 473 if (!PtInRect (&toolPtr->rect, *lpPt)) 474 continue; 475 return nTool; 476 } 476 477 } 477 478 478 479 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 479 480 481 482 483 484 480 toolPtr = &infoPtr->tools[nTool]; 481 482 if (toolPtr->uFlags & TTF_IDISHWND) { 483 if ((HWND)toolPtr->uId == hwnd) 484 return nTool; 485 } 485 486 } 486 487 … … 509 510 HWND hwndActive = GetActiveWindow (); 510 511 if (!hwndActive) 511 512 return FALSE; 512 513 if (hwndActive == hwnd) 513 514 return TRUE; 514 515 return IsChild (hwndActive, hwnd); 515 516 } … … 527 528 hwndTool = SendMessageA (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt); 528 529 if (hwndTool == 0) 529 530 return -1; 530 531 531 532 ScreenToClient (hwndTool, &pt); 532 533 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt); 533 534 if (nTool == -1) 534 535 return -1; 535 536 536 537 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) { 537 538 538 if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER))) 539 return -1; 539 540 } 540 541 … … 553 554 554 555 // if (infoPtr->bActive) 555 // 556 557 if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 558 556 // TRACE (tooltips, "activate!\n"); 557 558 if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 559 TOOLTIPS_Hide (hwnd, infoPtr); 559 560 560 561 return 0; … … 570 571 571 572 if (lpToolInfo == NULL) 572 573 return FALSE; 573 574 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 574 575 return FALSE; 575 576 576 577 // TRACE (tooltips, "add tool (%x) %x %d%s!\n", 577 // 578 // 578 // hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 579 // (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 579 580 580 581 if (infoPtr->uNumTools == 0) { 581 582 582 infoPtr->tools = COMCTL32_Alloc (sizeof(TTTOOL_INFO)); 583 toolPtr = infoPtr->tools; 583 584 } 584 585 else { 585 586 587 588 589 590 591 586 TTTOOL_INFO *oldTools = infoPtr->tools; 587 infoPtr->tools = 588 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1)); 589 memcpy (infoPtr->tools, oldTools, 590 infoPtr->uNumTools * sizeof(TTTOOL_INFO)); 591 COMCTL32_Free (oldTools); 592 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 592 593 } 593 594 … … 602 603 603 604 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 604 // 605 605 // TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText); 606 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 606 607 } 607 608 else if (lpToolInfo->lpszText) { 608 609 // 610 611 612 613 614 // 615 toolPtr->lpszText =COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));616 617 609 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) { 610 // TRACE (tooltips, "add CALLBACK!\n"); 611 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 612 } 613 else { 614 INT len = lstrlenA (lpToolInfo->lpszText); 615 // TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText); 616 toolPtr->lpszText = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR)); 617 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText); 618 } 618 619 } 619 620 620 621 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 621 622 toolPtr->lParam = lpToolInfo->lParam; 622 623 623 624 /* install subclassing hook */ 624 625 if (toolPtr->uFlags & TTF_SUBCLASS) { 625 626 627 628 629 630 631 lpttsi->wpOrigProc = 632 633 634 635 636 637 638 639 // 640 // 641 642 643 644 645 646 647 648 lpttsi->wpOrigProc = 649 650 651 652 653 654 655 656 657 658 // 626 if (toolPtr->uFlags & TTF_IDISHWND) { 627 LPTT_SUBCLASS_INFO lpttsi = 628 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 629 if (lpttsi == NULL) { 630 lpttsi = 631 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 632 lpttsi->wpOrigProc = 633 (WNDPROC)SetWindowLongA ((HWND)toolPtr->uId, 634 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 635 lpttsi->hwndToolTip = hwnd; 636 lpttsi->uRefCount++; 637 SetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass, 638 (HANDLE)lpttsi); 639 } 640 // else 641 // WARN (tooltips, "A window tool must only be listed once!\n"); 642 } 643 else { 644 LPTT_SUBCLASS_INFO lpttsi = 645 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 646 if (lpttsi == NULL) { 647 lpttsi = 648 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 649 lpttsi->wpOrigProc = 650 (WNDPROC)SetWindowLongA (toolPtr->hwnd, 651 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 652 lpttsi->hwndToolTip = hwnd; 653 lpttsi->uRefCount++; 654 SetPropA (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE)lpttsi); 655 } 656 else 657 lpttsi->uRefCount++; 658 } 659 // TRACE (tooltips, "subclassing installed!\n"); 659 660 } 660 661 … … 671 672 672 673 if (lpToolInfo == NULL) 673 674 return FALSE; 674 675 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 675 676 return FALSE; 676 677 677 678 // TRACE (tooltips, "add tool (%x) %x %d%s!\n", 678 // 679 // 679 // hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 680 // (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 680 681 681 682 if (infoPtr->uNumTools == 0) { 682 683 683 infoPtr->tools = COMCTL32_Alloc (sizeof(TTTOOL_INFO)); 684 toolPtr = infoPtr->tools; 684 685 } 685 686 else { 686 687 688 689 690 691 692 687 TTTOOL_INFO *oldTools = infoPtr->tools; 688 infoPtr->tools = 689 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1)); 690 memcpy (infoPtr->tools, oldTools, 691 infoPtr->uNumTools * sizeof(TTTOOL_INFO)); 692 COMCTL32_Free (oldTools); 693 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 693 694 } 694 695 … … 703 704 704 705 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 705 // 706 706 // TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText); 707 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 707 708 } 708 709 else if (lpToolInfo->lpszText) { 709 710 // 711 712 713 714 715 // 716 // 717 toolPtr->lpszText =COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));718 719 710 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) { 711 // TRACE (tooltips, "add CALLBACK!\n"); 712 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 713 } 714 else { 715 INT len = lstrlenW (lpToolInfo->lpszText); 716 // TRACE (tooltips, "add text \"%s\"!\n", 717 // debugstr_w(lpToolInfo->lpszText)); 718 toolPtr->lpszText = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR)); 719 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 720 } 720 721 } 721 722 722 723 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 723 724 toolPtr->lParam = lpToolInfo->lParam; 724 725 725 726 /* install subclassing hook */ 726 727 if (toolPtr->uFlags & TTF_SUBCLASS) { 727 728 729 730 731 732 733 lpttsi->wpOrigProc = 734 735 736 737 738 739 740 741 // 742 // 743 744 745 746 747 748 749 750 lpttsi->wpOrigProc = 751 752 753 754 755 756 757 758 759 760 // 728 if (toolPtr->uFlags & TTF_IDISHWND) { 729 LPTT_SUBCLASS_INFO lpttsi = 730 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 731 if (lpttsi == NULL) { 732 lpttsi = 733 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 734 lpttsi->wpOrigProc = 735 (WNDPROC)SetWindowLongA ((HWND)toolPtr->uId, 736 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 737 lpttsi->hwndToolTip = hwnd; 738 lpttsi->uRefCount++; 739 SetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass, 740 (HANDLE)lpttsi); 741 } 742 // else 743 // WARN (tooltips, "A window tool must only be listed once!\n"); 744 } 745 else { 746 LPTT_SUBCLASS_INFO lpttsi = 747 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 748 if (lpttsi == NULL) { 749 lpttsi = 750 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 751 lpttsi->wpOrigProc = 752 (WNDPROC)SetWindowLongA (toolPtr->hwnd, 753 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 754 lpttsi->hwndToolTip = hwnd; 755 lpttsi->uRefCount++; 756 SetPropA (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE)lpttsi); 757 } 758 else 759 lpttsi->uRefCount++; 760 } 761 // TRACE (tooltips, "subclassing installed!\n"); 761 762 } 762 763 … … 774 775 775 776 if (lpToolInfo == NULL) 776 777 return 0; 777 778 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 778 779 return 0; 779 780 if (infoPtr->uNumTools == 0) 780 781 return 0; 781 782 782 783 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); … … 786 787 787 788 /* delete text string */ 788 toolPtr = &infoPtr->tools[nTool]; 789 toolPtr = &infoPtr->tools[nTool]; 789 790 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 790 791 791 if (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) 792 COMCTL32_Free (toolPtr->lpszText); 792 793 } 793 794 794 795 /* remove subclassing */ 795 796 if (toolPtr->uFlags & TTF_SUBCLASS) { 796 797 798 799 800 801 802 803 804 805 // 806 // 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 // 822 // 823 797 if (toolPtr->uFlags & TTF_IDISHWND) { 798 LPTT_SUBCLASS_INFO lpttsi = 799 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 800 if (lpttsi) { 801 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 802 (LONG)lpttsi->wpOrigProc); 803 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 804 COMCTL32_Free (&lpttsi); 805 } 806 // else 807 // ERR (tooltips, "Invalid data handle!\n"); 808 } 809 else { 810 LPTT_SUBCLASS_INFO lpttsi = 811 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 812 if (lpttsi) { 813 if (lpttsi->uRefCount == 1) { 814 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 815 (LONG)lpttsi->wpOrigProc); 816 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 817 COMCTL32_Free (&lpttsi); 818 } 819 else 820 lpttsi->uRefCount--; 821 } 822 // else 823 // ERR (tooltips, "Invalid data handle!\n"); 824 } 824 825 } 825 826 826 827 /* delete tool from tool list */ 827 828 if (infoPtr->uNumTools == 1) { 828 829 829 COMCTL32_Free (infoPtr->tools); 830 infoPtr->tools = NULL; 830 831 } 831 832 else { 832 833 834 835 836 837 838 839 840 841 842 843 844 833 TTTOOL_INFO *oldTools = infoPtr->tools; 834 infoPtr->tools = 835 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 836 837 if (nTool > 0) 838 memcpy (&infoPtr->tools[0], &oldTools[0], 839 nTool * sizeof(TTTOOL_INFO)); 840 841 if (nTool < infoPtr->uNumTools - 1) 842 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 843 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 844 845 COMCTL32_Free (oldTools); 845 846 } 846 847 … … 860 861 861 862 if (lpToolInfo == NULL) 862 863 return 0; 863 864 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 864 865 return 0; 865 866 if (infoPtr->uNumTools == 0) 866 867 return 0; 867 868 868 869 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); … … 872 873 873 874 /* delete text string */ 874 toolPtr = &infoPtr->tools[nTool]; 875 toolPtr = &infoPtr->tools[nTool]; 875 876 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 876 877 877 if (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) 878 COMCTL32_Free (toolPtr->lpszText); 878 879 } 879 880 880 881 /* remove subclassing */ 881 882 if (toolPtr->uFlags & TTF_SUBCLASS) { 882 883 884 885 886 887 888 889 890 891 // 892 // 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 // 908 // 909 883 if (toolPtr->uFlags & TTF_IDISHWND) { 884 LPTT_SUBCLASS_INFO lpttsi = 885 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 886 if (lpttsi) { 887 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 888 (LONG)lpttsi->wpOrigProc); 889 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 890 COMCTL32_Free (&lpttsi); 891 } 892 // else 893 // ERR (tooltips, "Invalid data handle!\n"); 894 } 895 else { 896 LPTT_SUBCLASS_INFO lpttsi = 897 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 898 if (lpttsi) { 899 if (lpttsi->uRefCount == 1) { 900 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 901 (LONG)lpttsi->wpOrigProc); 902 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 903 COMCTL32_Free (&lpttsi); 904 } 905 else 906 lpttsi->uRefCount--; 907 } 908 // else 909 // ERR (tooltips, "Invalid data handle!\n"); 910 } 910 911 } 911 912 912 913 /* delete tool from tool list */ 913 914 if (infoPtr->uNumTools == 1) { 914 915 915 COMCTL32_Free (infoPtr->tools); 916 infoPtr->tools = NULL; 916 917 } 917 918 else { 918 919 920 921 922 923 924 925 926 927 928 929 930 919 TTTOOL_INFO *oldTools = infoPtr->tools; 920 infoPtr->tools = 921 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 922 923 if (nTool > 0) 924 memcpy (&infoPtr->tools[0], &oldTools[0], 925 nTool * sizeof(TTTOOL_INFO)); 926 927 if (nTool < infoPtr->uNumTools - 1) 928 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 929 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 930 931 COMCTL32_Free (oldTools); 931 932 } 932 933 … … 946 947 947 948 if (lpToolInfo == NULL) 948 949 return FALSE; 949 950 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 950 951 return FALSE; 951 952 if (uIndex >= infoPtr->uNumTools) 952 953 return FALSE; 953 954 954 955 // TRACE (tooltips, "index=%u\n", uIndex); … … 966 967 967 968 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 968 969 lpToolInfo->lParam = toolPtr->lParam; 969 970 970 971 return TRUE; … … 981 982 982 983 if (lpToolInfo == NULL) 983 984 return FALSE; 984 985 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 985 986 return FALSE; 986 987 if (uIndex >= infoPtr->uNumTools) 987 988 return FALSE; 988 989 989 990 // TRACE (tooltips, "index=%u\n", uIndex); … … 1001 1002 1002 1003 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1003 1004 lpToolInfo->lParam = toolPtr->lParam; 1004 1005 1005 1006 return TRUE; … … 1015 1016 1016 1017 if (lpToolInfo == NULL) 1017 1018 return FALSE; 1018 1019 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1019 1020 return FALSE; 1020 1021 1021 1022 if (lpToolInfo) { 1022 1023 1024 1025 1026 1027 1028 1029 /* 1030 1031 1032 1033 1034 1035 1036 1037 1038 1023 if (infoPtr->nCurrentTool > -1) { 1024 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1025 1026 /* copy tool data */ 1027 lpToolInfo->uFlags = toolPtr->uFlags; 1028 lpToolInfo->rect = toolPtr->rect; 1029 lpToolInfo->hinst = toolPtr->hinst; 1030 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1031 lpToolInfo->lpszText = NULL; /* FIXME */ 1032 1033 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1034 lpToolInfo->lParam = toolPtr->lParam; 1035 1036 return TRUE; 1037 } 1038 else 1039 return FALSE; 1039 1040 } 1040 1041 else 1041 1042 return (infoPtr->nCurrentTool != -1); 1042 1043 1043 1044 return FALSE; … … 1053 1054 1054 1055 if (lpToolInfo == NULL) 1055 1056 return FALSE; 1056 1057 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1057 1058 return FALSE; 1058 1059 1059 1060 if (lpToolInfo) { 1060 1061 1062 1063 1064 1065 1066 1067 /* 1068 1069 1070 1071 1072 1073 1074 1075 1076 1061 if (infoPtr->nCurrentTool > -1) { 1062 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1063 1064 /* copy tool data */ 1065 lpToolInfo->uFlags = toolPtr->uFlags; 1066 lpToolInfo->rect = toolPtr->rect; 1067 lpToolInfo->hinst = toolPtr->hinst; 1068 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1069 lpToolInfo->lpszText = NULL; /* FIXME */ 1070 1071 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1072 lpToolInfo->lParam = toolPtr->lParam; 1073 1074 return TRUE; 1075 } 1076 else 1077 return FALSE; 1077 1078 } 1078 1079 else 1079 1080 return (infoPtr->nCurrentTool != -1); 1080 1081 1081 1082 return FALSE; … … 1089 1090 1090 1091 switch (wParam) { 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1092 case TTDT_AUTOMATIC: 1093 return infoPtr->nAutomaticTime; 1094 1095 case TTDT_RESHOW: 1096 return infoPtr->nReshowTime; 1097 1098 case TTDT_AUTOPOP: 1099 return infoPtr->nAutoPopTime; 1100 1101 case TTDT_INITIAL: 1102 return infoPtr->nInitialTime; 1102 1103 } 1103 1104 … … 1138 1139 1139 1140 if (lpToolInfo == NULL) 1140 1141 return 0; 1141 1142 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1142 1143 return 0; 1143 1144 1144 1145 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); … … 1159 1160 1160 1161 if (lpToolInfo == NULL) 1161 1162 return 0; 1162 1163 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1163 1164 return 0; 1164 1165 1165 1166 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); … … 1205 1206 1206 1207 if (lpToolInfo == NULL) 1207 1208 return FALSE; 1208 1209 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1209 1210 return FALSE; 1210 1211 if (infoPtr->uNumTools == 0) 1211 1212 return FALSE; 1212 1213 1213 1214 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1214 1215 if (nTool == -1) 1215 1216 return FALSE; 1216 1217 1217 1218 // TRACE (tooltips, "tool %d\n", nTool); … … 1227 1228 1228 1229 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1229 1230 lpToolInfo->lParam = toolPtr->lParam; 1230 1231 1231 1232 return TRUE; … … 1242 1243 1243 1244 if (lpToolInfo == NULL) 1244 1245 return FALSE; 1245 1246 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1246 1247 return FALSE; 1247 1248 if (infoPtr->uNumTools == 0) 1248 1249 return FALSE; 1249 1250 1250 1251 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1251 1252 if (nTool == -1) 1252 1253 return FALSE; 1253 1254 1254 1255 // TRACE (tooltips, "tool %d\n", nTool); … … 1264 1265 1265 1266 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1266 1267 lpToolInfo->lParam = toolPtr->lParam; 1267 1268 1268 1269 return TRUE; … … 1279 1280 1280 1281 if (lptthit == 0) 1281 1282 return FALSE; 1282 1283 1283 1284 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1284 1285 if (nTool == -1) 1285 1286 return FALSE; 1286 1287 1287 1288 // TRACE (tooltips, "tool %d!\n", nTool); … … 1289 1290 /* copy tool data */ 1290 1291 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOA)) { 1291 1292 1293 1294 1295 1296 1297 1298 /* 1299 1300 1292 toolPtr = &infoPtr->tools[nTool]; 1293 1294 lptthit->ti.uFlags = toolPtr->uFlags; 1295 lptthit->ti.hwnd = toolPtr->hwnd; 1296 lptthit->ti.uId = toolPtr->uId; 1297 lptthit->ti.rect = toolPtr->rect; 1298 lptthit->ti.hinst = toolPtr->hinst; 1299 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1300 lptthit->ti.lpszText = NULL; /* FIXME */ 1301 lptthit->ti.lParam = toolPtr->lParam; 1301 1302 } 1302 1303 … … 1314 1315 1315 1316 if (lptthit == 0) 1316 1317 return FALSE; 1317 1318 1318 1319 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1319 1320 if (nTool == -1) 1320 1321 return FALSE; 1321 1322 1322 1323 // TRACE (tooltips, "tool %d!\n", nTool); … … 1324 1325 /* copy tool data */ 1325 1326 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOW)) { 1326 1327 1328 1329 1330 1331 1332 1333 /* 1334 1335 1327 toolPtr = &infoPtr->tools[nTool]; 1328 1329 lptthit->ti.uFlags = toolPtr->uFlags; 1330 lptthit->ti.hwnd = toolPtr->hwnd; 1331 lptthit->ti.uId = toolPtr->uId; 1332 lptthit->ti.rect = toolPtr->rect; 1333 lptthit->ti.hinst = toolPtr->hinst; 1334 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1335 lptthit->ti.lpszText = NULL; /* FIXME */ 1336 lptthit->ti.lParam = toolPtr->lParam; 1336 1337 } 1337 1338 … … 1348 1349 1349 1350 if (lpti == NULL) 1350 1351 return 0; 1351 1352 if (lpti->cbSize < TTTOOLINFO_V1_SIZEA) 1352 1353 return FALSE; 1353 1354 1354 1355 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti); … … 1369 1370 1370 1371 if (lpti == NULL) 1371 1372 return 0; 1372 1373 if (lpti->cbSize < TTTOOLINFO_V1_SIZEW) 1373 1374 return FALSE; 1374 1375 1375 1376 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti); … … 1401 1402 1402 1403 if (lParam == 0) { 1403 // 1404 1404 // ERR (tooltips, "lpMsg == NULL!\n"); 1405 return 0; 1405 1406 } 1406 1407 1407 1408 switch (lpMsg->message) { 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 // 1419 // 1420 1421 1422 1423 1424 1425 1426 1427 1428 // 1429 // 1430 // 1431 // 1432 1433 1434 1435 // 1436 1437 1438 1439 1440 // 1441 1442 1443 1444 1445 // 1446 1447 1409 case WM_LBUTTONDOWN: 1410 case WM_LBUTTONUP: 1411 case WM_MBUTTONDOWN: 1412 case WM_MBUTTONUP: 1413 case WM_RBUTTONDOWN: 1414 case WM_RBUTTONUP: 1415 pt = lpMsg->pt; 1416 ScreenToClient (lpMsg->hwnd, &pt); 1417 infoPtr->nOldTool = infoPtr->nTool; 1418 infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt); 1419 // TRACE (tooltips, "tool (%x) %d %d\n", 1420 // hwnd, infoPtr->nOldTool, infoPtr->nTool); 1421 TOOLTIPS_Hide (hwnd, infoPtr); 1422 break; 1423 1424 case WM_MOUSEMOVE: 1425 pt = lpMsg->pt; 1426 ScreenToClient (lpMsg->hwnd, &pt); 1427 infoPtr->nOldTool = infoPtr->nTool; 1428 infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt); 1429 // TRACE (tooltips, "tool (%x) %d %d\n", 1430 // hwnd, infoPtr->nOldTool, infoPtr->nTool); 1431 // TRACE (tooltips, "WM_MOUSEMOVE (%04x %ld %ld)\n", 1432 // hwnd, pt.x, pt.y); 1433 if ((infoPtr->bActive) && (infoPtr->nTool != infoPtr->nOldTool)) { 1434 if (infoPtr->nOldTool == -1) { 1435 SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nInitialTime, 0); 1436 // TRACE (tooltips, "timer 1 started!\n"); 1437 } 1438 else { 1439 TOOLTIPS_Hide (hwnd, infoPtr); 1440 SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0); 1441 // TRACE (tooltips, "timer 2 started!\n"); 1442 } 1443 } 1444 if (infoPtr->nCurrentTool != -1) { 1445 SetTimer (hwnd, ID_TIMERLEAVE, 100, 0); 1446 // TRACE (tooltips, "timer 3 started!\n"); 1447 } 1448 break; 1448 1449 } 1449 1450 … … 1459 1460 1460 1461 switch (wParam) { 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1462 case TTDT_AUTOMATIC: 1463 if (nTime == 0) { 1464 infoPtr->nAutomaticTime = 500; 1465 infoPtr->nReshowTime = 100; 1466 infoPtr->nAutoPopTime = 5000; 1467 infoPtr->nInitialTime = 500; 1468 } 1469 else { 1470 infoPtr->nAutomaticTime = nTime; 1471 infoPtr->nReshowTime = nTime / 5; 1472 infoPtr->nAutoPopTime = nTime * 10; 1473 infoPtr->nInitialTime = nTime; 1474 } 1475 break; 1476 1477 case TTDT_RESHOW: 1478 infoPtr->nReshowTime = nTime; 1479 break; 1480 1481 case TTDT_AUTOPOP: 1482 infoPtr->nAutoPopTime = nTime; 1483 break; 1484 1485 case TTDT_INITIAL: 1486 infoPtr->nInitialTime = nTime; 1487 break; 1487 1488 } 1488 1489 … … 1549 1550 1550 1551 if (lpToolInfo == NULL) 1551 1552 return 0; 1552 1553 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1553 1554 return 0; 1554 1555 1555 1556 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); … … 1568 1569 1569 1570 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1570 // 1571 1571 // TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText); 1572 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1572 1573 } 1573 1574 else if (lpToolInfo->lpszText) { 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1575 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1576 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1577 else { 1578 if (toolPtr->lpszText) { 1579 COMCTL32_Free (toolPtr->lpszText); 1580 toolPtr->lpszText = NULL; 1581 } 1582 if (lpToolInfo->lpszText) { 1583 INT len = lstrlenA (lpToolInfo->lpszText); 1584 toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1585 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText); 1586 } 1587 } 1587 1588 } 1588 1589 1589 1590 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1590 1591 toolPtr->lParam = lpToolInfo->lParam; 1591 1592 1592 1593 return 0; … … 1603 1604 1604 1605 if (lpToolInfo == NULL) 1605 1606 return 0; 1606 1607 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1607 1608 return 0; 1608 1609 1609 1610 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); … … 1622 1623 1623 1624 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1624 // 1625 1625 // TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText); 1626 toolPtr->lpszText = lpToolInfo->lpszText; 1626 1627 } 1627 1628 else if (lpToolInfo->lpszText) { 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1629 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1630 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1631 else { 1632 if (toolPtr->lpszText) { 1633 COMCTL32_Free (toolPtr->lpszText); 1634 toolPtr->lpszText = NULL; 1635 } 1636 if (lpToolInfo->lpszText) { 1637 INT len = lstrlenW (lpToolInfo->lpszText); 1638 toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1639 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1640 } 1641 } 1641 1642 } 1642 1643 1643 1644 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1644 1645 toolPtr->lParam = lpToolInfo->lParam; 1645 1646 1646 1647 return 0; … … 1655 1656 1656 1657 if (lpToolInfo == NULL) 1657 1658 return 0; 1658 1659 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1659 1660 return FALSE; 1660 1661 1661 1662 if ((BOOL)wParam) { 1662 1663 1664 1665 // 1666 1667 1668 1663 /* activate */ 1664 infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1665 if (infoPtr->nTrackTool != -1) { 1666 // TRACE (tooltips, "activated!\n"); 1667 infoPtr->bTrackActive = TRUE; 1668 TOOLTIPS_TrackShow (hwnd, infoPtr); 1669 } 1669 1670 } 1670 1671 else { 1671 1672 1673 1674 1675 1676 1677 // 1672 /* deactivate */ 1673 TOOLTIPS_TrackHide (hwnd, infoPtr); 1674 1675 infoPtr->bTrackActive = FALSE; 1676 infoPtr->nTrackTool = -1; 1677 1678 // TRACE (tooltips, "deactivated!\n"); 1678 1679 } 1679 1680 … … 1691 1692 1692 1693 if (infoPtr->bTrackActive) { 1693 // 1694 // 1695 1696 1694 // TRACE (tooltips, "[%d %d]\n", 1695 // infoPtr->xTrackPos, infoPtr->yTrackPos); 1696 1697 TOOLTIPS_TrackShow (hwnd, infoPtr); 1697 1698 } 1698 1699 … … 1707 1708 1708 1709 if (infoPtr->nCurrentTool != -1) 1709 1710 UpdateWindow (hwnd); 1710 1711 1711 1712 return 0; … … 1722 1723 1723 1724 if (lpToolInfo == NULL) 1724 1725 return 0; 1725 1726 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1726 1727 return FALSE; 1727 1728 1728 1729 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); … … 1737 1738 1738 1739 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1739 1740 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1740 1741 } 1741 1742 else if (lpToolInfo->lpszText) { 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1743 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1744 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1745 else { 1746 if (toolPtr->lpszText) { 1747 COMCTL32_Free (toolPtr->lpszText); 1748 toolPtr->lpszText = NULL; 1749 } 1750 if (lpToolInfo->lpszText) { 1751 INT len = lstrlenA (lpToolInfo->lpszText); 1752 toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1753 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText); 1754 } 1755 } 1755 1756 } 1756 1757 1757 1758 /* force repaint */ 1758 1759 if (infoPtr->bActive) 1759 1760 TOOLTIPS_Show (hwnd, infoPtr); 1760 1761 else if (infoPtr->bTrackActive) 1761 1762 TOOLTIPS_TrackShow (hwnd, infoPtr); 1762 1763 1763 1764 return 0; … … 1774 1775 1775 1776 if (lpToolInfo == NULL) 1776 1777 return 0; 1777 1778 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1778 1779 return FALSE; 1779 1780 1780 1781 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1781 1782 if (nTool == -1) 1782 1783 return 0; 1783 1784 1784 1785 // TRACE (tooltips, "tool %d\n", nTool); … … 1790 1791 1791 1792 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1792 1793 toolPtr->lpszText = lpToolInfo->lpszText; 1793 1794 } 1794 1795 else if (lpToolInfo->lpszText) { 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1796 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1797 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1798 else { 1799 if (toolPtr->lpszText) { 1800 COMCTL32_Free (toolPtr->lpszText); 1801 toolPtr->lpszText = NULL; 1802 } 1803 if (lpToolInfo->lpszText) { 1804 INT len = lstrlenW (lpToolInfo->lpszText); 1805 toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1806 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1807 } 1808 } 1808 1809 } 1809 1810 1810 1811 /* force repaint */ 1811 1812 if (infoPtr->bActive) 1812 1813 TOOLTIPS_Show (hwnd, infoPtr); 1813 1814 else if (infoPtr->bTrackActive) 1814 1815 TOOLTIPS_TrackShow (hwnd, infoPtr); 1815 1816 1816 1817 return 0; … … 1859 1860 1860 1861 nResult = (INT) SendMessageA (GetParent (hwnd), WM_NOTIFYFORMAT, 1861 1862 (WPARAM)hwnd, (LPARAM)NF_QUERY); 1862 1863 // if (nResult == NFR_ANSI) 1863 // 1864 // TRACE (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_ANSI\n"); 1864 1865 // else if (nResult == NFR_UNICODE) 1865 // 1866 // FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n"); 1866 1867 // else 1867 // 1868 // FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: error!\n"); 1868 1869 1869 1870 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); … … 1882 1883 /* free tools */ 1883 1884 if (infoPtr->tools) { 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1885 for (i = 0; i < infoPtr->uNumTools; i++) { 1886 toolPtr = &infoPtr->tools[i]; 1887 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 1888 if (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) 1889 COMCTL32_Free (toolPtr->lpszText); 1890 } 1891 1892 /* remove subclassing */ 1893 if (toolPtr->uFlags & TTF_SUBCLASS) { 1894 LPTT_SUBCLASS_INFO lpttsi; 1895 1896 if (toolPtr->uFlags & TTF_IDISHWND) 1897 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 1898 else 1899 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 1900 1901 if (lpttsi) { 1902 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 1903 (LONG)lpttsi->wpOrigProc); 1904 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 1905 COMCTL32_Free (&lpttsi); 1906 } 1907 } 1908 } 1909 COMCTL32_Free (infoPtr->tools); 1909 1910 } 1910 1911 … … 1977 1978 1978 1979 if ((nTool > -1) && (nTool < infoPtr->uNumTools)) { 1979 1980 // 1981 1982 1980 if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) { 1981 // TRACE (tooltips, "-- in transparent mode!\n"); 1982 return HTTRANSPARENT; 1983 } 1983 1984 } 1984 1985 … … 1996 1997 TOOLTIPS_Refresh (hwnd, hdc); 1997 1998 if (!wParam) 1998 1999 EndPaint (hwnd, &ps); 1999 2000 return 0; 2000 2001 } … … 2009 2010 2010 2011 if ((LOWORD(lParam)) & (infoPtr->nCurrentTool != -1)) { 2011 // 2012 // FIXME (tooltips, "full redraw needed!\n"); 2012 2013 } 2013 2014 … … 2072 2073 switch (wParam) 2073 2074 { 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2075 case ID_TIMERSHOW: 2076 KillTimer (hwnd, ID_TIMERSHOW); 2077 if (TOOLTIPS_CheckTool (hwnd, TRUE) == infoPtr->nTool) 2078 TOOLTIPS_Show (hwnd, infoPtr); 2079 break; 2080 2081 case ID_TIMERPOP: 2082 TOOLTIPS_Hide (hwnd, infoPtr); 2083 break; 2084 2085 case ID_TIMERLEAVE: 2086 KillTimer (hwnd, ID_TIMERLEAVE); 2087 if (TOOLTIPS_CheckTool (hwnd, FALSE) == -1) { 2088 infoPtr->nTool = -1; 2089 infoPtr->nOldTool = -1; 2090 TOOLTIPS_Hide (hwnd, infoPtr); 2091 } 2092 break; 2092 2093 } 2093 2094 return 0; … … 2117 2118 { 2118 2119 LPTT_SUBCLASS_INFO lpttsi = 2119 2120 (LPTT_SUBCLASS_INFO)GetPropA (hwnd, COMCTL32_aSubclass); 2120 2121 TOOLTIPS_INFO *infoPtr; 2121 2122 UINT nTool; 2122 2123 2123 2124 switch (uMsg) { 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 // 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 // 2144 2145 2146 2147 2148 2149 2150 2151 2152 // 2153 2154 2155 2156 2157 2158 // 2159 2160 2161 2162 2163 // 2164 2165 2125 case WM_LBUTTONDOWN: 2126 case WM_LBUTTONUP: 2127 case WM_MBUTTONDOWN: 2128 case WM_MBUTTONUP: 2129 case WM_RBUTTONDOWN: 2130 case WM_RBUTTONUP: 2131 infoPtr = TOOLTIPS_GetInfoPtr(lpttsi->hwndToolTip); 2132 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd); 2133 2134 // TRACE (tooltips, "subclassed mouse message %04x\n", uMsg); 2135 infoPtr->nOldTool = infoPtr->nTool; 2136 infoPtr->nTool = nTool; 2137 TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr); 2138 break; 2139 2140 case WM_MOUSEMOVE: 2141 infoPtr = TOOLTIPS_GetInfoPtr (lpttsi->hwndToolTip); 2142 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd); 2143 2144 // TRACE (tooltips, "subclassed WM_MOUSEMOVE\n"); 2145 infoPtr->nOldTool = infoPtr->nTool; 2146 infoPtr->nTool = nTool; 2147 2148 if ((infoPtr->bActive) && 2149 (infoPtr->nTool != infoPtr->nOldTool)) { 2150 if (infoPtr->nOldTool == -1) { 2151 SetTimer (hwnd, ID_TIMERSHOW, 2152 infoPtr->nInitialTime, 0); 2153 // TRACE (tooltips, "timer 1 started!\n"); 2154 } 2155 else { 2156 TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr); 2157 SetTimer (hwnd, ID_TIMERSHOW, 2158 infoPtr->nReshowTime, 0); 2159 // TRACE (tooltips, "timer 2 started!\n"); 2160 } 2161 } 2162 if (infoPtr->nCurrentTool != -1) { 2163 SetTimer (hwnd, ID_TIMERLEAVE, 100, 0); 2164 // TRACE (tooltips, "timer 3 started!\n"); 2165 } 2166 break; 2166 2167 } 2167 2168 … … 2175 2176 switch (uMsg) 2176 2177 { 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2178 case TTM_ACTIVATE: 2179 return TOOLTIPS_Activate (hwnd, wParam, lParam); 2180 2181 case TTM_ADDTOOLA: 2182 return TOOLTIPS_AddToolA (hwnd, wParam, lParam); 2183 2184 case TTM_ADDTOOLW: 2185 return TOOLTIPS_AddToolW (hwnd, wParam, lParam); 2186 2187 case TTM_DELTOOLA: 2188 return TOOLTIPS_DelToolA (hwnd, wParam, lParam); 2189 2190 case TTM_DELTOOLW: 2191 return TOOLTIPS_DelToolW (hwnd, wParam, lParam); 2192 2193 case TTM_ENUMTOOLSA: 2194 return TOOLTIPS_EnumToolsA (hwnd, wParam, lParam); 2195 2196 case TTM_ENUMTOOLSW: 2197 return TOOLTIPS_EnumToolsW (hwnd, wParam, lParam); 2198 2199 case TTM_GETCURRENTTOOLA: 2200 return TOOLTIPS_GetCurrentToolA (hwnd, wParam, lParam); 2201 2202 case TTM_GETCURRENTTOOLW: 2203 return TOOLTIPS_GetCurrentToolW (hwnd, wParam, lParam); 2204 2205 case TTM_GETDELAYTIME: 2206 return TOOLTIPS_GetDelayTime (hwnd, wParam, lParam); 2207 2208 case TTM_GETMARGIN: 2209 return TOOLTIPS_GetMargin (hwnd, wParam, lParam); 2210 2211 case TTM_GETMAXTIPWIDTH: 2212 return TOOLTIPS_GetMaxTipWidth (hwnd, wParam, lParam); 2213 2214 case TTM_GETTEXTA: 2215 return TOOLTIPS_GetTextA (hwnd, wParam, lParam); 2216 2217 case TTM_GETTEXTW: 2218 return TOOLTIPS_GetTextW (hwnd, wParam, lParam); 2219 2220 case TTM_GETTIPBKCOLOR: 2221 return TOOLTIPS_GetTipBkColor (hwnd, wParam, lParam); 2222 2223 case TTM_GETTIPTEXTCOLOR: 2224 return TOOLTIPS_GetTipTextColor (hwnd, wParam, lParam); 2225 2226 case TTM_GETTOOLCOUNT: 2227 return TOOLTIPS_GetToolCount (hwnd, wParam, lParam); 2228 2229 case TTM_GETTOOLINFOA: 2230 return TOOLTIPS_GetToolInfoA (hwnd, wParam, lParam); 2231 2232 case TTM_GETTOOLINFOW: 2233 return TOOLTIPS_GetToolInfoW (hwnd, wParam, lParam); 2234 2235 case TTM_HITTESTA: 2236 return TOOLTIPS_HitTestA (hwnd, wParam, lParam); 2237 2238 case TTM_HITTESTW: 2239 return TOOLTIPS_HitTestW (hwnd, wParam, lParam); 2240 2241 case TTM_NEWTOOLRECTA: 2242 return TOOLTIPS_NewToolRectA (hwnd, wParam, lParam); 2243 2244 case TTM_NEWTOOLRECTW: 2245 return TOOLTIPS_NewToolRectW (hwnd, wParam, lParam); 2246 2247 case TTM_POP: 2248 return TOOLTIPS_Pop (hwnd, wParam, lParam); 2249 2250 case TTM_RELAYEVENT: 2251 return TOOLTIPS_RelayEvent (hwnd, wParam, lParam); 2252 2253 case TTM_SETDELAYTIME: 2254 return TOOLTIPS_SetDelayTime (hwnd, wParam, lParam); 2255 2256 case TTM_SETMARGIN: 2257 return TOOLTIPS_SetMargin (hwnd, wParam, lParam); 2258 2259 case TTM_SETMAXTIPWIDTH: 2260 return TOOLTIPS_SetMaxTipWidth (hwnd, wParam, lParam); 2261 2262 case TTM_SETTIPBKCOLOR: 2263 return TOOLTIPS_SetTipBkColor (hwnd, wParam, lParam); 2264 2265 case TTM_SETTIPTEXTCOLOR: 2266 return TOOLTIPS_SetTipTextColor (hwnd, wParam, lParam); 2267 2268 case TTM_SETTOOLINFOA: 2269 return TOOLTIPS_SetToolInfoA (hwnd, wParam, lParam); 2270 2271 case TTM_SETTOOLINFOW: 2272 return TOOLTIPS_SetToolInfoW (hwnd, wParam, lParam); 2273 2274 case TTM_TRACKACTIVATE: 2275 return TOOLTIPS_TrackActivate (hwnd, wParam, lParam); 2276 2277 case TTM_TRACKPOSITION: 2278 return TOOLTIPS_TrackPosition (hwnd, wParam, lParam); 2279 2280 case TTM_UPDATE: 2281 return TOOLTIPS_Update (hwnd, wParam, lParam); 2282 2283 case TTM_UPDATETIPTEXTA: 2284 return TOOLTIPS_UpdateTipTextA (hwnd, wParam, lParam); 2285 2286 case TTM_UPDATETIPTEXTW: 2287 return TOOLTIPS_UpdateTipTextW (hwnd, wParam, lParam); 2288 2289 case TTM_WINDOWFROMPOINT: 2290 return TOOLTIPS_WindowFromPoint (hwnd, wParam, lParam); 2291 2292 2293 case WM_CREATE: 2294 return TOOLTIPS_Create (hwnd, wParam, lParam); 2295 2296 case WM_DESTROY: 2297 return TOOLTIPS_Destroy (hwnd, wParam, lParam); 2298 2299 case WM_ERASEBKGND: 2300 return TOOLTIPS_EraseBackground (hwnd, wParam, lParam); 2301 2302 case WM_GETFONT: 2303 return TOOLTIPS_GetFont (hwnd, wParam, lParam); 2303 2304 2304 2305 case WM_GETTEXT: 2305 2306 return TOOLTIPS_OnWMGetText (hwnd, wParam, lParam); 2306 2307 2307 2308 case WM_GETTEXTLENGTH: 2308 2309 return TOOLTIPS_OnWMGetTextLength (hwnd, wParam, lParam); 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 /* 2327 /* 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 // 2344 // 2345 2310 2311 2312 case WM_LBUTTONDOWN: 2313 case WM_LBUTTONUP: 2314 case WM_MBUTTONDOWN: 2315 case WM_MBUTTONUP: 2316 case WM_RBUTTONDOWN: 2317 case WM_RBUTTONUP: 2318 case WM_MOUSEMOVE: 2319 return TOOLTIPS_MouseMessage (hwnd, uMsg, wParam, lParam); 2320 2321 case WM_NCCREATE: 2322 return TOOLTIPS_NCCreate (hwnd, wParam, lParam); 2323 2324 case WM_NCHITTEST: 2325 return TOOLTIPS_NCHitTest (hwnd, wParam, lParam); 2326 2327 /* case WM_NOTIFYFORMAT: */ 2328 /* return TOOLTIPS_NotifyFormat (hwnd, wParam, lParam); */ 2329 2330 case WM_PAINT: 2331 return TOOLTIPS_Paint (hwnd, wParam, lParam); 2332 2333 case WM_SETFONT: 2334 return TOOLTIPS_SetFont (hwnd, wParam, lParam); 2335 2336 case WM_TIMER: 2337 return TOOLTIPS_Timer (hwnd, wParam, lParam); 2338 2339 case WM_WININICHANGE: 2340 return TOOLTIPS_WinIniChange (hwnd, wParam, lParam); 2341 2342 default: 2343 // if (uMsg >= WM_USER) 2344 // ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n", 2345 // uMsg, wParam, lParam); 2346 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 2346 2347 } 2347 2348 return 0; … … 2364 2365 wndClass.hbrBackground = 0; 2365 2366 wndClass.lpszClassName = TOOLTIPS_CLASSA; 2366 2367 2367 2368 RegisterClassA (&wndClass); 2368 2369 } … … 2373 2374 { 2374 2375 if (GlobalFindAtomA (TOOLTIPS_CLASSA)) 2375 2376 } 2377 2376 UnregisterClassA (TOOLTIPS_CLASSA, (HINSTANCE)NULL); 2377 } 2378
Note:
See TracChangeset
for help on using the changeset viewer.