Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
#include "std.h"
2
 
3
#include "resource.h"
4
 
5
#include "emul.h"
6
#include "vars.h"
7
#include "gui.h"
8
 
9
#include "util.h"
10
 
11
struct FILEPREVIEWINFO
12
{
13
   OPENFILENAME *ofn;
14
   struct { HWND h; int dx,dy; } list;
15
   struct { HWND h; } dlg;
16
   struct { HWND h; } innerdlg;
17
 
18
   void OnResize();
19
   void OnChange();
20
 
21
   void PreviewTRD(char *filename);
22
   void PreviewSCL(char *filename);
23
   void Preview(unsigned char *cat);
24
 
25
} FilePreviewInfo;
26
 
27
void FILEPREVIEWINFO::OnResize()
28
{
29
   const int dlgbase = 280;
30
   const int listbase = 136;
31
 
32
   RECT dlgrc; GetWindowRect(dlg.h, &dlgrc);
33
   list.dy = (dlgrc.bottom - dlgrc.top) - dlgbase + listbase;
34
 
35
   SetWindowPos(list.h, 0, 0, 0, list.dx, list.dy,
36
                  SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
37
}
38
 
39
void FILEPREVIEWINFO::OnChange()
40
{
41
   char filename[512];
42
   int r = SendMessage(dlg.h, CDM_GETFILEPATH, sizeof(filename), (LPARAM) filename);
43
   SendMessage(list.h, LVM_DELETEALLITEMS, 0, 0);
44
   if (r < 0 || (GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY)) return;
45
 
46
   #if 0 // too slow for every file
47
   TRKCACHE t;
48
   FDD TestDrive;
49
   unsigned char type = what_is(filename);
50
   if (type < snSCL) return;
51
   TestDrive.emptydisk();
52
   if (!TestDrive.read(type)) return;
53
   #endif
54
 
55
   char *ext = strrchr(filename, '.');
56
   if (!ext) return;
57
   ext++;
58
 
59
   if (!stricmp(ext, "trd")) PreviewTRD(filename);
60
   if (!stricmp(ext, "scl")) PreviewSCL(filename);
61
}
62
 
63
void FILEPREVIEWINFO::Preview(unsigned char *cat)
64
{
65
   ::dlg = innerdlg.h;
66
   unsigned char bas = getcheck(IDC_PREVIEW_BASIC);
67
   unsigned char del = getcheck(IDC_PREVIEW_ERASED);
68
 
69
   int count = 0;
70
   char fn[10];
71
 
72
   LVITEM item;
73
   item.mask = LVIF_TEXT;
74
   item.pszText = fn;
75
 
76
   for (unsigned p = 0; p < 0x800; p += 0x10) {
77
      if (!cat[p]) break;
78
      if (!del && cat[p] == 1) continue;
79
      if (bas && cat[p+8] != 'B') continue;
80
 
81
      memcpy(fn, cat+p, 8); fn[8] = 0;
82
      item.iItem = count++;
83
      item.iSubItem = 0;
84
      item.iItem = SendMessage(list.h, LVM_INSERTITEM, 0, (LPARAM) &item);
85
 
86
      fn[0] = cat[p+8]; fn[1] = 0;
87
      item.iSubItem = 1;
88
      SendMessage(list.h, LVM_SETITEM, 0, (LPARAM) &item);
89
 
90
      sprintf(fn, "%d", cat[p+13]);
91
      item.iSubItem = 2;
92
      SendMessage(list.h, LVM_SETITEM, 0, (LPARAM) &item);
93
   }
94
}
95
 
96
void FILEPREVIEWINFO::PreviewTRD(char *filename)
97
{
98
   unsigned char cat[0x800];
99
   FILE *ff = fopen(filename, "rb");
100
   int sz = fread(cat, 1, 0x800, ff);
101
   fclose(ff);
102
   if (sz != 0x800) return;
103
   Preview(cat);
104
}
105
 
106
void FILEPREVIEWINFO::PreviewSCL(char *filename)
107
{
108
   unsigned char cat[0x800] = { 0 };
109
   unsigned char hdr[16];
110
 
111
   FILE *ff = fopen(filename, "rb");
112
   unsigned sz = fread(hdr, 1, 9, ff), count = 0;
113
 
114
   if (sz == 9 && !memcmp(hdr, "SINCLAIR", 8)) {
115
      unsigned max = hdr[8]; sz = max*14;
116
      unsigned char *cat1 = (unsigned char*)alloca(sz);
117
      if (fread(cat1, 1, sz, ff) == sz) {
118
         for (unsigned i = 0; i < sz; i += 14) {
119
            memcpy(cat+count*0x10, cat1+i, 14);
120
            count++; if (count == 0x80) break;
121
         }
122
      }
123
   }
124
 
125
   fclose(ff);
126
   if (count) Preview(cat);
127
}
128
 
129
UINT_PTR CALLBACK PreviewDlgProc(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
130
{
131
   switch (msg)
132
   {
133
      case WM_INITDIALOG:
134
      {
135
         FilePreviewInfo.ofn = (OPENFILENAME*)lp;
136
         FilePreviewInfo.innerdlg.h = dlg;
137
         FilePreviewInfo.dlg.h = GetParent(dlg);
138
         FilePreviewInfo.list.h = GetDlgItem(dlg, IDC_PREVIEW_BOX);
139
 
140
         unsigned exflags = LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT;
141
         SendMessage(FilePreviewInfo.list.h, LVM_SETEXTENDEDLISTVIEWSTYLE, exflags, exflags);
142
 
143
         LVCOLUMN sizeCol;
144
         sizeCol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
145
         sizeCol.fmt = LVCFMT_LEFT;
146
 
147
         sizeCol.cx = 80;
148
         sizeCol.pszText = PSTR("Filename");
149
         SendMessage(FilePreviewInfo.list.h, LVM_INSERTCOLUMN, 0, (LPARAM)&sizeCol);
150
 
151
         sizeCol.cx = 40;
152
         sizeCol.pszText = PSTR("Ext");
153
         SendMessage(FilePreviewInfo.list.h, LVM_INSERTCOLUMN, 1, (LPARAM)&sizeCol);
154
 
155
         sizeCol.cx = 50;
156
         sizeCol.pszText = PSTR("Size");
157
         SendMessage(FilePreviewInfo.list.h, LVM_INSERTCOLUMN, 2, (LPARAM)&sizeCol);
158
 
159
         RECT rc; GetWindowRect(FilePreviewInfo.list.h, &rc);
160
         FilePreviewInfo.list.dx = rc.right - rc.left;
161
         FilePreviewInfo.list.dy = rc.bottom - rc.top;
162
 
163
         break;
164
      }
165
 
166
      case WM_COMMAND:
167
         if (LOWORD(wp) == IDC_PREVIEW_BASIC || LOWORD(wp) == IDC_PREVIEW_ERASED)
168
            FilePreviewInfo.OnChange();
169
         break;
170
 
171
      case WM_SIZE:
172
         FilePreviewInfo.OnResize();
173
         break;
174
 
175
      case WM_NOTIFY:
176
         if (((OFNOTIFY*)lp)->hdr.code == CDN_SELCHANGE)
177
            FilePreviewInfo.OnChange();
178
         break;
179
 
180
   }
181
   return 0;
182
}
183
 
184
int GetSnapshotFileName(OPENFILENAME *ofn, int save)
185
{
186
   ofn->Flags |= save? OFN_PATHMUSTEXIST : OFN_FILEMUSTEXIST;
187
   ofn->Flags |= OFN_HIDEREADONLY | OFN_EXPLORER | OFN_NOCHANGEDIR | OFN_ENABLESIZING;
188
   ofn->Flags |= OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;
189
 
190
   ofn->hwndOwner = GetForegroundWindow();
191
   ofn->hInstance = hIn;
192
   ofn->lpstrTitle = save? "Save Snapshot / Disk / Tape as" : "Load Snapshot / Disk / Tape";
193
 
194
   ofn->lpfnHook          = PreviewDlgProc;
195
   ofn->lpTemplateName    = MAKEINTRESOURCE(IDD_FILEPREVIEW);
196
   ofn->lpstrInitialDir   = temp.SnapDir;
197
 
198
   BOOL res = save? GetSaveFileName(ofn) : GetOpenFileName(ofn);
199
 
200
   if (res)
201
   {
202
       strcpy(temp.SnapDir, ofn->lpstrFile);
203
       char *Ptr = strrchr(temp.SnapDir, '\\');
204
       if(Ptr)
205
        *Ptr = 0;
206
       return res;
207
   }
208
   DWORD errcode = CommDlgExtendedError();
209
   if (!errcode) return 0;
210
 
211
   color(CONSCLR_ERROR);
212
   printf("Error while selecting file. Code is 0x%08lX\n", errcode);
213
   return 0;
214
}