source: trunk/dll/attribs.c@ 689

Last change on this file since 689 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: 12.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: attribs.c 574 2007-03-23 22:37:07Z gyoung $
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, QWL_USER, 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,
63 MPFROMLONG(2200L), MPFROMLONG(1980L));
64 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS,
65 MPFROMLONG(12L), 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,
71 MPFROMLONG(59L), MPFROMLONG(0L));
72 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS,
73 MPFROMLONG(59L), 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), MPFROMP(li->list[x]));
81 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM,
82 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
83 }
84 }
85 PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID);
86 if (li->list[1])
87 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID);
88 break;
89
90 case UM_UNDO:
91 {
92 FILESTATUS3 fi;
93 long ro = 2, hi = 2, sy = 2, ar = 2;
94 BOOL allgrey;
95
96 allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
97 (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
98 (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
99 (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2);
100 li = INSTDATA(hwnd);
101 if (li && li->list[0] && (allgrey || mp1) &&
102 !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi,
103 (ULONG) sizeof(fi))) {
104 ro = ((fi.attrFile & FILE_READONLY) != 0);
105 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
106 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
107 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
108 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
109 MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID);
110 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
111 MPFROMSHORT(fi.fdateLastWrite.month), MPVOID);
112 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
113 MPFROMSHORT(fi.fdateLastWrite.day), MPVOID);
114 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
115 MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID);
116 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
117 MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID);
118 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
119 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID);
120 }
121 WinCheckButton(hwnd, ATR_READONLY, ro);
122 WinCheckButton(hwnd, ATR_HIDDEN, hi);
123 WinCheckButton(hwnd, ATR_SYSTEM, sy);
124 WinCheckButton(hwnd, ATR_ARCHIVED, ar);
125 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED),
126 MPVOID);
127 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID);
128 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID);
129 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED),
130 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,
140 TRUE);
141 return 0;
142
143 case WM_CONTROL:
144 switch (SHORT1FROMMP(mp1)) {
145 case ATR_LISTBOX:
146 if (SHORT2FROMMP(mp1) == LN_ENTER) {
147
148 SHORT x;
149 CHAR szBuffer[CCHMAXPATH];
150
151 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
152 MPFROMSHORT(LIT_FIRST), MPVOID);
153 if (x >= 0) {
154 *szBuffer = 0;
155 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
156 MPFROM2SHORT(x, CCHMAXPATH), 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, GetPString(IDS_ATTRYEARHELPTEXT));
172 break;
173 case ATR_MONTH:
174 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
175 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
176 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
177 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMONTHHELPTEXT));
178 break;
179 case ATR_DAY:
180 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
181 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
182 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
183 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRDAYHELPTEXT));
184 break;
185 case ATR_HOUR:
186 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
187 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
188 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
189 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRHOURHELPTEXT));
190 break;
191 case ATR_MINUTES:
192 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
193 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
194 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
195 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMINHELPTEXT));
196 break;
197 case ATR_SECONDS:
198 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
199 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
200 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
201 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRSECHELPTEXT));
202 break;
203 case ATR_READONLY:
204 case ATR_SYSTEM:
205 case ATR_HIDDEN:
206 case ATR_ARCHIVED:
207 WinSendMsg(hwnd, UM_CONTROL, mp1, mp2);
208 break;
209 }
210 return 0;
211
212 case UM_CONTROL:
213 switch (SHORT1FROMMP(mp1)) {
214 case ATR_READONLY:
215 case ATR_SYSTEM:
216 case ATR_HIDDEN:
217 case ATR_ARCHIVED:
218 {
219
220 LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
221 CHAR s[80];
222
223 sprintf(s, "%s %s",
224 (SHORT1FROMMP(mp1) == ATR_READONLY) ?
225 GetPString(IDS_ATTRREADONLYBTEXT) :
226 (SHORT1FROMMP(mp1) == ATR_SYSTEM) ?
227 GetPString(IDS_ATTRSYSTEMBTEXT) :
228 (SHORT1FROMMP(mp1) == ATR_HIDDEN) ?
229 GetPString(IDS_ATTRHIDDENBTEXT) :
230 GetPString(IDS_ATTRARCHIVEDBTEXT),
231 (check == 1) ?
232 GetPString(IDS_ONTEXT) :
233 (check == 0) ?
234 GetPString(IDS_OFFTEXT) : GetPString(IDS_UNCHANGEDTEXT));
235 WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s);
236 }
237 break;
238 }
239 return 0;
240
241 case WM_COMMAND:
242 switch (SHORT1FROMMP(mp1)) {
243 case ATR_LEAVEALL:
244 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
245 break;
246
247 case ATR_NOW:
248 {
249 time_t t;
250 struct tm *tm;
251
252 t = time(NULL);
253 tm = localtime(&t);
254 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
255 MPFROMSHORT(tm->tm_year + 1900), MPVOID);
256 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
257 MPFROMSHORT(tm->tm_mon + 1), MPVOID);
258 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
259 MPFROMSHORT(tm->tm_mday), MPVOID);
260 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
261 MPFROMSHORT(tm->tm_hour), MPVOID);
262 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
263 MPFROMSHORT(tm->tm_min), MPVOID);
264 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
265 MPFROMSHORT(tm->tm_sec), MPVOID);
266 }
267 break;
268
269 case DID_OK:
270 if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) &&
271 WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
272 WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
273 WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
274 WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) {
275 saymsg(MB_ENTER,
276 hwnd,
277 GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT));
278 break;
279 }
280 {
281 ULONG temp = 0L;
282 FILESTATUS3 fi;
283 SHORT x;
284 APIRET rc;
285 USHORT state;
286
287 li = INSTDATA(hwnd);
288 if (!li) {
289 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
290 break;
291 }
292 {
293 CHAR szBuffer[CCHMAXPATH + 1];
294 INT numfiles = 0, numalloc = 0, error;
295
296 if (li->list)
297 FreeList(li->list);
298 li->list = NULL;
299 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
300 MPFROMSHORT(LIT_FIRST), MPVOID);
301 if (x >= 0) {
302 do {
303 *szBuffer = 0;
304 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
305 MPFROM2SHORT(x, CCHMAXPATH),
306 MPFROMP(szBuffer));
307 if (*szBuffer && isalpha(*szBuffer) &&
308 !(driveflags[toupper(*szBuffer) - 'A'] &
309 DRIVE_NOTWRITEABLE)) {
310 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
311 if (error) {
312 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
313 break;
314 }
315 }
316 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX,
317 LM_QUERYSELECTION,
318 MPFROMSHORT(x), MPVOID);
319 } while (x >= 0);
320 }
321 }
322 if (!li->list || !li->list[0]) {
323 Runtime_Error(pszSrcFile, __LINE__, "list build failed");
324 break;
325 }
326 for (x = 0; li->list[x]; x++) {
327 DosError(FERR_DISABLEHARDERR);
328 rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi,
329 (ULONG) sizeof(fi));
330 if (rc)
331 continue;
332 if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) {
333 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp),
334 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
335 fi.fdateLastWrite.year = temp - 1980L;
336 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE,
337 MPFROMP(&temp), MPFROM2SHORT(0,
338 SPBQ_DONOTUPDATE));
339 fi.fdateLastWrite.month = temp;
340 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp),
341 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
342 fi.fdateLastWrite.day = temp;
343 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp),
344 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
345 fi.ftimeLastWrite.hours = temp;
346 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE,
347 MPFROMP(&temp), MPFROM2SHORT(0,
348 SPBQ_DONOTUPDATE));
349 fi.ftimeLastWrite.minutes = temp;
350 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE,
351 MPFROMP(&temp), MPFROM2SHORT(0,
352 SPBQ_DONOTUPDATE));
353 fi.ftimeLastWrite.twosecs = (temp / 2L);
354 }
355 fi.attrFile &= (~FILE_DIRECTORY);
356 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY,
357 BM_QUERYCHECK, MPVOID, MPVOID);
358 if (!state)
359 fi.attrFile &= (~FILE_READONLY);
360 else if (state == 1)
361 fi.attrFile |= FILE_READONLY;
362 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_HIDDEN, BM_QUERYCHECK,
363 MPVOID, MPVOID);
364 if (!state)
365 fi.attrFile &= (~FILE_HIDDEN);
366 else if (state == 1)
367 fi.attrFile |= FILE_HIDDEN;
368 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_SYSTEM, BM_QUERYCHECK,
369 MPVOID, MPVOID);
370 if (!state)
371 fi.attrFile &= (~FILE_SYSTEM);
372 else if (state == 1)
373 fi.attrFile |= FILE_SYSTEM;
374 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_ARCHIVED,
375 BM_QUERYCHECK, MPVOID, MPVOID);
376 if (!state)
377 fi.attrFile &= (~FILE_ARCHIVED);
378 else if (state == 1)
379 fi.attrFile |= FILE_ARCHIVED;
380 DosSetPathInfo(li->list[x], FIL_STANDARD, (PVOID) & fi,
381 (ULONG) sizeof(FILESTATUS3), 0L);
382 }
383 WinDismissDlg(hwnd, 1);
384 }
385 break;
386
387 case IDM_HELP:
388 if (hwndHelp)
389 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
390 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
391 MPFROMSHORT(HM_RESOURCEID));
392 break;
393
394 case DID_CANCEL:
395 WinDismissDlg(hwnd, 0);
396 break;
397 }
398 return 0;
399 }
400 return WinDefDlgProc(hwnd, msg, mp1, mp2);
401}
Note: See TracBrowser for help on using the repository browser.