source: trunk/dll/attribs.c@ 433

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

Use RuntimeError2

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