source: trunk/dll/attribs.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 KB
Line 
1#define INCL_DOS
2#define INCL_WIN
3
4#include <os2.h>
5#include <stdarg.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <ctype.h>
10#include <time.h>
11#include "fm3dll.h"
12#include "fm3dlg.h"
13#include "fm3str.h"
14
15#pragma alloc_text(ATTRIBS,AttrListDlgProc)
16
17
18MRESULT EXPENTRY AttrListDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
19
20 LISTINFO *li;
21
22 switch(msg) {
23 case WM_INITDLG:
24 if(!mp2)
25 WinDismissDlg(hwnd,0);
26 else {
27 WinSetWindowPtr(hwnd,0,mp2);
28 li = (LISTINFO *)mp2;
29 if(!li->list || !li->list[0]) {
30 WinSendMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
31 break;
32 }
33 }
34 WinSendDlgItemMsg(hwnd,ATR_YEAR,SPBM_SETTEXTLIMIT,MPFROMSHORT(4L),
35 MPVOID);
36 WinSendDlgItemMsg(hwnd,ATR_MONTH,SPBM_SETTEXTLIMIT,MPFROMSHORT(2L),
37 MPVOID);
38 WinSendDlgItemMsg(hwnd,ATR_DAY,SPBM_SETTEXTLIMIT,MPFROMSHORT(2L),
39 MPVOID);
40 WinSendDlgItemMsg(hwnd,ATR_HOUR,SPBM_SETTEXTLIMIT,MPFROMSHORT(2L),
41 MPVOID);
42 WinSendDlgItemMsg(hwnd,ATR_MINUTES,SPBM_SETTEXTLIMIT,MPFROMSHORT(2L),
43 MPVOID);
44 WinSendDlgItemMsg(hwnd,ATR_SECONDS,SPBM_SETTEXTLIMIT,MPFROMSHORT(2L),
45 MPVOID);
46 WinSendDlgItemMsg(hwnd,ATR_YEAR,SPBM_OVERRIDESETLIMITS,MPFROMLONG(2200L),
47 MPFROMLONG(1980L));
48 WinSendDlgItemMsg(hwnd,ATR_MONTH,SPBM_OVERRIDESETLIMITS,MPFROMLONG(12L),
49 MPFROMLONG(1L));
50 WinSendDlgItemMsg(hwnd,ATR_DAY,SPBM_OVERRIDESETLIMITS,MPFROMLONG(31L),
51 MPFROMLONG(1L));
52 WinSendDlgItemMsg(hwnd,ATR_HOUR,SPBM_OVERRIDESETLIMITS,MPFROMLONG(23L),
53 MPFROMLONG(0L));
54 WinSendDlgItemMsg(hwnd,ATR_MINUTES,SPBM_OVERRIDESETLIMITS,MPFROMLONG(59L),
55 MPFROMLONG(0L));
56 WinSendDlgItemMsg(hwnd,ATR_SECONDS,SPBM_OVERRIDESETLIMITS,MPFROMLONG(59L),
57 MPFROMLONG(0L));
58 WinCheckButton(hwnd,ATR_USEDATETIME,FALSE);
59 {
60 INT x;
61
62 for(x = 0;li->list[x];x++) {
63 WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_INSERTITEM,
64 MPFROM2SHORT(LIT_END,0),
65 MPFROMP(li->list[x]));
66 WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_SELECTITEM,
67 MPFROM2SHORT(x,0),MPFROMSHORT(TRUE));
68 }
69 }
70 PostMsg(hwnd,UM_UNDO,MPFROMLONG(((!li->list[1]) ? 1L : 0L)),MPVOID);
71 if(li->list[1])
72 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(ATR_NOW,0),MPVOID);
73 break;
74
75 case UM_UNDO:
76 {
77 FILESTATUS3 fi;
78 long ro = 2,hi = 2,sy = 2,ar = 2;
79 BOOL allgrey;
80
81 allgrey = ((long)WinQueryButtonCheckstate(hwnd,ATR_READONLY) == 2 &&
82 (long)WinQueryButtonCheckstate(hwnd,ATR_SYSTEM) == 2 &&
83 (long)WinQueryButtonCheckstate(hwnd,ATR_HIDDEN) == 2 &&
84 (long)WinQueryButtonCheckstate(hwnd,ATR_ARCHIVED) == 2);
85 li = INSTDATA(hwnd);
86 if(li && li->list[0] && (allgrey || mp1) &&
87 !DosQueryPathInfo(li->list[0],FIL_STANDARD,&fi,
88 (ULONG)sizeof(fi))) {
89 ro = ((fi.attrFile & FILE_READONLY) != 0);
90 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
91 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
92 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
93 WinSendDlgItemMsg(hwnd,ATR_YEAR,SPBM_SETCURRENTVALUE,
94 MPFROMSHORT(fi.fdateLastWrite.year + 1980),
95 MPVOID);
96 WinSendDlgItemMsg(hwnd,ATR_MONTH,SPBM_SETCURRENTVALUE,
97 MPFROMSHORT(fi.fdateLastWrite.month),MPVOID);
98 WinSendDlgItemMsg(hwnd,ATR_DAY,SPBM_SETCURRENTVALUE,
99 MPFROMSHORT(fi.fdateLastWrite.day),MPVOID);
100 WinSendDlgItemMsg(hwnd,ATR_HOUR,SPBM_SETCURRENTVALUE,
101 MPFROMSHORT(fi.ftimeLastWrite.hours),MPVOID);
102 WinSendDlgItemMsg(hwnd,ATR_MINUTES,SPBM_SETCURRENTVALUE,
103 MPFROMSHORT(fi.ftimeLastWrite.minutes),MPVOID);
104 WinSendDlgItemMsg(hwnd,ATR_SECONDS,SPBM_SETCURRENTVALUE,
105 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2),MPVOID);
106 }
107 WinCheckButton(hwnd,ATR_READONLY,ro);
108 WinCheckButton(hwnd,ATR_HIDDEN,hi);
109 WinCheckButton(hwnd,ATR_SYSTEM,sy);
110 WinCheckButton(hwnd,ATR_ARCHIVED,ar);
111 PostMsg(hwnd,UM_CONTROL,MPFROM2SHORT(ATR_READONLY,BN_CLICKED),MPVOID);
112 PostMsg(hwnd,UM_CONTROL,MPFROM2SHORT(ATR_HIDDEN,BN_CLICKED),MPVOID);
113 PostMsg(hwnd,UM_CONTROL,MPFROM2SHORT(ATR_SYSTEM,BN_CLICKED),MPVOID);
114 PostMsg(hwnd,UM_CONTROL,MPFROM2SHORT(ATR_ARCHIVED,BN_CLICKED),MPVOID);
115 }
116 return 0;
117
118 case WM_ADJUSTWINDOWPOS:
119 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
120 break;
121
122 case UM_SETDIR:
123 PaintRecessedWindow(WinWindowFromID(hwnd,ATR_HELP),(HPS)0,FALSE,TRUE);
124 return 0;
125
126 case WM_CONTROL:
127 switch(SHORT1FROMMP(mp1)) {
128 case ATR_LISTBOX:
129 if(SHORT2FROMMP(mp1) == LN_ENTER) {
130
131 SHORT x;
132 CHAR szBuffer[CCHMAXPATH];
133
134 x = (SHORT)WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_QUERYSELECTION,
135 MPFROMSHORT(LIT_FIRST),MPVOID);
136 if(x >= 0) {
137 *szBuffer = 0;
138 WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_QUERYITEMTEXT,
139 MPFROM2SHORT(x,CCHMAXPATH),
140 MPFROMP(szBuffer));
141 if(*szBuffer)
142 QuickView(hwnd,szBuffer);
143 }
144 }
145 else if(SHORT2FROMMP(mp1) == LN_KILLFOCUS)
146 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
147 else if(SHORT2FROMMP(mp1) == LN_SETFOCUS)
148 WinSetDlgItemText(hwnd,ATR_HELP,
149 GetPString(IDS_ATTRLISTBOXHELPTEXT));
150 break;
151 case ATR_YEAR:
152 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
153 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
154 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
155 WinSetDlgItemText(hwnd,ATR_HELP,
156 GetPString(IDS_ATTRYEARHELPTEXT));
157 break;
158 case ATR_MONTH:
159 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
160 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
161 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
162 WinSetDlgItemText(hwnd,ATR_HELP,
163 GetPString(IDS_ATTRMONTHHELPTEXT));
164 break;
165 case ATR_DAY:
166 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
167 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
168 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
169 WinSetDlgItemText(hwnd,ATR_HELP,
170 GetPString(IDS_ATTRDAYHELPTEXT));
171 break;
172 case ATR_HOUR:
173 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
174 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
175 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
176 WinSetDlgItemText(hwnd,ATR_HELP,
177 GetPString(IDS_ATTRHOURHELPTEXT));
178 break;
179 case ATR_MINUTES:
180 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
181 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
182 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
183 WinSetDlgItemText(hwnd,ATR_HELP,
184 GetPString(IDS_ATTRMINHELPTEXT));
185 break;
186 case ATR_SECONDS:
187 if(SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
188 WinSetDlgItemText(hwnd,ATR_HELP,NullStr);
189 if(SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
190 WinSetDlgItemText(hwnd,ATR_HELP,
191 GetPString(IDS_ATTRSECHELPTEXT));
192 break;
193 case ATR_READONLY:
194 case ATR_SYSTEM:
195 case ATR_HIDDEN:
196 case ATR_ARCHIVED:
197 WinSendMsg(hwnd,UM_CONTROL,mp1,mp2);
198 break;
199 }
200 return 0;
201
202 case UM_CONTROL:
203 switch(SHORT1FROMMP(mp1)) {
204 case ATR_READONLY:
205 case ATR_SYSTEM:
206 case ATR_HIDDEN:
207 case ATR_ARCHIVED:
208 {
209
210 LONG check = WinQueryButtonCheckstate(hwnd,SHORT1FROMMP(mp1));
211 CHAR s[80];
212
213 sprintf(s,"%s %s",
214 (SHORT1FROMMP(mp1) == ATR_READONLY) ?
215 GetPString(IDS_ATTRREADONLYBTEXT) :
216 (SHORT1FROMMP(mp1) == ATR_SYSTEM) ?
217 GetPString(IDS_ATTRSYSTEMBTEXT) :
218 (SHORT1FROMMP(mp1) == ATR_HIDDEN) ?
219 GetPString(IDS_ATTRHIDDENBTEXT) :
220 GetPString(IDS_ATTRARCHIVEDBTEXT),
221 (check == 1) ?
222 GetPString(IDS_ONTEXT) :
223 (check == 0) ?
224 GetPString(IDS_OFFTEXT) :
225 GetPString(IDS_UNCHANGEDTEXT));
226 WinSetDlgItemText(hwnd,SHORT1FROMMP(mp1),s);
227 }
228 break;
229 }
230 return 0;
231
232 case WM_COMMAND:
233 switch(SHORT1FROMMP(mp1)) {
234 case ATR_LEAVEALL:
235 PostMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
236 break;
237
238 case ATR_NOW:
239 {
240 time_t t;
241 struct tm *tm;
242
243 t = time(NULL);
244 tm = localtime(&t);
245 WinSendDlgItemMsg(hwnd,ATR_YEAR,SPBM_SETCURRENTVALUE,
246 MPFROMSHORT(tm->tm_year + 1900),
247 MPVOID);
248 WinSendDlgItemMsg(hwnd,ATR_MONTH,SPBM_SETCURRENTVALUE,
249 MPFROMSHORT(tm->tm_mon + 1),MPVOID);
250 WinSendDlgItemMsg(hwnd,ATR_DAY,SPBM_SETCURRENTVALUE,
251 MPFROMSHORT(tm->tm_mday),MPVOID);
252 WinSendDlgItemMsg(hwnd,ATR_HOUR,SPBM_SETCURRENTVALUE,
253 MPFROMSHORT(tm->tm_hour),MPVOID);
254 WinSendDlgItemMsg(hwnd,ATR_MINUTES,SPBM_SETCURRENTVALUE,
255 MPFROMSHORT(tm->tm_min),MPVOID);
256 WinSendDlgItemMsg(hwnd,ATR_SECONDS,SPBM_SETCURRENTVALUE,
257 MPFROMSHORT(tm->tm_sec),MPVOID);
258 }
259 break;
260
261 case DID_OK:
262 if(!WinQueryButtonCheckstate(hwnd,ATR_USEDATETIME) &&
263 WinQueryButtonCheckstate(hwnd,ATR_HIDDEN) == 2 &&
264 WinQueryButtonCheckstate(hwnd,ATR_SYSTEM) == 2 &&
265 WinQueryButtonCheckstate(hwnd,ATR_READONLY) == 2 &&
266 WinQueryButtonCheckstate(hwnd,ATR_ARCHIVED) == 2) {
267 saymsg(MB_ENTER,
268 hwnd,
269 GetPString(IDS_UHYOTEXT),
270 GetPString(IDS_ATTRADVANTAGETEXT));
271 break;
272 }
273 {
274 ULONG temp = 0L;
275 FILESTATUS3 fi;
276 SHORT x;
277 APIRET rc;
278 USHORT state;
279
280 li = INSTDATA(hwnd);
281 if(!li)
282 break;
283 {
284 CHAR szBuffer[CCHMAXPATH + 1];
285 INT numfiles = 0,numalloc = 0,error;
286
287 if(li->list)
288 FreeList(li->list);
289 li->list = NULL;
290 x = (SHORT)WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_QUERYSELECTION,
291 MPFROMSHORT(LIT_FIRST),MPVOID);
292 if(x >= 0) {
293 do {
294 *szBuffer = 0;
295 WinSendDlgItemMsg(hwnd,ATR_LISTBOX,LM_QUERYITEMTEXT,
296 MPFROM2SHORT(x,CCHMAXPATH),
297 MPFROMP(szBuffer));
298 if(*szBuffer && isalpha(*szBuffer) &&
299 !(driveflags[toupper(*szBuffer) - 'A'] &
300 DRIVE_NOTWRITEABLE)) {
301 error = AddToList(szBuffer,&li->list,&numfiles,&numalloc);
302 if(error) {
303 DosBeep(250,100);
304 break;
305 }
306 }
307 x = (SHORT)WinSendDlgItemMsg(hwnd,ATR_LISTBOX,
308 LM_QUERYSELECTION,
309 MPFROMSHORT(x),MPVOID);
310 } while(x >= 0);
311 }
312 }
313 if(!li->list || !li->list[0]) {
314 DosBeep(250,100);
315 break;
316 }
317 for(x = 0;li->list[x];x++) {
318 DosError(FERR_DISABLEHARDERR);
319 rc = DosQueryPathInfo(li->list[x],FIL_STANDARD,&fi,
320 (ULONG)sizeof(fi));
321 if(rc)
322 continue;
323 if(WinQueryButtonCheckstate(hwnd,ATR_USEDATETIME)) {
324 WinSendDlgItemMsg(hwnd,ATR_YEAR,SPBM_QUERYVALUE,MPFROMP(&temp),
325 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
326 fi.fdateLastWrite.year = temp - 1980L;
327 WinSendDlgItemMsg(hwnd,ATR_MONTH,SPBM_QUERYVALUE,MPFROMP(&temp),
328 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
329 fi.fdateLastWrite.month = temp;
330 WinSendDlgItemMsg(hwnd,ATR_DAY,SPBM_QUERYVALUE,MPFROMP(&temp),
331 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
332 fi.fdateLastWrite.day = temp;
333 WinSendDlgItemMsg(hwnd,ATR_HOUR,SPBM_QUERYVALUE,MPFROMP(&temp),
334 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
335 fi.ftimeLastWrite.hours = temp;
336 WinSendDlgItemMsg(hwnd,ATR_MINUTES,SPBM_QUERYVALUE,MPFROMP(&temp),
337 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
338 fi.ftimeLastWrite.minutes = temp;
339 WinSendDlgItemMsg(hwnd,ATR_SECONDS,SPBM_QUERYVALUE,MPFROMP(&temp),
340 MPFROM2SHORT(0,SPBQ_DONOTUPDATE));
341 fi.ftimeLastWrite.twosecs = (temp / 2L);
342 }
343 fi.attrFile &= (~FILE_DIRECTORY);
344 state = (USHORT)WinSendDlgItemMsg(hwnd,ATR_READONLY,
345 BM_QUERYCHECK,
346 MPVOID,MPVOID);
347 if(!state)
348 fi.attrFile &= (~FILE_READONLY);
349 else if(state == 1)
350 fi.attrFile |= FILE_READONLY;
351 state = (USHORT)WinSendDlgItemMsg(hwnd,ATR_HIDDEN,BM_QUERYCHECK,
352 MPVOID,MPVOID);
353 if(!state)
354 fi.attrFile &= (~FILE_HIDDEN);
355 else if(state == 1)
356 fi.attrFile |= FILE_HIDDEN;
357 state = (USHORT)WinSendDlgItemMsg(hwnd,ATR_SYSTEM,BM_QUERYCHECK,
358 MPVOID,MPVOID);
359 if(!state)
360 fi.attrFile &= (~FILE_SYSTEM);
361 else if(state == 1)
362 fi.attrFile |= FILE_SYSTEM;
363 state = (USHORT)WinSendDlgItemMsg(hwnd,ATR_ARCHIVED,
364 BM_QUERYCHECK,
365 MPVOID,MPVOID);
366 if(!state)
367 fi.attrFile &= (~FILE_ARCHIVED);
368 else if(state == 1)
369 fi.attrFile |= FILE_ARCHIVED;
370 DosSetPathInfo(li->list[x],FIL_STANDARD,(PVOID)&fi,
371 (ULONG)sizeof(FILESTATUS3),0L);
372 }
373 WinDismissDlg(hwnd,1);
374 }
375 break;
376
377 case IDM_HELP:
378 if(hwndHelp)
379 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
380 MPFROM2SHORT(HELP_ATTRIBSLIST,0),
381 MPFROMSHORT(HM_RESOURCEID));
382 break;
383
384 case DID_CANCEL:
385 WinDismissDlg(hwnd,0);
386 break;
387 }
388 return 0;
389 }
390 return WinDefDlgProc(hwnd,msg,mp1,mp2);
391}
392
Note: See TracBrowser for help on using the repository browser.