source: trunk/dll/attribs.c@ 1194

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

Ticket 187: Draft 2: Move remaining function declarations

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