source: trunk/dll/objcnr.c@ 574

Last change on this file since 574 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: objcnr.c 574 2007-03-23 22:37:07Z gyoung $
5
6 Object containers
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2007 Steven H. Levine
10
11 24 May 05 SHL Rework for CNRITEM.szSubject
12 13 Jul 06 SHL Use Runtime_Error
13 01 Sep 06 SHL Do not complain for normal cancel
14 19 Oct 06 SHL Correct . and .. detect
15 03 Nov 06 SHL Renames
16 22 Mar 07 GKY Use QWL_USER
17
18***********************************************************************/
19
20#define INCL_DOS
21#define INCL_WIN
22#include <os2.h>
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <ctype.h>
28
29#include "fm3dll.h"
30#include "fm3dlg.h"
31#include "fm3str.h"
32
33typedef struct
34{
35 CHAR *filename;
36 HWND hwndCnr;
37 CHAR *stopflag;
38}
39DIRSIZE;
40
41typedef struct
42{
43 CHAR *dirname;
44 CHAR stopflag;
45 BOOL dying;
46 BOOL working;
47}
48TEMP;
49
50#pragma data_seg(DATA1)
51
52static PSZ pszSrcFile = __FILE__;
53
54static HWND objcnrwnd;
55
56#pragma alloc_text(OBJCNR,ProcessDir,FillCnrsThread,ObjCnrDlgProc)
57
58static VOID ProcessDir(HWND hwndCnr, CHAR * filename, PCNRITEM pciParent,
59 CHAR * stopflag)
60{
61 CHAR maskstr[CCHMAXPATH], *endpath, *p;
62 ULONG nm, ulM;
63 HDIR hdir;
64 FILEFINDBUF3 *ffb, *fft;
65 APIRET rc;
66 RECORDINSERT ri;
67 PCNRITEM pciP;
68
69 ffb = xmalloc(sizeof(FILEFINDBUF3), pszSrcFile, __LINE__);
70 if (!ffb)
71 return;
72 strcpy(maskstr, filename);
73 if (maskstr[strlen(maskstr) - 1] != '\\')
74 strcat(maskstr, "\\");
75 endpath = &maskstr[strlen(maskstr)];
76 strcat(maskstr, "*");
77 hdir = HDIR_CREATE;
78 nm = 1L;
79 rc = DosFindFirst(filename, &hdir,
80 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
81 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
82 ffb, sizeof(FILEFINDBUF3), &nm, FIL_STANDARD);
83 if (!rc)
84 DosFindClose(hdir);
85
86 if (rc) { /* work around furshluginer FAT bug... */
87 if (IsRoot(filename))
88 rc = 0;
89 }
90
91 if ((!rc && (ffb->attrFile & FILE_DIRECTORY))) {
92 pciP =
93 WinSendMsg(hwndCnr, CM_ALLOCRECORD, MPFROMLONG(EXTRA_RECORD_BYTES2),
94 MPFROMLONG(1L));
95 if (!pciP) {
96 free(ffb);
97 return;
98 }
99 strcpy(pciP->szFileName, filename);
100 pciP->pszDispAttr = pciP->szDispAttr;
101 pciP->pszSubject = pciP->szSubject;
102 pciP->pszLongname = pciP->szLongname;
103 pciP->pszDispAttr = pciP->szDispAttr;
104 *pciP->szDispAttr = *pciP->szLongname = *pciP->szSubject = 0;
105 if (strlen(filename) < 4)
106 pciP->pszFileName = pciP->szFileName;
107 else {
108 p = strrchr(pciP->szFileName, '\\');
109 if (!p)
110 pciP->pszFileName = pciP->szFileName;
111 else if (*(p + 1))
112 p++;
113 pciP->pszFileName = p;
114 }
115 pciP->rc.pszIcon = pciP->pszFileName;
116 if (fForceUpper)
117 strupr(pciP->szFileName);
118 else if (fForceLower)
119 strlwr(pciP->szFileName);
120 pciP->rc.flRecordAttr |= CRA_RECORDREADONLY;
121 }
122 else {
123 free(ffb);
124 Dos_Error(MB_ENTER,
125 rc,
126 HWND_DESKTOP,
127 pszSrcFile,
128 __LINE__, GetPString(IDS_CANTFINDDIRTEXT), filename);
129 return;
130 }
131 {
132 HPOINTER hptr;
133
134 hptr = WinLoadFileIcon(pciP->szFileName, FALSE);
135 if (hptr)
136 pciP->rc.hptrIcon = hptr;
137 }
138 if (!pciP->rc.hptrIcon || pciP->rc.hptrIcon == hptrFile) /* OS/2 bug bug bug bug */
139 pciP->rc.hptrIcon = hptrDir;
140 memset(&ri, 0, sizeof(RECORDINSERT));
141 ri.cb = sizeof(RECORDINSERT);
142 ri.pRecordOrder = (PRECORDCORE) CMA_END;
143 ri.pRecordParent = (PRECORDCORE) pciParent;
144 ri.zOrder = (USHORT) CMA_TOP;
145 ri.cRecordsInsert = 1L;
146 ri.fInvalidateRecord = TRUE;
147 if (!WinSendMsg(hwndCnr, CM_INSERTRECORD, MPFROMP(pciP), MPFROMP(&ri))) {
148 free(ffb);
149 return;
150 }
151 hdir = HDIR_CREATE;
152 if (!isalpha(*maskstr) || maskstr[1] != ':' || maskstr[2] != '\\' ||
153 ((driveflags[toupper(*maskstr) - 'A'] & DRIVE_REMOTE) && fRemoteBug))
154 ulM = 1L;
155 else
156 ulM = min(FilesToGet, 225);
157 if (ulM > 1L) {
158 fft = xrealloc(ffb, sizeof(FILEFINDBUF3) * ulM, pszSrcFile, __LINE__);
159 if (!fft)
160 ulM = 1L;
161 else
162 ffb = fft;
163 }
164 nm = ulM;
165 rc = DosFindFirst(maskstr, &hdir,
166 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
167 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY, ffb,
168 sizeof(FILEFINDBUF3) * ulM, &nm, FIL_STANDARD);
169 if (!rc) {
170
171 register PBYTE fb = (PBYTE) ffb;
172 FILEFINDBUF3 *pffbFile;
173 ULONG x;
174
175 while (!rc) {
176 for (x = 0L; x < nm; x++) {
177 pffbFile = (FILEFINDBUF3 *) fb;
178 if (*stopflag)
179 break;
180 if ((pffbFile->attrFile & FILE_DIRECTORY) &&
181 // Skip . and ..
182 (pffbFile->achName[0] != '.' ||
183 (pffbFile->achName[1] &&
184 (pffbFile->achName[1] != '.' || pffbFile->achName[2])))) {
185 strcpy(endpath, pffbFile->achName);
186 ProcessDir(hwndCnr, maskstr, pciP, stopflag);
187 }
188 if (!pffbFile->oNextEntryOffset)
189 break;
190 fb += pffbFile->oNextEntryOffset;
191 }
192 DosSleep(0L);
193 if (*stopflag)
194 break;
195 nm = ulM;
196 rc = DosFindNext(hdir, ffb, sizeof(FILEFINDBUF3) * ulM, &nm);
197 }
198 DosFindClose(hdir);
199 }
200 free(ffb);
201 WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pciP),
202 MPFROM2SHORT(1, 0));
203}
204
205static VOID FillCnrsThread(VOID * args)
206{
207 HAB hab;
208 HMQ hmq;
209 DIRSIZE *dirsize = (DIRSIZE *) args;
210
211 if (!dirsize)
212 return;
213
214 DosError(FERR_DISABLEHARDERR);
215
216 hab = WinInitialize(0);
217 if (hab) {
218 hmq = WinCreateMsgQueue(hab, 0);
219 if (hmq) {
220 WinCancelShutdown(hmq, TRUE);
221 ProcessDir(dirsize->hwndCnr, dirsize->filename, (PCNRITEM) NULL,
222 dirsize->stopflag);
223 DosPostEventSem(CompactSem);
224 WinDestroyMsgQueue(hmq);
225 }
226 WinTerminate(hab);
227 }
228 PostMsg(WinQueryWindow(dirsize->hwndCnr, QW_PARENT), UM_CONTAINER_FILLED,
229 MPVOID, MPVOID);
230 free(dirsize);
231}
232
233MRESULT EXPENTRY ObjCnrDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
234{
235 TEMP *data;
236
237 switch (msg) {
238 case WM_INITDLG:
239 if (objcnrwnd) {
240 Runtime_Error(pszSrcFile, __LINE__, "objcnrwnd set");
241 WinSetWindowPos(objcnrwnd, HWND_TOP, 0, 0, 0, 0,
242 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
243 WinDismissDlg(hwnd, 0);
244 break;
245 }
246 if (!mp2) {
247 Runtime_Error(pszSrcFile, __LINE__, "mp2 NULL");
248 WinDismissDlg(hwnd, 0);
249 break;
250 }
251 objcnrwnd = hwnd;
252 data = xmallocz(sizeof(TEMP), pszSrcFile, __LINE__);
253 if (!data) {
254 WinDismissDlg(hwnd, 0);
255 break;
256 }
257 data->dirname = (CHAR *) mp2;
258 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) data);
259 if (*data->dirname)
260 WinSetDlgItemText(hwnd, OBJCNR_DIR, data->dirname);
261 {
262 DIRSIZE *dirsize;
263
264 dirsize = xmalloc(sizeof(DIRSIZE), pszSrcFile, __LINE__);
265 if (!dirsize) {
266 WinDismissDlg(hwnd, 0);
267 break;
268 }
269 dirsize->stopflag = (CHAR *) & data->stopflag;
270 dirsize->filename = data->dirname;
271 dirsize->hwndCnr = WinWindowFromID(hwnd, OBJCNR_CNR);
272 if (_beginthread(FillCnrsThread, NULL, 65536 * 8, (PVOID) dirsize) ==
273 -1) {
274 Runtime_Error(pszSrcFile, __LINE__,
275 GetPString(IDS_COULDNTSTARTTHREADTEXT));
276 free(dirsize);
277 WinDismissDlg(hwnd, 0);
278 break;
279 }
280 else
281 data->working = TRUE;
282 }
283 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
284 break;
285
286 case UM_SETUP:
287 // WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),FALSE);
288 {
289 CNRINFO cnri;
290
291 memset(&cnri, 0, sizeof(CNRINFO));
292 cnri.cb = sizeof(CNRINFO);
293 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_QUERYCNRINFO,
294 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
295 cnri.cyLineSpacing = 0;
296 cnri.cxTreeIndent = 12L;
297 cnri.pszCnrTitle = GetPString(IDS_WORKINGTEXT);
298 cnri.flWindowAttr = CV_TREE | CV_FLOW |
299 CA_CONTAINERTITLE | CA_TITLESEPARATOR | CA_TREELINE;
300 if (WinQueryWindowUShort(hwnd, QWS_ID) == QTREE_FRAME)
301 cnri.flWindowAttr |= CV_MINI;
302 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_SETCNRINFO, MPFROMP(&cnri),
303 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
304 CMA_CXTREEINDENT));
305 }
306 return 0;
307
308 case UM_CONTAINER_FILLED:
309 WinSetDlgItemText(hwnd, OBJCNR_NOTE, NullStr);
310// WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),TRUE);
311 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_INVALIDATERECORD, MPVOID,
312 MPFROM2SHORT(0, CMA_ERASE | CMA_INVALIDATE));
313 data = INSTDATA(hwnd);
314 if (data) {
315 data->working = FALSE;
316 if (data->dying)
317 WinDismissDlg(hwnd, 0);
318 {
319 PCNRITEM pci;
320 USHORT id;
321
322 id = WinQueryWindowUShort(hwnd, QWS_ID);
323 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
324 CM_QUERYRECORD,
325 MPVOID,
326 MPFROM2SHORT(CMA_FIRST,
327 CMA_ITEMORDER));
328 if (pci && (INT) pci != -1) {
329 ExpandAll(WinWindowFromID(hwnd, OBJCNR_CNR), TRUE, pci);
330 if (id == QTREE_FRAME)
331 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
332 CM_QUERYRECORD,
333 MPFROMP(pci),
334 MPFROM2SHORT(CMA_FIRSTCHILD,
335 CMA_ITEMORDER));
336 }
337 if ((!pci || (INT) pci == -1) && id == QTREE_FRAME) {
338 Notify(GetPString(IDS_NODIRSUNDERTEXT));
339 WinDismissDlg(hwnd, 0);
340 break;
341 }
342 }
343 }
344 return 0;
345
346 case WM_CONTROL:
347 switch (SHORT1FROMMP(mp1)) {
348 case OBJCNR_CNR:
349 if (SHORT2FROMMP(mp1) == CN_ENTER) {
350
351 PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord;
352
353 if (pci && (INT) pci != -1)
354 WinSendDlgItemMsg(hwnd, DID_OK, BM_CLICK, MPVOID, MPVOID);
355 }
356 break;
357 }
358 return 0;
359
360 case WM_COMMAND:
361 switch (SHORT1FROMMP(mp1)) {
362 case IDM_HELP:
363 if (hwndHelp) {
364
365 USHORT id;
366
367 id = WinQueryWindowUShort(hwnd, QWS_ID);
368
369 if (id == QTREE_FRAME)
370 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
371 MPFROM2SHORT(HELP_QUICKTREE, 0),
372 MPFROMSHORT(HM_RESOURCEID));
373 else
374 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
375 MPFROM2SHORT(HELP_OBJECTPATH, 0),
376 MPFROMSHORT(HM_RESOURCEID));
377 }
378 break;
379
380 case OBJCNR_DESKTOP:
381 case DID_OK:
382 data = INSTDATA(hwnd);
383 if (data) {
384
385 PCNRITEM pci;
386
387 if (data->working) {
388 Runtime_Error(pszSrcFile, __LINE__, "working unexpected");
389 break;
390 }
391 if (SHORT1FROMMP(mp1) == OBJCNR_DESKTOP) {
392 WinDismissDlg(hwnd, 2);
393 break;
394 }
395 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
396 CM_QUERYRECORDEMPHASIS,
397 MPFROMLONG(CMA_FIRST),
398 MPFROMSHORT(CRA_CURSORED));
399 if (pci && (INT) pci != -1)
400 strcpy(data->dirname, pci->szFileName);
401 WinDismissDlg(hwnd, 1);
402 }
403 break;
404
405 case DID_CANCEL:
406 data = INSTDATA(hwnd);
407 if (data) {
408 if (data->working) {
409 data->dying = TRUE;
410 data->stopflag = 0xff;
411 break;
412 }
413 WinDismissDlg(hwnd, 0);
414 }
415 break;
416 }
417 return 0;
418
419 case WM_DESTROY:
420 objcnrwnd = (HWND) 0;
421 data = INSTDATA(hwnd);
422 if (data)
423 free(data);
424 break;
425 }
426 return WinDefDlgProc(hwnd, msg, mp1, mp2);
427}
Note: See TracBrowser for help on using the repository browser.