source: trunk/dll/attribs.c@ 1330

Last change on this file since 1330 was 1220, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: attribs.c 1220 2008-09-13 23:09:45Z jbs $
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 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
13 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
14
15***********************************************************************/
16
17#include <ctype.h>
18#include <time.h>
19
20#define INCL_DOS
21#define INCL_WIN
22
23#include "fm3dll.h"
24#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
25#include "notebook.h" // Data declaration(s)
26#include "info.h" // Data declaration(s)
27#include "init.h" // Data declaration(s)
28#include "fm3dlg.h"
29#include "fm3str.h"
30#include "makelist.h" // LISTINFO
31#include "errutil.h" // Runtime_Error
32#include "strutil.h" // GetPString
33#include "defview.h" // QuickView
34#include "attribs.h"
35#include "misc.h" // PaintRecessedWindow
36#include "wrappers.h" // xDosSetPathInfo
37
38static PSZ pszSrcFile = __FILE__;
39
40MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
41{
42 LISTINFO *li;
43
44 switch (msg) {
45 case WM_INITDLG:
46 if (!mp2)
47 WinDismissDlg(hwnd, 0);
48 else {
49 WinSetWindowPtr(hwnd, QWL_USER, mp2);
50 li = (LISTINFO *) mp2;
51 if (!li->list || !li->list[0]) {
52 WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
53 break;
54 }
55 }
56 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETTEXTLIMIT, MPFROMSHORT(4L),
57 MPVOID);
58 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
59 MPVOID);
60 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
61 MPVOID);
62 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
63 MPVOID);
64 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
65 MPVOID);
66 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
67 MPVOID);
68 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_OVERRIDESETLIMITS,
69 MPFROMLONG(2200L), MPFROMLONG(1980L));
70 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS,
71 MPFROMLONG(12L), MPFROMLONG(1L));
72 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_OVERRIDESETLIMITS, MPFROMLONG(31L),
73 MPFROMLONG(1L));
74 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(23L),
75 MPFROMLONG(0L));
76 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_OVERRIDESETLIMITS,
77 MPFROMLONG(59L), MPFROMLONG(0L));
78 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS,
79 MPFROMLONG(59L), MPFROMLONG(0L));
80 WinCheckButton(hwnd, ATR_USEDATETIME, FALSE);
81 {
82 INT x;
83
84 for (x = 0; li->list[x]; x++) {
85 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_INSERTITEM,
86 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
87 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM,
88 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
89 }
90 }
91 PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID);
92 if (li->list[1])
93 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID);
94 break;
95
96 case UM_UNDO:
97 {
98 FILESTATUS3 fi;
99 long ro = 2, hi = 2, sy = 2, ar = 2;
100 BOOL allgrey;
101
102 allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
103 (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
104 (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
105 (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2);
106 li = INSTDATA(hwnd);
107 if (li && li->list[0] && (allgrey || mp1) &&
108 !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi,
109 (ULONG) sizeof(fi))) {
110 ro = ((fi.attrFile & FILE_READONLY) != 0);
111 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
112 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
113 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
114 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
115 MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID);
116 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
117 MPFROMSHORT(fi.fdateLastWrite.month), MPVOID);
118 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
119 MPFROMSHORT(fi.fdateLastWrite.day), MPVOID);
120 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
121 MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID);
122 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
123 MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID);
124 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
125 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID);
126 }
127 WinCheckButton(hwnd, ATR_READONLY, ro);
128 WinCheckButton(hwnd, ATR_HIDDEN, hi);
129 WinCheckButton(hwnd, ATR_SYSTEM, sy);
130 WinCheckButton(hwnd, ATR_ARCHIVED, ar);
131 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED),
132 MPVOID);
133 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID);
134 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID);
135 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED),
136 MPVOID);
137 }
138 return 0;
139
140 case WM_ADJUSTWINDOWPOS:
141 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
142 break;
143
144 case UM_SETDIR:
145 PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE,
146 TRUE);
147 return 0;
148
149 case WM_CONTROL:
150 switch (SHORT1FROMMP(mp1)) {
151 case ATR_LISTBOX:
152 if (SHORT2FROMMP(mp1) == LN_ENTER) {
153
154 SHORT x;
155 CHAR szBuffer[CCHMAXPATH];
156
157 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
158 MPFROMSHORT(LIT_FIRST), MPVOID);
159 if (x >= 0) {
160 *szBuffer = 0;
161 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
162 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
163 if (*szBuffer)
164 QuickView(hwnd, szBuffer);
165 }
166 }
167 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
168 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
169 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
170 WinSetDlgItemText(hwnd, ATR_HELP,
171 GetPString(IDS_ATTRLISTBOXHELPTEXT));
172 break;
173 case ATR_YEAR:
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_ATTRYEARHELPTEXT));
178 break;
179 case ATR_MONTH:
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_ATTRMONTHHELPTEXT));
184 break;
185 case ATR_DAY:
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_ATTRDAYHELPTEXT));
190 break;
191 case ATR_HOUR:
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_ATTRHOURHELPTEXT));
196 break;
197 case ATR_MINUTES:
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_ATTRMINHELPTEXT));
202 break;
203 case ATR_SECONDS:
204 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
205 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
206 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
207 WinSetDlgItemText(hwnd, ATR_HELP, 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) : GetPString(IDS_UNCHANGEDTEXT));
241 WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s);
242 }
243 break;
244 }
245 return 0;
246
247 case WM_COMMAND:
248 switch (SHORT1FROMMP(mp1)) {
249 case ATR_LEAVEALL:
250 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
251 break;
252
253 case ATR_NOW:
254 {
255 time_t t;
256 struct tm *tm;
257
258 t = time(NULL);
259 tm = localtime(&t);
260 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
261 MPFROMSHORT(tm->tm_year + 1900), MPVOID);
262 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
263 MPFROMSHORT(tm->tm_mon + 1), MPVOID);
264 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
265 MPFROMSHORT(tm->tm_mday), MPVOID);
266 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
267 MPFROMSHORT(tm->tm_hour), MPVOID);
268 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
269 MPFROMSHORT(tm->tm_min), MPVOID);
270 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
271 MPFROMSHORT(tm->tm_sec), MPVOID);
272 }
273 break;
274
275 case DID_OK:
276 if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) &&
277 WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
278 WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
279 WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
280 WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) {
281 saymsg(MB_ENTER,
282 hwnd,
283 GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT));
284 break;
285 }
286 {
287 ULONG temp = 0;
288 FILESTATUS3 fi;
289 SHORT x;
290 APIRET rc;
291 USHORT state;
292
293 li = INSTDATA(hwnd);
294 if (!li) {
295 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
296 break;
297 }
298 {
299 CHAR szBuffer[CCHMAXPATH + 1];
300 UINT numfiles = 0, numalloc = 0;
301 INT error;
302
303 if (li->list)
304 FreeList(li->list);
305 li->list = NULL;
306 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
307 MPFROMSHORT(LIT_FIRST), MPVOID);
308 if (x >= 0) {
309 do {
310 *szBuffer = 0;
311 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
312 MPFROM2SHORT(x, CCHMAXPATH),
313 MPFROMP(szBuffer));
314 if (*szBuffer && isalpha(*szBuffer) &&
315 !(driveflags[toupper(*szBuffer) - 'A'] &
316 DRIVE_NOTWRITEABLE)) {
317 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
318 if (error) {
319 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
320 break;
321 }
322 }
323 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX,
324 LM_QUERYSELECTION,
325 MPFROMSHORT(x), MPVOID);
326 } while (x >= 0);
327 }
328 }
329 if (!li->list || !li->list[0]) {
330 Runtime_Error(pszSrcFile, __LINE__, "list build failed");
331 break;
332 }
333 for (x = 0; li->list[x]; x++) {
334 DosError(FERR_DISABLEHARDERR);
335 rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi,
336 (ULONG) sizeof(fi));
337 if (rc)
338 continue;
339 if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) {
340 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp),
341 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
342 fi.fdateLastWrite.year = temp - 1980;
343 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE,
344 MPFROMP(&temp), MPFROM2SHORT(0,
345 SPBQ_DONOTUPDATE));
346 fi.fdateLastWrite.month = temp;
347 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp),
348 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
349 fi.fdateLastWrite.day = temp;
350 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp),
351 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
352 fi.ftimeLastWrite.hours = temp;
353 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE,
354 MPFROMP(&temp), MPFROM2SHORT(0,
355 SPBQ_DONOTUPDATE));
356 fi.ftimeLastWrite.minutes = temp;
357 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE,
358 MPFROMP(&temp), MPFROM2SHORT(0,
359 SPBQ_DONOTUPDATE));
360 fi.ftimeLastWrite.twosecs = (temp / 2L);
361 }
362 fi.attrFile &= (~FILE_DIRECTORY);
363 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY,
364 BM_QUERYCHECK, 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, MPVOID, MPVOID);
383 if (!state)
384 fi.attrFile &= (~FILE_ARCHIVED);
385 else if (state == 1)
386 fi.attrFile |= FILE_ARCHIVED;
387 xDosSetPathInfo(li->list[x], FIL_STANDARD, &fi, sizeof(fi), 0);
388 }
389 WinDismissDlg(hwnd, 1);
390 }
391 break;
392
393 case IDM_HELP:
394 if (hwndHelp)
395 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
396 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
397 MPFROMSHORT(HM_RESOURCEID));
398 break;
399
400 case DID_CANCEL:
401 WinDismissDlg(hwnd, 0);
402 break;
403 }
404 return 0;
405 }
406 return WinDefDlgProc(hwnd, msg, mp1, mp2);
407}
408
409#pragma alloc_text(ATTRIBS,AttrListDlgProc)
Note: See TracBrowser for help on using the repository browser.