source: trunk/dll/objcnr.c@ 531

Last change on this file since 531 was 531, checked in by root, 19 years ago

Renames

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