| 1 | /* | 
|---|
| 2 | * | 
|---|
| 3 | * Main Source file for class CWProgFolder | 
|---|
| 4 | * | 
|---|
| 5 | *             (C) Chris Wohlgenuth 1999-2004 | 
|---|
| 6 | * | 
|---|
| 7 | * This class is intended for programmers and provides functions for some | 
|---|
| 8 | * common tasks like: | 
|---|
| 9 | *                     - Adding dialogs as frame controls to WPS folders | 
|---|
| 10 | *                     - Showing 'About'-dialogs | 
|---|
| 11 | *                     - Checking of object pointers | 
|---|
| 12 | *                     - ... | 
|---|
| 13 | * | 
|---|
| 14 | * Use IBM VAC++ V3.08 and Gnu-make 3.74.1 to compile | 
|---|
| 15 | * | 
|---|
| 16 | */ | 
|---|
| 17 |  | 
|---|
| 18 | /* | 
|---|
| 19 | * This program is free software; you can redistribute it and/or modify | 
|---|
| 20 | * it under the terms of the GNU General Public License as published by | 
|---|
| 21 | * the Free Software Foundation; either version 2, or (at your option) | 
|---|
| 22 | * any later version. | 
|---|
| 23 | * | 
|---|
| 24 | * This program is distributed in the hope that it will be useful, | 
|---|
| 25 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 27 | * GNU General Public License for more details. | 
|---|
| 28 | * | 
|---|
| 29 | * You should have received a copy of the GNU General Public License | 
|---|
| 30 | * along with this program; see the file COPYING.  If not, write to | 
|---|
| 31 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 
|---|
| 32 | */ | 
|---|
| 33 | #define INCL_DOSQUEUES | 
|---|
| 34 | #define  INCL_PM | 
|---|
| 35 | #include "progfolder.h" | 
|---|
| 36 | #include "progfolder.hh" | 
|---|
| 37 | #include "menufolder.hh" | 
|---|
| 38 | #include <stdlib.h> | 
|---|
| 39 | #include <stdio.h> | 
|---|
| 40 |  | 
|---|
| 41 |  | 
|---|
| 42 | #define DEFAULT_DIALOG_FONT   "9.WarpSans" | 
|---|
| 43 |  | 
|---|
| 44 | typedef ULONG   SOMLINK somTP_CWMenuFolder_mfInsertMenuItems(CWMenuFolder *somSelf, | 
|---|
| 45 | HWND hwndMenu, | 
|---|
| 46 | ULONG iPosition, | 
|---|
| 47 | ULONG ulLastMenuId); | 
|---|
| 48 | typedef somTP_CWMenuFolder_mfInsertMenuItems *somTD_CWMenuFolder_mfInsertMenuItems; | 
|---|
| 49 |  | 
|---|
| 50 | typedef BOOL   SOMLINK somTP_CWMenuFolder_mfCheckMenuItems(CWMenuFolder *somSelf, | 
|---|
| 51 | WPObject* wpObject, | 
|---|
| 52 | ULONG ulMenuId); | 
|---|
| 53 | typedef somTP_CWMenuFolder_mfCheckMenuItems *somTD_CWMenuFolder_mfCheckMenuItems; | 
|---|
| 54 |  | 
|---|
| 55 | MRESULT EXPENTRY folderFrameProcedure(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2); | 
|---|
| 56 | HWND createStoreWindow(HWND hwndCLF); | 
|---|
| 57 | HWND createLeechFrame(HWND hwndCLF); | 
|---|
| 58 | BOOL cwRegisterSeparatorWindowClass(void); | 
|---|
| 59 |  | 
|---|
| 60 | HPOINTER hptrHand=NULLHANDLE; | 
|---|
| 61 |  | 
|---|
| 62 | /**************************************************** | 
|---|
| 63 | *                                                  * | 
|---|
| 64 | * This function returns the running OS version:    * | 
|---|
| 65 | *                                                  * | 
|---|
| 66 | * 30: Warp 3, 40 Warp 4 etc.                       * | 
|---|
| 67 | *                                                  * | 
|---|
| 68 | ****************************************************/ | 
|---|
| 69 | static ULONG cwQueryOSRelease() | 
|---|
| 70 | { | 
|---|
| 71 | static ULONG ulVersionMinor=0; | 
|---|
| 72 |  | 
|---|
| 73 | if(!ulVersionMinor) | 
|---|
| 74 | if(DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &ulVersionMinor, sizeof(ulVersionMinor))) | 
|---|
| 75 | ulVersionMinor=30;/* Default Warp 3 */ | 
|---|
| 76 |  | 
|---|
| 77 | return ulVersionMinor; | 
|---|
| 78 |  | 
|---|
| 79 | } | 
|---|
| 80 |  | 
|---|
| 81 | /**************************************************************/ | 
|---|
| 82 | /*                                                            */ | 
|---|
| 83 | /* This function returns the module handle of our class-dll   */ | 
|---|
| 84 | /*                                                            */ | 
|---|
| 85 | /**************************************************************/ | 
|---|
| 86 | HMODULE queryModuleHandle(void) | 
|---|
| 87 | { | 
|---|
| 88 | static HMODULE hmod=0; | 
|---|
| 89 |  | 
|---|
| 90 | if(!hmod) { | 
|---|
| 91 | PSZ pathname=SOMClassMgrObject  //Query Pathname of class file | 
|---|
| 92 | ->somLocateClassFile(somIdFromString("CWProgFolder"),1,2); | 
|---|
| 93 | DosQueryModuleHandle(pathname,&hmod);  //Query module handle | 
|---|
| 94 | } | 
|---|
| 95 | return hmod; | 
|---|
| 96 | } | 
|---|
| 97 |  | 
|---|
| 98 | /**************************************************** | 
|---|
| 99 | *                                                  * | 
|---|
| 100 | * This funktion inserts a separator into menu      * | 
|---|
| 101 | * <hwndMenu> and submenu <hwndSubMenu> at          * | 
|---|
| 102 | * position <iPosition>                             * | 
|---|
| 103 | *                                                  * | 
|---|
| 104 | ****************************************************/ | 
|---|
| 105 | MRESULT cwInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu) | 
|---|
| 106 | { | 
|---|
| 107 | MENUITEM mi; | 
|---|
| 108 |  | 
|---|
| 109 | /* Fill the MENUITEM structure */ | 
|---|
| 110 | mi.iPosition=iPosition; | 
|---|
| 111 | mi.afStyle=MIS_SEPARATOR; | 
|---|
| 112 | if(hwndSubMenu) | 
|---|
| 113 | mi.afStyle|=MIS_SUBMENU; | 
|---|
| 114 | mi.id=0; | 
|---|
| 115 | mi.afAttribute=NULL; | 
|---|
| 116 | mi.hwndSubMenu=hwndSubMenu; | 
|---|
| 117 | mi.hItem=NULL; | 
|---|
| 118 |  | 
|---|
| 119 | return WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi, | 
|---|
| 120 | (MPARAM)NULL); | 
|---|
| 121 | } | 
|---|
| 122 |  | 
|---|
| 123 | /**************************************************************/ | 
|---|
| 124 | /*                                                            */ | 
|---|
| 125 | /* Overriden function: wpclsQueryStyle()                      */ | 
|---|
| 126 | /*                                                            */ | 
|---|
| 127 | /* This class doesn't need a template.                        */ | 
|---|
| 128 | /*                                                            */ | 
|---|
| 129 | /**************************************************************/ | 
|---|
| 130 | ULONG M_CWProgFolder::wpclsQueryStyle() | 
|---|
| 131 | { | 
|---|
| 132 | somId mySomId; | 
|---|
| 133 | ULONG rc; | 
|---|
| 134 |  | 
|---|
| 135 | if((mySomId=somIdFromString("wpclsQueryStyle"))!=NULLHANDLE) { | 
|---|
| 136 | rc=((somTD_M_WPObject_wpclsQueryStyle) | 
|---|
| 137 | somParentNumResolve(__ClassObject->somGetPClsMtabs(), | 
|---|
| 138 | 1, | 
|---|
| 139 | __ClassObject-> | 
|---|
| 140 | somGetMethodToken(mySomId)) | 
|---|
| 141 | )(this)/*|CLSSTYLE_DONTTEMPLATE*/|CLSSTYLE_NEVERTEMPLATE; | 
|---|
| 142 | SOMFree(mySomId); | 
|---|
| 143 | } | 
|---|
| 144 | else | 
|---|
| 145 | rc=M_WPFolder::wpclsQueryStyle()/*|CLSSTYLE_DONTTEMPLATE*/|CLSSTYLE_NEVERTEMPLATE; | 
|---|
| 146 |  | 
|---|
| 147 | return rc; | 
|---|
| 148 |  | 
|---|
| 149 | #if 0 | 
|---|
| 150 | return ((somTD_M_WPObject_wpclsQueryStyle) | 
|---|
| 151 | somParentNumResolve(__ClassObject->somGetPClsMtabs(), | 
|---|
| 152 | 1, | 
|---|
| 153 | __ClassObject-> | 
|---|
| 154 | somGetMethodToken(somIdFromString | 
|---|
| 155 | ("wpclsQueryStyle"))) | 
|---|
| 156 | )(this)|CLSSTYLE_DONTTEMPLATE/*|CLSSTYLE_NEVERTEMPLATE*/; | 
|---|
| 157 | #endif | 
|---|
| 158 |  | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | /**************************************************************/ | 
|---|
| 162 | /*                                                            */ | 
|---|
| 163 | /* Overriden function: wpclsQueryTitle()                      */ | 
|---|
| 164 | /*                                                            */ | 
|---|
| 165 | /* Returns our class name                                     */ | 
|---|
| 166 | /*                                                            */ | 
|---|
| 167 | /**************************************************************/ | 
|---|
| 168 | PSZ M_CWProgFolder::wpclsQueryTitle() | 
|---|
| 169 | { | 
|---|
| 170 | return "Support-Folder"; | 
|---|
| 171 | } | 
|---|
| 172 |  | 
|---|
| 173 |  | 
|---|
| 174 | void M_CWProgFolder::wpclsInitData() | 
|---|
| 175 | { | 
|---|
| 176 | somId mySomId; | 
|---|
| 177 |  | 
|---|
| 178 | /* call parent */ | 
|---|
| 179 | if((mySomId=somIdFromString("wpclsInitData"))!=NULLHANDLE) { | 
|---|
| 180 | ((somTD_M_WPObject_wpclsInitData) | 
|---|
| 181 | somParentNumResolve(__ClassObject->somGetPClsMtabs(), | 
|---|
| 182 | 1, | 
|---|
| 183 | __ClassObject-> | 
|---|
| 184 | somGetMethodToken(mySomId)) | 
|---|
| 185 | )(this); | 
|---|
| 186 | SOMFree(mySomId); | 
|---|
| 187 | } | 
|---|
| 188 | else | 
|---|
| 189 | M_WPFolder::wpclsInitData(); | 
|---|
| 190 |  | 
|---|
| 191 | /* Register the separator window class */ | 
|---|
| 192 | cwRegisterSeparatorWindowClass(); | 
|---|
| 193 | } | 
|---|
| 194 |  | 
|---|
| 195 | /* This Funktion is called when the close button of the */ | 
|---|
| 196 | /* frame is pressed or if the user chooses 'close' from */ | 
|---|
| 197 | /* the menu. Apparently the wpClose() method isn't      */ | 
|---|
| 198 | /* called when choosing close.                          */ | 
|---|
| 199 | BOOL CWProgFolder::cwClose(HWND hwndFrame) | 
|---|
| 200 | { | 
|---|
| 201 | return TRUE; | 
|---|
| 202 | } | 
|---|
| 203 |  | 
|---|
| 204 | /**************************************************************/ | 
|---|
| 205 | /*                                                            */ | 
|---|
| 206 | /* Overriden function: wpOpen()                               */ | 
|---|
| 207 | /*                                                            */ | 
|---|
| 208 | /* This function subclasses the folder frame window and       */ | 
|---|
| 209 | /* prepares it for the addition of frame controls.            */ | 
|---|
| 210 | /*                                                            */ | 
|---|
| 211 | /**************************************************************/ | 
|---|
| 212 | HWND CWProgFolder::wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam) | 
|---|
| 213 | { | 
|---|
| 214 | HWND hwnd; | 
|---|
| 215 | HWND hwndStore; | 
|---|
| 216 | PFNWP orgFrameProc; | 
|---|
| 217 | char * memPtr; | 
|---|
| 218 | somId mySomId; | 
|---|
| 219 |  | 
|---|
| 220 | if((mySomId=somIdFromString("wpOpen"))!=NULLHANDLE) { | 
|---|
| 221 | hwnd=((somTD_WPObject_wpOpen) | 
|---|
| 222 | somParentNumResolve(__ClassObject->somGetPClsMtabs(), | 
|---|
| 223 | 1, | 
|---|
| 224 | __ClassObject-> | 
|---|
| 225 | somGetMethodToken(mySomId)) | 
|---|
| 226 | )(this,hwndCnr, ulView, ulParam); | 
|---|
| 227 | SOMFree(mySomId); | 
|---|
| 228 | } | 
|---|
| 229 | else | 
|---|
| 230 | hwnd=WPFolder::wpOpen(hwndCnr, ulView, ulParam); | 
|---|
| 231 |  | 
|---|
| 232 | #if 0 | 
|---|
| 233 | //  hwnd=WPFolder::wpOpen(hwndCnr, ulView, ulParam);/* Call parent to build folder window */ | 
|---|
| 234 | hwnd=((somTD_WPObject_wpOpen) | 
|---|
| 235 | somParentNumResolve(__ClassObject->somGetPClsMtabs(), | 
|---|
| 236 | 1, | 
|---|
| 237 | __ClassObject-> | 
|---|
| 238 | somGetMethodToken(somIdFromString | 
|---|
| 239 | ("wpOpen"))) | 
|---|
| 240 | )(this,hwndCnr, ulView, ulParam); | 
|---|
| 241 | #endif | 
|---|
| 242 |  | 
|---|
| 243 | if(ulView==OPEN_SETTINGS) | 
|---|
| 244 | /* We only build frame controls for folder frame windows */ | 
|---|
| 245 | return hwnd; | 
|---|
| 246 | if(WinWindowFromID(hwnd,ID_FOLDERSTOREWINDOW)) | 
|---|
| 247 | return hwnd;/* Already subclassed */ | 
|---|
| 248 |  | 
|---|
| 249 | hwndStore=createStoreWindow(hwnd);/* This holds our object pointer */ | 
|---|
| 250 | if(hwndStore){ | 
|---|
| 251 | /* Save 'this' ptr. */ | 
|---|
| 252 | WinSetWindowPtr(hwndStore,0,this); | 
|---|
| 253 | /* Subclass the folder frame window */ | 
|---|
| 254 | orgFrameProc=WinSubclassWindow(hwnd,&folderFrameProcedure); | 
|---|
| 255 | /* Save the old window procedure in our store window */ | 
|---|
| 256 | WinSetWindowPtr(hwndStore,QWP_ORGFRAMEPROC,orgFrameProc); | 
|---|
| 257 | /* Save a ptr. to private control data */ | 
|---|
| 258 | memPtr=(char*)malloc(sizeof(FRAMECTRLDATA)); | 
|---|
| 259 | if(memPtr) | 
|---|
| 260 | memset(memPtr,0,sizeof(FRAMECTRLDATA)); | 
|---|
| 261 | WinSetWindowPtr(hwndStore,QWP_FCTRLDATA,memPtr); | 
|---|
| 262 | } | 
|---|
| 263 |  | 
|---|
| 264 | return hwnd; | 
|---|
| 265 | } | 
|---|
| 266 |  | 
|---|
| 267 | /**************************************************************/ | 
|---|
| 268 | /*                                                            */ | 
|---|
| 269 | /* This member function returns the count of additional frame */ | 
|---|
| 270 | /* controls we have added to the frame. This fuction is       */ | 
|---|
| 271 | /* called from the frame window procedure                     */ | 
|---|
| 272 | /*                                                            */ | 
|---|
| 273 | /**************************************************************/ | 
|---|
| 274 | ULONG CWProgFolder::cwNumAdditionalFrameControls(HWND hwndFolder) | 
|---|
| 275 | { | 
|---|
| 276 | ULONG rc; | 
|---|
| 277 | FRAMECTRLDATA * fctrlData; | 
|---|
| 278 |  | 
|---|
| 279 | fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA); | 
|---|
| 280 | if(!fctrlData) return 0; | 
|---|
| 281 |  | 
|---|
| 282 | rc=0; | 
|---|
| 283 |  | 
|---|
| 284 | if(fctrlData->bLeft)rc++; | 
|---|
| 285 | if(fctrlData->bRight)rc++; | 
|---|
| 286 | if(fctrlData->bTop)rc++; | 
|---|
| 287 | if(fctrlData->bBottom)rc++; | 
|---|
| 288 |  | 
|---|
| 289 | return rc; | 
|---|
| 290 | } | 
|---|
| 291 |  | 
|---|
| 292 | /**************************************************************/ | 
|---|
| 293 | /*                                                            */ | 
|---|
| 294 | /* This function adjusts the size and position of the client. */ | 
|---|
| 295 | /* It is called from the frame window procedure               */ | 
|---|
| 296 | /*                                                            */ | 
|---|
| 297 | /**************************************************************/ | 
|---|
| 298 | BOOL CWProgFolder::cwCalculateClient(HWND hwndFolder, PRECTL pRectl, BOOL which) | 
|---|
| 299 | { | 
|---|
| 300 | FRAMECTRLDATA * fctrlData; | 
|---|
| 301 |  | 
|---|
| 302 | //  which: | 
|---|
| 303 | //     TRUE:  Frame rectangle provided, calculate client | 
|---|
| 304 | //     FALSE: Client area rectangle provided, calculate frame | 
|---|
| 305 |  | 
|---|
| 306 | /* Get our control data */ | 
|---|
| 307 | fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA); | 
|---|
| 308 | if(!fctrlData) return FALSE; | 
|---|
| 309 |  | 
|---|
| 310 |  | 
|---|
| 311 | if (SHORT1FROMMP(which)) | 
|---|
| 312 | //     TRUE:  Frame rectangle provided, calculate client | 
|---|
| 313 | //     FALSE: Client area rectangle provided, calculate frame | 
|---|
| 314 | { | 
|---|
| 315 | //  TRUE: calculate the rectl of the client; | 
|---|
| 316 | //  call default window procedure to subtract child frame | 
|---|
| 317 | //  controls from the rectangle's height | 
|---|
| 318 | LONG lClientHeight; | 
|---|
| 319 | LONG lNewControls; | 
|---|
| 320 |  | 
|---|
| 321 | lNewControls=0; | 
|---|
| 322 | if(fctrlData->bTop) | 
|---|
| 323 | lNewControls=fctrlData->sizelTopFrame.cy; | 
|---|
| 324 | if(fctrlData->bBottom) | 
|---|
| 325 | lNewControls+=fctrlData->sizelBottomFrame.cy; | 
|---|
| 326 |  | 
|---|
| 327 | lClientHeight = pRectl->yTop - pRectl->yBottom; | 
|---|
| 328 | if ( lNewControls  > lClientHeight  ) | 
|---|
| 329 | { | 
|---|
| 330 | if(fctrlData->bBottom || fctrlData->bTop) | 
|---|
| 331 | // extension is taller than client, so set client height to 0 | 
|---|
| 332 | pRectl->yTop = pRectl->yBottom; | 
|---|
| 333 | } | 
|---|
| 334 | else | 
|---|
| 335 | { | 
|---|
| 336 | //  set the origin of the client and shrink it based upon the | 
|---|
| 337 | //  frame control's height | 
|---|
| 338 | if(fctrlData->bBottom) { | 
|---|
| 339 | pRectl->yBottom +=fctrlData->sizelBottomFrame.cy; | 
|---|
| 340 | //pRectl->yTop -= fctrlData->sizelBottomFrame.cy; | 
|---|
| 341 | } | 
|---|
| 342 | if(fctrlData->bTop) { | 
|---|
| 343 | pRectl->yTop -=fctrlData->sizelTopFrame.cy; | 
|---|
| 344 | //pRectl->yBottom +=fctrlData->sizelTopFrame.cy; | 
|---|
| 345 | } | 
|---|
| 346 | } | 
|---|
| 347 |  | 
|---|
| 348 | lNewControls=0; | 
|---|
| 349 | if(fctrlData->bLeft) | 
|---|
| 350 | lNewControls=fctrlData->sizelLeftFrame.cx; | 
|---|
| 351 | if(fctrlData->bRight) | 
|---|
| 352 | lNewControls+=fctrlData->sizelRightFrame.cx; | 
|---|
| 353 |  | 
|---|
| 354 | lClientHeight = pRectl->xRight - pRectl->xLeft; | 
|---|
| 355 | if ( lNewControls  > lClientHeight  ) | 
|---|
| 356 | { | 
|---|
| 357 | if(fctrlData->bRight || fctrlData->bLeft) | 
|---|
| 358 | // extension is taller than client, so set client height to 0 | 
|---|
| 359 | pRectl->xRight = pRectl->xLeft; | 
|---|
| 360 | } | 
|---|
| 361 | else | 
|---|
| 362 | { | 
|---|
| 363 | if(fctrlData->bLeft) | 
|---|
| 364 | pRectl->xLeft+=fctrlData->sizelLeftFrame.cx; | 
|---|
| 365 | if(fctrlData->bRight) | 
|---|
| 366 | pRectl->xRight-=fctrlData->sizelRightFrame.cx; | 
|---|
| 367 | } | 
|---|
| 368 | } | 
|---|
| 369 | else | 
|---|
| 370 | { | 
|---|
| 371 | //  FALSE: calculate the rectl of the frame; | 
|---|
| 372 | //  call default window procedure to subtract child frame | 
|---|
| 373 | //  controls from the rectangle's height; | 
|---|
| 374 | //  set the origin of the frame and increase it based upon the | 
|---|
| 375 | //  static text control's height | 
|---|
| 376 |  | 
|---|
| 377 | return TRUE; | 
|---|
| 378 |  | 
|---|
| 379 | if(fctrlData->bBottom) { | 
|---|
| 380 | pRectl->yBottom +=fctrlData->sizelBottomFrame.cy; | 
|---|
| 381 | // pRectl->yTop -= fctrlData->sizelBottomFrame.cy; | 
|---|
| 382 | } | 
|---|
| 383 | if(fctrlData->bTop) | 
|---|
| 384 | pRectl->yTop -=fctrlData->sizelTopFrame.cy; | 
|---|
| 385 |  | 
|---|
| 386 | if(fctrlData->bLeft) { | 
|---|
| 387 | pRectl->xLeft +=fctrlData->sizelLeftFrame.cx; | 
|---|
| 388 | //    pRectl->yRight -= fctrlData->sizelLeftFrame.cx; | 
|---|
| 389 | } | 
|---|
| 390 | if(fctrlData->bRight) | 
|---|
| 391 | pRectl->xRight -=fctrlData->sizelRightFrame.cx; | 
|---|
| 392 |  | 
|---|
| 393 | } | 
|---|
| 394 |  | 
|---|
| 395 |  | 
|---|
| 396 | return TRUE;/* Everything's ok */ | 
|---|
| 397 | } | 
|---|
| 398 |  | 
|---|
| 399 |  | 
|---|
| 400 |  | 
|---|
| 401 | /**************************************************************/ | 
|---|
| 402 | /*                                                            */ | 
|---|
| 403 |  | 
|---|
| 404 | /*                                                            */ | 
|---|
| 405 | /**************************************************************/ | 
|---|
| 406 | ULONG CWProgFolder::cwFormatFrame(HWND hwndFolder, USHORT countSWP,PSWP pswp) | 
|---|
| 407 | { | 
|---|
| 408 | /* countSWP:  number of standard framecontrols | 
|---|
| 409 | pswp:      Array of SWP describing the framecontrols. | 
|---|
| 410 | Since we added the number of our controls to the | 
|---|
| 411 | standard controls in the framecontrol there is | 
|---|
| 412 | space for the new controls. | 
|---|
| 413 | */ | 
|---|
| 414 | ULONG rc; | 
|---|
| 415 | PSWP pswpClient=0, pswpFrameCtl=0; | 
|---|
| 416 | int iCount; | 
|---|
| 417 | FRAMECTRLDATA * fctrlData; | 
|---|
| 418 | int a; | 
|---|
| 419 | CNRINFO     CnrInfo; | 
|---|
| 420 | HWND hwndClient; | 
|---|
| 421 |  | 
|---|
| 422 | /* The data of our framecontrols is stored in a structure. | 
|---|
| 423 | Get a pointer from the window words of the invisible child. */ | 
|---|
| 424 | fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA); | 
|---|
| 425 | if(!fctrlData) return 0; | 
|---|
| 426 |  | 
|---|
| 427 | iCount=0; | 
|---|
| 428 | rc=0; | 
|---|
| 429 |  | 
|---|
| 430 | for (a = 0; a < countSWP; a++) | 
|---|
| 431 | { | 
|---|
| 432 | /* Find the client window */ | 
|---|
| 433 | if ( WinQueryWindowUShort( pswp[a].hwnd, QWS_ID ) == 0x8008 ) // FID_CLIENT ) | 
|---|
| 434 | { | 
|---|
| 435 | pswpClient=&pswp[a]; | 
|---|
| 436 |  | 
|---|
| 437 | /* Framecontrol at the top */ | 
|---|
| 438 | if(fctrlData->bTop){ | 
|---|
| 439 | pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */ | 
|---|
| 440 |  | 
|---|
| 441 | /* Adjust client and insert the new control into the array of SWPs */ | 
|---|
| 442 |  | 
|---|
| 443 | /* Decrease the height of the client to have place for the new control */ | 
|---|
| 444 | pswp[a].cy -= fctrlData->sizelTopFrame.cy; | 
|---|
| 445 |  | 
|---|
| 446 | /* Insert the HWND of the new control into the structure */ | 
|---|
| 447 | pswpFrameCtl->hwnd=fctrlData->hwndCtlTop; | 
|---|
| 448 | /* The x-position is the same as that of the client */ | 
|---|
| 449 | pswpFrameCtl->x  = pswpClient->x; | 
|---|
| 450 | /* The control is placed above the client */ | 
|---|
| 451 | pswpFrameCtl->y  = pswpClient->y + pswpClient->cy; | 
|---|
| 452 | /* The control is as wide as the client */ | 
|---|
| 453 | pswpFrameCtl->cx = pswpClient->cx; | 
|---|
| 454 | /* Insert the height of the control */ | 
|---|
| 455 | pswpFrameCtl->cy = fctrlData->sizelTopFrame.cy; | 
|---|
| 456 | /* Place the control on top of all windows */ | 
|---|
| 457 | pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM; | 
|---|
| 458 | /* Insert necessary flags */ | 
|---|
| 459 | pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW; | 
|---|
| 460 |  | 
|---|
| 461 | /* Adjust position if flags are set. It's possible to place | 
|---|
| 462 | the control above the controls on the left and right or let these controls | 
|---|
| 463 | cover the full height of the folder. */ | 
|---|
| 464 | if(fctrlData->bLeft){ | 
|---|
| 465 | /* There is a frame control on the left side */ | 
|---|
| 466 | if(!(fctrlData->ulFlagsLeft & FCTL_POSBELOW)) { | 
|---|
| 467 | pswpFrameCtl->x  += fctrlData->sizelLeftFrame.cx; | 
|---|
| 468 | pswpFrameCtl->cx -= fctrlData->sizelLeftFrame.cx; | 
|---|
| 469 | } | 
|---|
| 470 | } | 
|---|
| 471 | /* framecontrol on the right side */ | 
|---|
| 472 | if(!(fctrlData->ulFlagsRight & FCTL_POSBELOW) && fctrlData->bRight) | 
|---|
| 473 | pswpFrameCtl->cx -= fctrlData->sizelRightFrame.cx; | 
|---|
| 474 |  | 
|---|
| 475 | if(!fctrlData->bCnrAdjusted) { | 
|---|
| 476 | hwndClient=pswpClient->hwnd; | 
|---|
| 477 | if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){ | 
|---|
| 478 | if(fctrlData->bBottom) | 
|---|
| 479 | CnrInfo.ptlOrigin.y-=fctrlData->sizelBottomFrame.cy; | 
|---|
| 480 | if(fctrlData->bTop) | 
|---|
| 481 | CnrInfo.ptlOrigin.y-=fctrlData->sizelTopFrame.cy; | 
|---|
| 482 | //CnrInfo.ptlOrigin.y+=0; | 
|---|
| 483 | WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN)); | 
|---|
| 484 | } | 
|---|
| 485 | fctrlData->bCnrAdjusted=TRUE; | 
|---|
| 486 | } | 
|---|
| 487 | /* One new control added */ | 
|---|
| 488 | rc++; | 
|---|
| 489 | }/* end of if(fctrlData->bTop) */ | 
|---|
| 490 |  | 
|---|
| 491 |  | 
|---|
| 492 | /* Left frame control */ | 
|---|
| 493 | if(fctrlData->bLeft){ | 
|---|
| 494 | pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */ | 
|---|
| 495 |  | 
|---|
| 496 | pswpClient->cx -= fctrlData->sizelLeftFrame.cx;/* Size client */ | 
|---|
| 497 | pswpFrameCtl->hwnd=fctrlData->hwndCtlLeft; | 
|---|
| 498 |  | 
|---|
| 499 | pswpFrameCtl->x  =pswpClient->x; | 
|---|
| 500 | pswpClient->x  += fctrlData->sizelLeftFrame.cx;/* Size client */ | 
|---|
| 501 | pswpFrameCtl->y  =pswpClient->y; | 
|---|
| 502 |  | 
|---|
| 503 | pswpFrameCtl->cx = fctrlData->sizelLeftFrame.cx; | 
|---|
| 504 | pswpFrameCtl->cy =pswpClient->cy; | 
|---|
| 505 |  | 
|---|
| 506 | pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM; | 
|---|
| 507 | pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW; | 
|---|
| 508 |  | 
|---|
| 509 | /* Position this frame control above bottom ctrl if requested */ | 
|---|
| 510 | if((fctrlData->ulFlagsLeft & FCTL_POSABOVE) && fctrlData->bBottom){ | 
|---|
| 511 | pswpFrameCtl->y  +=fctrlData->sizelBottomFrame.cy; | 
|---|
| 512 | pswpFrameCtl->cy  -=fctrlData->sizelBottomFrame.cy; | 
|---|
| 513 | } | 
|---|
| 514 | /* Position this frame control below top ctrl if requested */ | 
|---|
| 515 | if(!(fctrlData->ulFlagsLeft & FCTL_POSBELOW) && fctrlData->bTop){ | 
|---|
| 516 | pswpFrameCtl->cy  +=fctrlData->sizelTopFrame.cy; | 
|---|
| 517 | } | 
|---|
| 518 | rc++; | 
|---|
| 519 | }/* end of if(fctrlData->bLeft) */ | 
|---|
| 520 |  | 
|---|
| 521 | /* Bottom frame control */ | 
|---|
| 522 | if(fctrlData->bBottom){ | 
|---|
| 523 | pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */ | 
|---|
| 524 |  | 
|---|
| 525 | pswpClient->cy -= fctrlData->sizelBottomFrame.cy; | 
|---|
| 526 | pswpFrameCtl->hwnd=fctrlData->hwndCtlBottom; | 
|---|
| 527 |  | 
|---|
| 528 | pswpFrameCtl->x  = pswpClient->x; | 
|---|
| 529 | pswpFrameCtl->y  = pswpClient->y; | 
|---|
| 530 | pswpClient->y += fctrlData->sizelBottomFrame.cy; | 
|---|
| 531 |  | 
|---|
| 532 | pswpFrameCtl->cx = pswpClient->cx; | 
|---|
| 533 | pswpFrameCtl->cy = fctrlData->sizelBottomFrame.cy; | 
|---|
| 534 |  | 
|---|
| 535 | pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM; | 
|---|
| 536 | pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW; | 
|---|
| 537 |  | 
|---|
| 538 | /* Adjust position if flags are set */ | 
|---|
| 539 | if(fctrlData->bLeft){ | 
|---|
| 540 | if((fctrlData->ulFlagsLeft & FCTL_POSABOVE)) { | 
|---|
| 541 | pswpFrameCtl->cx +=fctrlData->sizelLeftFrame.cx; | 
|---|
| 542 | pswpFrameCtl->x  -= fctrlData->sizelLeftFrame.cx; | 
|---|
| 543 | } | 
|---|
| 544 | } | 
|---|
| 545 | if(!(fctrlData->ulFlagsRight & FCTL_POSABOVE)&& fctrlData->bRight) { | 
|---|
| 546 | pswpFrameCtl->cx -= fctrlData->sizelRightFrame.cx; | 
|---|
| 547 | } | 
|---|
| 548 | /* Adjust container view so items do not scroll out of view */ | 
|---|
| 549 | /*   hwndClient=pswpClient->hwnd; | 
|---|
| 550 | if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){ | 
|---|
| 551 | CnrInfo.ptlOrigin.y-=pswpFrameCtl->cy; | 
|---|
| 552 | WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN)); | 
|---|
| 553 | };*/ | 
|---|
| 554 |  | 
|---|
| 555 | if(!fctrlData->bCnrAdjusted) { | 
|---|
| 556 | hwndClient=pswpClient->hwnd; | 
|---|
| 557 | if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){ | 
|---|
| 558 | if(fctrlData->bBottom) | 
|---|
| 559 | CnrInfo.ptlOrigin.y-=fctrlData->sizelBottomFrame.cy; | 
|---|
| 560 | if(fctrlData->bTop) | 
|---|
| 561 | CnrInfo.ptlOrigin.y-=fctrlData->sizelTopFrame.cy; | 
|---|
| 562 | //CnrInfo.ptlOrigin.y+=0; | 
|---|
| 563 | WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN)); | 
|---|
| 564 | } | 
|---|
| 565 | fctrlData->bCnrAdjusted=TRUE; | 
|---|
| 566 | } | 
|---|
| 567 |  | 
|---|
| 568 | rc++; | 
|---|
| 569 | }/* end of if(fctrlData->bBottom) */ | 
|---|
| 570 |  | 
|---|
| 571 | /* Right frame control */ | 
|---|
| 572 | if(fctrlData->bRight){ | 
|---|
| 573 | pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */ | 
|---|
| 574 |  | 
|---|
| 575 | pswpClient->cx -= fctrlData->sizelRightFrame.cx;/* Size client */ | 
|---|
| 576 | pswpFrameCtl->hwnd=fctrlData->hwndCtlRight; | 
|---|
| 577 |  | 
|---|
| 578 | pswpFrameCtl->x  =pswpClient->x+pswpClient->cx; | 
|---|
| 579 | pswpFrameCtl->y  =pswpClient->y; | 
|---|
| 580 |  | 
|---|
| 581 | pswpFrameCtl->cx = fctrlData->sizelRightFrame.cx; | 
|---|
| 582 | pswpFrameCtl->cy =pswpClient->cy; | 
|---|
| 583 |  | 
|---|
| 584 | pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM; | 
|---|
| 585 | pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW; | 
|---|
| 586 |  | 
|---|
| 587 | /* Position this frame control above bottom ctrl only if requested */ | 
|---|
| 588 | if(!(fctrlData->ulFlagsRight & FCTL_POSABOVE) && fctrlData->bBottom){ | 
|---|
| 589 | pswpFrameCtl->y  -=fctrlData->sizelBottomFrame.cy; | 
|---|
| 590 | pswpFrameCtl->cy  +=fctrlData->sizelBottomFrame.cy; | 
|---|
| 591 | } | 
|---|
| 592 | /* Position this frame control below top ctrl only if requested */ | 
|---|
| 593 | if(!(fctrlData->ulFlagsRight & FCTL_POSBELOW) && fctrlData->bTop){ | 
|---|
| 594 | pswpFrameCtl->cy  +=fctrlData->sizelTopFrame.cy; | 
|---|
| 595 | } | 
|---|
| 596 | rc++; | 
|---|
| 597 | }/* end of if(fctrlData->bRight) */ | 
|---|
| 598 |  | 
|---|
| 599 |  | 
|---|
| 600 | } | 
|---|
| 601 | } | 
|---|
| 602 | return rc;/* Return additional controls */ | 
|---|
| 603 | } | 
|---|
| 604 |  | 
|---|
| 605 |  | 
|---|
| 606 | /**************************************************************/ | 
|---|
| 607 | /*                                                            */ | 
|---|
| 608 | /* This function adds a frame control at the specified        */ | 
|---|
| 609 | /* position.                                                  */ | 
|---|
| 610 | /*                                                            */ | 
|---|
| 611 | /**************************************************************/ | 
|---|
| 612 | BOOL CWProgFolder::cwAddFrameCtl(HWND hwndFolder, HWND hwndNewCtl,SIZEL sizel, ULONG ulPos, ULONG ulFlags) | 
|---|
| 613 | { | 
|---|
| 614 | FRAMECTRLDATA * fctrlData; | 
|---|
| 615 |  | 
|---|
| 616 | /* Get the framecontrol datastructure from the invisible control window */ | 
|---|
| 617 | fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA); | 
|---|
| 618 | if(!fctrlData) return FALSE; | 
|---|
| 619 |  | 
|---|
| 620 | /* Fill in the values into the structure */ | 
|---|
| 621 | /* This is the dialog at the left */ | 
|---|
| 622 | if(ulPos & FCTL_LEFT) { | 
|---|
| 623 | /* The HWND of the dialog used as a framcontrol */ | 
|---|
| 624 | fctrlData->hwndCtlLeft=hwndNewCtl; | 
|---|
| 625 | /* The size of the dialog. Actually only sizel.cx is used | 
|---|
| 626 | since this is a dialog at the left which always has | 
|---|
| 627 | got the height of the client. */ | 
|---|
| 628 | fctrlData->sizelLeftFrame=sizel; | 
|---|
| 629 | /* A flag which determines the positioning of the dialog. | 
|---|
| 630 | If there is a dialog at the top you may tell the folder | 
|---|
| 631 | to move it sizel.cx pixel to the right to allow the | 
|---|
| 632 | control at the left to cover the full height of the folder. | 
|---|
| 633 | The same is with the control at the bottom. This gives | 
|---|
| 634 | you the ability to finetune the appearance of the | 
|---|
| 635 | folder. Just try the flags FCTL_POSBELOW, FCTL_POSABOVE as | 
|---|
| 636 | defined in progfolder.h in conjunction with framecontrols | 
|---|
| 637 | at different positions of the folder. | 
|---|
| 638 | */ | 
|---|
| 639 | fctrlData->ulFlagsLeft=ulFlags; | 
|---|
| 640 | /* Tell the frame procedure that there's a framecontrol | 
|---|
| 641 | at the left. */ | 
|---|
| 642 | fctrlData->bLeft=TRUE; | 
|---|
| 643 | if(!fctrlData->hwndCtlLeft) | 
|---|
| 644 | /* If this method is called with hwndNewCtl=NULL the framecontrol | 
|---|
| 645 | is disabled. */ | 
|---|
| 646 | fctrlData->bLeft=FALSE; | 
|---|
| 647 | } | 
|---|
| 648 | /* This is the dialog at the right */ | 
|---|
| 649 | if(ulPos & FCTL_RIGHT){ | 
|---|
| 650 | fctrlData->hwndCtlRight=hwndNewCtl; | 
|---|
| 651 | fctrlData->sizelRightFrame=sizel; | 
|---|
| 652 | fctrlData->ulFlagsRight=ulFlags; | 
|---|
| 653 | fctrlData->bRight=TRUE; | 
|---|
| 654 | if(!fctrlData->hwndCtlRight) | 
|---|
| 655 | fctrlData->bRight=FALSE; | 
|---|
| 656 | } | 
|---|
| 657 | if(ulPos & FCTL_TOP){ | 
|---|
| 658 | fctrlData->hwndCtlTop=hwndNewCtl; | 
|---|
| 659 | fctrlData->sizelTopFrame=sizel; | 
|---|
| 660 | fctrlData->bTop=TRUE; | 
|---|
| 661 | if(!fctrlData->hwndCtlTop) | 
|---|
| 662 | fctrlData->bTop=FALSE; | 
|---|
| 663 | } | 
|---|
| 664 | if(ulPos & FCTL_BOTTOM){ | 
|---|
| 665 | fctrlData->hwndCtlBottom=hwndNewCtl; | 
|---|
| 666 | fctrlData->sizelBottomFrame=sizel; | 
|---|
| 667 | fctrlData->bBottom=TRUE; | 
|---|
| 668 | if(!fctrlData->hwndCtlBottom) | 
|---|
| 669 | fctrlData->bBottom=FALSE; | 
|---|
| 670 | } | 
|---|
| 671 | return TRUE; | 
|---|
| 672 | } | 
|---|
| 673 |  | 
|---|
| 674 |  | 
|---|
| 675 | /**************************************************************/ | 
|---|
| 676 | /*                                                            */ | 
|---|
| 677 | /* This function returns information about the specified      */ | 
|---|
| 678 | /* private frame control.                                     */ | 
|---|
| 679 | /*                                                            */ | 
|---|
| 680 | /**************************************************************/ | 
|---|
| 681 | HWND CWProgFolder::cwQueryFrameCtl(HWND hwndFolder, SIZEL* sizel, ULONG ulPos, ULONG * ulFlags) | 
|---|
| 682 | { | 
|---|
| 683 | FRAMECTRLDATA * fctrlData; | 
|---|
| 684 |  | 
|---|
| 685 | fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA); | 
|---|
| 686 | if(!fctrlData) return FALSE; | 
|---|
| 687 |  | 
|---|
| 688 |  | 
|---|
| 689 | if(ulPos & FCTL_LEFT){ | 
|---|
| 690 | *sizel=fctrlData->sizelLeftFrame; | 
|---|
| 691 | *ulFlags= fctrlData->ulFlagsLeft; | 
|---|
| 692 | return fctrlData->hwndCtlLeft; | 
|---|
| 693 | } | 
|---|
| 694 | if(ulPos & FCTL_RIGHT){ | 
|---|
| 695 | *sizel=fctrlData->sizelRightFrame; | 
|---|
| 696 | *ulFlags=fctrlData->ulFlagsRight; | 
|---|
| 697 | return fctrlData->hwndCtlRight; | 
|---|
| 698 | } | 
|---|
| 699 | if(ulPos & FCTL_TOP){ | 
|---|
| 700 | *sizel=fctrlData->sizelTopFrame; | 
|---|
| 701 | *ulFlags=0; | 
|---|
| 702 | return  fctrlData->hwndCtlTop; | 
|---|
| 703 | } | 
|---|
| 704 | if(ulPos & FCTL_BOTTOM){ | 
|---|
| 705 | *sizel=fctrlData->sizelBottomFrame; | 
|---|
| 706 | *ulFlags=0; | 
|---|
| 707 | return fctrlData->hwndCtlBottom; | 
|---|
| 708 | } | 
|---|
| 709 | return NULL; | 
|---|
| 710 | } | 
|---|
| 711 |  | 
|---|
| 712 | /**************************************************************/ | 
|---|
| 713 | /*                                                            */ | 
|---|
| 714 | /* This function requests an update of frame controls so      */ | 
|---|
| 715 | /* added frame controls will become visible.                  */ | 
|---|
| 716 | /* You must call this function after calling cwAddFrameCtl(). */ | 
|---|
| 717 | /*                                                            */ | 
|---|
| 718 | /**************************************************************/ | 
|---|
| 719 | void CWProgFolder::cwUpdateFrame(HWND hwndFolder) | 
|---|
| 720 | { | 
|---|
| 721 |  | 
|---|
| 722 | WinSendMsg(hwndFolder,WM_UPDATEFRAME,0,0); | 
|---|
| 723 |  | 
|---|
| 724 | } | 
|---|
| 725 |  | 
|---|
| 726 | /**************************************************************/ | 
|---|
| 727 | /*                                                            */ | 
|---|
| 728 | /* This function returns the pointer to a file system object  */ | 
|---|
| 729 | /* or NULL.                                                   */ | 
|---|
| 730 | /* It follows shadow objects and returns the object handle    */ | 
|---|
| 731 | /* of the linked object if it's a file system object          */ | 
|---|
| 732 | /*                                                            */ | 
|---|
| 733 | /**************************************************************/ | 
|---|
| 734 | WPObject* CWProgFolder::cwGetFileSystemObject(WPObject* wpObject) | 
|---|
| 735 | { | 
|---|
| 736 | if(!somIsObj(wpObject)) return NULL;//No object given | 
|---|
| 737 |  | 
|---|
| 738 | /* Check if it's a shadow */ | 
|---|
| 739 | if(somResolveByName(wpObject,"wpQueryShadowedObject")){ | 
|---|
| 740 | /* Yes, it's a shadow. Query the linked object. */ | 
|---|
| 741 | wpObject=((WPShadow*)wpObject)->wpQueryShadowedObject(FALSE); | 
|---|
| 742 | } | 
|---|
| 743 |  | 
|---|
| 744 | if(!somIsObj(wpObject)) return NULL;//The link is broken | 
|---|
| 745 |  | 
|---|
| 746 | /* Check if it's a file system object */ | 
|---|
| 747 | if(somResolveByName(wpObject, "wpQueryRealName")){ | 
|---|
| 748 | return wpObject;/* Yes */ | 
|---|
| 749 | } | 
|---|
| 750 | else | 
|---|
| 751 | return NULL; | 
|---|
| 752 | } | 
|---|
| 753 |  | 
|---|
| 754 | void paintURL(HPS hps, HWND hwnd, LONG lColor) | 
|---|
| 755 | { | 
|---|
| 756 | POINTL aptl[TXTBOX_COUNT]; | 
|---|
| 757 | POINTL ptl[2]; | 
|---|
| 758 | int iLen; | 
|---|
| 759 | RECTL rectl; | 
|---|
| 760 | char chrURL[500]; | 
|---|
| 761 | int a; | 
|---|
| 762 | LONG lSaveY; | 
|---|
| 763 | //  SIZEF fxSize; | 
|---|
| 764 |  | 
|---|
| 765 | WinQueryWindowText(hwnd, sizeof(chrURL),chrURL); | 
|---|
| 766 | iLen=strlen(chrURL); | 
|---|
| 767 | GpiQueryTextBox(hps, iLen, chrURL, TXTBOX_COUNT, aptl); | 
|---|
| 768 | WinQueryWindowRect(hwnd, &rectl); | 
|---|
| 769 | // WinDrawText(hps, -1L, chrURL,  &rectl, CLR_BLUE, CLR_BACKGROUND, DT_LEFT|DT_UNDERSCORE); | 
|---|
| 770 |  | 
|---|
| 771 | if(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x <= rectl.xRight-rectl.xLeft) | 
|---|
| 772 | WinDrawText(hps, -1L, chrURL,  &rectl, lColor, CLR_BACKGROUND, DT_CENTER|DT_UNDERSCORE); | 
|---|
| 773 | else | 
|---|
| 774 | { | 
|---|
| 775 | /* Always draw the first 15 chars to speed up */ | 
|---|
| 776 | a=15; | 
|---|
| 777 | ptl[0].x=0; | 
|---|
| 778 | lSaveY=rectl.yTop-aptl[TXTBOX_TOPLEFT].y; | 
|---|
| 779 | ptl[0].y=lSaveY; | 
|---|
| 780 |  | 
|---|
| 781 | GpiSetColor(hps, lColor); | 
|---|
| 782 | GpiCharStringPosAt(hps, ptl,NULLHANDLE, CHS_UNDERSCORE, a, chrURL, 0); | 
|---|
| 783 | //      GpiQueryCharBox(hps, &fxSize); | 
|---|
| 784 |  | 
|---|
| 785 |  | 
|---|
| 786 | //      GpiQueryCharStringPos(hps, 0, 1, &chrURL[a], 0,ptl); | 
|---|
| 787 | while(a < iLen) {/* While chars in string */ | 
|---|
| 788 | /* Get draw position of next char */ | 
|---|
| 789 | GpiQueryCharStringPos(hps, 0, 1,  &chrURL[a], 0, ptl); | 
|---|
| 790 | if(ptl[1].x  > rectl.xRight) {/* ptl[1] is position of next char */ | 
|---|
| 791 | /* Center the next line ?? */ | 
|---|
| 792 | GpiQueryTextBox(hps, strlen(&chrURL[a]), &chrURL[a], TXTBOX_COUNT, aptl); | 
|---|
| 793 | if(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x <= rectl.xRight-rectl.xLeft) | 
|---|
| 794 | /* Yes */ | 
|---|
| 795 | ptl[0].x=(rectl.xRight-rectl.xLeft-(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x))/2; | 
|---|
| 796 | else | 
|---|
| 797 | ptl[0].x=0; /* No */ | 
|---|
| 798 | lSaveY-=aptl[TXTBOX_TOPLEFT].y+2; | 
|---|
| 799 | ptl[0].y=lSaveY; | 
|---|
| 800 | GpiMove(hps, ptl); | 
|---|
| 801 | } | 
|---|
| 802 | /* Draw char */ | 
|---|
| 803 | GpiCharStringPos(hps,NULLHANDLE,CHS_UNDERSCORE,1,&chrURL[a],0); | 
|---|
| 804 | a++; | 
|---|
| 805 | //        GpiQueryCharStringPos(hps, 0, 1,  &chrURL[a], 0, ptl); | 
|---|
| 806 | //        a++; | 
|---|
| 807 | }; | 
|---|
| 808 | } | 
|---|
| 809 | } | 
|---|
| 810 |  | 
|---|
| 811 | MRESULT EXPENTRY urlProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) | 
|---|
| 812 | { | 
|---|
| 813 | PFNWP pfnwp; | 
|---|
| 814 | char chrURL[500]; | 
|---|
| 815 | STARTDATA startData; | 
|---|
| 816 | char chrLoadError[CCHMAXPATH]; | 
|---|
| 817 | ULONG ulSessionID; | 
|---|
| 818 | PID pid; | 
|---|
| 819 | ULONG attrValue[32]; | 
|---|
| 820 | APIRET rc; | 
|---|
| 821 | HPS hps; | 
|---|
| 822 | RECTL rectl; | 
|---|
| 823 |  | 
|---|
| 824 | switch( msg ) | 
|---|
| 825 | { | 
|---|
| 826 | case WM_BUTTON1DOWN: | 
|---|
| 827 | hps=WinGetPS(hwnd); | 
|---|
| 828 | paintURL(hps, hwnd, CLR_RED); | 
|---|
| 829 | WinReleasePS(hps); | 
|---|
| 830 | return (MRESULT) FALSE; | 
|---|
| 831 | case WM_BUTTON1UP: | 
|---|
| 832 | hps=WinGetPS(hwnd); | 
|---|
| 833 | paintURL(hps, hwnd, CLR_BLUE); | 
|---|
| 834 | WinReleasePS(hps); | 
|---|
| 835 | return (MRESULT) FALSE; | 
|---|
| 836 | case WM_BUTTON1CLICK: | 
|---|
| 837 | WinQueryWindowText(hwnd,sizeof(chrURL),chrURL); | 
|---|
| 838 | memset(&startData,0,sizeof(startData)); | 
|---|
| 839 | startData.Length=sizeof(startData); | 
|---|
| 840 | startData.Related=SSF_RELATED_INDEPENDENT; | 
|---|
| 841 | startData.FgBg=SSF_FGBG_FORE; | 
|---|
| 842 | startData.TraceOpt=SSF_TRACEOPT_NONE; | 
|---|
| 843 | startData.PgmTitle=""; | 
|---|
| 844 | startData.PgmName="netscape.exe"; | 
|---|
| 845 | startData.InheritOpt=SSF_INHERTOPT_SHELL; | 
|---|
| 846 | startData.SessionType=SSF_TYPE_DEFAULT; | 
|---|
| 847 | startData.PgmControl=SSF_CONTROL_VISIBLE; | 
|---|
| 848 | startData.InitXPos=30; | 
|---|
| 849 | startData.InitYPos=30; | 
|---|
| 850 | startData.InitXSize=500; | 
|---|
| 851 | startData.InitYSize=400; | 
|---|
| 852 | startData.ObjectBuffer=chrLoadError; | 
|---|
| 853 | startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError); | 
|---|
| 854 | startData.PgmInputs=chrURL; | 
|---|
| 855 | rc=DosStartSession(&startData,&ulSessionID,&pid); | 
|---|
| 856 | return (MRESULT) FALSE; | 
|---|
| 857 | case WM_PAINT: | 
|---|
| 858 | hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE); | 
|---|
| 859 | paintURL(hps, hwnd, CLR_BLUE); | 
|---|
| 860 | WinEndPaint(hps); | 
|---|
| 861 | return (MRESULT) FALSE; | 
|---|
| 862 | case WM_MOUSEMOVE: | 
|---|
| 863 | if(hptrHand) { | 
|---|
| 864 | WinSetPointer(HWND_DESKTOP,hptrHand); | 
|---|
| 865 | } | 
|---|
| 866 | return (MRESULT)FALSE; | 
|---|
| 867 | default: | 
|---|
| 868 | break; | 
|---|
| 869 | } | 
|---|
| 870 | pfnwp=(PFNWP)WinQueryWindowULong(hwnd,QWL_USER); | 
|---|
| 871 | if(pfnwp) | 
|---|
| 872 | return pfnwp( hwnd, msg, mp1, mp2 ); | 
|---|
| 873 |  | 
|---|
| 874 | return WinDefWindowProc( hwnd, msg, mp1, mp2 ); | 
|---|
| 875 | } | 
|---|
| 876 |  | 
|---|
| 877 |  | 
|---|
| 878 | /**************************************************************/ | 
|---|
| 879 | /*                                                            */ | 
|---|
| 880 |  | 
|---|
| 881 | /*                                                            */ | 
|---|
| 882 | /**************************************************************/ | 
|---|
| 883 | MRESULT EXPENTRY aboutDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) | 
|---|
| 884 | { | 
|---|
| 885 | HENUM hEnum; | 
|---|
| 886 | HWND hwndNext; | 
|---|
| 887 | char chrText[400]; | 
|---|
| 888 | ULONG ulStyle; | 
|---|
| 889 | char text[50]; | 
|---|
| 890 | PFNWP pfnwp; | 
|---|
| 891 | HMODULE hModule; | 
|---|
| 892 | SWP swp; | 
|---|
| 893 |  | 
|---|
| 894 | switch( msg ) | 
|---|
| 895 | { | 
|---|
| 896 | case WM_INITDLG: | 
|---|
| 897 | /* Find text controls with an URL */ | 
|---|
| 898 | hEnum=WinBeginEnumWindows(hwnd); | 
|---|
| 899 | do { | 
|---|
| 900 | hwndNext=WinGetNextWindow(hEnum); | 
|---|
| 901 | if(hwndNext) { | 
|---|
| 902 | WinQueryClassName(hwndNext,sizeof(chrText), chrText); | 
|---|
| 903 | if(!strcmpi(chrText,"#5")) { | 
|---|
| 904 | ulStyle=WinQueryWindowULong(hwndNext,QWL_STYLE); | 
|---|
| 905 |  | 
|---|
| 906 | if((ulStyle & 0xf) == SS_TEXT) { | 
|---|
| 907 | /* Static text control */ | 
|---|
| 908 | WinQueryWindowText(hwndNext,sizeof(chrText), chrText); | 
|---|
| 909 | if(!strnicmp(chrText,"http:",5)){ | 
|---|
| 910 | if(!hptrHand) { | 
|---|
| 911 | if(!DosQueryModuleHandle("PROGFLDR.DLL",&hModule)) | 
|---|
| 912 | hptrHand=WinLoadPointer(HWND_DESKTOP,hModule,IDPT_HAND); | 
|---|
| 913 | } | 
|---|
| 914 | pfnwp=WinSubclassWindow(hwndNext, urlProc); | 
|---|
| 915 | WinSetWindowULong(hwndNext,QWL_USER,(ULONG)pfnwp); | 
|---|
| 916 | } | 
|---|
| 917 | }/* end of if((ulStyle & 0xf) == SS_TEXT) */ | 
|---|
| 918 | } | 
|---|
| 919 | } | 
|---|
| 920 | }while(hwndNext); | 
|---|
| 921 | WinEndEnumWindows(hEnum); | 
|---|
| 922 | /* Set dialog font to WarpSans for Warp 4 and above */ | 
|---|
| 923 | if(cwQueryOSRelease()>=40) { | 
|---|
| 924 | WinSetPresParam(hwnd, | 
|---|
| 925 | PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT), | 
|---|
| 926 | DEFAULT_DIALOG_FONT ); | 
|---|
| 927 | } | 
|---|
| 928 |  | 
|---|
| 929 | WinQueryWindowPos(hwnd, &swp); | 
|---|
| 930 |  | 
|---|
| 931 | WinSetWindowPos(hwnd,HWND_TOP,(WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN)-swp.cx)/2, (WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN)-swp.cy)/2, | 
|---|
| 932 | 0,0, SWP_MOVE|SWP_ZORDER|SWP_ACTIVATE|SWP_SHOW); | 
|---|
| 933 | return (MRESULT) TRUE; | 
|---|
| 934 | case WM_DESTROY: | 
|---|
| 935 | break; | 
|---|
| 936 | case WM_CLOSE: | 
|---|
| 937 | break; | 
|---|
| 938 | case WM_COMMAND: | 
|---|
| 939 | { | 
|---|
| 940 | switch( SHORT1FROMMP( mp1 ) ) | 
|---|
| 941 | { | 
|---|
| 942 | default: | 
|---|
| 943 | break; | 
|---|
| 944 | } | 
|---|
| 945 | } | 
|---|
| 946 | break; | 
|---|
| 947 | return (MRESULT) TRUE; | 
|---|
| 948 | } | 
|---|
| 949 | return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) ); | 
|---|
| 950 | } | 
|---|
| 951 |  | 
|---|
| 952 | /**************************************************************/ | 
|---|
| 953 | /*                                                            */ | 
|---|
| 954 | /* This method shows an about dialog.                         */ | 
|---|
| 955 | /*                                                            */ | 
|---|
| 956 | /**************************************************************/ | 
|---|
| 957 | ULONG CWProgFolder::cwShowAboutDlg(HMODULE hModule, ULONG idDialog) | 
|---|
| 958 | { | 
|---|
| 959 | HWND hwnd; | 
|---|
| 960 |  | 
|---|
| 961 | /* | 
|---|
| 962 | New: 01.05.2004, MAke sure the about dialog is modal to the folder. | 
|---|
| 963 | */ | 
|---|
| 964 | hwnd=WinQueryActiveWindow(HWND_DESKTOP); | 
|---|
| 965 |  | 
|---|
| 966 | return (WinDlgBox( HWND_DESKTOP, hwnd, aboutDlgProc, hModule,idDialog, 0)); | 
|---|
| 967 | } | 
|---|
| 968 |  | 
|---|
| 969 | /**************************************************************/ | 
|---|
| 970 | /*                                                            */ | 
|---|
| 971 | /* This funktion returns the CD-Drives in the system          */ | 
|---|
| 972 | /*                                                            */ | 
|---|
| 973 | /* iNumCD (output): # of CD-Drives                            */ | 
|---|
| 974 | /* cFirstDrive (output): first cd-Drive letter                */ | 
|---|
| 975 | /* returns TRUE: We have cd-drives                            */ | 
|---|
| 976 | /*                                                            */ | 
|---|
| 977 | /**************************************************************/ | 
|---|
| 978 | BOOL CWProgFolder::cwQueryCDDrives(int *iNumCD, char * cFirstDrive) | 
|---|
| 979 | { | 
|---|
| 980 | HFILE hfDevice; | 
|---|
| 981 | ULONG ulAction; | 
|---|
| 982 | ULONG ulLen; | 
|---|
| 983 | static char cFirst=0; | 
|---|
| 984 | static int iNumCDLocal=0; | 
|---|
| 985 | static BOOL haveCD=FALSE; | 
|---|
| 986 | static BOOL done=FALSE; | 
|---|
| 987 | struct | 
|---|
| 988 | { | 
|---|
| 989 | USHORT usCountCD; | 
|---|
| 990 | USHORT usFirstCD; | 
|---|
| 991 | } CDInfo; | 
|---|
| 992 |  | 
|---|
| 993 | if(!done){ | 
|---|
| 994 | ulLen = sizeof(CDInfo); | 
|---|
| 995 | if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0, | 
|---|
| 996 | FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, | 
|---|
| 997 | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL)) | 
|---|
| 998 | { | 
|---|
| 999 | if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen)) | 
|---|
| 1000 | { | 
|---|
| 1001 | if(CDInfo.usCountCD) { | 
|---|
| 1002 | haveCD=TRUE; | 
|---|
| 1003 | iNumCDLocal=CDInfo.usCountCD; | 
|---|
| 1004 | cFirst='A'+ CDInfo.usFirstCD; | 
|---|
| 1005 | } | 
|---|
| 1006 | } | 
|---|
| 1007 | DosClose(hfDevice); | 
|---|
| 1008 | } | 
|---|
| 1009 | done=TRUE; | 
|---|
| 1010 | } | 
|---|
| 1011 | *iNumCD=iNumCDLocal; | 
|---|
| 1012 | *cFirstDrive=cFirst; | 
|---|
| 1013 | return haveCD; | 
|---|
| 1014 | } | 
|---|
| 1015 |  | 
|---|
| 1016 |  | 
|---|
| 1017 | /* Use this method to insert user menu items into a menu when WPSWizard is installed */ | 
|---|
| 1018 | BOOL CWProgFolder::cwInsertUserMenuItems(HWND hwndMenu, char* chrMenuFolder, ULONG ulFirstId, BOOL bLeadingSeparator) | 
|---|
| 1019 | { | 
|---|
| 1020 | M_WPObject *m_wpObject; | 
|---|
| 1021 | CWMenuFolder * wpFolder; | 
|---|
| 1022 | HOBJECT hObject; | 
|---|
| 1023 | somId id; | 
|---|
| 1024 | somTD_CWMenuFolder_mfInsertMenuItems methodPtr; | 
|---|
| 1025 | ULONG ulRc=ulFirstId; | 
|---|
| 1026 |  | 
|---|
| 1027 | /* Insert the menu items from the user menu folder. WPS-Wizard must be installed for | 
|---|
| 1028 | this. */ | 
|---|
| 1029 | if((hObject=WinQueryObject(chrMenuFolder))!=NULLHANDLE) {//is there a default menufolder? | 
|---|
| 1030 | /* Yes */ | 
|---|
| 1031 | m_wpObject=(M_WPObject*)this->somGetClass(); | 
|---|
| 1032 | if(somIsObj(m_wpObject)) { | 
|---|
| 1033 | /* We have it */ | 
|---|
| 1034 | /* Get method address */ | 
|---|
| 1035 | if((id=somIdFromString("mfInsertMenuItems"))!=NULLHANDLE) { | 
|---|
| 1036 | wpFolder=(CWMenuFolder *)m_wpObject->wpclsQueryObject( hObject); | 
|---|
| 1037 | if(somIsObj(wpFolder)) { | 
|---|
| 1038 | methodPtr= (somTD_CWMenuFolder_mfInsertMenuItems) (wpFolder->somGetClass())->somFindSMethod(id); | 
|---|
| 1039 | if(methodPtr) { | 
|---|
| 1040 | SHORT sIndex; | 
|---|
| 1041 |  | 
|---|
| 1042 | if(bLeadingSeparator) | 
|---|
| 1043 | sIndex=SHORT1FROMMR(cwInsertMenuSeparator(MIT_END, hwndMenu, NULL)); | 
|---|
| 1044 | ulRc=methodPtr(wpFolder, hwndMenu , MIT_END, ulFirstId); | 
|---|
| 1045 | #if 0 | 
|---|
| 1046 | if(ulRc==ulFirstId) { | 
|---|
| 1047 | /* No item inserted, remove the separator */ | 
|---|
| 1048 | sIndex=SHORT1FROMMR(WinSendMsg(hwndMenu,MM_ITEMIDFROMPOSITION,MPFROMSHORT(sIndex), | 
|---|
| 1049 | (MPARAM)NULL)); | 
|---|
| 1050 | if(sIndex!=MIT_ERROR) | 
|---|
| 1051 | WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT(sIndex, TRUE), | 
|---|
| 1052 | (MPARAM)NULL); | 
|---|
| 1053 |  | 
|---|
| 1054 | } | 
|---|
| 1055 | #endif | 
|---|
| 1056 | } | 
|---|
| 1057 | /* ulCurrentID contains the last used menu id */ | 
|---|
| 1058 | wpFolder->wpUnlockObject();//Object is locked because of wpclsQueryHandle() | 
|---|
| 1059 | }/* if(somIsObj(wpFolder)) */ | 
|---|
| 1060 | SOMFree(id); | 
|---|
| 1061 | }/* somId */ | 
|---|
| 1062 | }/* end of if(somIsObj(m_wpObject))  */ | 
|---|
| 1063 | }/* USERMENU_FOLDER */ | 
|---|
| 1064 | return ulRc; | 
|---|
| 1065 | } | 
|---|
| 1066 |  | 
|---|
| 1067 | BOOL CWProgFolder::cwCheckUserMenuItems( char* chrMenuFolder, USHORT usItemId) | 
|---|
| 1068 | { | 
|---|
| 1069 | CWMenuFolder * wpFolder; | 
|---|
| 1070 | HOBJECT hObject; | 
|---|
| 1071 | somId id; | 
|---|
| 1072 | somTD_CWMenuFolder_mfCheckMenuItems methodPtr; | 
|---|
| 1073 | M_WPObject *m_wpObject; | 
|---|
| 1074 | BOOL bHandled=FALSE; | 
|---|
| 1075 |  | 
|---|
| 1076 | if((hObject=WinQueryObject(chrMenuFolder))!=NULLHANDLE) {//is there a default menufolder? | 
|---|
| 1077 | /* Get class object */ | 
|---|
| 1078 | m_wpObject=(M_WPObject*)this->somGetClass(); | 
|---|
| 1079 | if(somIsObj(m_wpObject)) { | 
|---|
| 1080 | /* We have it */ | 
|---|
| 1081 | if((id=somIdFromString("mfCheckMenuItems"))!=NULLHANDLE){ | 
|---|
| 1082 | wpFolder=(CWMenuFolder *)m_wpObject->wpclsQueryObject( hObject); | 
|---|
| 1083 | if(somIsObj(wpFolder)) { | 
|---|
| 1084 | methodPtr= (somTD_CWMenuFolder_mfCheckMenuItems) (wpFolder->somGetClass())->somFindSMethod(id); | 
|---|
| 1085 | SOMFree(id); | 
|---|
| 1086 | if(methodPtr) { | 
|---|
| 1087 | /* Check for Items */ | 
|---|
| 1088 | bHandled=methodPtr(wpFolder, this, usItemId); | 
|---|
| 1089 | } | 
|---|
| 1090 | wpFolder->wpUnlockObject();//Object is locked because of wpclsQueryHandle() | 
|---|
| 1091 | } | 
|---|
| 1092 | }/* somId */ | 
|---|
| 1093 | }/* end of if(somIsObj(m_wpObject))  */ | 
|---|
| 1094 | } | 
|---|
| 1095 | return bHandled; | 
|---|
| 1096 | } | 
|---|