source: trunk/dll/attribs.c@ 807

Last change on this file since 807 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
RevLine 
[342]1
2/***********************************************************************
3
4 $Id: attribs.c 793 2007-08-21 02:53:38Z 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
[793]12 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[342]13
14***********************************************************************/
15
[2]16#define INCL_DOS
17#define INCL_WIN
[342]18#include <os2.h>
[2]19
20#include <stdarg.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <ctype.h>
25#include <time.h>
[342]26
[2]27#include "fm3dll.h"
28#include "fm3dlg.h"
29#include "fm3str.h"
30
[342]31static PSZ pszSrcFile = __FILE__;
32
[551]33MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[342]34{
[2]35 LISTINFO *li;
36
[551]37 switch (msg) {
38 case WM_INITDLG:
39 if (!mp2)
40 WinDismissDlg(hwnd, 0);
41 else {
[574]42 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[551]43 li = (LISTINFO *) mp2;
44 if (!li->list || !li->list[0]) {
45 WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
46 break;
[2]47 }
[551]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;
[2]76
[551]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));
[2]82 }
[551]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;
[2]88
[551]89 case UM_UNDO:
90 {
91 FILESTATUS3 fi;
92 long ro = 2, hi = 2, sy = 2, ar = 2;
93 BOOL allgrey;
[2]94
[551]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);
[2]119 }
[551]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;
[2]132
[551]133 case WM_ADJUSTWINDOWPOS:
134 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
135 break;
[2]136
[551]137 case UM_SETDIR:
138 PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE,
139 TRUE);
140 return 0;
[2]141
[551]142 case WM_CONTROL:
143 switch (SHORT1FROMMP(mp1)) {
144 case ATR_LISTBOX:
145 if (SHORT2FROMMP(mp1) == LN_ENTER) {
[2]146
[551]147 SHORT x;
148 CHAR szBuffer[CCHMAXPATH];
[2]149
[551]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 }
[2]159 }
[551]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;
[2]210
[551]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 {
[2]218
[551]219 LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
220 CHAR s[80];
[2]221
[551]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);
[2]235 }
[551]236 break;
237 }
238 return 0;
[2]239
[551]240 case WM_COMMAND:
241 switch (SHORT1FROMMP(mp1)) {
242 case ATR_LEAVEALL:
243 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
244 break;
[2]245
[551]246 case ATR_NOW:
247 {
248 time_t t;
249 struct tm *tm;
[2]250
[551]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;
[2]267
[551]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 = 0L;
281 FILESTATUS3 fi;
282 SHORT x;
283 APIRET rc;
284 USHORT state;
[2]285
[551]286 li = INSTDATA(hwnd);
287 if (!li) {
288 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
289 break;
290 }
291 {
292 CHAR szBuffer[CCHMAXPATH + 1];
293 INT numfiles = 0, numalloc = 0, error;
[2]294
[551]295 if (li->list)
296 FreeList(li->list);
297 li->list = NULL;
298 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
299 MPFROMSHORT(LIT_FIRST), MPVOID);
300 if (x >= 0) {
301 do {
302 *szBuffer = 0;
303 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
304 MPFROM2SHORT(x, CCHMAXPATH),
305 MPFROMP(szBuffer));
306 if (*szBuffer && isalpha(*szBuffer) &&
307 !(driveflags[toupper(*szBuffer) - 'A'] &
308 DRIVE_NOTWRITEABLE)) {
309 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
310 if (error) {
311 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
312 break;
313 }
314 }
315 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX,
316 LM_QUERYSELECTION,
317 MPFROMSHORT(x), MPVOID);
318 } while (x >= 0);
319 }
320 }
321 if (!li->list || !li->list[0]) {
322 Runtime_Error(pszSrcFile, __LINE__, "list build failed");
323 break;
324 }
325 for (x = 0; li->list[x]; x++) {
326 DosError(FERR_DISABLEHARDERR);
327 rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi,
328 (ULONG) sizeof(fi));
329 if (rc)
330 continue;
331 if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) {
332 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp),
333 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
334 fi.fdateLastWrite.year = temp - 1980L;
335 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE,
336 MPFROMP(&temp), MPFROM2SHORT(0,
337 SPBQ_DONOTUPDATE));
338 fi.fdateLastWrite.month = temp;
339 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp),
340 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
341 fi.fdateLastWrite.day = temp;
342 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp),
343 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
344 fi.ftimeLastWrite.hours = temp;
345 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE,
346 MPFROMP(&temp), MPFROM2SHORT(0,
347 SPBQ_DONOTUPDATE));
348 fi.ftimeLastWrite.minutes = temp;
349 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE,
350 MPFROMP(&temp), MPFROM2SHORT(0,
351 SPBQ_DONOTUPDATE));
352 fi.ftimeLastWrite.twosecs = (temp / 2L);
353 }
354 fi.attrFile &= (~FILE_DIRECTORY);
355 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY,
356 BM_QUERYCHECK, MPVOID, MPVOID);
357 if (!state)
358 fi.attrFile &= (~FILE_READONLY);
359 else if (state == 1)
360 fi.attrFile |= FILE_READONLY;
361 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_HIDDEN, BM_QUERYCHECK,
362 MPVOID, MPVOID);
363 if (!state)
364 fi.attrFile &= (~FILE_HIDDEN);
365 else if (state == 1)
366 fi.attrFile |= FILE_HIDDEN;
367 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_SYSTEM, BM_QUERYCHECK,
368 MPVOID, MPVOID);
369 if (!state)
370 fi.attrFile &= (~FILE_SYSTEM);
371 else if (state == 1)
372 fi.attrFile |= FILE_SYSTEM;
373 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_ARCHIVED,
374 BM_QUERYCHECK, MPVOID, MPVOID);
375 if (!state)
376 fi.attrFile &= (~FILE_ARCHIVED);
377 else if (state == 1)
378 fi.attrFile |= FILE_ARCHIVED;
379 DosSetPathInfo(li->list[x], FIL_STANDARD, (PVOID) & fi,
380 (ULONG) sizeof(FILESTATUS3), 0L);
381 }
382 WinDismissDlg(hwnd, 1);
383 }
384 break;
[2]385
[551]386 case IDM_HELP:
387 if (hwndHelp)
388 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
389 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
390 MPFROMSHORT(HM_RESOURCEID));
391 break;
[2]392
[551]393 case DID_CANCEL:
394 WinDismissDlg(hwnd, 0);
395 break;
396 }
397 return 0;
[2]398 }
[551]399 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]400}
[793]401
402#pragma alloc_text(ATTRIBS,AttrListDlgProc)
Note: See TracBrowser for help on using the repository browser.