Changeset 243 for trunk/src/helpers/cctl_cnr.c
- Timestamp:
- Jan 29, 2003, 7:41:39 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/helpers/cctl_cnr.c
r242 r243 28 28 #define INCL_WINWINDOWMGR 29 29 #define INCL_WINFRAMEMGR 30 #define INCL_WININPUT 30 31 #define INCL_WINSYS 31 32 #define INCL_WINSCROLLBARS … … 62 63 ********************************************************************/ 63 64 64 extern const SYSCOLORSET G_scsCnr = 65 { 66 TRUE, // inherit presparams 67 SYSCLR_WINDOW, 68 SYSCLR_WINDOWTEXT 65 extern const CCTLCOLOR G_scsCnr[] = 66 { 67 TRUE, PP_BACKGROUNDCOLOR, SYSCLR_WINDOW, 68 TRUE, PP_FOREGROUNDCOLOR, SYSCLR_WINDOWTEXT, 69 TRUE, PP_HILITEBACKGROUNDCOLOR, SYSCLR_HILITEBACKGROUND, 70 TRUE, PP_HILITEFOREGROUNDCOLOR, SYSCLR_HILITEFOREGROUND, 71 TRUE, PP_BORDERCOLOR, SYSCLR_WINDOWFRAME, 72 TRUE, PP_PAGEBACKGROUNDCOLOR, RGBCOL_WHITE, 73 TRUE, PP_PAGEFOREGROUNDCOLOR, RGBCOL_BLACK, 74 TRUE, PP_FIELDBACKGROUNDCOLOR, SYSCLR_SCROLLBAR 69 75 }; 70 76 … … 75 81 ********************************************************************/ 76 82 77 VOID cnrDrawString(HPS hps, 83 /* 84 *@@ ctnrInit: 85 * 86 */ 87 88 VOID ctnrInit(HWND hwnd, 89 MPARAM mp2, 90 ULONG flMainCnrStyle, // in: window style bits of main cnr 91 PDEFWINDATA pdwd) 92 { 93 ctlInitDWD(hwnd, 94 mp2, 95 pdwd, 96 WinDefWindowProc, 97 (flMainCnrStyle & CCS_NOCONTROLPTR) 98 ? CCS_NOSENDCTLPTR 99 : 0, 100 G_scsCnr, 101 ARRAYITEMCOUNT(G_scsCnr)); 102 } 103 104 /* 105 *@@ ctnrDrawString: 106 * 107 */ 108 109 VOID ctnrDrawString(HPS hps, 78 110 PCSZ pcsz, // in: string to test 79 111 PRECTL prcl, // in: clipping rectangle (inclusive!) … … 115 147 116 148 /* 149 *@@ ctnrGetRecordRect: 150 * returns the rectangle of the given record 151 * converted to window coordinates. Works for 152 * all views. 153 */ 154 155 VOID ctnrGetRecordRect(PCNRDATA pData, 156 PRECTL prcl, 157 const RECORDLISTITEM *prli) 158 { 159 LONG deltaWorkspace = ( pData->scrw.szlWorkarea.cy 160 - pData->dwdContent.szlWin.cy) 161 - pData->scrw.ptlScrollOfs.y; 162 prcl->xLeft = 0; 163 prcl->xRight = pData->dwdContent.szlWin.cx; 164 prcl->yBottom = prli->ptl.y - deltaWorkspace; 165 prcl->yTop = prcl->yBottom + prli->szlBox.cy; 166 } 167 168 /* 169 *@@ ctnrRepaintRecord: 170 * 171 */ 172 173 BOOL ctnrRepaintRecord(PCNRDATA pData, 174 const RECORDLISTITEM *prli) 175 { 176 RECTL rcl; 177 ctnrGetRecordRect(pData, &rcl, prli); 178 ++rcl.xRight; // for separators, if any 179 return WinInvalidateRect(pData->dwdContent.hwnd, &rcl, FALSE); 180 } 181 182 /* 183 *@@ ctnrQuerySelMode: 184 * returns one of CCS_EXTENDSEL, CCS_MULTIPLESEL, or 185 * CCS_SINGLESEL, depending on the cnr's current view 186 * and window style bits. 187 */ 188 189 ULONG ctnrQuerySelMode(PCNRDATA pData) 190 { 191 // in tree view, there is always only single-sel mode 192 if (!(pData->CnrInfo.flWindowAttr & CV_TREE)) 193 { 194 // not tree view: then check window style bits 195 ULONG flStyle = winhQueryWindowStyle(pData->dwdMain.hwnd); 196 if (flStyle & CCS_EXTENDSEL) 197 return CCS_EXTENDSEL; 198 else if (flStyle & CCS_MULTIPLESEL) 199 return CCS_MULTIPLESEL; 200 201 // this appears to be what the pm cnr does... 202 // the CCS_SINGLESEL is totally superfluous cos 203 // if none of the "selection style" bits are 204 // set, the cnr operates in "single sel" mode 205 } 206 207 return CCS_SINGLESEL; 208 } 209 210 /* 211 *@@ ctnrChangeEmphasis: 212 * 213 */ 214 215 BOOL ctnrChangeEmphasis(PCNRDATA pData, 216 PRECORDLISTITEM prliSet, 217 BOOL fTurnOn, 218 ULONG fsEmphasis) 219 { 220 PRECORDLISTITEM prliOld; 221 ULONG flRecordAttrOld = prliSet->flRecordAttr; 222 223 /* #define CCS_EXTENDSEL 0x00000001L 224 #define CCS_MULTIPLESEL 0x00000002L 225 #define CCS_SINGLESEL 0x00000004L */ 226 227 ULONG ulSel = ctnrQuerySelMode(pData); 228 229 if (fTurnOn) 230 { 231 ULONG flMask; 232 if (ulSel == CCS_SINGLESEL) 233 flMask = CRA_CURSORED | CRA_SELECTED; 234 else 235 flMask = CRA_CURSORED; 236 237 if (fsEmphasis & flMask) 238 { 239 if (prliOld = pData->prliCursored) 240 { 241 prliOld->flRecordAttr &= ~flMask; 242 ctnrRepaintRecord(pData, prliOld); 243 } 244 245 pData->prliCursored = prliSet; 246 } 247 248 prliSet->flRecordAttr |= fsEmphasis; 249 } 250 else 251 prliSet->flRecordAttr &= ~fsEmphasis; 252 253 if (flRecordAttrOld != prliSet->flRecordAttr) 254 ctnrRepaintRecord(pData, prliSet); 255 256 return TRUE; 257 } 258 259 /* 260 *@@ ctnrRecordEnter: 261 * helper function when a record gets double-clicked 262 * upon or when "Enter" key gets pressed. 263 */ 264 265 VOID ctnrRecordEnter(PCNRDATA pData, 266 const RECORDLISTITEM *prli, 267 BOOL fKeyboard) 268 { 269 NOTIFYRECORDENTER nre; 270 nre.hwndCnr = pData->dwdMain.hwnd; 271 nre.fKey = fKeyboard; 272 nre.pRecord = (prli) ? (PRECORDCORE)prli->precc : NULL; 273 274 ctlSendWmControl(nre.hwndCnr, 275 CN_ENTER, 276 &nre); 277 } 278 279 /* 117 280 *@@ CreateChild: 118 281 * creates a container child window. 119 282 */ 120 283 121 HWND CreateChild(PCNRDATA pData,122 PCSZ pcszClass,123 ULONG id)284 STATIC HWND CreateChild(PCNRDATA pData, 285 PCSZ pcszClass, 286 ULONG id) 124 287 { 125 288 return WinCreateWindow(pData->dwdMain.hwnd, … … 143 306 */ 144 307 145 PDETAILCOLUMN FindColumnFromFI(PCNRDATA pData,146 const FIELDINFO *pfi,147 PLISTNODE *ppNode) // out: listnode of column308 STATIC PDETAILCOLUMN FindColumnFromFI(PCNRDATA pData, 309 const FIELDINFO *pfi, 310 PLISTNODE *ppNode) // out: listnode of column 148 311 { 149 312 PLISTNODE pNode; 150 313 FOR_ALL_NODES(&pData->llColumns, pNode) 151 314 { 152 PDETAILCOLUMN pCol = pNode->pItemData;315 PDETAILCOLUMN pCol = (PDETAILCOLUMN)pNode->pItemData; 153 316 if (pCol->pfi == pfi) 154 317 { … … 164 327 165 328 /* 166 *@@ FindListNodeForRecc:167 * 168 */ 169 170 PLISTNODE FindListNodeForRecc(PCNRDATA pData,171 const RECORDCORE *precc)329 *@@ ctnrFindListNodeForRecc: 330 * 331 */ 332 333 PLISTNODE ctnrFindListNodeForRecc(PCNRDATA pData, 334 const RECORDCORE *precc) 172 335 { 173 336 RECORDTREEITEM *pti; … … 180 343 } 181 344 345 VOID SendViewportChanged(PCNRDATA pData) 346 { 347 CNRVIEWPORT cvp; 348 cvp.hwndCnr = pData->dwdMain.hwnd; 349 cvp.szlWorkarea = pData->scrw.szlWorkarea; 350 cvp.szlWin = pData->dwdContent.szlWin; 351 cvp.ptlScroll = pData->scrw.ptlScrollOfs; 352 353 ctlSendWmControl(pData->dwdMain.hwnd, 354 CN_VIEWPORTCHANGED, 355 &cvp); 356 } 357 358 /* 359 *@@ ctnrUpdateScrollbars: 360 * 361 */ 362 363 VOID ctnrUpdateScrollbars(PCNRDATA pData, 364 LONG cx, 365 LONG cy) 366 { 367 BOOL fNotify = FALSE; 368 369 if (cx && pData->scrw.hwndHScroll) 370 { 371 winhUpdateScrollBar(pData->scrw.hwndHScroll, 372 cx, 373 pData->scrw.szlWorkarea.cx, 374 pData->scrw.ptlScrollOfs.x, 375 FALSE); 376 fNotify = TRUE; 377 } 378 379 if (cy && pData->scrw.hwndVScroll) 380 { 381 winhUpdateScrollBar(pData->scrw.hwndVScroll, 382 cy, 383 pData->scrw.szlWorkarea.cy, 384 pData->scrw.ptlScrollOfs.y, 385 FALSE); 386 fNotify = TRUE; 387 } 388 389 if (fNotify) 390 SendViewportChanged(pData); 391 } 392 182 393 /* ****************************************************************** 183 394 * … … 191 402 */ 192 403 193 MRESULT CnrCreate(HWND hwnd, MPARAM mp1, MPARAM mp2) 404 STATIC MRESULT CnrCreate(HWND hwnd, 405 MPARAM mp1, 406 MPARAM mp2) 194 407 { 195 408 PCNRDATA pData; … … 202 415 203 416 // initialize DEFWINDOWDATA 204 ctlInitDWD(hwnd, 205 mp2, 206 &pData->dwdMain, 207 WinDefWindowProc, 208 &G_scsCnr); 209 210 if (winhQueryWindowStyle(hwnd) & CCS_MINIRECORDCORE) 417 ctnrInit(hwnd, 418 mp2, 419 ((PCREATESTRUCT)mp2)->flStyle, 420 &pData->dwdMain); 421 422 if (((PCREATESTRUCT)mp2)->flStyle & CCS_MINIRECORDCORE) 211 423 pData->fMiniRecords = TRUE; 212 424 … … 229 441 nlsQueryCountrySettings(&pData->cs); 230 442 231 winhCreateScrollBars(hwnd, 232 &pData->hwndVScroll, 233 &pData->hwndHScroll); 234 235 pData->cxScrollBar = WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL); 236 pData->cyScrollBar = WinQuerySysValue(HWND_DESKTOP, SV_CYHSCROLL); 443 winhCreateScroller(hwnd, 444 &pData->scrw, 445 CID_VSCROLL, 446 CID_HSCROLL); 237 447 238 448 return (MRESULT)FALSE; … … 248 458 */ 249 459 250 VOID CnrSem2(HWND hwnd, ULONG fl) 251 { 252 PCNRDATA pData; 253 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 254 { 255 if (pData->CnrInfo.flWindowAttr & CV_DETAIL) 256 { 257 if (fl & (DDFL_INVALIDATECOLUMNS | DDFL_INCALIDATERECORDS)) 460 STATIC VOID CnrSem2(PCNRDATA pData, 461 ULONG fl) 462 { 463 HWND hwnd = pData->dwdMain.hwnd; 464 465 if (pData->CnrInfo.flWindowAttr & CV_DETAIL) 466 { 467 if (fl & (DDFL_INVALIDATECOLUMNS | DDFL_INVALIDATERECORDS | DDFL_INVALIDATESOME)) 468 { 469 HPS hps = WinGetPS(hwnd); 470 cdtlRecalcDetails(pData, hps, &fl); 471 WinReleasePS(hps); 472 } 473 474 if (fl & (DDFL_WINDOWSIZECHANGED | DDFL_WORKAREACHANGED)) 475 { 476 LONG y = 0, 477 cx = pData->dwdMain.szlWin.cx, 478 cy = pData->dwdMain.szlWin.cy - pData->cyColTitlesBox; 479 480 if (pData->scrw.hwndVScroll) 481 cx -= pData->scrw.cxScrollBar; 482 if (pData->scrw.hwndHScroll) 258 483 { 259 HPS hps = WinGetPS(hwnd); 260 cdtlRecalcDetails(pData, hps, &fl); 261 WinReleasePS(hps); 262 263 if (fl & DDFL_WINDOWSIZECHANGED) 264 WinInvalidateRect(pData->dwdMain.hwnd, NULL, TRUE); 484 y += pData->scrw.cyScrollBar; 485 cy -= pData->scrw.cyScrollBar; 265 486 } 266 487 267 if (fl & (DDFL_WINDOWSIZECHANGED | DDFL_WORKAREACHANGED)) 488 _PmpfF(("cyColTitlesBox %d, new cy: %d", pData->cyColTitlesBox, cy)); 489 490 if (fl & DDFL_WINDOWSIZECHANGED) 491 WinSetWindowPos(pData->dwdContent.hwnd, 492 HWND_TOP, 493 0, 494 y, 495 cx, 496 cy, 497 SWP_MOVE | SWP_SIZE); 498 // SWP_MOVE is required or PM will move our 499 // subwindow to some adjustment position 500 501 if (pData->scrw.hwndVScroll) 268 502 { 269 LONG y = 0, 270 cx = pData->dwdMain.szlWin.cx, 271 cy = pData->dwdMain.szlWin.cy - pData->cyColTitlesBox; 272 273 if (pData->hwndVScroll) 274 cx -= pData->cxScrollBar; 275 if (pData->hwndHScroll) 276 { 277 y += pData->cyScrollBar; 278 cy -= pData->cyScrollBar; 279 } 280 281 _PmpfF(("cyColTitlesBox %d, new cy: %d", pData->cyColTitlesBox, cy)); 282 283 if (fl & DDFL_WINDOWSIZECHANGED) 284 WinSetWindowPos(pData->hwndDetails, 285 HWND_TOP, 286 0, 287 y, 288 cx, 289 cy, 290 SWP_MOVE | SWP_SIZE); 291 // SWP_MOVE is required or PM will move our 292 // subwindow to some adjustment position 293 294 if (pData->hwndVScroll) 295 { 296 WinSetWindowPos(pData->hwndVScroll, 297 HWND_TOP, 298 cx, 299 y, 300 pData->cxScrollBar, 301 cy, 302 SWP_MOVE | SWP_SIZE); 303 304 _PmpfF(("updating VScroll, cy: %d, szlWorkarea.cy: %d", 305 cy, 306 pData->szlWorkarea.cy)); 307 308 winhUpdateScrollBar(pData->hwndVScroll, 309 cy, 310 pData->szlWorkarea.cy, 311 pData->ptlScrollOfs.y, 312 FALSE); 313 } 314 315 if (pData->hwndHScroll) 316 { 317 WinSetWindowPos(pData->hwndHScroll, 318 HWND_TOP, 319 0, 320 0, 321 cx, 322 pData->cyScrollBar, 323 SWP_MOVE | SWP_SIZE); 324 325 _PmpfF(("updating HScroll, cx: %d, szlWorkarea.cx: %d", 326 cx, 327 pData->szlWorkarea.cx)); 328 329 winhUpdateScrollBar(pData->hwndHScroll, 330 cx, 331 pData->szlWorkarea.cx, 332 pData->ptlScrollOfs.x, 333 FALSE); 334 } 503 WinSetWindowPos(pData->scrw.hwndVScroll, 504 HWND_TOP, 505 cx, 506 y, 507 pData->scrw.cxScrollBar, 508 cy, 509 SWP_MOVE | SWP_SIZE); 510 511 _PmpfF(("updating VScroll, cy: %d, scrw.szlWorkarea.cy: %d", 512 cy, 513 pData->scrw.szlWorkarea.cy)); 335 514 } 515 516 if (pData->scrw.hwndHScroll) 517 { 518 WinSetWindowPos(pData->scrw.hwndHScroll, 519 HWND_TOP, 520 0, 521 0, 522 cx, 523 pData->scrw.cyScrollBar, 524 SWP_MOVE | SWP_SIZE); 525 526 _PmpfF(("updating HScroll, cx: %d, scrw.szlWorkarea.cx: %d", 527 cx, 528 pData->scrw.szlWorkarea.cx)); 529 } 530 531 ctnrUpdateScrollbars(pData, 532 cx, 533 cy); 336 534 } 337 535 } … … 341 539 *@@ CnrPaint: 342 540 * implementation for WM_PAINT in fnwpCnr. 343 */ 344 345 VOID CnrPaint(HWND hwnd) 346 { 347 HPS hps; 348 PCNRDATA pData; 349 RECTL rclPaint; 350 351 if ( (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 352 && (hps = WinBeginPaint(hwnd, NULLHANDLE, &rclPaint)) 541 * 542 * This paints only the part of the container that belongs 543 * to the main container window, which is the title area 544 * and/or the details column headings. 545 */ 546 547 STATIC VOID CnrPaint(PCNRDATA pData) 548 { 549 HPS hps; 550 RECTL rclPaint; 551 552 if ( (pData) 553 && (hps = WinBeginPaint(pData->dwdMain.hwnd, NULLHANDLE, &rclPaint)) 353 554 ) 354 555 { … … 376 577 WinFillRect(hps, 377 578 &rclPaint, 378 pData->dwdMain.lcolBackground);579 ctlQueryColor(&pData->dwdMain, CTLCOL_BGND)); 379 580 380 581 FOR_ALL_NODES(&pData->llColumns, pColNode) … … 386 587 ULONG cRow; 387 588 388 rcl.xLeft = pCol->xLeft + COLUMN_PADDING_X - pData-> ptlScrollOfs.x;389 rcl.xRight = rcl.xLeft + pCol->cx Total;589 rcl.xLeft = pCol->xLeft + COLUMN_PADDING_X - pData->scrw.ptlScrollOfs.x; 590 rcl.xRight = rcl.xLeft + pCol->cxContent; 390 591 391 592 // we start out at the top and work our way down, … … 402 603 else 403 604 { 404 c nrDrawString(hps,605 ctnrDrawString(hps, 405 606 (PCSZ)pfi->pTitleData, 406 607 &rcl, … … 438 639 */ 439 640 440 MRESULT CnrWindowPosChanged(HWND hwnd,441 MPARAM mp1,442 MPARAM mp2)641 STATIC MRESULT CnrWindowPosChanged(PCNRDATA pData, 642 MPARAM mp1, 643 MPARAM mp2) 443 644 { 444 645 MRESULT mrc = 0; 445 PCNRDATA pData; 446 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1))646 647 if (pData) 447 648 { 448 649 mrc = ctlDefWindowProc(&pData->dwdMain, WM_WINDOWPOSCHANGED, mp1, mp2); … … 450 651 if (((PSWP)mp1)->fl & SWP_SIZE) 451 652 { 452 WinPostMsg( hwnd,653 WinPostMsg(pData->dwdMain.hwnd, 453 654 WM_SEM2, 454 655 (MPARAM)DDFL_WINDOWSIZECHANGED, … … 461 662 462 663 /* 463 *@@ c nrPresParamChanged:664 *@@ ctnrPresParamChanged: 464 665 * implementation for WM_PRESPARAMCHANGED for both 465 666 * fnwpCnr and fnwpCnrDetails. 466 667 */ 467 668 468 VOID c nrPresParamChanged(HWND hwnd,669 VOID ctnrPresParamChanged(HWND hwnd, // in: either main cnr or content subwindow 469 670 ULONG ulpp) 470 671 { 471 PCNRDATA pData;672 PCNRDATA pData; 472 673 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 473 674 { 474 // note, we use the dwdMain buffer here cos 475 // we share presparams with the cnr 675 // note, no matter what hwnd is passed in, 676 // we use the dwdMain buffer here cos we share presparams 677 // between all cnr child windows 476 678 ctlRefreshColors(&pData->dwdMain); 477 679 … … 480 682 case 0: // layout palette thing dropped 481 683 case PP_FONTNAMESIZE: 482 if ( pData->CnrInfo.flWindowAttr & CV_DETAIL)684 if (!pData->fSettingPP) 483 685 { 484 // if we got this on the details window, 485 // set it on the main cnr as well, and 486 // vice versa 487 PSZ pszFont; 488 if (pszFont = winhQueryWindowFont(hwnd)) 686 pData->fSettingPP = TRUE; 687 688 if (pData->CnrInfo.flWindowAttr & CV_DETAIL) 489 689 { 490 HWND hwndOther; 491 DosBeep(1000, 10); 492 if (hwnd == pData->dwdMain.hwnd) 493 hwndOther = pData->dwdContent.hwnd; 494 else 495 hwndOther = pData->dwdMain.hwnd; 496 497 winhSetWindowFont(hwndOther, pszFont); 498 free(pszFont); 690 // if we got this on the contents window, 691 // set it on the main cnr as well, and 692 // vice versa 693 PSZ pszFont; 694 if (pszFont = winhQueryWindowFont(hwnd)) 695 { 696 HWND hwndOther; 697 if (hwnd == pData->dwdMain.hwnd) 698 hwndOther = pData->dwdContent.hwnd; 699 else 700 hwndOther = pData->dwdMain.hwnd; 701 702 winhSetWindowFont(hwndOther, pszFont); 703 free(pszFont); 704 } 705 706 WinPostMsg(pData->dwdMain.hwnd, 707 WM_SEM2, 708 (MPARAM)(DDFL_INVALIDATECOLUMNS | DDFL_INVALIDATERECORDS), 709 0); 499 710 } 500 711 501 WinPostMsg(pData->dwdMain.hwnd, 502 WM_SEM2, 503 (MPARAM)(DDFL_INVALIDATECOLUMNS | DDFL_INCALIDATERECORDS), 504 0); 712 pData->fSettingPP = FALSE; 505 713 } 506 714 break; … … 518 726 */ 519 727 520 VOID CnrScroll(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 521 { 522 PCNRDATA pData; 523 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 524 { 728 STATIC VOID CnrScroll(PCNRDATA pData, 729 ULONG msg, 730 MPARAM mp1, 731 MPARAM mp2) 732 { 733 if (pData) 734 { 735 BOOL fNotify = FALSE; 736 525 737 if (pData->CnrInfo.flWindowAttr & CV_DETAIL) 526 738 { 527 POINTL ptlScroll; 739 POINTL ptlScroll; 740 NOTIFYSCROLL ns; 741 ns.hwndCnr = pData->dwdMain.hwnd; 742 528 743 if (msg == WM_HSCROLL) 529 744 { 530 745 ptlScroll.y = 0; 531 if (ptlScroll.x = winhHandleScrollMsg 2(pData->hwndHScroll,532 &pData->ptlScrollOfs.x,533 534 pData->szlWorkarea.cx,535 536 537 746 if (ptlScroll.x = winhHandleScrollMsg(pData->scrw.hwndHScroll, 747 &pData->scrw.ptlScrollOfs.x, 748 pData->dwdContent.szlWin.cx, 749 pData->scrw.szlWorkarea.cx, 750 5, 751 msg, 752 mp2)) 538 753 { 754 winhScrollWindow(pData->dwdContent.hwnd, 755 NULL, 756 &ptlScroll); 757 758 // scroll main cnr with detail titles too 539 759 if (pData->CnrInfo.flWindowAttr & CA_DETAILSVIEWTITLES) 540 760 { … … 544 764 rclClip.yBottom = pData->dwdMain.szlWin.cy - pData->cyColTitlesBox; 545 765 rclClip.yTop = pData->dwdMain.szlWin.cy; 546 winhScrollWindow( hwnd,766 winhScrollWindow(pData->dwdMain.hwnd, 547 767 &rclClip, 548 768 &ptlScroll); 549 769 } 550 winhScrollWindow(pData->hwndDetails, 551 NULL, 552 &ptlScroll); 770 771 ns.lScrollInc = ptlScroll.y; 772 ns.fScroll = CMA_HORIZONTAL; // @@todo details flags 773 ctlSendWmControl(pData->dwdMain.hwnd, 774 CN_SCROLL, 775 &ns); 776 777 fNotify = TRUE; 553 778 } 554 779 } … … 556 781 { 557 782 ptlScroll.x = 0; 558 if (ptlScroll.y = winhHandleScrollMsg2(pData->hwndVScroll, 559 &pData->ptlScrollOfs.y, 560 pData->dwdContent.szlWin.cy, 561 pData->szlWorkarea.cy, 562 5, 563 msg, 564 mp2)) 565 winhScrollWindow(pData->hwndDetails, 783 if (ptlScroll.y = winhHandleScrollMsg(pData->scrw.hwndVScroll, 784 &pData->scrw.ptlScrollOfs.y, 785 pData->dwdContent.szlWin.cy, 786 pData->scrw.szlWorkarea.cy, 787 5, 788 msg, 789 mp2)) 790 { 791 winhScrollWindow(pData->dwdContent.hwnd, 566 792 NULL, 567 793 &ptlScroll); 794 795 ns.lScrollInc = ptlScroll.x; 796 ns.fScroll = CMA_VERTICAL; // @@todo details flags 797 ctlSendWmControl(pData->dwdMain.hwnd, 798 CN_SCROLL, 799 &ns); 800 801 fNotify = TRUE; 802 } 568 803 } 569 804 } 805 806 if (fNotify) 807 SendViewportChanged(pData); 570 808 } 571 809 } … … 576 814 */ 577 815 578 VOID CnrDestroy(HWND hwnd) 579 { 580 PCNRDATA pData; 581 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 816 STATIC VOID CnrDestroy(PCNRDATA pData) 817 { 818 if (pData) 582 819 { 583 820 // free all data that we ever allocated; … … 605 842 */ 606 843 607 USHORT CnrQueryCnrInfo(HWND hwnd, 608 PCNRINFO pci, // in: mp1 of CM_QUERYCNRINFO 609 USHORT cb) // in: mp2 of CM_QUERYCNRINFO 610 { 611 PCNRDATA pData; 612 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 844 STATIC USHORT CnrQueryCnrInfo(PCNRDATA pData, 845 PCNRINFO pci, // out: target buffer (mp1 of CM_QUERYCNRINFO) 846 USHORT cb) // in: mp2 of CM_QUERYCNRINFO 847 { 848 if (pData) 613 849 { 614 850 USHORT cbCopied = max(cb, sizeof(CNRINFO)); … … 629 865 */ 630 866 631 BOOL CnrSetCnrInfo(HWND hwnd, 632 PCNRINFO pci, // in: mp1 of CM_SETCNRINFO 633 ULONG flCI) // in: CMA_* flags in mp2 of CM_SETCNRINFO 634 { 635 PCNRDATA pData; 636 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 867 STATIC BOOL CnrSetCnrInfo(PCNRDATA pData, 868 PCNRINFO pci, // in: mp1 of CM_SETCNRINFO 869 ULONG flCI) // in: CMA_* flags in mp2 of CM_SETCNRINFO 870 { 871 if (pData) 637 872 { 638 873 ULONG flDirty = 0; … … 680 915 if (pData->CnrInfo.flWindowAttr & CV_DETAIL) 681 916 { 682 if (!pData-> hwndDetails)917 if (!pData->dwdContent.hwnd) 683 918 { 684 if (pData-> hwndDetails= CreateChild(pData,685 WC_CCTL_CNR_DETAILS,686 CID_LEFTDVWND))919 if (pData->dwdContent.hwnd = CreateChild(pData, 920 WC_CCTL_CNR_DETAILS, 921 CID_LEFTDVWND)) 687 922 { 688 923 flDirty = DDFL_ALL; … … 692 927 else 693 928 { 694 winhDestroyWindow(&pData-> hwndDetails);929 winhDestroyWindow(&pData->dwdContent.hwnd); 695 930 } 696 931 } … … 782 1017 // flWindowAttr field is not specified, these lines are not drawn. 783 1018 pData->CnrInfo.cxTreeLine = pci->cxTreeLine; 1019 1020 // @@todo recalc window components, repaint 784 1021 } 785 1022 … … 790 1027 // value is negative one (-1). 791 1028 pData->CnrInfo.xVertSplitbar = pci->xVertSplitbar; 1029 1030 // @@todo recalc window components, repaint 792 1031 } 793 1032 794 1033 if (flDirty) 795 1034 // post semaphore to force resize of details wnd 796 WinPostMsg( hwnd,1035 WinPostMsg(pData->dwdMain.hwnd, 797 1036 WM_SEM2, 798 1037 (MPARAM)flDirty, … … 805 1044 } 806 1045 1046 /* 1047 *@@ CnrQueryViewportRect: 1048 * implementation for CM_QUERYVIEWPORTRECT in fnwpCnr. 1049 * 1050 * From my testing, this simply returns the extensions 1051 * of the container content window, which the cnr docs 1052 * dub the "viewport". This never returns the workarea 1053 * size, that is, the total size of the container's 1054 * viewable content. 1055 */ 1056 1057 STATIC BOOL CnrQueryViewportRect(PCNRDATA pData, 1058 PRECTL prcl, 1059 USHORT usIndicator, 1060 BOOL fRightSplitView) // @@todo 1061 { 1062 if (pData && prcl) 1063 { 1064 prcl->xLeft = 0; 1065 prcl->yBottom = 0; 1066 prcl->xRight = pData->dwdContent.szlWin.cx; 1067 prcl->yTop = pData->dwdContent.szlWin.cy; 1068 1069 switch (usIndicator) 1070 { 1071 case CMA_WORKSPACE: 1072 // for CMA_WORKSPACE, the PM cnr returns a 0 yBottom when 1073 // the cnr is scrolled to the very top and negative y 1074 // values when it has been scrolled down to some extent; 1075 // wonder what the use for this would be 1076 prcl->xLeft += pData->scrw.ptlScrollOfs.x; 1077 prcl->xRight += pData->scrw.ptlScrollOfs.x; 1078 prcl->yBottom -= pData->scrw.ptlScrollOfs.y; 1079 prcl->yTop -= pData->scrw.ptlScrollOfs.y; 1080 break; 1081 1082 case CMA_WINDOW: 1083 // for CMA_WINDOW, the PM cnr returns a constant 1084 // rectangle without scrolling taken into account 1085 WinMapWindowPoints(pData->dwdContent.hwnd, 1086 pData->dwdMain.hwnd, 1087 (PPOINTL)prcl, 1088 2); 1089 break; 1090 } 1091 1092 return TRUE; 1093 } 1094 1095 return FALSE; 1096 } 1097 807 1098 /* ****************************************************************** 808 1099 * … … 818 1109 */ 819 1110 820 PFIELDINFO CnrAllocDetailFieldInfo(HWND hwnd,821 USHORT cFieldInfos) // in: no. of fieldinfos to allocate (> 0)1111 STATIC PFIELDINFO CnrAllocDetailFieldInfo(PCNRDATA pData, 1112 USHORT cFieldInfos) // in: no. of fieldinfos to allocate (> 0) 822 1113 { 823 1114 PFIELDINFO pfiFirst = NULL, 824 1115 pfiPrev = NULL; 825 1116 826 PCNRDATA pData; 827 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 1117 if (pData) 828 1118 { 829 1119 ULONG ul; … … 863 1153 */ 864 1154 865 USHORT CnrInsertDetailFieldInfo(HWND hwnd,866 PFIELDINFO pfiFirst,867 PFIELDINFOINSERT pfii)1155 STATIC USHORT CnrInsertDetailFieldInfo(PCNRDATA pData, 1156 PFIELDINFO pfiFirst, 1157 PFIELDINFOINSERT pfii) 868 1158 { 869 1159 USHORT usrc = 0; 870 PCNRDATA pData; 871 if ( (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1))1160 1161 if ( (pData) 872 1162 && (pfiFirst) 873 1163 && (pfii) … … 933 1223 { 934 1224 // post semaphore to force resize of details wnd 935 WinPostMsg( hwnd,1225 WinPostMsg(pData->dwdMain.hwnd, 936 1226 WM_SEM2, 937 1227 (MPARAM)DDFL_ALL, … … 948 1238 */ 949 1239 950 BOOL CnrInvalidateDetailFieldInfo(HWND hwnd) 951 { 952 PCNRDATA pData; 953 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 954 { 955 WinPostMsg(hwnd, 956 WM_SEM2, 957 (MPARAM)DDFL_INVALIDATECOLUMNS, 958 0); 959 } 1240 STATIC BOOL CnrInvalidateDetailFieldInfo(PCNRDATA pData) 1241 { 1242 if (pData) 1243 return WinPostMsg(pData->dwdMain.hwnd, 1244 WM_SEM2, 1245 (MPARAM)DDFL_INVALIDATECOLUMNS, 1246 0); 960 1247 961 1248 return FALSE; 1249 } 1250 1251 /* 1252 *@@ CnrQueryDetailFieldInfo: 1253 * implementation for CM_QUERYDETAILFIELDINFO in fnwpCnr. 1254 */ 1255 1256 STATIC const FIELDINFO* CnrQueryDetailFieldInfo(PCNRDATA pData, 1257 PFIELDINFO pfiIn, 1258 USHORT cmd) // in: mp2 (CMA_FIRST, CMA_LAST, CMA_NEXT, CMA_PREV) 1259 { 1260 const FIELDINFO *pfiReturn = NULL; 1261 1262 if (pData) 1263 { 1264 PLISTNODE pNode; 1265 1266 switch (cmd) 1267 { 1268 case CMA_FIRST: 1269 pNode = lstQueryFirstNode(&pData->llColumns); 1270 break; 1271 1272 case CMA_LAST: 1273 pNode = lstQueryLastNode(&pData->llColumns); 1274 break; 1275 1276 case CMA_NEXT: 1277 case CMA_PREV: 1278 if (FindColumnFromFI(pData, 1279 pfiIn, 1280 &pNode)) 1281 if (cmd == CMA_NEXT) 1282 pNode = pNode->pNext; 1283 else 1284 pNode = pNode->pPrevious; 1285 break; 1286 } 1287 1288 if (pNode) 1289 pfiReturn = ((PDETAILCOLUMN)pNode->pItemData)->pfi; 1290 } 1291 1292 return pfiReturn; 962 1293 } 963 1294 … … 967 1298 */ 968 1299 969 SHORT CnrRemoveDetailFieldInfo(HWND hwnd, 970 PFIELDINFO* ppafi, 971 USHORT cfi, 972 USHORT fl) 973 { 974 PCNRDATA pData; 975 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 1300 STATIC SHORT CnrRemoveDetailFieldInfo(PCNRDATA pData, 1301 PFIELDINFO* ppafi, 1302 USHORT cfi, 1303 USHORT fl) 1304 { 1305 if (pData) 976 1306 { 977 1307 SHORT rc = lstCountItems(&pData->llColumns); … … 1011 1341 ) 1012 1342 { 1013 WinPostMsg( hwnd,1343 WinPostMsg(pData->dwdMain.hwnd, 1014 1344 WM_SEM2, 1015 1345 (MPARAM)DDFL_INVALIDATECOLUMNS, … … 1028 1358 */ 1029 1359 1030 BOOL CnrFreeDetailFieldInfo(HWND hwnd,1031 PFIELDINFO *ppafi, // in: mp1 of CM_FREEDETAILFIELDINFO1032 USHORT cFieldInfos) // in: no. of items in array1360 STATIC BOOL CnrFreeDetailFieldInfo(PCNRDATA pData, 1361 PFIELDINFO *ppafi, // in: mp1 of CM_FREEDETAILFIELDINFO 1362 USHORT cFieldInfos) // in: no. of items in array 1033 1363 { 1034 1364 BOOL brc = FALSE; 1035 1365 1036 PCNRDATA pData; 1037 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1)) 1366 if (pData) 1038 1367 { 1039 1368 ULONG ul; … … 1070 1399 */ 1071 1400 1072 PRECORDCORE CnrAllocRecord(HWND hwnd,1073 ULONG cbExtra,1074 USHORT cRecords)1401 STATIC PRECORDCORE CnrAllocRecord(PCNRDATA pData, 1402 ULONG cbExtra, 1403 USHORT cRecords) 1075 1404 { 1076 1405 PRECORDCORE preccFirst = NULL; 1077 PCNRDATA pData; 1078 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1))1406 1407 if (pData) 1079 1408 { 1080 1409 ULONG ul; … … 1124 1453 */ 1125 1454 1126 ULONG CnrInsertRecord(HWND hwnd,1127 PRECORDCORE preccFirst,1128 PRECORDINSERT pri)1455 STATIC ULONG CnrInsertRecord(PCNRDATA pData, 1456 PRECORDCORE preccFirst, 1457 PRECORDINSERT pri) 1129 1458 { 1130 1459 ULONG cReturn = 0; 1131 PCNRDATA pData; 1132 if ( (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1))1460 1461 if ( (pData) 1133 1462 && (preccFirst) 1134 1463 && (pri) … … 1163 1492 1164 1493 default: 1165 pNodeInsertAfter = FindListNodeForRecc(pData,1166 pri->pRecordOrder);1494 pNodeInsertAfter = ctnrFindListNodeForRecc(pData, 1495 pri->pRecordOrder); 1167 1496 } 1168 1497 … … 1171 1500 ++ul) 1172 1501 { 1173 PRECORDLISTITEM p ListItem;1174 1175 if (p ListItem= NEW(RECORDLISTITEM))1502 PRECORDLISTITEM prli; 1503 1504 if (prli = NEW(RECORDLISTITEM)) 1176 1505 { 1177 ZERO(pListItem); 1178 1179 pListItem->precc = preccThis; 1180 pListItem->preccParent = pri->pRecordParent; 1506 ZERO(prli); 1507 1508 prli->precc = preccThis; 1509 prli->preccParent = pri->pRecordParent; 1510 1511 // make private copy of record attributes 1512 prli->flRecordAttr = preccThis->flRecordAttr; 1513 1514 // PM container gives the first record in the cnr 1515 // "cursored" and "selected" emphasis, so that's 1516 // what we'll do too 1517 if ( (!cReturn) // @@todo filtered records 1518 && (!(prli->flRecordAttr & CRA_FILTERED)) 1519 ) 1520 { 1521 prli->flRecordAttr |= CRA_CURSORED | CRA_SELECTED; 1522 1523 pData->prliCursored = prli; 1524 } 1181 1525 1182 1526 if (pNodeInsertAfter = lstInsertItemAfterNode(pll, 1183 p ListItem,1527 prli, 1184 1528 pNodeInsertAfter)) 1185 1529 { … … 1212 1556 } 1213 1557 1214 free(p ListItem);1558 free(prli); 1215 1559 } 1216 1560 1217 free(p ListItem);1561 free(prli); 1218 1562 1219 1563 cReturn = 0; … … 1225 1569 ) 1226 1570 { 1227 WinPostMsg( hwnd,1571 WinPostMsg(pData->dwdMain.hwnd, 1228 1572 WM_SEM2, 1229 (MPARAM)DDFL_IN CALIDATERECORDS,1573 (MPARAM)DDFL_INVALIDATERECORDS, 1230 1574 0); 1231 1575 } … … 1235 1579 } 1236 1580 1581 /* 1582 *@@ CnrInsertRecordArray: 1583 * implementation for CM_INSERTRECORDARRAY in fnwpCnr. 1584 */ 1585 1586 STATIC ULONG CnrInsertRecordArray(PCNRDATA pData, 1587 PRECORDCORE *papRecords, 1588 PRECORDINSERT pri) 1589 { 1590 ULONG cReturn = 0; 1591 1592 if ( (pData) 1593 && (papRecords) 1594 && (pri) 1595 && (pri->cb = sizeof(RECORDINSERT)) 1596 ) 1597 { 1598 // produce a linked list off the array and call 1599 // the CM_INSERTRECORD implementation 1600 ULONG ul; 1601 for (ul = 0; 1602 ul < (pri->cRecordsInsert - 1); 1603 ++ul) 1604 { 1605 papRecords[ul]->preccNextRecord = papRecords[ul + 1]; 1606 } 1607 1608 papRecords[pri->cRecordsInsert - 1]->preccNextRecord = (PRECORDCORE)NULL; 1609 1610 cReturn = CnrInsertRecord(pData, 1611 papRecords[0], 1612 pri); 1613 } 1614 1615 return cReturn; 1616 } 1617 1618 /* 1619 *@@ CnrSetRecordEmphasis: 1620 * implementation for CM_SETRECORDEMPHASIS in fnwpCnr. 1621 */ 1622 1623 STATIC BOOL CnrSetRecordEmphasis(PCNRDATA pData, 1624 PRECORDCORE precc, 1625 BOOL fTurnOn, 1626 USHORT fsEmphasis) 1627 { 1628 BOOL brc = FALSE; 1629 1630 if (pData) 1631 { 1632 if (precc) 1633 { 1634 PLISTNODE pNode; 1635 if (pNode = ctnrFindListNodeForRecc(pData, 1636 precc)) 1637 { 1638 PRECORDLISTITEM prli = (PRECORDLISTITEM)pNode->pItemData; 1639 1640 ctnrChangeEmphasis(pData, 1641 prli, 1642 fTurnOn, 1643 fsEmphasis); 1644 1645 // update caller's buffer too 1646 precc->flRecordAttr = prli->flRecordAttr; 1647 1648 brc = TRUE; 1649 } 1650 } // if (precc) 1651 // @@todo else set emphasis on entire cnr 1652 } 1653 1654 return brc; 1655 } 1656 1657 /* 1658 *@@ CnrQueryRecordEmphasis: 1659 * implementation for CM_QUERYRECORDEMPHASIS in fnwpCnr. 1660 * 1661 * Note, if several flags are set in fsEmphasis, all 1662 * of them must be set in the record to match. 1663 */ 1664 1665 PRECORDCORE CnrQueryRecordEmphasis(PCNRDATA pData, 1666 PRECORDCORE preccSearchAfter, 1667 USHORT fsEmphasis) 1668 { 1669 if (pData) 1670 { 1671 PLISTNODE pNode = NULL; 1672 if (preccSearchAfter == (PRECORDCORE)CMA_FIRST) 1673 pNode = lstQueryFirstNode(&pData->llRootRecords); 1674 else 1675 if (pNode = ctnrFindListNodeForRecc(pData, preccSearchAfter)) 1676 pNode = pNode->pNext; 1677 else 1678 return (PRECORDCORE)-1; 1679 // @@todo how does this search tree subrecords? 1680 1681 while (pNode) 1682 { 1683 PRECORDLISTITEM prli = (PRECORDLISTITEM)pNode->pItemData; 1684 if ((prli->flRecordAttr & fsEmphasis) == fsEmphasis) 1685 return (PRECORDCORE)prli->precc; 1686 1687 pNode = pNode->pNext; 1688 } 1689 } 1690 1691 return NULL; 1692 } 1693 1694 /* 1695 *@@ CnrInvalidateRecord: 1696 * implementation for CM_INVALIDATERECORD in fnwpCnr. 1697 * 1698 */ 1699 1700 STATIC BOOL CnrInvalidateRecord(PCNRDATA pData, 1701 PRECORDCORE *papRecs, 1702 USHORT cRecs, 1703 USHORT fsInvalidate) 1704 { 1705 BOOL brc = TRUE; 1706 1707 if (pData) 1708 { 1709 if ( (!papRecs) 1710 || (!cRecs) 1711 ) 1712 // invalidate all: 1713 CnrSem2(pData, DDFL_INVALIDATERECORDS); 1714 else 1715 { 1716 ULONG ul; 1717 for (ul = 0; 1718 ul < cRecs; 1719 ++cRecs) 1720 { 1721 PRECORDCORE precc = papRecs[ul]; 1722 PLISTNODE pRecNode; 1723 if (!(pRecNode = ctnrFindListNodeForRecc(pData, 1724 precc))) 1725 { 1726 brc = FALSE; 1727 break; 1728 } 1729 1730 // set special flag for recompute 1731 ((PRECORDLISTITEM)pRecNode->pItemData)->flInvalidate = fsInvalidate; 1732 } 1733 1734 if (brc) 1735 CnrSem2(pData, DDFL_INVALIDATESOME); 1736 // @@todo optimize: post sem only if a column size has 1737 // actually changed 1738 } 1739 } 1740 1741 return brc; 1742 } 1743 1237 1744 /* ****************************************************************** 1238 1745 * … … 1249 1756 { 1250 1757 MRESULT mrc = 0; 1251 PCNRDATA pData; 1758 1759 PCNRDATA pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1); 1252 1760 1253 1761 switch (msg) … … 1264 1772 1265 1773 case WM_SEM2: 1266 CnrSem2( hwnd, (ULONG)mp1);1774 CnrSem2(pData, (ULONG)mp1); 1267 1775 break; 1268 1776 1269 1777 case WM_PAINT: 1270 CnrPaint( hwnd);1778 CnrPaint(pData); 1271 1779 break; 1272 1780 1273 1781 case WM_WINDOWPOSCHANGED: 1274 mrc = CnrWindowPosChanged(hwnd, mp1, mp2); 1782 mrc = CnrWindowPosChanged(pData, mp1, mp2); 1783 break; 1784 1785 case WM_SYSCOLORCHANGE: 1786 ctnrPresParamChanged(hwnd, 0); 1787 break; 1788 1789 case WM_PRESPARAMCHANGED: 1790 ctnrPresParamChanged(hwnd, (ULONG)mp1); 1275 1791 break; 1276 1792 1277 1793 case WM_HSCROLL: 1278 1794 case WM_VSCROLL: 1279 CnrScroll( hwnd, msg, mp1, mp2);1795 CnrScroll(pData, msg, mp1, mp2); 1280 1796 break; 1281 1797 1282 1798 case WM_DESTROY: 1283 CnrDestroy(hwnd); 1799 CnrDestroy(pData); 1800 break; 1801 1802 /* ****************************************************************** 1803 * 1804 * Mouse and keyboard input 1805 * 1806 ********************************************************************/ 1807 1808 /* 1809 * WM_OPEN: 1810 * when the user double-clicks on the _main_ cnr 1811 * (i.e. details titles), we notify the owner 1812 * of a "whitespace" enter event. 1813 */ 1814 1815 case WM_OPEN: 1816 ctnrRecordEnter(pData, 1817 NULL, 1818 FALSE); // mouse, not keyboard 1819 mrc = (MRESULT)TRUE; 1284 1820 break; 1285 1821 … … 1301 1837 */ 1302 1838 1303 case CM_QUERYCNRINFO: 1304 mrc = (MRESULT)CnrQueryCnrInfo( hwnd,1839 case CM_QUERYCNRINFO: // done 1840 mrc = (MRESULT)CnrQueryCnrInfo(pData, 1305 1841 (PCNRINFO)mp1, 1306 (USHORT)mp2);1842 SHORT1FROMMP(mp2)); 1307 1843 break; 1308 1844 … … 1319 1855 */ 1320 1856 1321 case CM_SETCNRINFO: 1322 mrc = (MRESULT)CnrSetCnrInfo( hwnd,1857 case CM_SETCNRINFO: // parlty done 1858 mrc = (MRESULT)CnrSetCnrInfo(pData, 1323 1859 (PCNRINFO)mp1, 1324 1860 (ULONG)mp2); 1325 1861 break; 1326 1862 1863 case CM_PAINTBACKGROUND: // @@todo 1864 break; 1865 1866 case CM_SCROLLWINDOW: // @@todo 1867 break; 1868 1869 /* 1870 * CM_QUERYVIEWPORTRECT: 1871 * 1872 * Parameters: 1873 * 1874 * -- PRECTL mp1 1875 * 1876 * -- SHORT1FROMMP(mp2): -- CMA_WINDOW: return window coordinates 1877 * -- CMA_WORKSPACE: return workspace coordinates 1878 * 1879 * -- BOOL SHORT2FROMMP(mp2): if TRUE, return right split details view 1880 */ 1881 1882 case CM_QUERYVIEWPORTRECT: // done 1883 mrc = (MRESULT)CnrQueryViewportRect(pData, 1884 (PRECTL)mp1, 1885 SHORT1FROMMP(mp2), 1886 SHORT2FROMMP(mp2)); 1887 break; 1888 1889 case CM_SETTEXTVISIBILITY: // @@todo 1890 break; 1891 1327 1892 /* ****************************************************************** 1328 1893 * 1329 * FIELDINFO-related messages 1894 * Record allocation/insertion/removal 1895 * 1896 ********************************************************************/ 1897 1898 /* 1899 * CM_ALLOCRECORD: 1900 * 1901 * Parameters: 1902 * 1903 * -- ULONG mp1: record size in addition to (MINI)RECORDCORE size. 1904 * 1905 * -- USHORT mp2: no. of records to allocate. 1906 * 1907 * Returns linked list of RECORDCORE's or NULL on errors. 1908 */ 1909 1910 case CM_ALLOCRECORD: // done 1911 mrc = (MRESULT)CnrAllocRecord(pData, 1912 (ULONG)mp1, 1913 SHORT1FROMMP(mp2)); 1914 break; 1915 1916 /* 1917 * CM_INSERTRECORD: 1918 * inserts one or more records. If there's more 1919 * than one record, we assume it's a linked list. 1920 * 1921 * Parameters: 1922 * 1923 * -- PRECORDCORE mp1: first record 1924 * 1925 * -- PRECORDINSERT pri 1926 * 1927 * Returns the no. of records in the container or 0 on errors. 1928 */ 1929 1930 case CM_INSERTRECORD: // done 1931 mrc = (MRESULT)CnrInsertRecord(pData, 1932 (PRECORDCORE)mp1, 1933 (PRECORDINSERT)mp2); 1934 break; 1935 1936 /* 1937 * CM_INSERTRECORDARRAY: 1938 * inserts one or more records. As opposed to with 1939 * CM_INSERTRECORD, mp1 points to an array of 1940 * record pointers instead of to a linked list 1941 * of records. 1942 * 1943 * Parameters: 1944 * 1945 * -- PRECORDCORE mp1: first record 1946 * 1947 * -- PRECORDINSERT pri 1948 * 1949 * Returns the no. of records in the container or 0 on errors. 1950 */ 1951 1952 case CM_INSERTRECORDARRAY: // done 1953 mrc = (MRESULT)CnrInsertRecordArray(pData, 1954 (PRECORDCORE*)mp1, 1955 (PRECORDINSERT)mp2); 1956 break; 1957 1958 /* 1959 * CM_QUERYRECORD: 1960 * 1961 * Parameters: 1962 * 1963 * -- PRECORDCORE mp1: preccSearch 1964 * 1965 * -- SHORT1FROMMP(mp1): CMA_FIRST, CMA_LAST, CMA_NEXT, CMA_PREV 1966 * 1967 * or for tree views: CMA_FIRSTCHILD, CMA_LASTCHILD, CMA_PARENT 1968 * 1969 * -- SHORT2FROMMP(mp1): CMA_ITEMORDER or CMA_ZORDER 1970 */ 1971 1972 case CM_QUERYRECORD: // @@todo 1973 break; 1974 1975 /* 1976 * CM_SETRECORDEMPHASIS: 1977 * 1978 * Parameters: 1979 * 1980 * -- PRECORDCORE mp1: record to change emphasis for. 1981 * 1982 * -- SHORT1FROMMP(mp2): TRUE == turn flags on, FALSE == turn flags off. 1983 * 1984 * -- SHORT2FROMMP(mp2): any combination of CRA_CURSORED, CRA_DISABLED, 1985 * CRA_INUSE, CRA_PICKED, CRA_SELECTED, CRA_SOURCE 1986 * 1987 * Returns BOOL. 1988 */ 1989 1990 case CM_SETRECORDEMPHASIS: 1991 mrc = (MRESULT)CnrSetRecordEmphasis(pData, 1992 (PRECORDCORE)mp1, 1993 SHORT1FROMMP(mp2), 1994 SHORT2FROMMP(mp2)); 1995 break; 1996 1997 /* 1998 * CM_QUERYRECORDEMPHASIS: 1999 * 2000 * Parameters: 2001 * 2002 * -- PRECORDCORE mp1: record after which to start search 2003 * or NULL to start search from beginning. 2004 * 2005 * -- USHORT mp2: any combination of CRA_COLLAPSED, CRA_CURSORED, 2006 * CRA_DISABLED, CRA_DROPONABLE, CRA_EXPANDED, CRA_FILTERED, 2007 * CRA_INUSE, CRA_PICKED, CRA_SELECTED, CRA_SOURCE 2008 */ 2009 2010 case CM_QUERYRECORDEMPHASIS: // done 2011 mrc = (MRESULT)CnrQueryRecordEmphasis(pData, 2012 (PRECORDCORE)mp1, 2013 SHORT1FROMMP(mp2)); 2014 break; 2015 2016 case CM_QUERYRECORDFROMRECT: // @@todo 2017 break; 2018 2019 case CM_QUERYRECORDINFO: // @@todo 2020 break; 2021 2022 case CM_QUERYRECORDRECT: // @@todo 2023 break; 2024 2025 /* 2026 * CM_INVALIDATERECORD: 2027 * 2028 * Parameters: 2029 * 2030 * -- PRECORDCORE* mp1: ptr to array of record pointers 2031 * 2032 * -- SHORT1FROMMP(mp2): no. of records in array 2033 * 2034 * -- SHORT2FROMMP(mp2): CMA_ERASE, CMA_REPOSITION, 2035 * CMA_NOREPOSITION, CMA_TEXTCHANGED 2036 * 2037 * Returns BOOL. 2038 */ 2039 2040 case CM_INVALIDATERECORD: // done 2041 mrc = (MRESULT)CnrInvalidateRecord(pData, 2042 (PRECORDCORE*)mp1, 2043 SHORT1FROMMP(mp2), 2044 SHORT2FROMMP(mp2)); 2045 break; 2046 2047 case CM_REMOVERECORD: // @@todo 2048 case CM_FREERECORD: // @@todo 2049 break; 2050 2051 case CM_ERASERECORD: // @@todo 2052 break; 2053 2054 case CM_ARRANGE: // @@todo 2055 break; 2056 2057 case CM_FILTER: // @@todo 2058 break; 2059 2060 case CM_QUERYDRAGIMAGE: // @@todo 2061 2062 case CM_SEARCHSTRING: 2063 2064 case CM_SORTRECORD: // @@todo 2065 2066 /* ****************************************************************** 2067 * 2068 * Details view 1330 2069 * 1331 2070 ********************************************************************/ … … 1343 2082 */ 1344 2083 1345 case CM_ALLOCDETAILFIELDINFO: 1346 mrc = (MRESULT)CnrAllocDetailFieldInfo( hwnd,1347 (USHORT)mp1);2084 case CM_ALLOCDETAILFIELDINFO: // done 2085 mrc = (MRESULT)CnrAllocDetailFieldInfo(pData, 2086 SHORT1FROMMP(mp1)); 1348 2087 break; 1349 2088 … … 1360 2099 */ 1361 2100 1362 case CM_INSERTDETAILFIELDINFO: 1363 mrc = (MRESULT)CnrInsertDetailFieldInfo( hwnd,2101 case CM_INSERTDETAILFIELDINFO: // done 2102 mrc = (MRESULT)CnrInsertDetailFieldInfo(pData, 1364 2103 (PFIELDINFO)mp1, 1365 2104 (PFIELDINFOINSERT)mp2); … … 1373 2112 */ 1374 2113 1375 case CM_INVALIDATEDETAILFIELDINFO: 1376 mrc = (MRESULT)CnrInvalidateDetailFieldInfo(hwnd); 2114 case CM_INVALIDATEDETAILFIELDINFO: // done 2115 mrc = (MRESULT)CnrInvalidateDetailFieldInfo(pData); 2116 break; 2117 2118 /* 2119 * CM_QUERYDETAILFIELDINFO: 2120 * 2121 * Parameters: 2122 * 2123 * -- PFIELDINFO mp1 2124 * 2125 * -- USHORT mp2: CMA_FIRST, CMA_LAST, CMA_NEXT, CMA_PREV 2126 */ 2127 2128 case CM_QUERYDETAILFIELDINFO: // done 2129 mrc = (MRESULT)CnrQueryDetailFieldInfo(pData, 2130 (PFIELDINFO)mp1, 2131 SHORT1FROMMP(mp2)); 1377 2132 break; 1378 2133 … … 1391 2146 */ 1392 2147 1393 case CM_REMOVEDETAILFIELDINFO: 1394 mrc = (MRESULT)CnrRemoveDetailFieldInfo( hwnd,2148 case CM_REMOVEDETAILFIELDINFO: // done 2149 mrc = (MRESULT)CnrRemoveDetailFieldInfo(pData, 1395 2150 (PFIELDINFO*)mp1, 1396 2151 SHORT1FROMMP(mp2), … … 1409 2164 */ 1410 2165 1411 case CM_FREEDETAILFIELDINFO: 1412 mrc = (MRESULT)CnrFreeDetailFieldInfo( hwnd,2166 case CM_FREEDETAILFIELDINFO: // done 2167 mrc = (MRESULT)CnrFreeDetailFieldInfo(pData, 1413 2168 (PFIELDINFO*)mp1, 1414 (USHORT)mp2); 2169 SHORT1FROMMP(mp2)); 2170 break; 2171 2172 case CM_HORZSCROLLSPLITWINDOW: 1415 2173 break; 1416 2174 1417 2175 /* ****************************************************************** 1418 2176 * 1419 * Record allocation/insertion/removal2177 * Icon view 1420 2178 * 1421 2179 ********************************************************************/ 1422 2180 1423 /* 1424 * CM_ALLOCRECORD: 1425 * 1426 * Parameters: 1427 * 1428 * -- ULONG mp1: record size in addition to (MINI)RECORDCORE size. 1429 * 1430 * -- USHORT mp2: no. of records to allocate. 1431 * 1432 * Returns linked list of RECORDCORE's or NULL on errors. 1433 */ 1434 1435 case CM_ALLOCRECORD: 1436 mrc = (MRESULT)CnrAllocRecord(hwnd, 1437 (ULONG)mp1, 1438 (USHORT)mp2); 1439 break; 1440 1441 /* 1442 * CM_INSERTRECORD: 1443 * 1444 * Parameters: 1445 * 1446 * -- PRECORDCORE mp1: first record 1447 * 1448 * -- PRECORDINSERT pri 1449 * 1450 * Returns the no. of records in the container or 0 on errors. 1451 */ 1452 1453 case CM_INSERTRECORD: 1454 mrc = (MRESULT)CnrInsertRecord(hwnd, 1455 (PRECORDCORE)mp1, 1456 (PRECORDINSERT)mp2); 1457 break; 2181 case CM_SETGRIDINFO: // @@todo 2182 case CM_QUERYGRIDINFO: // @@todo 2183 case CM_SNAPTOGRID: // @@todo 2184 break; 2185 2186 /* ****************************************************************** 2187 * 2188 * Tree management 2189 * 2190 ********************************************************************/ 2191 2192 case CM_COLLAPSETREE: // @@todo 2193 case CM_EXPANDTREE: 2194 case CM_MOVETREE: // @@todo 2195 break; 2196 2197 /* ****************************************************************** 2198 * 2199 * Direct editing 2200 * 2201 ********************************************************************/ 2202 2203 case CM_OPENEDIT: // @@todo 2204 2205 case CM_CLOSEEDIT: // @@todo 2206 break; 2207 1458 2208 1459 2209 default: 1460 if (pData = (PCNRDATA)WinQueryWindowPtr(hwnd, QWL_USER + 1))2210 if (pData) 1461 2211 mrc = ctlDefWindowProc(&pData->dwdMain, msg, mp1, mp2); 1462 2212 break;
Note:
See TracChangeset
for help on using the changeset viewer.