source: trunk/dll/attribs.c@ 1168

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

Ticket 187: Draft 1: Functions only

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: attribs.c 1156 2008-09-05 21:39:19Z 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
19#define INCL_DOS
20#define INCL_WIN
21
22#include "fm3dlg.h"
23#include "fm3str.h"
24#include "makelist.h" // LISTINFO
25#include "errutil.h" // Runtime_Error
26#include "strutil.h" // GetPString
27#include "defview.h" // QuickView
28#include "attribs.h"
29#include "fm3dll.h"
30
31static PSZ pszSrcFile = __FILE__;
32
33MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
34{
35 LISTINFO *li;
36
37 switch (msg) {
38 case WM_INITDLG:
39 if (!mp2)
40 WinDismissDlg(hwnd, 0);
41 else {
42 WinSetWindowPtr(hwnd, QWL_USER, mp2);
43 li = (LISTINFO *) mp2;
44 if (!li->list || !li->list[0]) {
45 WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
46 break;
47 }
48 }
49 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETTEXTLIMIT, MPFROMSHORT(4L),
50 MPVOID);
51 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
52 MPVOID);
53 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
54 MPVOID);
55 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
56 MPVOID);
57 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
58 MPVOID);
59 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
60 MPVOID);
61 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_OVERRIDESETLIMITS,
62 MPFROMLONG(2200L), MPFROMLONG(1980L));
63 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS,
64 MPFROMLONG(12L), MPFROMLONG(1L));
65 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_OVERRIDESETLIMITS, MPFROMLONG(31L),
66 MPFROMLONG(1L));
67 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(23L),
68 MPFROMLONG(0L));
69 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_OVERRIDESETLIMITS,
70 MPFROMLONG(59L), MPFROMLONG(0L));
71 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS,
72 MPFROMLONG(59L), MPFROMLONG(0L));
73 WinCheckButton(hwnd, ATR_USEDATETIME, FALSE);
74 {
75 INT x;
76
77 for (x = 0; li->list[x]; x++) {
78 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_INSERTITEM,
79 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
80 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM,
81 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
82 }
83 }
84 PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID);
85 if (li->list[1])
86 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID);
87 break;
88
89 case UM_UNDO:
90 {
91 FILESTATUS3 fi;
92 long ro = 2, hi = 2, sy = 2, ar = 2;
93 BOOL allgrey;
94
95 allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
96 (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
97 (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
98 (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2);
99 li = INSTDATA(hwnd);
100 if (li && li->list[0] && (allgrey || mp1) &&
101 !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi,
102 (ULONG) sizeof(fi))) {
103 ro = ((fi.attrFile & FILE_READONLY) != 0);
104 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
105 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
106 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
107 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
108 MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID);
109 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
110 MPFROMSHORT(fi.fdateLastWrite.month), MPVOID);
111 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
112 MPFROMSHORT(fi.fdateLastWrite.day), MPVOID);
113 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
114 MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID);
115 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
116 MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID);
117 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
118 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID);
119 }
120 WinCheckButton(hwnd, ATR_READONLY, ro);
121 WinCheckButton(hwnd, ATR_HIDDEN, hi);
122 WinCheckButton(hwnd, ATR_SYSTEM, sy);
123 WinCheckButton(hwnd, ATR_ARCHIVED, ar);
124 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED),
125 MPVOID);
126 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID);
127 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID);
128 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED),
129 MPVOID);
130 }
131 return 0;
132
133 case WM_ADJUSTWINDOWPOS:
134 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
135 break;
136
137 case UM_SETDIR:
138 PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE,
139 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), MPFROMP(szBuffer));
156 if (*szBuffer)
157 QuickView(hwnd, szBuffer);
158 }
159 }
160 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
161 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
162 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
163 WinSetDlgItemText(hwnd, ATR_HELP,
164 GetPString(IDS_ATTRLISTBOXHELPTEXT));
165 break;
166 case ATR_YEAR:
167 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
168 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
169 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
170 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRYEARHELPTEXT));
171 break;
172 case ATR_MONTH:
173 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
174 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
175 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
176 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMONTHHELPTEXT));
177 break;
178 case ATR_DAY:
179 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
180 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
181 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
182 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRDAYHELPTEXT));
183 break;
184 case ATR_HOUR:
185 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
186 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
187 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
188 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRHOURHELPTEXT));
189 break;
190 case ATR_MINUTES:
191 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
192 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
193 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
194 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMINHELPTEXT));
195 break;
196 case ATR_SECONDS:
197 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
198 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
199 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
200 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRSECHELPTEXT));
201 break;
202 case ATR_READONLY:
203 case ATR_SYSTEM:
204 case ATR_HIDDEN:
205 case ATR_ARCHIVED:
206 WinSendMsg(hwnd, UM_CONTROL, mp1, mp2);
207 break;
208 }
209 return 0;
210
211 case UM_CONTROL:
212 switch (SHORT1FROMMP(mp1)) {
213 case ATR_READONLY:
214 case ATR_SYSTEM:
215 case ATR_HIDDEN:
216 case ATR_ARCHIVED:
217 {
218
219 LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
220 CHAR s[80];
221
222 sprintf(s, "%s %s",
223 (SHORT1FROMMP(mp1) == ATR_READONLY) ?
224 GetPString(IDS_ATTRREADONLYBTEXT) :
225 (SHORT1FROMMP(mp1) == ATR_SYSTEM) ?
226 GetPString(IDS_ATTRSYSTEMBTEXT) :
227 (SHORT1FROMMP(mp1) == ATR_HIDDEN) ?
228 GetPString(IDS_ATTRHIDDENBTEXT) :
229 GetPString(IDS_ATTRARCHIVEDBTEXT),
230 (check == 1) ?
231 GetPString(IDS_ONTEXT) :
232 (check == 0) ?
233 GetPString(IDS_OFFTEXT) : GetPString(IDS_UNCHANGEDTEXT));
234 WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s);
235 }
236 break;
237 }
238 return 0;
239
240 case WM_COMMAND:
241 switch (SHORT1FROMMP(mp1)) {
242 case ATR_LEAVEALL:
243 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
244 break;
245
246 case ATR_NOW:
247 {
248 time_t t;
249 struct tm *tm;
250
251 t = time(NULL);
252 tm = localtime(&t);
253 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
254 MPFROMSHORT(tm->tm_year + 1900), MPVOID);
255 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
256 MPFROMSHORT(tm->tm_mon + 1), MPVOID);
257 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
258 MPFROMSHORT(tm->tm_mday), MPVOID);
259 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
260 MPFROMSHORT(tm->tm_hour), MPVOID);
261 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
262 MPFROMSHORT(tm->tm_min), MPVOID);
263 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
264 MPFROMSHORT(tm->tm_sec), MPVOID);
265 }
266 break;
267
268 case DID_OK:
269 if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) &&
270 WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
271 WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
272 WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
273 WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) {
274 saymsg(MB_ENTER,
275 hwnd,
276 GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT));
277 break;
278 }
279 {
280 ULONG temp = 0;
281 FILESTATUS3 fi;
282 SHORT x;
283 APIRET rc;
284 USHORT state;
285
286 li = INSTDATA(hwnd);
287 if (!li) {
288 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
289 break;
290 }
291 {
292 CHAR szBuffer[CCHMAXPATH + 1];
293 UINT numfiles = 0, numalloc = 0;
294 INT 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 - 1980;
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 xDosSetPathInfo(li->list[x], FIL_STANDARD, &fi, sizeof(fi), 0);
381 }
382 WinDismissDlg(hwnd, 1);
383 }
384 break;
385
386 case IDM_HELP:
387 if (hwndHelp)
388 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
389 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
390 MPFROMSHORT(HM_RESOURCEID));
391 break;
392
393 case DID_CANCEL:
394 WinDismissDlg(hwnd, 0);
395 break;
396 }
397 return 0;
398 }
399 return WinDefDlgProc(hwnd, msg, mp1, mp2);
400}
401
402#pragma alloc_text(ATTRIBS,AttrListDlgProc)
Note: See TracBrowser for help on using the repository browser.