source: branches/v2.9/mediafolder/ProgFolder/progfolder.cpp@ 77

Last change on this file since 77 was 2, checked in by stevenhl, 8 years ago

Import sources from cwmm-full.zip dated 2005-03-21

File size: 40.2 KB
Line 
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
44typedef ULONG SOMLINK somTP_CWMenuFolder_mfInsertMenuItems(CWMenuFolder *somSelf,
45 HWND hwndMenu,
46 ULONG iPosition,
47 ULONG ulLastMenuId);
48typedef somTP_CWMenuFolder_mfInsertMenuItems *somTD_CWMenuFolder_mfInsertMenuItems;
49
50typedef BOOL SOMLINK somTP_CWMenuFolder_mfCheckMenuItems(CWMenuFolder *somSelf,
51 WPObject* wpObject,
52 ULONG ulMenuId);
53typedef somTP_CWMenuFolder_mfCheckMenuItems *somTD_CWMenuFolder_mfCheckMenuItems;
54
55MRESULT EXPENTRY folderFrameProcedure(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2);
56HWND createStoreWindow(HWND hwndCLF);
57HWND createLeechFrame(HWND hwndCLF);
58BOOL cwRegisterSeparatorWindowClass(void);
59
60HPOINTER hptrHand=NULLHANDLE;
61
62/****************************************************
63 * *
64 * This function returns the running OS version: *
65 * *
66 * 30: Warp 3, 40 Warp 4 etc. *
67 * *
68 ****************************************************/
69static 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/**************************************************************/
86HMODULE 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 ****************************************************/
105MRESULT 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/**************************************************************/
130ULONG 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/**************************************************************/
168PSZ M_CWProgFolder::wpclsQueryTitle()
169{
170 return "Support-Folder";
171}
172
173
174void 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. */
199BOOL 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/**************************************************************/
212HWND 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/**************************************************************/
274ULONG 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/**************************************************************/
298BOOL 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/**************************************************************/
406ULONG 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/**************************************************************/
612BOOL 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/**************************************************************/
681HWND 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/**************************************************************/
719void 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/**************************************************************/
734WPObject* 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
754void 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
811MRESULT 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/**************************************************************/
883MRESULT 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/**************************************************************/
957ULONG 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/**************************************************************/
978BOOL 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 */
1018BOOL 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
1067BOOL 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}
Note: See TracBrowser for help on using the repository browser.