Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




1 VERSION 4.00
2 Begin VB.Form MpqEx 
3    Caption         =   "WinMPQ"
4    ClientHeight    =   3510
5    ClientLeft      =   1245
6    ClientTop       =   1785
7    ClientWidth     =   6690
8    Height          =   4200
9    Icon            =   "listing.frx":0000
10    KeyPreview      =   -1  'True
11    Left            =   1185
12    LinkTopic       =   "Form1"
13    ScaleHeight     =   3510
14    ScaleWidth      =   6690
15    Top             =   1155
16    Width           =   6810
17    Begin VB.Timer Timer1 
18       Enabled         =   0   'False
19       Interval        =   2500
20       Left            =   6120
21       Top             =   2160
22    End
23    Begin VB.TextBox txtCommand 
24       BackColor       =   &H8000000F&
25       Height          =   285
26       Left            =   1440
27       TabIndex        =   1
28       Top             =   2880
29       Width           =   4695
30    End
31    Begin VB.CommandButton cmdGo 
32       Caption         =   "Go"
33       Height          =   285
34       Left            =   6120
35       TabIndex        =   2
36       Top             =   2880
37       Width           =   495
38    End
39    Begin VB.ComboBox mFilter 
40       Height          =   315
41       ItemData        =   "listing.frx":27A2
42       Left            =   5220
43       List            =   "listing.frx":27A9
44       Sorted          =   -1  'True
45       TabIndex        =   3
46       Text            =   "*"
47       Top             =   30
48       Width           =   675
49    End
50    Begin MSComctlLib.Toolbar Toolbar 
51       Align           =   1  'Align Top
52       Height          =   345
53       Left            =   0
54       TabIndex        =   5
55       Top             =   0
56       Width           =   6690
57       _ExtentX        =   11800
58       _ExtentY        =   609
59       ButtonWidth     =   1535
60       ButtonHeight    =   556
61       Wrappable       =   0   'False
62       Appearance      =   1
63       Style           =   1
64       ImageList       =   "ImageList1"
65       _Version        =   393216
66       BeginProperty Buttons {66833FE8-8583-11D1-B16A-00C0F0283628} 
67          NumButtons      =   8
68          BeginProperty Button1 {66833FEA-8583-11D1-B16A-00C0F0283628} 
69             Caption         =   "New"
70             Key             =   "New"
71             Description     =   "Create a new archive"
72             ToolTipText     =   "Create a new archive"
73             ImageIndex      =   1
74          EndProperty
75          BeginProperty Button2 {66833FEA-8583-11D1-B16A-00C0F0283628} 
76             Caption         =   "Open"
77             Key             =   "Open"
78             Description     =   "Open an existing archive"
79             ToolTipText     =   "Open an existing archive"
80          EndProperty
81          BeginProperty Button3 {66833FEA-8583-11D1-B16A-00C0F0283628} 
82             Enabled         =   0   'False
83             Caption         =   "Add"
84             Key             =   "Add"
85             Description     =   "Add files to the archive"
86             ToolTipText     =   "Add files to the archive"
87          EndProperty
88          BeginProperty Button4 {66833FEA-8583-11D1-B16A-00C0F0283628} 
89             Enabled         =   0   'False
90             Caption         =   "Add Folder"
91             Key             =   "Add Folder"
92             Description     =   "Add files from a folder and its subfolders"
93             ToolTipText     =   "Add files from a folder and its subfolders"
94          EndProperty
95          BeginProperty Button5 {66833FEA-8583-11D1-B16A-00C0F0283628} 
96             Enabled         =   0   'False
97             Caption         =   "Extract"
98             Key             =   "Extract"
99             Description     =   "Extract files from the archive"
100             ToolTipText     =   "Extract files from the archive"
101          EndProperty
102          BeginProperty Button6 {66833FEA-8583-11D1-B16A-00C0F0283628} 
103             Enabled         =   0   'False
104             Caption         =   "Compact"
105             Key             =   "Compact"
106             Description     =   "Clear deleted files from the archive"
107             ToolTipText     =   "Clear deleted files from the archive"
108          EndProperty
109          BeginProperty Button7 {66833FEA-8583-11D1-B16A-00C0F0283628} 
110             Enabled         =   0   'False
111             Key             =   "filterspace"
112             Style           =   4
113             Object.Width           =   675
114          EndProperty
115          BeginProperty Button8 {66833FEA-8583-11D1-B16A-00C0F0283628} 
116             Enabled         =   0   'False
117             Caption         =   "List"
118             Key             =   "List"
119          EndProperty
120       EndProperty
121    End
122    Begin VB.Label Label1 
123       AutoSize        =   -1  'True
124       Caption         =   " MPQ2k &Command  "
125       Height          =   195
126       Left            =   0
127       TabIndex        =   6
128       Top             =   2880
129       Width           =   1425
130    End
131    Begin MSComctlLib.ImageList ImageList1 
132       Left            =   6120
133       Top             =   1560
134       _ExtentX        =   1005
135       _ExtentY        =   1005
136       BackColor       =   -2147483643
137       ImageWidth      =   1
138       ImageHeight     =   1
139       MaskColor       =   12632256
140       _Version        =   393216
141       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
142          NumListImages   =   1
143          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
144             Picture         =   "listing.frx":27B0
145             Key             =   ""
146          EndProperty
147       EndProperty
148    End
149    Begin MSComctlLib.StatusBar StatBar 
150       Align           =   2  'Align Bottom
151       Height          =   300
152       Left            =   0
153       TabIndex        =   4
154       Top             =   3210
155       Width           =   6690
156       _ExtentX        =   11800
157       _ExtentY        =   529
158       _Version        =   393216
159       BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628} 
160          NumPanels       =   2
161          BeginProperty Panel1 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
162             AutoSize        =   1
163             Object.Width           =   5664
164             MinWidth        =   2
165             Key             =   "FileInfo"
166          EndProperty
167          BeginProperty Panel2 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
168             AutoSize        =   1
169             Object.Width           =   5664
170             MinWidth        =   2
171             Key             =   "MpqInfo"
172          EndProperty
173       EndProperty
174    End
175    Begin MSComctlLib.ListView List 
176       Height          =   2295
177       Left            =   0
178       TabIndex        =   0
179       Top             =   360
180       Width           =   6015
181       _ExtentX        =   10610
182       _ExtentY        =   4048
183       View            =   3
184       Arrange         =   2
185       Sorted          =   -1  'True
186       MultiSelect     =   -1  'True
187       LabelWrap       =   -1  'True
188       HideSelection   =   -1  'True
189       OLEDragMode     =   1
190       OLEDropMode     =   1
191       AllowReorder    =   -1  'True
192       _Version        =   393217
193       ForeColor       =   -2147483640
194       BackColor       =   -2147483643
195       BorderStyle     =   1
196       Appearance      =   1
197       BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} 
198          Name            =   "MS Sans Serif"
199          Size            =   8.25
200          Charset         =   0
201          Weight          =   400
202          Underline       =   0   'False
203          Italic          =   0   'False
204          Strikethrough   =   0   'False
205       EndProperty
206       OLEDragMode     =   1
207       OLEDropMode     =   1
208       NumItems        =   6
209       BeginProperty ColumnHeader(1) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
210          Key             =   "N"
211          Text            =   "Name"
212          Object.Width           =   5080
213       EndProperty
214       BeginProperty ColumnHeader(2) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
215          Alignment       =   1
216          SubItemIndex    =   1
217          Key             =   "S"
218          Text            =   "Size"
219          Object.Width           =   1905
220       EndProperty
221       BeginProperty ColumnHeader(3) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
222          Alignment       =   1
223          SubItemIndex    =   2
224          Key             =   "R"
225          Text            =   "Ratio"
226          Object.Width           =   1129
227       EndProperty
228       BeginProperty ColumnHeader(4) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
229          Alignment       =   1
230          SubItemIndex    =   3
231          Key             =   "PK"
232          Text            =   "Packed"
233          Object.Width           =   1905
234       EndProperty
235       BeginProperty ColumnHeader(5) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
236          SubItemIndex    =   4
237          Key             =   "LCID"
238          Text            =   "Locale ID"
239          Object.Width           =   1129
240       EndProperty
241       BeginProperty ColumnHeader(6) {BDD1F052-858B-11D1-B16A-00C0F0283628} 
242          SubItemIndex    =   5
243          Key             =   "A"
244          Text            =   "Attributes"
245          Object.Width           =   1129
246       EndProperty
247    End
248    Begin VB.Menu mnuFile 
249       Caption         =   "&File"
250       Begin VB.Menu mnuFNew 
251          Caption         =   "&New..."
252          Shortcut        =   ^N
253       End
254       Begin VB.Menu mnuFOpen 
255          Caption         =   "&Open..."
256          Shortcut        =   ^O
257       End
258       Begin VB.Menu mnuFReopen 
259          Caption         =   "&Reopen Mpq"
260          Shortcut        =   {F5}
261       End
262       Begin VB.Menu mnuFScript 
263          Caption         =   "Run Mo'PaQ 2000 &Script..."
264          Shortcut        =   ^S
265       End
266       Begin VB.Menu mnuFSep 
267          Caption         =   "-"
268       End
269       Begin VB.Menu mnuFExit 
270          Caption         =   "E&xit"
271       End
272       Begin VB.Menu mnuFRecent 
273          Caption         =   "-"
274          Index           =   0
275          Visible         =   0   'False
276       End
277    End
278    Begin VB.Menu mnuMpq 
279       Caption         =   "&Mpq"
280       Enabled         =   0   'False
281       Begin VB.Menu mnuMItem 
282          Caption         =   "&Open"
283          Index           =   0
284          Visible         =   0   'False
285       End
286       Begin VB.Menu mnuMSep1 
287          Caption         =   "-"
288          Visible         =   0   'False
289       End
290       Begin VB.Menu mnuMExtract 
291          Caption         =   "&Extract"
292          Shortcut        =   ^E
293       End
294       Begin VB.Menu mnuMDelete 
295          Caption         =   "&Delete         Del or"
296          Shortcut        =   ^D
297       End
298       Begin VB.Menu mnuMRename 
299          Caption         =   "Rena&me"
300          Shortcut        =   ^R
301       End
302       Begin VB.Menu mnuMChLCID 
303          Caption         =   "Change Locale &ID..."
304          Shortcut        =   ^I
305       End
306       Begin VB.Menu mnuMSep2 
307          Caption         =   "-"
308       End
309       Begin VB.Menu mnuMAdd 
310          Caption         =   "&Add..."
311          Shortcut        =   ^A
312       End
313       Begin VB.Menu mnuMAddFolder 
314          Caption         =   "Add &Folder..."
315          Shortcut        =   ^F
316       End
317       Begin VB.Menu mnuMCompression 
318          Caption         =   "&Compression"
319          Begin VB.Menu mnuMCAuto 
320             Caption         =   "Auto-Select"
321             Checked         =   -1  'True
322             Shortcut        =   {F4}
323          End
324          Begin VB.Menu mnuMCSep 
325             Caption         =   "-"
326          End
327          Begin VB.Menu mnuMCNone 
328             Caption         =   "&None"
329             Shortcut        =   {F2}
330          End
331          Begin VB.Menu mnuMCStandard 
332             Caption         =   "&Standard"
333             Shortcut        =   {F3}
334          End
335          Begin VB.Menu mnuMCDeflate 
336             Caption         =   "&Deflate"
337             Shortcut        =   {F9}
338          End
339          Begin VB.Menu mnuMCAudio 
340             Caption         =   "&Audio"
341             Begin VB.Menu mnuMCALowest 
342                Caption         =   "&Lowest (Best quality)"
343                Shortcut        =   {F6}
344             End
345             Begin VB.Menu mnuMCAMedium 
346                Caption         =   "&Medium"
347                Shortcut        =   {F7}
348             End
349             Begin VB.Menu mnuMCAHighest 
350                Caption         =   "&Highest (Least space)"
351                Shortcut        =   {F8}
352             End
353          End
354       End
355       Begin VB.Menu mnuMEncrypt 
356          Caption         =   "Encr&ypt Files"
357       End
358       Begin VB.Menu mnuMCompact 
359          Caption         =   "Com&pact"
360          Shortcut        =   ^P
361       End
362       Begin VB.Menu mnuMAddToList 
363          Caption         =   "Add File to Li&sting..."
364          Shortcut        =   ^K
365       End
366       Begin VB.Menu mnuMSaveList 
367          Caption         =   "Save File &List..."
368          Shortcut        =   ^L
369       End
370    End
371    Begin VB.Menu mnuTools 
372       Caption         =   "&Tools"
373       Begin VB.Menu mnuTItem 
374          Caption         =   "(Empty)"
375          Enabled         =   0   'False
376          Index           =   0
377       End
378       Begin VB.Menu mnuTSep 
379          Caption         =   "-"
380       End
381       Begin VB.Menu mnuTMpqEmbed 
382          Caption         =   "MPQ Embedder"
383       End
384       Begin VB.Menu mnuTSep2 
385          Caption         =   "-"
386       End
387       Begin VB.Menu mnuTAdd 
388          Caption         =   "&Add/Remove..."
389       End
390    End
391    Begin VB.Menu mnuOptions 
392       Caption         =   "&Options..."
393    End
394    Begin VB.Menu mnuHelp 
395       Caption         =   "&Help"
396       Begin VB.Menu mnuHReadme 
397          Caption         =   "View &Readme..."
398          Shortcut        =   {F1}
399       End
400       Begin VB.Menu mnuHSep 
401          Caption         =   "-"
402       End
403       Begin VB.Menu mnuHAbout 
404          Caption         =   "&About..."
405       End
406    End
407    Begin VB.Menu mnuPopup 
408       Caption         =   "Popup Menu"
409       Visible         =   0   'False
410       Begin VB.Menu mnuPItem 
411          Caption         =   "&Open"
412          Index           =   0
413       End
414       Begin VB.Menu mnuPSep1 
415          Caption         =   "-"
416       End
417       Begin VB.Menu mnuPTools 
418          Caption         =   "&Tools"
419          Begin VB.Menu mnuPTItem 
420             Caption         =   "(Empty)"
421             Index           =   0
422          End
423       End
424       Begin VB.Menu mnuPSep2 
425          Caption         =   "-"
426       End
427       Begin VB.Menu mnuPExtract 
428          Caption         =   "&Extract"
429       End
430       Begin VB.Menu mnuPDelete 
431          Caption         =   "&Delete"
432       End
433       Begin VB.Menu mnuPRename 
434          Caption         =   "Rena&me"
435       End
436       Begin VB.Menu mnuPChLCID 
437          Caption         =   "Change Locale &ID..."
438       End
439    End
440 End
441 Attribute VB_Name = "MpqEx"
442 Attribute VB_Creatable = False
443 Attribute VB_Exposed = False
444 Option Explicit
446 Dim txtCommandHasFocus As Boolean, ShiftState As Boolean
447 Dim OpenFiles() As String, OpenFileDates() As Date, MpqDate As Date
448 Sub AddRecentFile(rFileName As String)
449 Dim bNum As Long, fNum As Long
450 NewKey AppKey + "Recent\"
451 For bNum = 1 To 8
452     If LCase(GetReg(AppKey + "Recent\File" + CStr(bNum))) = LCase(rFileName) Then
453         For fNum = bNum To 7
454             If Not IsEmpty(GetReg(AppKey + "Recent\File" + CStr(fNum + 1))) Then
455                 SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
456             Else
457                 Exit For
458             End If
459         Next fNum
460         SetReg AppKey + "Recent\File" + CStr(fNum), rFileName
461         Exit For
462     End If
463 Next bNum
464 If fNum = 0 Then
465     For bNum = 1 To 8
466         If IsEmpty(GetReg(AppKey + "Recent\File" + CStr(bNum))) Then
467             SetReg AppKey + "Recent\File" + CStr(bNum), rFileName
468             Exit For
469         ElseIf bNum = 8 Then
470             For fNum = 1 To 7
471                 SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
472             Next fNum
473             SetReg AppKey + "Recent\File" + CStr(bNum), rFileName
474         End If
475     Next bNum
476 End If
477 BuildRecentFileList
478 End Sub
479 Sub BuildMpqActionList()
480 Dim Shift As Integer
481 On Error GoTo NotSelected
482 List.SelectedItem.Tag = List.SelectedItem.Tag
483 On Error GoTo 0
484 If List.SelectedItem.Selected = True Then
485     Shift = 0
486     If ShiftState = True Then Shift = vbShiftMask
487     mnuMItem(0).Visible = True
488     mnuMSep1.Visible = True
489     BuildPopup List.SelectedItem.Tag, Shift, mnuMpq, mnuMItem
490 Else
491     GoTo NotSelected
492 End If
493 Exit Sub
494 NotSelected:
495 Dim PItem As Menu
496 For Each PItem In mnuMItem
497     If PItem.Index <> 0 Then Unload PItem
498 Next PItem
499 mnuMItem(0).Visible = False
500 mnuMSep1.Visible = False
501 End Sub
502 Sub BuildPopup(FileName As String, Shift As Integer, mnuRoot As Menu, mnuItem)
503 Dim aNum As Long, aItem As String, aName As String, bNum As Long, PItem As Menu, dItem As String
504 mnuRoot.Tag = 0
505 For Each PItem In mnuItem
506     If PItem.Index <> 0 Then Unload PItem
507 Next PItem
508 If InStr(FileName, ".") = 0 Then
509     GoSub AddUnknown
510 Else
511     For bNum = 1 To Len(FileName)
512         If InStr(bNum, FileName, ".") > 0 Then
513             bNum = InStr(bNum, FileName, ".")
514         Else
515             Exit For
516         End If
517     Next bNum
518     aName = Mid(FileName, bNum - 1)
519     aName = GetReg("HKEY_CLASSES_ROOT\" + aName + "\")
520     If aName = "" Then
521         GoSub AddUnknown
522         Exit Sub
523     End If
524     dItem = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\", "open")
525     dItem = GetReg(SharedAppKey + "FileDefaultActions\" + aName, dItem)
526     If dItem <> "" And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\command\")) Then
527         If LCase(dItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\")) Then
528             mnuItem(0).Caption = "Op&en with..."
529         Else
530             mnuItem(0).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + dItem + "\", "&" + UCase(Left(dItem, 1)) + Mid(dItem, 2))
531         End If
532         mnuItem(0).Tag = dItem
533         mnuRoot.Tag = 1
534         aNum = 0
535         bNum = 1
536     Else
537         aItem = EnumKey("HKEY_CLASSES_ROOT\" + aName + "\shell\", 0)
538         If aItem = "" Then
539             GoSub AddUnknown
540             Exit Sub
541         End If
542         If Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\command\")) Then
543             If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\")) Then
544                 mnuItem(0).Caption = "Op&en with..."
545             Else
546                 mnuItem(0).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
547             End If
548             mnuItem(0).Tag = aItem
549             mnuRoot.Tag = 1
550             aNum = 1
551             bNum = 1
552         Else
553             aNum = 1
554             bNum = 0
555         End If
556     End If
557     Do
558         aItem = EnumKey("HKEY_CLASSES_ROOT\" + aName + "\shell\", aNum)
559         If aItem <> "" Then
560             If LCase(aItem) <> LCase(dItem) And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\command\")) Then
561                 On Error Resume Next
562                 Load mnuItem(bNum)
563                 On Error GoTo 0
564                 If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\")) Then
565                     mnuItem(bNum).Caption = "Op&en with..."
566                 Else
567                     mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\" + aName + "\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
568                 End If
569                 mnuItem(bNum).Tag = aItem
570                 mnuRoot.Tag = mnuRoot.Tag + 1
571                 bNum = bNum + 1
572             End If
573             aNum = aNum + 1
574         End If
575     Loop Until aItem = ""
576     If Shift And vbShiftMask Then GoSub AddUnknown
577 End If
578 Exit Sub
579 AddUnknown:
580     aNum = 0
581     bNum = mnuRoot.Tag
582     dItem = ""
583     If bNum = 0 Then
584         dItem = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\", "open")
585         dItem = GetReg(SharedAppKey + "FileDefaultActions\Unknown", dItem)
586         If dItem <> "" And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\command\")) Then
587             If LCase(dItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\")) Then
588                 mnuItem(bNum).Caption = "Op&en with..."
589             Else
590                 mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + dItem + "\", "&" + UCase(Left(dItem, 1)) + Mid(dItem, 2))
591             End If
592             mnuItem(bNum).Tag = dItem
593             bNum = bNum + 1
594         End If
595     End If
596     Do
597         aItem = EnumKey("HKEY_CLASSES_ROOT\Unknown\shell\", aNum)
598         If aItem <> "" Then
599             If LCase(aItem) <> LCase(dItem) And Not IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\command\")) Then
600                 On Error Resume Next
601                 Load mnuItem(bNum)
602                 On Error GoTo 0
603                 If LCase(aItem) = "openas" And IsEmpty(GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\")) Then
604                     mnuItem(bNum).Caption = "Op&en with..."
605                 Else
606                     mnuItem(bNum).Caption = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + aItem + "\", "&" + UCase(Left(aItem, 1)) + Mid(aItem, 2))
607                 End If
608                 mnuItem(bNum).Tag = aItem
609                 bNum = bNum + 1
610             End If
611             aNum = aNum + 1
612         End If
613     Loop Until aItem = ""
614 Return
615 End Sub
616 Sub ChangeLCID(NewLCID As Long)
617 Dim fNum As Long, hMPQ As Long
618 fNum = 1
619 hMPQ = mOpenMpq(CD.FileName)
620 If hMPQ Then
621     Do While fNum <= List.ListItems.Count
622         If List.ListItems.Item(fNum).Selected Then
623             StatBar.Style = 1
624             StatBar.SimpleText = "Changing locale ID of " + List.ListItems.Item(fNum).Tag + " to " + CStr(NewLCID) + "..."
625             MousePointer = 11
626             MpqSetFileLocale hMPQ, List.ListItems.Item(fNum).Tag, List.ListItems.Item(fNum).ListSubItems(4).Tag, NewLCID
627             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
628             List.ListItems.Item(fNum).ListSubItems(4).Tag = NewLCID
629             List.ListItems.Item(fNum).ListSubItems(4).Text = NewLCID
630         End If
631         fNum = fNum + 1
632     Loop
633     MpqCloseUpdatedArchive hMPQ, 0
634 End If
635 StatBar.Style = 0
636 StatBar.SimpleText = ""
637 MousePointer = 0
638 ShowSelected
639 ShowTotal
640 End Sub
641 Sub DelRecentFile(rFileName As String)
642 Dim bNum As Long, fNum As Long
643 For bNum = 1 To 8
644     If LCase(GetReg(AppKey + "Recent\File" + CStr(bNum))) = LCase(rFileName) Then
645         For fNum = bNum To 7
646             SetReg AppKey + "Recent\File" + CStr(fNum), GetReg(AppKey + "Recent\File" + CStr(fNum + 1))
647         Next fNum
648         DelReg AppKey + "Recent\File" + CStr(8)
649         Exit For
650     End If
651 Next bNum
652 BuildRecentFileList
653 End Sub
654 Sub AddToListing(AddedFile As String)
655 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, hFile As Long
656 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
657     If SFileOpenFileEx(hMPQ, AddedFile, 0, hFile) Then
658         L1 = AddedFile
659         fSize = SFileGetFileSize(hFile, 0)
660         cSize = SFileGetFileInfo(hFile, 6)
661         If fSize / 1024 > 0 And fSize / 1024 < 1 Then
662             L2 = "<1KB"
663         ElseIf fSize = 0 Then
664             L2 = "0KB"
665         Else
666             L2 = CStr(Int(fSize / 1024)) + "KB"
667         End If
668         If cSize / 1024 > 0 And cSize / 1024 < 1 Then
669             L4 = "<1KB"
670         ElseIf cSize = 0 Then
671             L4 = "0KB"
672         Else
673             L4 = CStr(Int(cSize / 1024)) + "KB"
674         End If
675         If fSize <> 0 Then
676             L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
677         Else
678             L3 = "0%"
679         End If
680         fFlags = SFileGetFileInfo(hFile, 7)
681         L6 = SFileGetFileInfo(hFile, SFILE_INFO_LOCALEID)
682         If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
683         If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
684         If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
685         On Error Resume Next
686         lIndex = List.ListItems.Add(, L1, L1).Index
687         On Error GoTo 0
688         If lIndex = 0 Then
689             lIndex = List.ListItems.Item(L1).Index
690             List.ListItems.Item(L1).ListSubItems.Clear
691         End If
692         List.ListItems.Item(lIndex).Tag = L1
693         List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
694         If fSize <> 0 Then
695             List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
696         Else
697             List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
698         End If
699         List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
700         List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
701         List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
702         SFileCloseFile hFile
703     End If
704     SFileCloseArchive hMPQ
705 End If
706 End Sub
707 Sub FileActionClick(mnuRoot As Menu, mnuItem, Index As Integer)
708 Dim fNum As Long, Path As String, fName As String, fName2 As String, bNum As Long, AlreadyInList As Boolean, hMPQ As Long
709 Path = App.Path
710 If Right(Path, 1) <> "\" Then Path = Path + "\"
711 Path = Path + "Temp_extract\"
712 If ExtractPathNum = -1 Then
713     fNum = 0
714     Do
715     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
716     fNum = fNum + 1
717     Loop
718     ExtractPathNum = fNum
719 End If
720 Path = Path + CStr(ExtractPathNum) + "\"
721 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
722 For fNum = 1 To List.ListItems.Count
723     If List.ListItems.Item(fNum).Selected Then
724         StatBar.Style = 1
725         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
726         MousePointer = 11
727         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
728         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
729         SFileSetLocale LocaleID
730         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
731             For bNum = 1 To UBound(OpenFiles)
732                 If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
733                     AlreadyInList = True
734                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
735                     Exit For
736                 End If
737             Next bNum
738             If AlreadyInList = False Then
739                 ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
740                 OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
741                 If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
742             End If
743         End If
744         StatBar.Style = 1
745         StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
746         fName = List.ListItems.Item(fNum).Tag
747         ExecuteFile Path + fName, Index, mnuRoot, mnuItem
748         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
749     End If
750 Next fNum
751 SFileCloseArchive hMPQ
752 StatBar.Style = 0
753 StatBar.SimpleText = ""
754 MousePointer = 0
755 End Sub
756 Sub MpqAddToListing(hMPQ As Long, AddedFile As String)
757 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long, hFile As Long
758 If SFileOpenFileEx(hMPQ, AddedFile, 0, hFile) Then
759     L1 = AddedFile
760     fSize = SFileGetFileSize(hFile, 0)
761     cSize = SFileGetFileInfo(hFile, 6)
762     If fSize / 1024 > 0 And fSize / 1024 < 1 Then
763         L2 = "<1KB"
764     ElseIf fSize = 0 Then
765         L2 = "0KB"
766     Else
767         L2 = CStr(Int(fSize / 1024)) + "KB"
768     End If
769     If cSize / 1024 > 0 And cSize / 1024 < 1 Then
770         L4 = "<1KB"
771     ElseIf cSize = 0 Then
772         L4 = "0KB"
773     Else
774         L4 = CStr(Int(cSize / 1024)) + "KB"
775     End If
776     If fSize <> 0 Then
777         L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
778     Else
779         L3 = "0%"
780     End If
781     fFlags = SFileGetFileInfo(hFile, 7)
782     L6 = SFileGetFileInfo(hFile, SFILE_INFO_LOCALEID)
783     If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
784     If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
785     If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
786     On Error Resume Next
787     lIndex = List.ListItems.Add(, L1, L1).Index
788     On Error GoTo 0
789     If lIndex = 0 Then
790         lIndex = List.ListItems.Item(L1).Index
791         List.ListItems.Item(L1).ListSubItems.Clear
792     End If
793     List.ListItems.Item(lIndex).Tag = L1
794     List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
795     If fSize <> 0 Then
796         List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
797     Else
798         List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
799     End If
800     List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
801     List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
802     List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
803     SFileCloseFile hFile
804 End If
805 End Sub
806 Sub RemoveFromListing(RemovedFile As String)
807 Dim FileCount As Long
808 On Error GoTo FileRemoved
809 Do
810 List.ListItems.Remove RemovedFile
811 FileCount = FileCount + 1
812 Loop
813 FileRemoved:
814 If FileCount = 0 Then
815     For FileCount = 1 To List.ListItems.Count
816         If LCase(RemovedFile) = LCase(List.ListItems.Item(FileCount).Key) Then
817             List.ListItems.Remove FileCount
818             Exit Sub
819         End If
820     Next FileCount
821 End If
822 End Sub
823 Sub RenameInListing(OldName As String, NewName As String)
824 Dim lIndex As Long
825 If LCase(OldName) <> LCase(NewName) Then RemoveFromListing NewName
826 On Error GoTo RenameError
827 lIndex = List.ListItems.Item(OldName).Index
828 List.ListItems.Item(lIndex).Text = NewName
829 List.ListItems.Item(lIndex).Tag = NewName
830 On Error Resume Next
831 List.ListItems.Item(lIndex).Key = NewName
832 On Error GoTo 0
833 Exit Sub
834 RenameError:
835 For lIndex = 1 To List.ListItems.Count
836     If LCase(OldName) = LCase(List.ListItems.Item(lIndex).Key) Then
837         List.ListItems.Item(lIndex).Text = NewName
838         List.ListItems.Item(lIndex).Tag = NewName
839         On Error Resume Next
840         List.ListItems.Item(lIndex).Key = NewName
841         On Error GoTo 0
842         Exit Sub
843     End If
844 Next lIndex
845 End Sub
846 Sub ExecuteFile(FileName As String, Index As Integer, mnuRoot As Menu, mnuItem)
847 Dim Param As String, bNum As Long, bNum2 As Long, EnvName As String, RetVal As Long
848 RetVal = ShellExecute(hWnd, mnuItem(Index).Tag, FileName, vbNullString, vbNullString, 1)
849 If RetVal >= 0 And RetVal <= 32 And Index >= mnuRoot.Tag Then
850     Param = GetReg("HKEY_CLASSES_ROOT\Unknown\shell\" + mnuItem(Index).Tag + "\command\")
851     Do
852         If InStr(Param, "%1") = 0 Then
853             Param = Param + " " + FileName
854         Else
855             bNum = InStr(Param, "%1")
856             Param = Left(Param, bNum - 1) + FileName + Mid(Param, bNum + 2)
857         End If
858     Loop While InStr(Param, "%1")
859     bNum = 1
860     Do While bNum <= Len(Param)
861         If InStr(bNum, Param, "%") Then
862             bNum = InStr(bNum, Param, "%")
863             If InStr(bNum + 1, Param, "%") Then
864                 bNum2 = InStr(bNum + 1, Param, "%")
865                 EnvName = Mid(Param, bNum + 1, bNum2 - bNum - 1)
866                 If Environ(EnvName) <> "" Then
867                     Param = Left(Param, bNum - 1) + Environ(EnvName) + Mid(Param, bNum2 + 1)
868                 End If
869             End If
870         End If
871         bNum = bNum + 1
872     Loop
873     On Error GoTo NoProgram
874     Shell Param, 1
875     On Error GoTo 0
876 End If
877 Exit Sub
878 NoProgram:
879 If Err.Number = 53 Then MsgBox "No program is assigned for this action.", , "WinMPQ"
880 End Sub
881 Sub RunMpq2kCommand(CmdLine As String)
882 Dim sLine As String, pNum As Long, Param() As String, EndParam As Long, CurPath As String, cType As Integer, Rswitch As Boolean, fCount As Long, Files As String, fEndLine As Long, fLine As String, bNum As Long, OldFileName As String, fNum As Long, cNum As Long, FileFilter As String, TItem As Menu, fLine2 As String, fLineTitle As String, hMPQ As Long, hFile As Long, FileShortNames() As String, dwFlags As Long
883 CurPath = CurDir
884 If Right(CurPath, 1) <> "\" Then CurPath = CurPath + "\"
885 sLine = CmdLine
886 If Right(sLine, 1) <> " " Then sLine = sLine + " "
887 If sLine <> "" Then
888     ReDim Param(0) As String
889     For pNum = 1 To Len(sLine)
890         If Mid(sLine, pNum, 1) = Chr(34) Then
891             pNum = pNum + 1
892             EndParam = InStr(pNum, sLine, Chr(34))
893         Else
894             EndParam = InStr(pNum, sLine, " ")
895         End If
896         If EndParam = 0 Then EndParam = Len(sLine) + 1
897         If pNum <> EndParam Then
898             If Trim(Mid(sLine, pNum, EndParam - pNum)) <> "" Then
899                 ReDim Preserve Param(UBound(Param) + 1) As String
900                 Param(UBound(Param)) = Trim(Mid(sLine, pNum, EndParam - pNum))
901             End If
902         End If
903         pNum = EndParam
904     Next pNum
905     If UBound(Param) < 3 Then ReDim Preserve Param(3) As String
906     Select Case LCase(Param(1))
907     Case "?", "h", "help"
908         mnuHReadme_Click
909     Case "o", "open"
910         OldFileName = CD.FileName
911         If Param(2) <> "" Then
912             CD.FileName = FullPath(CurPath, Param(2))
913         End If
914         If Param(3) <> "" And FileExists(CD.FileName) = False And CD.FileName <> "" Then
915             DefaultMaxFiles = Param(3)
916         End If
917         If FileExists(CD.FileName) Then
918             OpenMpq
919             If CD.FileName = "" Then
920                 CD.FileName = OldFileName
921                 StatBar.SimpleText = "The file does not contain an MPQ archive."
922             Else
923                 StatBar.SimpleText = "Opened " + CD.FileName
924                 AddRecentFile CD.FileName
925             End If
926         ElseIf FileExists(CD.FileName) = False And CD.FileName <> "" Then
927             ReDim FileList(0) As String
928             List.ListItems.Clear
929             ShowSelected
930             ShowTotal
931             NewFile = True
932             ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
933             mnuMpq.Enabled = True
934             For Each TItem In mnuTItem
935                 TItem.Enabled = True
936             Next TItem
937             Toolbar.Buttons.Item("Add").Enabled = True
938             Toolbar.Buttons.Item("Add Folder").Enabled = True
939             Toolbar.Buttons.Item("Extract").Enabled = True
940             Toolbar.Buttons.Item("Compact").Enabled = True
941             Toolbar.Buttons.Item("List").Enabled = True
942             If InStr(CD.FileName, "\") > 0 Then
943                 For bNum = 1 To Len(CD.FileName)
944                     If InStr(bNum, CD.FileName, "\") > 0 Then
945                         bNum = InStr(bNum, CD.FileName, "\")
946                     Else
947                         Exit For
948                     End If
949                 Next bNum
950             End If
951             Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
952             StatBar.SimpleText = "Created new " + CD.FileName
953             AddRecentFile CD.FileName
954         ElseIf CD.FileName = "" Then
955             StatBar.SimpleText = "Required parameter missing"
956         End If
957     Case "n", "new"
958         If Param(2) <> "" Then
959             CD.FileName = FullPath(CurPath, Param(2))
960             If Param(3) <> "" Then
961                 DefaultMaxFiles = Param(3)
962             End If
963             If CD.FileName <> "" Then
964                 ReDim FileList(0) As String
965                 List.ListItems.Clear
966                 ShowSelected
967                 ShowTotal
968                 NewFile = True
969                 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
970                 mnuMpq.Enabled = True
971                 For Each TItem In mnuTItem
972                     TItem.Enabled = True
973                 Next TItem
974                 Toolbar.Buttons.Item("Add").Enabled = True
975                 Toolbar.Buttons.Item("Add Folder").Enabled = True
976                 Toolbar.Buttons.Item("Extract").Enabled = True
977                 Toolbar.Buttons.Item("Compact").Enabled = True
978                 Toolbar.Buttons.Item("List").Enabled = True
979                 If InStr(CD.FileName, "\") > 0 Then
980                     For bNum = 1 To Len(CD.FileName)
981                         If InStr(bNum, CD.FileName, "\") > 0 Then
982                             bNum = InStr(bNum, CD.FileName, "\")
983                         Else
984                             Exit For
985                         End If
986                     Next bNum
987                 End If
988                 Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
989                 StatBar.SimpleText = "Created new " + CD.FileName
990                 AddRecentFile CD.FileName
991             End If
992         Else
993             StatBar.SimpleText = "Required parameter missing"
994         End If
995     Case "c", "close"
996         StatBar.SimpleText = "Close is for scripts only"
997     Case "p", "pause"
998         StatBar.SimpleText = "Pause not supported"
999     Case "a", "add"
1000         If CD.FileName <> "" Then
1001             ReDim FileShortNames(0) As String
1002             cType = 0
1003             Rswitch = False
1004             fCount = 0
1005             Files = ""
1006             fEndLine = 0
1007             fLine = ""
1008             dwFlags = MAFA_REPLACE_EXISTING
1009             If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
1010             For pNum = 3 To UBound(Param)
1011                 If LCase(Param(pNum)) = "/wav" Then
1012                     cType = 2
1013                     dwFlags = dwFlags Or MAFA_COMPRESS
1014                 ElseIf LCase(Param(pNum)) = "/c" And cType < 2 Then
1015                     cType = 1
1016                     dwFlags = dwFlags Or MAFA_COMPRESS
1017                 ElseIf LCase(Param(pNum)) = "/auto" And cType < 1 Then
1018                     cType = -1
1019                 ElseIf LCase(Param(pNum)) = "/r" Then
1020                     Rswitch = True
1021                 End If
1022             Next pNum
1023             If Left(Param(3), 1) = "/" Or Param(3) = "" Then
1024                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1025                     Param(3) = ""
1026                 Else
1027                     Param(3) = Param(2)
1028                 End If
1029             End If
1030             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1031                 If InStr(Param(2), "\") > 0 Then
1032                     For pNum = 1 To Len(Param(2))
1033                         If InStr(pNum, Param(2), "\") > 0 Then
1034                             pNum = InStr(pNum, Param(2), "\")
1035                             Files = Left(Param(2), pNum)
1036                         End If
1037                     Next pNum
1038                 End If
1039                 MousePointer = 11
1040                 If NewFile = True Then
1041                     If FileExists(CD.FileName) Then Kill CD.FileName
1042                     NewFile = False
1043                 End If
1044                 Files = DirEx(Files, Mid(Param(2), Len(Files) + 1), 6, Rswitch)
1045                 List.Sorted = False
1046                 FileFilter = mFilter
1047                 hMPQ = mOpenMpq(CD.FileName)
1048                 If hMPQ = 0 Then
1049                     StatBar.SimpleText = "Can't create archive " + CD.FileName
1050                     Exit Sub
1051                 End If
1052                 For pNum = 1 To Len(Files)
1053                     fEndLine = InStr(pNum, Files, vbCrLf)
1054                     fLine = Mid(Files, pNum, fEndLine - pNum)
1055                     If cType = 0 Then
1056                         StatBar.SimpleText = "Adding " + fLine + "..."
1057                     ElseIf cType = 1 Then
1058                         StatBar.SimpleText = "Adding compressed " + fLine + "..."
1059                     ElseIf cType = 2 Then
1060                         StatBar.SimpleText = "Adding compressed WAV " + fLine + "..."
1061                     ElseIf cType = -1 Then
1062                         StatBar.SimpleText = "Adding " + fLine + " (compression auto-select)..."
1063                     End If
1064                     If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1065                         If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"
1066                         If cType = 2 Then
1067                             MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0
1068                         ElseIf cType = -1 Then
1069                             mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3) + fLine
1070                         ElseIf cType = 1 Then
1071                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, DefaultCompress, DefaultCompressLevel
1072                         Else
1073                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0, 0
1074                         End If
1075                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1076                         mFilter.AddItem "*" + GetExtension(Param(3) + fLine)
1077                         For cNum = 1 To mFilter.ListCount - 1
1078                             If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
1079                                 mFilter.RemoveItem cNum
1080                                 Exit For
1081                             End If
1082                         Next cNum
1083                         If MatchesFilter(Param(3) + fLine, FileFilter) Then
1084                             ReDim Preserve FileShortNames(UBound(FileShortNames) + 1) As String
1085                             FileShortNames(UBound(FileShortNames)) = Param(3) + fLine
1086                         End If
1087                     Else
1088                         If cType = 2 Then
1089                             MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0
1090                         ElseIf cType = -1 Then
1091                             mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3)
1092                         ElseIf cType = 1 Then
1093                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, DefaultCompress, DefaultCompressLevel
1094                         Else
1095                             MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0, 0
1096                         End If
1097                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1098                         mFilter.AddItem "*" + GetExtension(Param(3))
1099                         For cNum = 1 To mFilter.ListCount - 1
1100                             If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
1101                                 mFilter.RemoveItem cNum
1102                                 Exit For
1103                             End If
1104                         Next cNum
1105                         If MatchesFilter(Param(3), FileFilter) Then
1106                             ReDim Preserve FileShortNames(UBound(FileShortNames) + 1) As String
1107                             FileShortNames(UBound(FileShortNames)) = Param(3)
1108                         End If
1109                     End If
1110                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1111                     fCount = fCount + 1
1112                     pNum = fEndLine + 1
1113                 Next pNum
1114                 MpqCloseUpdatedArchive hMPQ, 0
1115                 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1116                 If UBound(FileShortNames) > 1 Then
1117                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
1118                         StatBar.SimpleText = "Adding files to listing... 0% complete"
1119                         For pNum = 1 To UBound(FileShortNames)
1120                             If MatchesFilter(FileShortNames(pNum), FileFilter) Then
1121                                 MpqAddToListing hMPQ, FileShortNames(pNum)
1122                             End If
1123                             On Error Resume Next
1124                             StatBar.SimpleText = "Adding files to listing... " + CStr(Int((pNum / UBound(FileShortNames)) * 100)) + "% complete"
1125                             On Error GoTo 0
1126                         Next pNum
1127                         SFileCloseArchive hMPQ
1128                     End If
1129                 ElseIf UBound(FileShortNames) = 1 Then
1130                     AddToListing FileShortNames(1)
1131                 End If
1132                 MousePointer = 0
1133                 If MatchesFilter("(listfile)", FileFilter) Then
1134                     AddToListing "(listfile)"
1135                 End If
1136                 mFilter = FileFilter
1137                 List.Sorted = True
1138                 RemoveDuplicates
1139                 ShowTotal
1140                 If fCount > 1 Then
1141                     StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " added"
1142                 End If
1143             Else
1144                 StatBar.SimpleText = "Required parameter missing"
1145             End If
1146         Else
1147             StatBar.SimpleText = "No archive open"
1148         End If
1149     Case "e", "extract"
1150         If CD.FileName <> "" Then
1151             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Extracting " + Param(2) + "..."
1152             cType = 0
1153             For pNum = 3 To UBound(Param)
1154                 If LCase(Param(pNum)) = "/fp" Then
1155                     cType = 1
1156                     Exit For
1157                 End If
1158             Next pNum
1159             If Left(Param(3), 1) = "/" Then Param(3) = ""
1160             If Param(3) = "" Then Param(3) = "."
1161             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1162                 MousePointer = 11
1163                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1164                     Files = MpqDir(CD.FileName, Param(2))
1165                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1166                         StatBar.SimpleText = "Can't open archive " + CD.FileName
1167                         Exit Sub
1168                     End If
1169                     For pNum = 1 To Len(Files)
1170                         fEndLine = InStr(pNum, Files, vbCrLf)
1171                         fLine = Mid(Files, pNum, fEndLine - pNum)
1172                         StatBar.SimpleText = "Extracting " + fLine + "..."
1173                         sGetFile hMPQ, fLine, FullPath(CurPath, Param(3)), cType
1174                         StatBar.SimpleText = StatBar.SimpleText + " Done"
1175                         fCount = fCount + 1
1176                         pNum = fEndLine + 1
1177                     Next pNum
1178                     SFileCloseArchive hMPQ
1179                     If fCount > 1 Then
1180                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " extracted"
1181                     End If
1182                 Else
1183                     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1184                         StatBar.SimpleText = "Can't open archive " + CD.FileName
1185                         Exit Sub
1186                     End If
1187                     sGetFile hMPQ, Param(2), FullPath(CurPath, Param(3)), cType
1188                     SFileCloseArchive hMPQ
1189                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1190                 End If
1191                 MousePointer = 0
1192             Else
1193                 StatBar.SimpleText = "Required parameter missing"
1194             End If
1195         Else
1196             StatBar.SimpleText = "No archive open"
1197         End If
1198     Case "r", "ren", "rename"
1199         If CD.FileName <> "" Then
1200             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Renaming " + Param(2) + " => " + Param(3) + "..."
1201             If Param(2) <> "" And Param(3) <> "" Then
1202                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1203                     If InStr(Param(3), "*") <> 0 Or InStr(Param(3), "?") <> 0 Then
1204                         Files = MpqDir(CD.FileName, Param(2))
1205                         hMPQ = mOpenMpq(CD.FileName)
1206                         If hMPQ Then
1207                             For pNum = 1 To Len(Files)
1208                                 fEndLine = InStr(pNum, Files, vbCrLf)
1209                                 fLine = Mid(Files, pNum, fEndLine - pNum)
1210                                 fLine2 = RenameWithFilter(fLine, Param(2), Param(3))
1211                                 StatBar.SimpleText = "Renaming " + fLine + " => " + fLine2 + "..."
1212                                 If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then
1213                                     SFileCloseFile hFile
1214                                     MpqDeleteFile hMPQ, fLine2
1215                                     MpqRenameFile hMPQ, fLine, fLine2
1216                                 Else
1217                                     MpqRenameFile hMPQ, fLine, fLine2
1218                                 End If
1219                                 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1220                                 RenameInListing fLine, fLine2
1221                                 StatBar.SimpleText = StatBar.SimpleText + " Done"
1222                                 fCount = fCount + 1
1223                                 pNum = fEndLine + 1
1224                             Next pNum
1225                             MpqCloseUpdatedArchive hMPQ, 0
1226                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1227                         End If
1228                         If fCount > 1 Then
1229                             StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " renamed"
1230                         End If
1231                     Else
1232                     StatBar.SimpleText = "You must use wildcards with new name"
1233                     End If
1234                 Else
1235                     hMPQ = mOpenMpq(CD.FileName)
1236                     If hMPQ Then
1237                         If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then
1238                             SFileCloseFile hFile
1239                             MpqDeleteFile hMPQ, Param(3)
1240                             MpqRenameFile hMPQ, Param(2), Param(3)
1241                         Else
1242                             MpqRenameFile hMPQ, Param(2), Param(3)
1243                         End If
1244                         MpqCloseUpdatedArchive hMPQ, 0
1245                     End If
1246                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1247                     RenameInListing Param(2), Param(3)
1248                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1249                 End If
1250             Else
1251                 StatBar.SimpleText = "Required parameter missing"
1252             End If
1253         Else
1254             StatBar.SimpleText = "No archive open"
1255         End If
1256     Case "m", "move"
1257         If CD.FileName <> "" Then
1258             For pNum = 1 To Len(Param(2))
1259                 If InStr(pNum, Param(2), "\") Then
1260                     pNum = InStr(pNum, Param(2), "\")
1261                 Else
1262                     Exit For
1263                 End If
1264             Next pNum
1265             fLineTitle = Mid(Param(2), pNum)
1266             If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"
1267             Param(3) = Param(3) + fLineTitle
1268             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Moving " + Param(2) + " => " + Param(3) + "..."
1269             If (Left(Param(2), 1) <> "/" And Param(2) <> "") And (Left(Param(3), 1) <> "/") Then
1270                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1271                     Files = MpqDir(CD.FileName, Param(2))
1272                     hMPQ = mOpenMpq(CD.FileName)
1273                     If hMPQ Then
1274                         For pNum = 1 To Len(Files)
1275                             fEndLine = InStr(pNum, Files, vbCrLf)
1276                             fLine = Mid(Files, pNum, fEndLine - pNum)
1277                             fLine2 = RenameWithFilter(fLine, Param(2), Param(3))
1278                             StatBar.SimpleText = "Moving " + fLine + " => " + fLine2 + "..."
1279                             If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then
1280                                 SFileCloseFile hFile
1281                                 MpqDeleteFile hMPQ, fLine2
1282                                 MpqRenameFile hMPQ, fLine, fLine2
1283                             Else
1284                                 MpqRenameFile hMPQ, fLine, fLine2
1285                             End If
1286                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1287                             RenameInListing fLine, fLine2
1288                             StatBar.SimpleText = StatBar.SimpleText + " Done"
1289                             fCount = fCount + 1
1290                             pNum = fEndLine + 1
1291                         Next pNum
1292                         MpqCloseUpdatedArchive hMPQ, 0
1293                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1294                     End If
1295                     If fCount > 1 Then
1296                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " moved"
1297                     End If
1298                 Else
1299                     hMPQ = mOpenMpq(CD.FileName)
1300                     If hMPQ Then
1301                         If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then
1302                             SFileCloseFile hFile
1303                             MpqDeleteFile hFile, Param(3)
1304                             MpqRenameFile hFile, Param(2), Param(3)
1305                         Else
1306                             MpqRenameFile hFile, Param(2), Param(3)
1307                         End If
1308                         MpqCloseUpdatedArchive hMPQ, 0
1309                     End If
1310                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1311                     RenameInListing Param(2), Param(3)
1312                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1313                 End If
1314             Else
1315                 StatBar.SimpleText = "Required parameter missing"
1316             End If
1317         Else
1318             StatBar.SimpleText = "No archive open"
1319         End If
1320     Case "d", "del", "delete"
1321         If CD.FileName <> "" Then
1322             If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then StatBar.SimpleText = "Deleting " + Param(2) + "..."
1323             If Left(Param(2), 1) <> "/" And Param(2) <> "" Then
1324                 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then
1325                     Files = MpqDir(CD.FileName, Param(2))
1326                     hMPQ = mOpenMpq(CD.FileName)
1327                     If hMPQ Then
1328                         For pNum = 1 To Len(Files)
1329                             fEndLine = InStr(pNum, Files, vbCrLf)
1330                             fLine = Mid(Files, pNum, fEndLine - pNum)
1331                             StatBar.SimpleText = "Deleting " + fLine + "..."
1332                             MpqDeleteFile hMPQ, fLine
1333                             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1334                             RemoveFromListing fLine
1335                             StatBar.SimpleText = StatBar.SimpleText + " Done"
1336                             fCount = fCount + 1
1337                             pNum = fEndLine + 1
1338                         Next pNum
1339                         MpqCloseUpdatedArchive hMPQ, 0
1340                         If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1341                     End If
1342                     If fCount > 1 Then
1343                         StatBar.SimpleText = CStr(fCount) + " files of " + Param(2) + " deleted"
1344                     End If
1345                 Else
1346                     hMPQ = mOpenMpq(CD.FileName)
1347                     If hMPQ Then
1348                         MpqDeleteFile hMPQ, Param(2)
1349                         MpqCloseUpdatedArchive hMPQ, 0
1350                     End If
1351                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1352                     RemoveFromListing Param(2)
1353                     StatBar.SimpleText = StatBar.SimpleText + " Done"
1354                 End If
1355             Else
1356                 StatBar.SimpleText = "Required parameter missing"
1357             End If
1358         Else
1359             StatBar.SimpleText = "No archive open"
1360         End If
1361     Case "f", "flush", "compact"
1362         If CD.FileName <> "" Then
1363             MousePointer = 11
1364             StatBar.SimpleText = "Flushing " + CD.FileName + "..."
1365             hMPQ = mOpenMpq(CD.FileName)
1366             If hMPQ Then
1367                 MpqCompactArchive hMPQ
1368                 MpqCloseUpdatedArchive hMPQ, 0
1369             End If
1370             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1371             StatBar.SimpleText = StatBar.SimpleText + " Done"
1372             MousePointer = 0
1373             OpenMpq
1374         Else
1375             StatBar.SimpleText = "No archive open"
1376         End If
1377     Case "l", "list"
1378         If CD.FileName <> "" Then
1379             If Param(2) <> "" Then
1380                 StatBar.SimpleText = "Creating list..."
1381                 MousePointer = 11
1382                 If (InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0) And Param(3) <> "" Then
1383                     Files = MpqDir(CD.FileName, Param(2))
1384                     Param(2) = Param(3)
1385                 Else
1386                     Files = MpqDir(CD.FileName, "*")
1387                 End If
1388                 fNum = FreeFile
1389                 Open FullPath(CurPath, Param(2)) For Binary As #fNum
1390                 Put #fNum, 1, Files
1391                 Close #fNum
1392                 StatBar.SimpleText = StatBar.SimpleText + " Done"
1393                 MousePointer = 0
1394             Else
1395                 StatBar.SimpleText = "Required parameter missing"
1396             End If
1397         Else
1398             StatBar.SimpleText = "No archive open"
1399         End If
1400     Case "s", "script"
1401         StatBar.SimpleText = "Running script " + Param(2) + "..."
1402         If Param(2) <> "" Then
1403             MousePointer = 11
1404             RunScript FullPath(CurPath, Param(2))
1405             MousePointer = 0
1406             StatBar.SimpleText = StatBar.SimpleText + " Done"
1407         Else
1408             StatBar.SimpleText = "Required parameter missing"
1409         End If
1410     Case "x", "exit", "quit"
1411         Unload Me
1412     Case Else
1413         If Left(Param(1), 1) <> ";" Then
1414             If LCase(Param(1)) = "cd" Or LCase(Param(1)) = "chdir" Then
1415                 On Error Resume Next
1416                 ChDir Param(2)
1417                 On Error GoTo 0
1418                 txtCommand_GotFocus
1419             ElseIf Left(LCase(Param(1)), 3) = "cd." Or Left(LCase(Param(1)), 3) = "cd\" Then
1420                 On Error Resume Next
1421                 ChDir Mid(Param(1), 3)
1422                 On Error GoTo 0
1423                 txtCommand_GotFocus
1424             ElseIf Left(LCase(Param(1)), 6) = "chdir." Or Left(LCase(Param(1)), 6) = "chdir\" Then
1425                 On Error Resume Next
1426                 ChDir Mid(Param(1), 6)
1427                 On Error GoTo 0
1428                 txtCommand_GotFocus
1429             ElseIf Mid(Param(1), 2, 1) = ":" And (Len(Param(1)) = 2 Or Right(Param(1), 1) = "\") Then
1430                 On Error Resume Next
1431                 ChDrive Left(Param(1), 2)
1432                 On Error GoTo 0
1433                 txtCommand_GotFocus
1434             Else
1435                 Shell "command.com /k " + sLine, 1
1436             End If
1437         End If
1438     End Select
1439 End If
1440 End Sub
1441 Sub BuildRecentFileList()
1442 Dim rNum As Long, rNum2 As Long, RecentFile As String, FirstSep As Long, LastSep As Long, RItem As Menu
1443 For Each RItem In mnuFRecent
1444     If RItem.Index <> 0 Then Unload RItem
1445 Next RItem
1446 rNum2 = 1
1447 For rNum = 8 To 1 Step -1
1448     RecentFile = GetReg(AppKey + "Recent\File" + CStr(rNum))
1449     If FileExists(RecentFile) Then
1450         mnuFRecent(0).Visible = True
1451         On Error Resume Next
1452         Load mnuFRecent(rNum2)
1453         On Error GoTo 0
1454         mnuFRecent(rNum2).Tag = RecentFile
1455         If TextWidth(RecentFile) > TextWidth("________________________________") Then
1456             FirstSep = InStr(RecentFile, "\")
1457             If FirstSep > 0 Then
1458                 For LastSep = FirstSep + 1 To Len(RecentFile)
1459                     If InStr(LastSep, RecentFile, "\") > 0 Then
1460                         LastSep = InStr(LastSep, RecentFile, "\")
1461                     Else
1462                         Exit For
1463                     End If
1464                 Next LastSep
1465                 RecentFile = Left(RecentFile, FirstSep) + "..." + Mid(RecentFile, LastSep - 1)
1466             End If
1467         End If
1468         mnuFRecent(rNum2).Caption = "&" + CStr(rNum2) + " " + RecentFile
1469         rNum2 = rNum2 + 1
1470     End If
1471     If rNum2 > 4 Then Exit For
1472 Next rNum
1473 End Sub
1474 Sub BuildToolsList()
1475 Dim tNum As Long, ToolName As String, ToolCommand, TItem As Menu
1476 For Each TItem In mnuTItem
1477     If TItem.Index <> 0 Then Unload TItem
1478 Next TItem
1479 For Each TItem In mnuPTItem
1480     If TItem.Index <> 0 Then Unload TItem
1481 Next TItem
1482 mnuTItem(0).Caption = "(Empty)"
1483 mnuPTItem(0).Caption = mnuTItem(0).Caption
1484 mnuTItem(0).Tag = ""
1485 mnuPTItem(0).Tag = ""
1486 Do
1487     ToolName = GetReg(AppKey + "Tools\Name" + CStr(tNum))
1488     ToolCommand = GetReg(AppKey + "Tools\Command" + CStr(tNum))
1489     If ToolName = "" Then ToolName = ToolCommand
1490     If ToolName <> "" Then
1491         On Error Resume Next
1492         Load mnuTItem(tNum)
1493         Load mnuPTItem(tNum)
1494         On Error GoTo 0
1495         mnuTItem(tNum).Tag = ToolCommand
1496         mnuPTItem(tNum).Tag = mnuTItem(tNum).Tag
1497         If InStr(ToolName, "&") = 0 And tNum < 9 Then
1498             mnuTItem(tNum).Caption = "&" + CStr(tNum + 1) + " " + ToolName
1499         ElseIf InStr(ToolName, "&") = 0 And tNum = 9 Then
1500             mnuTItem(tNum).Caption = "&0 " + ToolName
1501         Else
1502             mnuTItem(tNum).Caption = ToolName
1503         End If
1504         mnuPTItem(tNum).Caption = mnuTItem(tNum).Caption
1505     End If
1506     tNum = tNum + 1
1507 Loop Until ToolName = ""
1508 End Sub
1509 Sub OpenMpq()
1510 Dim Path, FileCont As String, bNum As Long, FileLine As String, nFiles As Long, MpqFileName As String, FileFilter As String, TItem As Menu, hMPQ As Long, hFile As Long, FileEntries() As FILELISTENTRY
1511 On Error Resume Next
1512 If FileExists(CD.FileName) And FileLen(CD.FileName) = 0 Then
1513     ReDim FileList(0) As String
1514     List.ListItems.Clear
1515     ShowSelected
1516     ShowTotal
1517     NewFile = True
1518     On Error GoTo 0
1519     GoTo FileOpened
1520 End If
1521 On Error GoTo 0
1522 If IsMPQ(CD.FileName) = False Then
1523     CD.FileName = ""
1524     MsgBox "This file does not contain an MPQ archive.", vbExclamation, "WinMPQ"
1525     Exit Sub
1526 End If
1527 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then
1528     CD.FileName = ""
1529     MsgBox "The MPQ archive could not be opened.", vbExclamation, "WinMPQ"
1530     Exit Sub
1531 End If
1532 StatBar.Style = 1
1533 StatBar.SimpleText = "Loading list..."
1534 MousePointer = 11
1535 Path = App.Path: If Right(Path, 1) <> "\" Then Path = Path + "\"
1536 ReDim FileList(0) As String
1537 #If InternalListing Then
1538 FileList(0) = "(listfile)"
1539 If Mpq.FileExists(CD.FileName, "(listfile)") Then
1540     FileCont = Mpq.GetFileEx(CD.FileName, "(listfile)", 0, -1)
1541 #Else
1542     sListFiles CD.FileName, hMPQ, ListFile, FileEntries
1543 #End If
1544     For bNum = 1 To Len(FileCont)
1545         If InStr(bNum, FileCont, vbCrLf) > 0 Then
1546             ReDim Preserve FileList(UBound(FileList) + 1) As String
1547             FileList(UBound(FileList)) = Mid(FileCont, bNum, InStr(bNum, FileCont, vbCrLf) - bNum)
1548             bNum = InStr(bNum, FileCont, vbCrLf) + 1
1549         Else
1550             ReDim Preserve FileList(UBound(FileList) + 1) As String
1551             FileList(UBound(FileList)) = Mid(FileCont, bNum)
1552             Exit For
1553         End If
1554     Next bNum
1555 #If InternalListing Then
1556 End If
1557 nFiles = UBound(FileList)
1558 ReDim Preserve FileList(UBound(FileList) + UBound(GlobalFileList)) As String
1559 For bNum = nFiles + 1 To UBound(FileList)
1560     FileList(bNum) = GlobalFileList(bNum - nFiles)
1561 Next bNum
1562 #End If
1563 Dim fNum As Long, lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, L6 As String, fSize As Long, cSize As Long, fFlags As Long
1564 SendMessageA List.hWnd, WM_SETREDRAW, 0, ByVal 0&
1565 List.ListItems.Clear
1566 List.Sorted = False
1567 FileFilter = mFilter
1568 StatBar.SimpleText = "Building list... 0% complete"
1569 For fNum = 0 To UBound(FileEntries)
1570 #If InternalListing Then
1571     If Mpq.FileExists(CD.FileName, FileList(fNum)) Then
1572 #End If
1573     If FileEntries(fNum).dwFileExists Then
1574     MpqFileName = StrConv(FileEntries(fNum).szFileName, vbUnicode)
1575     StripNull MpqFileName
1576     mFilter.AddItem "*" + GetExtension(MpqFileName)
1577     For bNum = 1 To mFilter.ListCount - 1
1578         If LCase(mFilter.List(bNum)) = LCase(mFilter.List(bNum - 1)) Then
1579             mFilter.RemoveItem bNum
1580             Exit For
1581         End If
1582     Next bNum
1583     If MatchesFilter(MpqFileName, FileFilter) Then
1584         L1 = MpqFileName
1585                 fSize = FileEntries(fNum).dwFullSize
1586                 cSize = FileEntries(fNum).dwCompressedSize
1587                 If fSize / 1024 > 0 And fSize / 1024 < 1 Then
1588                     L2 = "<1KB"
1589                 ElseIf fSize = 0 Then
1590                     L2 = "0KB"
1591                 Else
1592                     L2 = CStr(Int(fSize / 1024)) + "KB"
1593                 End If
1594                 If cSize / 1024 > 0 And cSize / 1024 < 1 Then
1595                     L4 = "<1KB"
1596                 ElseIf cSize = 0 Then
1597                     L4 = "0KB"
1598                 Else
1599                     L4 = CStr(Int(cSize / 1024)) + "KB"
1600                 End If
1601                 If fSize <> 0 Then
1602                     L3 = CStr(Int((1 - cSize / fSize) * 100)) + "%"
1603                 Else
1604                     L3 = "0%"
1605                 End If
1606                 fFlags = FileEntries(fNum).dwFlags
1607                 L6 = CStr(FileEntries(fNum).lcLocale)
1608                 If (fFlags And &H200) Or (fFlags And &H100) Then L5 = "C" Else L5 = "-"
1609                 If fFlags And &H10000 Then L5 = L5 + "E" Else L5 = L5 + "-"
1610                 If fFlags And &H20000 Then L5 = L5 + "X" Else L5 = L5 + "-"
1611         lIndex = 0
1612         On Error Resume Next
1613         lIndex = List.ListItems.Add(, , L1).Index
1614         On Error GoTo 0
1615         If lIndex = 0 Then
1616             lIndex = List.ListItems.Item(L1).Index
1617             List.ListItems.Item(L1).ListSubItems.Clear
1618         End If
1619         List.ListItems.Item(lIndex).Tag = L1
1620         List.ListItems.Item(lIndex).ListSubItems.Add(, , L2).Tag = fSize
1621             If fSize <> 0 Then
1622                 List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = Int((1 - cSize / fSize) * 100)
1623             Else
1624                 List.ListItems.Item(lIndex).ListSubItems.Add(, , L3).Tag = 0
1625             End If
1626             List.ListItems.Item(lIndex).ListSubItems.Add(, , L4).Tag = cSize
1627             List.ListItems.Item(lIndex).ListSubItems.Add(, , L6).Tag = L6
1628             List.ListItems.Item(lIndex).ListSubItems.Add(, , L5).Tag = L5
1629     End If
1630     End If
1631 #If InternalListing Then
1632     End If
1633 #End If
1634     On Error Resume Next
1635     StatBar.SimpleText = "Building list... " + CStr(Int((fNum / UBound(FileEntries)) * 100)) + "% complete"
1636     On Error GoTo 0
1637 Next fNum
1638 SFileCloseArchive hMPQ
1639 List.Sorted = True
1640 '#If InternalListing Then
1641 RemoveDuplicates
1642 '#End If
1643 On Error Resume Next
1644 List.SelectedItem.Selected = False
1645 On Error GoTo 0
1646 SendMessageA List.hWnd, WM_SETREDRAW, 1, ByVal 0&
1647 ShowSelected
1648 ShowTotal
1649 NewFile = False
1650 mFilter = FileFilter
1651 FileOpened:
1652 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1653 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1654 mnuMpq.Enabled = True
1655 For Each TItem In mnuTItem
1656     TItem.Enabled = True
1657 Next TItem
1658 Toolbar.Buttons.Item("Add").Enabled = True
1659 Toolbar.Buttons.Item("Add Folder").Enabled = True
1660 Toolbar.Buttons.Item("Extract").Enabled = True
1661 Toolbar.Buttons.Item("Compact").Enabled = True
1662 Toolbar.Buttons.Item("List").Enabled = True
1663 StatBar.Style = 0
1664 StatBar.SimpleText = ""
1665 If InStr(CD.FileName, "\") > 0 Then
1666     For bNum = 1 To Len(CD.FileName)
1667         If InStr(bNum, CD.FileName, "\") > 0 Then
1668             bNum = InStr(bNum, CD.FileName, "\")
1669         Else
1670             Exit For
1671         End If
1672     Next bNum
1673 End If
1674 Caption = "WinMPQ - " + Mid(CD.FileName, bNum)
1675 AddRecentFile CD.FileName
1676 MousePointer = 0
1677 End Sub
1678 Sub RemoveDuplicates()
1679 Dim fNum As Long
1680 fNum = 1
1681 Do While fNum <= List.ListItems.Count - 1
1682     If LCase(List.ListItems.Item(fNum).Tag) = LCase(List.ListItems.Item(fNum + 1).Tag) And List.ListItems.Item(fNum).ListSubItems(4).Tag = List.ListItems.Item(fNum + 1).ListSubItems(4).Tag Then
1683         List.ListItems.Remove (fNum)
1684         fNum = fNum - 1
1685     End If
1686     fNum = fNum + 1
1687 Loop
1688 End Sub
1689 Sub ShowSelected()
1690 Dim fNum As Long, nSelect As Long, sSize As Long, fSize As Long, L2 As String, hMPQ As Long, hFile As Long
1691 On Error GoTo NotSelected
1692 List.SelectedItem.Tag = List.SelectedItem.Tag
1693 On Error GoTo 0
1694 For fNum = 1 To List.ListItems.Count
1695     If List.ListItems.Item(fNum).Selected Then
1696         nSelect = nSelect + 1
1697         If List.ListItems.Item(fNum).ListSubItems(1).Text <> "" Then
1698             sSize = sSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1699         Else
1700             If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
1701                 If SFileOpenFileEx(hMPQ, List.ListItems.Item(fNum).Tag, 0, hFile) Then
1702                     fSize = SFileGetFileSize(hFile, 0)
1703                     SFileCloseFile hFile
1704                 End If
1705                 SFileCloseArchive hMPQ
1706             End If
1707             If fSize / 1024 > 0 And fSize / 1024 < 1 Then
1708                 L2 = "<1KB"
1709             ElseIf fSize = 0 Then
1710                 L2 = "0KB"
1711             Else
1712                 L2 = CStr(Int(fSize / 1024)) + "KB"
1713             End If
1714             List.ListItems.Item(fNum).ListSubItems(1).Text = L2
1715             List.ListItems.Item(fNum).ListSubItems(1).Tag = fSize
1716             sSize = sSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1717         End If
1718     End If
1719 Next fNum
1720 If sSize / 1024 > 0 And sSize / 1024 < 1 Then
1721     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, <1KB"
1722 ElseIf sSize = 0 Then
1723     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, 0KB"
1724 Else
1725     StatBar.Panels.Item(1).Text = "Selected " + CStr(nSelect) + " files, " + CStr(Int(sSize / 1024)) + "KB"
1726 End If
1727 Exit Sub
1728 NotSelected:
1729 StatBar.Panels.Item(1).Text = "Selected 0 files, 0KB"
1730 End Sub
1731 Sub ShowTotal()
1732 Dim fNum As Long, nFiles As Long, tSize As Long
1733 For fNum = 1 To List.ListItems.Count
1734     nFiles = nFiles + 1
1735     If List.ListItems.Item(fNum).ListSubItems(1).Text <> "" Then
1736         tSize = tSize + List.ListItems.Item(fNum).ListSubItems(1).Tag
1737     End If
1738 Next fNum
1739 If tSize / 1024 > 0 And tSize / 1024 < 1 Then
1740     StatBar.Panels.Item(2).Text = "Total " + CStr(nFiles) + "/" + CStr(GetNumMpqFiles(CD.FileName)) + " files, <1KB"
1741 Else
1742     StatBar.Panels.Item(2).Text = "Total " + CStr(nFiles) + "/" + CStr(GetNumMpqFiles(CD.FileName)) + " files, " + CStr(Int(tSize / 1024)) + "KB"
1743 End If
1744 End Sub
1745 Private Sub cmdGo_Click()
1746 StatBar.Style = 1
1747 RunMpq2kCommand txtCommand
1748 txtCommand = ""
1749 If StatBar.SimpleText = "" Then txtCommand_GotFocus
1750 End Sub
1752 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
1753 If KeyCode = vbKeyShift Then
1754     ShiftState = True
1755     BuildMpqActionList
1756 End If
1757 End Sub
1758 Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
1759 If KeyCode = vbKeyShift Then
1760     ShiftState = False
1761     BuildMpqActionList
1762 End If
1763 End Sub
1764 Private Sub Form_Load()
1765 Dim FileName As String, bNum As Long, CurPath As String, CurPath2 As String, CurPathType As Integer, sLine As String, Param() As String, pNum As Long, EndParam As Long, ParamCutout As String, OldStartPath As String, NewStartPath As String, ErrorText As String
1766 Dim Path
1767 Path = App.Path: If Right(Path, 1) <> "\" Then Path = Path + "\"
1768 NewKey AppKey
1769 SetReg AppKey + "InstallPath", GetLongPath(App.Path), REG_SZ
1770 SetReg AppKey + "ProgramFilename", GetLongPath(Path + App.EXEName + ".exe"), REG_SZ
1771 FixIcon hWnd, 1
1772 InitFileDialog CD
1773 CD.hwndOwner = hWnd
1774 CD.DefaultExt = "mpq"
1775 CD.MaxFileSize = 5120
1776 InitFolderDialog PathInput
1777 PathInput.hwndOwner = hWnd
1778 PathInput.Flags = BIF_RETURNONLYFSDIRS
1779 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
1780 ChDir App.Path
1781 'If Mpq.MpqInitialize = False Then
1782 '    ErrorText = "Mpq Control did not initialize properly!" + vbCrLf + "Reason:  "
1783 '    Select Case Mpq.LastError
1784 '    Case MPQ_ERROR_NO_STAREDIT
1785 '        ErrorText = ErrorText + "Can't find StarEdit.exe"
1786 '    Case MPQ_ERROR_BAD_STAREDIT
1787 '        ErrorText = ErrorText + "Wrong version of StarEdit.exe.  Need SC/BW 1.07"
1788 '    Case MPQ_ERROR_STAREDIT_RUNNING
1789 '        ErrorText = ErrorText + "StarEdit.exe is running.  It must be closed before running this"
1790 '    Case Else
1791 '        ErrorText = ErrorText + "Unknown"
1792 '    End Select
1793 '    MsgBox ErrorText
1794 '    End
1795 'End If
1796 ExtractPathNum = -1
1797 CopyPathNum = -1
1798 OldStartPath = CurDir
1799 CurPath = GetReg(AppKey + "StartupPath", CurDir)
1800 CurPathType = GetReg(AppKey + "StartupPathType", 0)
1801 If CurPathType < 0 Then CurPathType = 0
1802 If CurPathType > 2 Then CurPathType = 2
1803 If CurPathType = 1 Then
1804     CurPath = App.Path
1805 End If
1806 CurPath2 = CurPath
1807 If Right(CurPath2, 1) <> "\" Then CurPath2 = CurPath2 + "\"
1808 If IsDir(CurPath2) Then
1809     If Mid(CurPath, 2, 1) = ":" Then ChDrive Left(CurPath, 1)
1810     ChDir CurPath
1811 End If
1812 NewStartPath = CurDir
1813 On Error Resume Next
1814 Height = GetReg(AppKey + "Status\WindowHeight", Height)
1815 Left = GetReg(AppKey + "Status\WindowLeft", Left)
1816 Top = GetReg(AppKey + "Status\WindowTop", Top)
1817 Width = GetReg(AppKey + "Status\WindowWidth", Width)
1818 If GetReg(AppKey + "Status\WindowState", WindowState) = 2 Then WindowState = 2 Else WindowState = 0
1819 ListFile = GetReg(AppKey + "ListFile", Path + "mpq_data.txt")
1820 DefaultMaxFiles = GetReg(AppKey + "DefaultMaxFiles", 1024)
1821 LocaleID = GetReg(AppKey + "LocaleID", 0)
1822 GlobalEncrypt = False
1823 DefaultCompressID = GetReg(AppKey + "DefaultCompress", -1)
1824 Select Case DefaultCompressID
1825 Case -3
1826 DefaultCompress = MAFA_COMPRESS_DEFLATE
1827 Case Else
1828 DefaultCompress = MAFA_COMPRESS_STANDARD
1829 End Select
1830 DefaultCompressLevel = GetReg(AppKey + "DefaultZlibLevel", Z_DEFAULT_COMPRESSION)
1831 BuildRecentFileList
1832 BuildToolsList
1833 On Error GoTo 0
1834 SFileSetLocale LocaleID
1835 ReDim GlobalFileList(0) As String
1836 #If InternalListing Then
1837 If FileExists(ListFile) Then
1838     Open ListFile For Input As #1
1839     Do While Not EOF(1)
1840         ReDim Preserve GlobalFileList(UBound(GlobalFileList) + 1) As String
1841         Line Input #1, GlobalFileList(UBound(GlobalFileList))
1842     Loop
1843     Close #1
1844 End If
1845 #End If
1846 FileName = Trim(Command)
1847 If Left(FileName, 1) = Chr(34) Then FileName = Mid(FileName, 2)
1848 If Right(FileName, 1) = Chr(34) Then FileName = Left(FileName, Len(FileName) - 1)
1849 FileName = Trim(FileName)
1850 If FileExists(FileName) Then
1851     CD.FileName = FileName
1852     Show
1853     OpenMpq
1854     Exit Sub
1855 End If
1856 ReDim FileList(0) As String
1857 If Right(CurPath, 1) <> "\" Then CurPath = CurPath + "\"
1858 sLine = Command
1859 If Right(sLine, 1) <> " " Then sLine = sLine + " "
1860 If sLine <> "" Then
1861     ReDim Param(0) As String
1862     For pNum = 1 To Len(sLine)
1863         If Mid(sLine, pNum, 1) = Chr(34) Then
1864             pNum = pNum + 1
1865             EndParam = InStr(pNum, sLine, Chr(34))
1866             If UBound(Param) = 1 Then ParamCutout = Mid(sLine, pNum - 1, (EndParam + 1) - (pNum - 1))
1867         Else
1868             EndParam = InStr(pNum, sLine, " ")
1869             If UBound(Param) = 1 Then ParamCutout = Mid(sLine, pNum, EndParam - pNum)
1870         End If
1871         If EndParam = 0 Then EndParam = Len(sLine) + 1
1872         If pNum <> EndParam Then
1873             If Trim(Mid(sLine, pNum, EndParam - pNum)) <> "" Then
1874                 ReDim Preserve Param(UBound(Param) + 1) As String
1875                 Param(UBound(Param)) = Trim(Mid(sLine, pNum, EndParam - pNum))
1876             End If
1877         End If
1878         pNum = EndParam
1879     Next pNum
1880     If UBound(Param) < 3 Then ReDim Preserve Param(3) As String
1881     Select Case LCase(Param(1))
1882     Case "o", "open", "n", "new"
1883         Show
1884         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
1885         ChDir OldStartPath
1886         RunMpq2kCommand sLine
1887     Case "a", "add", "e", "extract", "r", "ren", "rename", "m", "move", "d", "del", "delete", "f", "flush", "compact", "l", "list"
1888         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
1889         ChDir OldStartPath
1890         CD.FileName = FullPath(CurDir, Param(2))
1891         sLine = Left(sLine, InStr(sLine, ParamCutout) - 1) + Mid(sLine, InStr(sLine, ParamCutout) + Len(ParamCutout))
1892         RunMpq2kCommand sLine
1893         If Mid(NewStartPath, 2, 1) = ":" Then ChDrive Left(NewStartPath, 1)
1894         ChDir NewStartPath
1895         Unload Me
1896     Case "s", "script"
1897         Show
1898         If Mid(OldStartPath, 2, 1) = ":" Then ChDrive Left(OldStartPath, 1)
1899         ChDir OldStartPath
1900         RunMpq2kCommand sLine
1901         If Mid(NewStartPath, 2, 1) = ":" Then ChDrive Left(NewStartPath, 1)
1902         ChDir NewStartPath
1903     End Select
1904 End If
1905 End Sub
1906 Private Sub Form_Resize()
1907 On Error Resume Next
1908 If WindowState <> 1 Then
1909     List.Top = Toolbar.Height
1910     List.Width = ScaleWidth
1911     List.Height = ScaleHeight - List.Top - StatBar.Height - txtCommand.Height
1912     Label1.Top = List.Top + List.Height + (txtCommand.Height - Label1.Height) / 2
1913     txtCommand.Top = List.Top + List.Height
1914     txtCommand.Left = Label1.Width
1915     txtCommand.Width = ScaleWidth - cmdGo.Width - Label1.Width
1916     cmdGo.Top = txtCommand.Top
1917     cmdGo.Left = txtCommand.Left + txtCommand.Width
1918     mFilter.Width = ScaleWidth - mFilter.Left - Toolbar.Buttons.Item("List").Width
1919     Toolbar.Buttons.Item("filterspace").Width = mFilter.Width
1920 End If
1921 End Sub
1922 Private Sub Form_Unload(Cancel As Integer)
1923 Dim Path As String
1924 Path = App.Path
1925 If Right(Path, 1) <> "\" Then Path = Path + "\"
1926 On Error Resume Next
1927 If ExtractPathNum > -1 Then
1928     KillEx Path + "Temp_extract\" + CStr(ExtractPathNum) + "\", "*", 6, True
1929     RmDir Path + "Temp_extract\" + CStr(ExtractPathNum) + "\"
1930 End If
1931 If DirEx(Path + "Temp_extract\", "*", 6, True) = "" Or App.PrevInstance = False Then
1932     KillEx Path + "Temp_extract\", "*", 6, True
1933     RmDir Path + "Temp_extract\"
1934 End If
1935 If CopyPathNum > -1 Then
1936     KillEx Path + "Temp_copy\" + CStr(CopyPathNum) + "\", "*", 6, True
1937     RmDir Path + "Temp_copy\" + CStr(CopyPathNum) + "\"
1938 End If
1939 If DirEx(Path + "Temp_copy\", "*", 6, True) = "" Or App.PrevInstance = False Then
1940     KillEx Path + "Temp_copy\", "*", 6, True
1941     RmDir Path + "Temp_copy\"
1942 End If
1943 If GetReg(AppKey + "SaveWindowStatus", 1) > 0 Then
1944     NewKey AppKey
1945     NewKey AppKey + "Status\"
1946     If WindowState = 1 Then WindowState = 0
1947     SetReg AppKey + "Status\WindowState", WindowState, REG_DWORD
1948     WindowState = 0
1949     SetReg AppKey + "Status\WindowHeight", Height, REG_DWORD
1950     SetReg AppKey + "Status\WindowLeft", Left, REG_DWORD
1951     SetReg AppKey + "Status\WindowTop", Top, REG_DWORD
1952     SetReg AppKey + "Status\WindowWidth", Width, REG_DWORD
1953 End If
1954 If GetReg(AppKey + "StartupPathType", 0) <= 0 Then
1955     SetReg AppKey + "StartupPath", CurDir
1956 End If
1957 End
1958 End Sub
1959 Private Sub Label1_Click()
1960 txtCommand.SetFocus
1961 End Sub
1962 Private Sub List_AfterLabelEdit(Cancel As Integer, NewString As String)
1963 Dim result As Long, hMPQ As Long, hFile As Long
1964 If List.SelectedItem.Text <> NewString Then
1965     If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
1966         result = vbYes
1967     Else
1968         result = MsgBox("Rename file?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
1969     End If
1970     If result = vbYes Then
1971         List.SelectedItem.Tag = NewString
1972         hMPQ = mOpenMpq(CD.FileName)
1973         If hMPQ Then
1974             If SFileOpenFileEx(hMPQ, NewString, 0, hFile) Then
1975                 SFileCloseFile hFile
1976                 SFileSetLocale List.SelectedItem.ListSubItems(4).Tag
1977                 MpqDeleteFile hMPQ, NewString
1978                 MpqRenameFile hMPQ, List.SelectedItem.Text, NewString
1979                 SFileSetLocale LocaleID
1980                 RemoveDuplicates
1981             Else
1982                 SFileSetLocale List.SelectedItem.ListSubItems(4).Tag
1983                 MpqRenameFile hMPQ, List.SelectedItem.Text, NewString
1984                 SFileSetLocale LocaleID
1985             End If
1986             MpqCloseUpdatedArchive hMPQ, 0
1987             On Error Resume Next
1988             List.SelectedItem.Key = NewString
1989             On Error GoTo 0
1990             If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
1991         End If
1992     Else
1993         Cancel = True
1994     End If
1995 End If
1996 ShowSelected
1997 End Sub
1998 Private Sub List_Click()
1999 On Error GoTo NotSelected
2000 List.SelectedItem.Tag = List.SelectedItem.Tag
2001 On Error GoTo NotClick
2002 List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2003 On Error GoTo 0
2004 ShowSelected
2005 Exit Sub
2006 NotClick:
2007 List.SelectedItem.Selected = False
2008 NotSelected:
2009 ShowSelected
2010 BuildMpqActionList
2011 End Sub
2012 Private Sub List_ColumnClick(ByVal ColumnHeader As ColumnHeader)
2013 If List.SortKey = ColumnHeader.Index - 1 Then
2014     If List.SortOrder = 0 Then
2015         List.SortOrder = 1
2016     Else
2017         List.SortOrder = 0
2018     End If
2019 Else
2020     List.SortOrder = 0
2021     List.SortKey = ColumnHeader.Index - 1
2022 End If
2023 End Sub
2024 Private Sub List_DblClick()
2025 Dim fNum As Long, Path As String, fName As String, fName2 As String, bNum As Long, AlreadyInList As Boolean, hMPQ As Long
2026 On Error GoTo NotSelected
2027 List.SelectedItem.Tag = List.SelectedItem.Tag
2028 On Error GoTo NotClick
2029 List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2030 On Error GoTo 0
2031 Path = App.Path
2032 If Right(Path, 1) <> "\" Then Path = Path + "\"
2033 Path = Path + "Temp_extract\"
2034 If ExtractPathNum = -1 Then
2035     fNum = 0
2036     Do
2037     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
2038     fNum = fNum + 1
2039     Loop
2040     ExtractPathNum = fNum
2041 End If
2042 Path = Path + CStr(ExtractPathNum) + "\"
2043 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2044 For fNum = 1 To List.ListItems.Count
2045     If List.ListItems.Item(fNum).Selected Then
2046         StatBar.Style = 1
2047         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2048         MousePointer = 11
2049         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2050         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2051         SFileSetLocale LocaleID
2052         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
2053             For bNum = 1 To UBound(OpenFiles)
2054                 If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
2055                     AlreadyInList = True
2056                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2057                     Exit For
2058                 End If
2059             Next bNum
2060             If AlreadyInList = False Then
2061                 ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
2062                 OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
2063                 If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2064             End If
2065         End If
2066         StatBar.Style = 1
2067         StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
2068         fName = List.ListItems.Item(fNum).Tag
2069         BuildPopup Path + fName, 0, mnuPopup, mnuPItem
2070         ExecuteFile Path + fName, 0, mnuPopup, mnuPItem
2071         If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
2072     End If
2073 Next fNum
2074 SFileCloseArchive hMPQ
2075 StatBar.Style = 0
2076 StatBar.SimpleText = ""
2077 MousePointer = 0
2078 Exit Sub
2079 NotClick:
2080 List.SelectedItem.Selected = False
2081 NotSelected:
2082 End Sub
2083 Private Sub List_ItemClick(ByVal Item As ListItem)
2084 BuildMpqActionList
2085 End Sub
2086 Private Sub List_KeyPress(KeyAscii As Integer)
2087 If KeyAscii = 13 Then List_DblClick
2088 End Sub
2089 Private Sub List_KeyUp(KeyCode As Integer, Shift As Integer)
2090 If KeyCode = vbKeyDelete Then
2091     mnuMDelete_Click
2092 ElseIf KeyCode = 93 Or ((Shift And vbShiftMask) And KeyCode = vbKeyF10) Then
2093     On Error GoTo NotSelected
2094     List.SelectedItem.Tag = List.SelectedItem.Tag
2095     On Error GoTo 0
2096     If List.SelectedItem.Selected = True Then
2097         BuildPopup List.SelectedItem.Tag, Shift, mnuPopup, mnuPItem
2098         PopupMenu mnuPopup, vbPopupMenuRightButton, List.Left + List.SelectedItem.Left + 12 * Screen.TwipsPerPixelX, List.Top + List.SelectedItem.Top + 16 * Screen.TwipsPerPixelY, mnuPItem(0)
2099     End If
2100 End If
2101 NotSelected:
2102 End Sub
2103 Private Sub List_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
2104 CX = X
2105 CY = Y
2106 If Button And vbRightButton Then
2107     On Error GoTo NotSelected
2108     List.SelectedItem.Tag = List.SelectedItem.Tag
2109     On Error GoTo NotClick
2110     List.HitTest(CX, CY).Tag = List.HitTest(CX, CY).Tag
2111     On Error GoTo 0
2112     BuildPopup List.SelectedItem.Tag, Shift, mnuPopup, mnuPItem
2113     PopupMenu mnuPopup, vbPopupMenuRightButton, , , mnuPItem(0)
2114 End If
2115 NotClick:
2116 NotSelected:
2117 End Sub
2118 Private Sub List_OLECompleteDrag(Effect As Long)
2119 List.Tag = ""
2120 End Sub
2121 Private Sub List_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
2122 Dim Files() As String, ShortFiles() As String, bNum As Long, fNum As Long, Path As String, FolderFiles As String, Path2 As String, cNum As Long, FileFilter As String
2123 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, dwFlags As Long
2124 If Data.GetFormat(ccCFFiles) <> True Then Exit Sub
2125 For fNum = 1 To Data.Files.Count
2126     Path = Data.Files.Item(fNum)
2127     If Right(Path, 1) <> "\" Then Path = Path + "\"
2128     If IsDir(Path) Then
2129         Path = Path + "*"
2130         Data.Files.Remove fNum
2131         Data.Files.Add Path, fNum
2132     End If
2133 Next fNum
2134 Path = Data.Files.Item(1)
2135 For bNum = 1 To Len(Path)
2136     If InStr(bNum, Path, "\") > 0 Then
2137         For fNum = 1 To Data.Files.Count
2138             If Left(Data.Files.Item(fNum), InStr(bNum, Path, "\")) <> Left(Path, InStr(bNum, Path, "\")) Then GoTo PathFound
2139         Next fNum
2140         bNum = InStr(bNum, Path, "\")
2141     Else
2142         Exit For
2143     End If
2144 Next bNum
2145 PathFound:
2146 Path = Left(Path, bNum - 1)
2147 ReDim Files(0) As String
2148 Files(0) = Path
2149 If Right(Path, 1) <> "\" Then Path = Path + "\"
2150 ReDim Preserve Files(Data.Files.Count) As String
2151 For bNum = 1 To Data.Files.Count
2152     Files(bNum) = Mid(Data.Files.Item(bNum), 1 + Len(Path))
2153     For fNum = 1 To Len(Files(bNum))
2154         If InStr(fNum, Files(bNum), "\") > 0 Then
2155             fNum = InStr(fNum, Files(bNum), "\")
2156         Else
2157             Exit For
2158         End If
2159     Next fNum
2160     FolderFiles = FolderFiles + DirEx(Path + Left(Files(bNum), fNum - 1), Mid(Files(bNum), fNum), 6, True)
2161 Next bNum
2162 If FolderFiles = "" Then Exit Sub
2163 ReDim Preserve Files(0) As String
2164 For bNum = 1 To Len(FolderFiles)
2165     ReDim Preserve Files(UBound(Files) + 1) As String
2166     If InStr(bNum, FolderFiles, vbCrLf) > 0 Then
2167         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path), InStr(bNum, FolderFiles, vbCrLf) - bNum - Len(Path))
2168         bNum = InStr(bNum, FolderFiles, vbCrLf) + 1
2169     Else
2170         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path))
2171         Exit For
2172     End If
2173 Next bNum
2174 FoldName.Show 1
2175 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2176 If UBound(Files) > 1 Then
2177     ReDim ShortFiles(UBound(Files)) As String
2178     For bNum = 0 To UBound(Files)
2179         ShortFiles(bNum) = AddFolderName + Files(bNum)
2180     Next bNum
2181     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2182     For bNum = 1 To UBound(Files)
2183         Files(bNum) = FullPath(Files(0), Files(bNum))
2184     Next bNum
2185 Else
2186     For bNum = 1 To Len(Files(1))
2187         If InStr(bNum, Files(1), "\") > 0 Then
2188             bNum = InStr(bNum, Files(1), "\")
2189         Else
2190             Exit For
2191         End If
2192     Next bNum
2193     ReDim ShortFiles(UBound(Files)) As String
2194     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2195     Files(1) = FullPath(Files(0), Files(1))
2196 End If
2197 If NewFile = True Then
2198     If FileExists(CD.FileName) Then Kill CD.FileName
2199     NewFile = False
2200 End If
2201 List.Sorted = False
2202 FileFilter = mFilter
2203 hMPQ = mOpenMpq(CD.FileName)
2204 If hMPQ = 0 Then
2205     StatBar.SimpleText = "Can't create archive " + CD.FileName
2206     Exit Sub
2207 End If
2208 dwFlags = MAFA_REPLACE_EXISTING
2209 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2210 For bNum = 1 To UBound(Files)
2211     StatBar.Style = 1
2212     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2213     MousePointer = 11
2214     If mnuMCNone.Checked Then
2215         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2216     ElseIf mnuMCStandard.Checked Then
2217         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2218     ElseIf mnuMCDeflate.Checked Then
2219         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2220     ElseIf mnuMCAMedium.Checked Then
2221         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2222     ElseIf mnuMCAHighest.Checked Then
2223         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2224     ElseIf mnuMCALowest.Checked Then
2225         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2226     ElseIf mnuMCAuto.Checked Then
2227         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2228     End If
2229     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2230     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2231     For cNum = 1 To mFilter.ListCount - 1
2232         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2233             mFilter.RemoveItem cNum
2234             Exit For
2235         End If
2236     Next cNum
2237 Next bNum
2238 MpqCloseUpdatedArchive hMPQ, 0
2239 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2240 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2241     StatBar.SimpleText = "Adding files to listing... 0% complete"
2242     For bNum = 1 To UBound(Files)
2243         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2244             MpqAddToListing hMPQ, ShortFiles(bNum)
2245         End If
2246         On Error Resume Next
2247         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2248         On Error GoTo 0
2249     Next bNum
2250     SFileCloseArchive hMPQ
2251 End If
2252 StatBar.Style = 0
2253 StatBar.SimpleText = ""
2254 MousePointer = 0
2255 If MatchesFilter("(listfile)", FileFilter) Then
2256     AddToListing "(listfile)"
2257 End If
2258 mFilter = FileFilter
2259 List.Sorted = True
2260 RemoveDuplicates
2261 ShowTotal
2262 Cancel:
2263 End Sub
2264 Private Sub List_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
2265 If CD.FileName = "" Or Data.GetFormat(ccCFFiles) <> True Or List.Tag = "WinMPQ" Then
2266     Effect = ccOLEDropEffectNone
2267 Else
2268     Effect = ccOLEDropEffectCopy
2269 End If
2270 End Sub
2271 Private Sub List_OLESetData(Data As MSComctlLib.DataObject, DataFormat As Integer)
2272 Dim fNum As Long, Path As String, fCount As Long, FirstFile As String, hMPQ As Long
2273 Path = App.Path
2274 If Right(Path, 1) <> "\" Then Path = Path + "\"
2275 Path = Path + "Temp_copy\"
2276 If CopyPathNum = -1 Then
2277     fNum = 0
2278     Do
2279     If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
2280     fNum = fNum + 1
2281     Loop
2282     CopyPathNum = fNum
2283 End If
2284 Path = Path + CStr(CopyPathNum) + "\"
2285 KillEx Path, "*", 6, True
2286 fCount = 0
2287 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2288 For fNum = 1 To List.ListItems.Count
2289     If List.ListItems.Item(fNum).Selected Then
2290         StatBar.Style = 1
2291         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2292         MousePointer = 11
2293         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2294         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2295         SFileSetLocale LocaleID
2296         If GetReg(AppKey + "UseDragDropWildcards", 1) = 0 Then
2297             Data.Files.Add Path + List.ListItems.Item(fNum).Tag
2298         End If
2299         fCount = fCount + 1
2300         If fCount = 1 Then FirstFile = Path + List.ListItems.Item(fNum).Tag
2301     End If
2302 Next fNum
2303 SFileCloseArchive hMPQ
2304 StatBar.Style = 0
2305 StatBar.SimpleText = ""
2306 MousePointer = 0
2307 If GetReg(AppKey + "UseDragDropWildcards", 1) <> 0 And fCount > 1 Then
2308     Data.Files.Add Path + "*"
2309 ElseIf fCount = 1 Then
2310     Data.Files.Add FirstFile
2311 End If
2312 End Sub
2313 Private Sub List_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
2314 Data.SetData , ccCFFiles
2315 AllowedEffects = ccOLEDropEffectCopy
2316 List.Tag = "WinMPQ"
2317 End Sub
2318 Private Sub mFilter_KeyPress(KeyAscii As Integer)
2319 If KeyAscii = 13 And Toolbar.Buttons.Item("List").Enabled Then
2320     If NewFile = False Then OpenMpq
2321 End If
2322 End Sub
2323 Private Sub mnuFExit_Click()
2324 Unload Me
2325 End Sub
2326 Private Sub mnuFile_Click()
2327 If FileExists(CD.FileName) Then mnuFReopen.Enabled = True Else mnuFReopen.Enabled = False
2328 End Sub
2329 Private Sub mnuFRecent_Click(Index As Integer)
2330 Dim OldFileName As String
2331 OldFileName = CD.FileName
2332 CD.FileName = mnuFRecent(Index).Tag
2333 If FileExists(CD.FileName) = False Then
2334     CD.FileName = OldFileName
2335     MsgBox "The file " + Chr(34) + mnuFRecent(Index).Tag + Chr(34) + " does not exist.", vbExclamation, "WinMPQ"
2336     DelRecentFile mnuFRecent(Index).Tag
2337     Exit Sub
2338 End If
2339 OpenMpq
2340 If CD.FileName = "" Then
2341     CD.FileName = OldFileName
2342     DelRecentFile mnuFRecent(Index).Tag
2343 End If
2344 End Sub
2345 Private Sub mnuFReopen_Click()
2346 OpenMpq
2347 End Sub
2349 Private Sub mnuFScript_Click()
2350 Dim OldFileName As String, OldPath As String
2351 CD.Flags = &H1000 Or &H4 Or &H2
2352 CD.Filter = "All Files (*.*)|*.*"
2353 OldFileName = CD.FileName
2354 OldPath = CurDir
2355 CD.hwndOwner = hWnd
2356 If ShowOpen(CD) = False Then GoTo Cancel
2357 StatBar.Style = 1
2358 StatBar.SimpleText = "Running script " + CD.FileName + "..."
2359 MousePointer = 11
2360 RunScript CD.FileName
2361 StatBar.Style = 0
2362 StatBar.SimpleText = ""
2363 MousePointer = 0
2364 CD.FileName = OldFileName
2365 Cancel:
2366 If Mid(OldPath, 2, 1) = ":" Then ChDrive Left(OldPath, 1)
2367 ChDir OldPath
2368 End Sub
2369 Private Sub mnuHAbout_Click()
2370 About.Show 1
2371 End Sub
2372 Private Sub mnuHReadme_Click()
2373 Dim Path As String
2374 Path = App.Path
2375 If Right(Path, 1) <> "\" Then Path = Path + "\"
2376 If FileExists(Path + "WinMPQ.rtf") Then
2377     ShellExecute hWnd, vbNullString, Path + "WinMPQ.rtf", vbNullString, vbNullString, 1
2378 Else
2379     MsgBox "Could not find WinMPQ.rtf!", vbCritical, "WinMPQ"
2380 End If
2381 End Sub
2382 Private Sub mnuMAdd_Click()
2383 Dim Files() As String, ShortFiles() As String, bNum As Long, OldFileName As String, fNum As Long, cNum As Long, FileFilter As String
2384 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, hMPQ As Long, dwFlags As Long
2385 CD.Flags = OFN_EXPLORER Or &H1000 Or &H200 Or &H4 Or &H2
2386 CD.Filter = "All Files (*.*)|*.*"
2387 OldFileName = CD.FileName
2388 CD.hwndOwner = hWnd
2389 If ShowOpen(CD) = False Then GoTo Cancel
2390 ReDim Files(0) As String
2391 bNum = 1
2392 If InStr(1, CD.FileName, Chr(0)) > 0 Then
2393     Files(0) = Mid(CD.FileName, 1, InStr(1, CD.FileName, Chr(0)) - 1)
2394     bNum = InStr(1, CD.FileName, Chr(0)) + 1
2395 Else
2396     Files(0) = Mid(CD.FileName, 1)
2397 End If
2398 For bNum = bNum To Len(CD.FileName)
2399     ReDim Preserve Files(UBound(Files) + 1) As String
2400     If InStr(bNum, CD.FileName, Chr(0)) > 0 Then
2401         Files(UBound(Files)) = Mid(CD.FileName, bNum, InStr(bNum, CD.FileName, Chr(0)) - bNum)
2402         bNum = InStr(bNum, CD.FileName, Chr(0))
2403     Else
2404         Files(UBound(Files)) = Mid(CD.FileName, bNum)
2405         Exit For
2406     End If
2407 Next bNum
2408 CD.FileName = OldFileName
2409 FoldName.Show 1
2410 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2411 If UBound(Files) > 1 Then
2412     ReDim ShortFiles(UBound(Files)) As String
2413     For bNum = 0 To UBound(Files)
2414         ShortFiles(bNum) = AddFolderName + Files(bNum)
2415     Next bNum
2416     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2417     For bNum = 1 To UBound(Files)
2418         Files(bNum) = FullPath(Files(0), Files(bNum))
2419     Next bNum
2420 Else
2421     For bNum = 1 To Len(Files(1))
2422         If InStr(bNum, Files(1), "\") > 0 Then
2423             bNum = InStr(bNum, Files(1), "\")
2424         Else
2425             Exit For
2426         End If
2427     Next bNum
2428     ReDim ShortFiles(UBound(Files)) As String
2429     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2430     Files(1) = FullPath(Files(0), Files(1))
2431 End If
2432 If NewFile = True Then
2433     If FileExists(CD.FileName) Then Kill CD.FileName
2434     NewFile = False
2435 End If
2436 List.Sorted = False
2437 FileFilter = mFilter
2438 hMPQ = mOpenMpq(CD.FileName)
2439 If hMPQ = 0 Then
2440     StatBar.SimpleText = "Can't create archive " + CD.FileName
2441     Exit Sub
2442 End If
2443 dwFlags = MAFA_REPLACE_EXISTING
2444 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2445 For bNum = 1 To UBound(Files)
2446     StatBar.Style = 1
2447     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2448     MousePointer = 11
2449     If mnuMCNone.Checked Then
2450         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2451     ElseIf mnuMCStandard.Checked Then
2452         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2453     ElseIf mnuMCDeflate.Checked Then
2454         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2455     ElseIf mnuMCAMedium.Checked Then
2456         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2457     ElseIf mnuMCAHighest.Checked Then
2458         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2459     ElseIf mnuMCALowest.Checked Then
2460         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2461     ElseIf mnuMCAuto.Checked Then
2462         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2463     End If
2464     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2465     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2466     For cNum = 1 To mFilter.ListCount - 1
2467         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2468             mFilter.RemoveItem cNum
2469             Exit For
2470         End If
2471     Next cNum
2472 Next bNum
2473 MpqCloseUpdatedArchive hMPQ, 0
2474 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2475 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2476     StatBar.SimpleText = "Adding files to listing... 0% complete"
2477     For bNum = 1 To UBound(Files)
2478         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2479             MpqAddToListing hMPQ, ShortFiles(bNum)
2480         End If
2481         On Error Resume Next
2482         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2483         On Error GoTo 0
2484     Next bNum
2485     SFileCloseArchive hMPQ
2486 End If
2487 StatBar.Style = 0
2488 StatBar.SimpleText = ""
2489 MousePointer = 0
2490 If MatchesFilter("(listfile)", FileFilter) Then
2491     AddToListing "(listfile)"
2492 End If
2493 mFilter = FileFilter
2494 List.Sorted = True
2495 RemoveDuplicates
2496 ShowTotal
2497 Cancel:
2498 End Sub
2499 Private Sub mnuMAddFolder_Click()
2500 Dim Files() As String, ShortFiles() As String, bNum As Long, fNum As Long, Path As String, FolderFiles As String, cNum As Long, FileFilter As String, hMPQ As Long
2501 Dim lIndex As Long, L1 As String, L2 As String, L3 As String, L4 As String, L5 As String, fSize As Long, cSize As Long, fFlags As Long, dwFlags As Long
2502 PathInput.hwndOwner = hWnd
2503 Path = PathInputBox(PathInput, "Folder to add files from...", CurDir)
2504 If Path = "" Then GoTo Cancel
2505 FolderFiles = DirEx(Path, "*", 6, True)
2506 If FolderFiles = "" Then Exit Sub
2507 ReDim Files(0) As String
2508 Files(0) = Path
2509 If Right(Path, 1) <> "\" Then Path = Path + "\"
2510 For bNum = 1 To Len(FolderFiles)
2511     ReDim Preserve Files(UBound(Files) + 1) As String
2512     If InStr(bNum, FolderFiles, vbCrLf) > 0 Then
2513         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path), InStr(bNum, FolderFiles, vbCrLf) - bNum - Len(Path))
2514         bNum = InStr(bNum, FolderFiles, vbCrLf) + 1
2515     Else
2516         Files(UBound(Files)) = Mid(FolderFiles, bNum + Len(Path))
2517         Exit For
2518     End If
2519 Next bNum
2520 FoldName.Show 1
2521 If AddFolderName = Chr(0) + Chr(255) + Chr(127) + Chr(128) Then GoTo Cancel
2522 If UBound(Files) > 1 Then
2523     ReDim ShortFiles(UBound(Files)) As String
2524     For bNum = 0 To UBound(Files)
2525         ShortFiles(bNum) = AddFolderName + Files(bNum)
2526     Next bNum
2527     If Right(Files(0), 1) <> "\" Then Files(0) = Files(0) + "\"
2528     For bNum = 1 To UBound(Files)
2529         Files(bNum) = FullPath(Files(0), Files(bNum))
2530     Next bNum
2531 Else
2532     For bNum = 1 To Len(Files(1))
2533         If InStr(bNum, Files(1), "\") > 0 Then
2534             bNum = InStr(bNum, Files(1), "\")
2535         Else
2536             Exit For
2537         End If
2538     Next bNum
2539     ReDim ShortFiles(UBound(Files)) As String
2540     ShortFiles(1) = AddFolderName + Mid(Files(1), bNum)
2541     Files(1) = FullPath(Files(0), Files(1))
2542 End If
2543 If NewFile = True Then
2544     If FileExists(CD.FileName) Then Kill CD.FileName
2545     NewFile = False
2546 End If
2547 List.Sorted = False
2548 FileFilter = mFilter
2549 hMPQ = mOpenMpq(CD.FileName)
2550 If hMPQ = 0 Then
2551     StatBar.SimpleText = "Can't create archive " + CD.FileName
2552     Exit Sub
2553 End If
2554 dwFlags = MAFA_REPLACE_EXISTING
2555 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
2556 For bNum = 1 To UBound(Files)
2557     StatBar.Style = 1
2558     StatBar.SimpleText = "Adding " + Files(bNum) + "..."
2559     MousePointer = 11
2560     If mnuMCNone.Checked Then
2561         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags, 0, 0
2562     ElseIf mnuMCStandard.Checked Then
2563         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
2564     ElseIf mnuMCDeflate.Checked Then
2565         MpqAddFileToArchiveEx hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
2566     ElseIf mnuMCAMedium.Checked Then
2567         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 0
2568     ElseIf mnuMCAHighest.Checked Then
2569         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 1
2570     ElseIf mnuMCALowest.Checked Then
2571         MpqAddWaveToArchive hMPQ, Files(bNum), ShortFiles(bNum), dwFlags Or MAFA_COMPRESS, 2
2572     ElseIf mnuMCAuto.Checked Then
2573         mAddAutoFile hMPQ, Files(bNum), ShortFiles(bNum)
2574     End If
2575     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2576     mFilter.AddItem "*" + GetExtension(ShortFiles(bNum))
2577     For cNum = 1 To mFilter.ListCount - 1
2578         If LCase(mFilter.List(cNum)) = LCase(mFilter.List(cNum - 1)) Then
2579             mFilter.RemoveItem cNum
2580             Exit For
2581         End If
2582     Next cNum
2583 Next bNum
2584 MpqCloseUpdatedArchive hMPQ, 0
2585 If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2586 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) Then
2587     StatBar.SimpleText = "Adding files to listing... 0% complete"
2588     For bNum = 1 To UBound(Files)
2589         If MatchesFilter(ShortFiles(bNum), FileFilter) Then
2590             MpqAddToListing hMPQ, ShortFiles(bNum)
2591         End If
2592         On Error Resume Next
2593         StatBar.SimpleText = "Adding files to listing... " + CStr(Int((bNum / UBound(Files)) * 100)) + "% complete"
2594         On Error GoTo 0
2595     Next bNum
2596     SFileCloseArchive hMPQ
2597 End If
2598 StatBar.Style = 0
2599 StatBar.SimpleText = ""
2600 MousePointer = 0
2601 If MatchesFilter("(listfile)", FileFilter) Then
2602     AddToListing "(listfile)"
2603 End If
2604 mFilter = FileFilter
2605 List.Sorted = True
2606 RemoveDuplicates
2607 ShowTotal
2608 Cancel:
2609 End Sub
2611 Private Sub mnuMAddToList_Click()
2612 frmAddToList.Show 1
2613 End Sub
2614 Private Sub mnuMCAHighest_Click()
2615 mnuMCNone.Checked = False
2616 mnuMCStandard.Checked = False
2617 mnuMCDeflate.Checked = False
2618 mnuMCALowest.Checked = False
2619 mnuMCAMedium.Checked = False
2620 mnuMCAHighest.Checked = True
2621 mnuMCAuto.Checked = False
2622 End Sub
2623 Private Sub mnuMCALowest_Click()
2624 mnuMCNone.Checked = False
2625 mnuMCStandard.Checked = False
2626 mnuMCDeflate.Checked = False
2627 mnuMCALowest.Checked = True
2628 mnuMCAMedium.Checked = False
2629 mnuMCAHighest.Checked = False
2630 mnuMCAuto.Checked = False
2631 End Sub
2634 Private Sub mnuMCAMedium_Click()
2635 mnuMCNone.Checked = False
2636 mnuMCStandard.Checked = False
2637 mnuMCDeflate.Checked = False
2638 mnuMCALowest.Checked = False
2639 mnuMCAMedium.Checked = True
2640 mnuMCAHighest.Checked = False
2641 mnuMCAuto.Checked = False
2642 End Sub
2643 Private Sub mnuMCAuto_Click()
2644 mnuMCNone.Checked = False
2645 mnuMCStandard.Checked = False
2646 mnuMCDeflate.Checked = False
2647 mnuMCALowest.Checked = False
2648 mnuMCAMedium.Checked = False
2649 mnuMCAHighest.Checked = False
2650 mnuMCAuto.Checked = True
2651 End Sub
2653 Private Sub mnuMCDeflate_Click()
2654 mnuMCNone.Checked = False
2655 mnuMCStandard.Checked = False
2656 mnuMCDeflate.Checked = True
2657 mnuMCALowest.Checked = False
2658 mnuMCAMedium.Checked = False
2659 mnuMCAHighest.Checked = False
2660 mnuMCAuto.Checked = False
2661 End Sub
2664 Private Sub mnuMChLCID_Click()
2665 Dim fNum As Long
2666 On Error GoTo NotSelected
2667 List.SelectedItem.Tag = List.SelectedItem.Tag
2668 On Error GoTo 0
2669 For fNum = 1 To List.ListItems.Count
2670     If List.ListItems.Item(fNum).Selected Then
2671         GoTo FileSelected
2672     End If
2673 Next fNum
2674 GoTo NotSelected
2675 FileSelected:
2676 ChLCID.Show 1
2677 Exit Sub
2678 NotSelected:
2679 MsgBox "No files are selected.", , "WinMPQ"
2680 End Sub
2681 Private Sub mnuMCNone_Click()
2682 mnuMCNone.Checked = True
2683 mnuMCStandard.Checked = False
2684 mnuMCDeflate.Checked = False
2685 mnuMCALowest.Checked = False
2686 mnuMCAMedium.Checked = False
2687 mnuMCAHighest.Checked = False
2688 mnuMCAuto.Checked = False
2689 End Sub
2690 Private Sub mnuMCompact_Click()
2691 Dim fNum As Long, result As Long, hMPQ As Long
2692 If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2693     result = vbYes
2694 Else
2695     result = MsgBox("Uncompressed files with an 'X' in the attributes column and are not" + vbCrLf + "listed in (listfile) may be corrupted or deleted by the compacting process." + vbCrLf + "(Note:  These files are fairly rare)  Continue with compact?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2696 End If
2697 If result = vbYes Then
2698     StatBar.Style = 1
2699     StatBar.SimpleText = "Compacting " + CD.FileName + "..."
2700     MousePointer = 11
2701     hMPQ = mOpenMpq(CD.FileName)
2702     If hMPQ Then
2703         MpqCompactArchive hMPQ
2704         MpqCloseUpdatedArchive hMPQ, 0
2705     End If
2706     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2707     StatBar.Style = 0
2708     StatBar.SimpleText = ""
2709     MousePointer = 0
2710     OpenMpq
2711 End If
2712 End Sub
2713 Private Sub mnuMCStandard_Click()
2714 mnuMCNone.Checked = False
2715 mnuMCStandard.Checked = True
2716 mnuMCDeflate.Checked = False
2717 mnuMCALowest.Checked = False
2718 mnuMCAMedium.Checked = False
2719 mnuMCAHighest.Checked = False
2720 mnuMCAuto.Checked = False
2721 End Sub
2722 Private Sub mnuMDelete_Click()
2723 Dim fNum As Long, result As Long, hMPQ As Long
2724 On Error GoTo NotSelected
2725 List.SelectedItem.Tag = List.SelectedItem.Tag
2726 On Error GoTo 0
2727 For fNum = 1 To List.ListItems.Count
2728     If List.ListItems.Item(fNum).Selected Then
2729         GoTo FileSelected
2730     End If
2731 Next fNum
2732 GoTo NotSelected
2733 FileSelected:
2734     If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2735         result = vbYes
2736     Else
2737         result = MsgBox("Delete file(s)?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2738     End If
2739     If result = vbYes Then
2740         fNum = 1
2741         hMPQ = mOpenMpq(CD.FileName)
2742         If hMPQ Then
2743             Do While fNum <= List.ListItems.Count
2744                 If List.ListItems.Item(fNum).Selected Then
2745                     StatBar.Style = 1
2746                     StatBar.SimpleText = "Deleting " + List.ListItems.Item(fNum).Tag + "..."
2747                     MousePointer = 11
2748                     SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2749                     MpqDeleteFile hMPQ, List.ListItems.Item(fNum).Tag
2750                     SFileSetLocale LocaleID
2751                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
2752                     List.ListItems.Remove (fNum)
2753                     fNum = fNum - 1
2754                 End If
2755                 fNum = fNum + 1
2756             Loop
2757             MpqCloseUpdatedArchive hMPQ, 0
2758         End If
2759     End If
2760     StatBar.Style = 0
2761     StatBar.SimpleText = ""
2762     MousePointer = 0
2763     ShowSelected
2764     ShowTotal
2765 Exit Sub
2766 NotSelected:
2767 MsgBox "No files are selected.", , "WinMPQ"
2768 End Sub
2769 Private Sub mnuMEncrypt_Click()
2770 If mnuMEncrypt.Checked = False Then
2771     mnuMEncrypt.Checked = True
2772     GlobalEncrypt = True
2773 Else
2774     mnuMEncrypt.Checked = False
2775     GlobalEncrypt = False
2776 End If
2777 End Sub
2778 Private Sub mnuMExtract_Click()
2779 Dim fNum As Long, Path As String, result As Long, hMPQ As Long
2780 On Error GoTo NotSelected
2781 List.SelectedItem.Tag = List.SelectedItem.Tag
2782 On Error GoTo 0
2783 For fNum = 1 To List.ListItems.Count
2784     If List.ListItems.Item(fNum).Selected Then
2785         GoTo FileSelected
2786     End If
2787 Next fNum
2788 GoTo NotSelected
2789 FileSelected:
2790 PathInput.hwndOwner = hWnd
2791 Path = PathInputBox(PathInput, "Extract file(s) to...", CurDir)
2792 If Path = "" Then Exit Sub
2793 If Right(Path, 1) <> "\" Then Path = Path + "\"
2794 If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2795 For fNum = 1 To List.ListItems.Count
2796     If List.ListItems.Item(fNum).Selected Then
2797         StatBar.Style = 1
2798         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2799         MousePointer = 11
2800         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2801         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2802         SFileSetLocale LocaleID
2803     End If
2804 Next fNum
2805 SFileCloseArchive hMPQ
2806 StatBar.Style = 0
2807 StatBar.SimpleText = ""
2808 MousePointer = 0
2809 Exit Sub
2810 NotSelected:
2811 If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
2812     result = vbYes
2813 Else
2814     result = MsgBox("No files are selected." + vbCrLf + "Extract all listed files?", vbYesNo Or vbQuestion Or vbDefaultButton2, "WinMPQ")
2815 End If
2816 If result = vbYes Then
2817     PathInput.hwndOwner = hWnd
2818     Path = PathInputBox(PathInput, "Extract file(s) to...", CurDir)
2819     If Path = "" Then Exit Sub
2820     If Right(Path, 1) <> "\" Then Path = Path + "\"
2821     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2822     For fNum = 1 To List.ListItems.Count
2823         StatBar.Style = 1
2824         StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2825         MousePointer = 11
2826         SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2827         sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2828         SFileSetLocale LocaleID
2829     Next fNum
2830     SFileCloseArchive hMPQ
2831     StatBar.Style = 0
2832     StatBar.SimpleText = ""
2833     MousePointer = 0
2834 End If
2835 End Sub
2836 Private Sub mnuFNew_Click()
2837 Dim TItem As Menu
2838 CD.Flags = &H1000 Or &H4 Or &H2
2839 CD.DefaultExt = "mpq"
2840 CD.Filter = "Mpq Archives (*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m)|*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m|All Files (*.*)|*.*"
2841 CD.hwndOwner = hWnd
2842 If ShowSave(CD) = False Then GoTo Cancel
2843 ReDim FileList(0) As String
2844 List.ListItems.Clear
2845 ShowSelected
2846 ShowTotal
2847 NewFile = True
2848 ReDim OpenFiles(0) As String, OpenFileDates(0) As Date
2849 mnuMpq.Enabled = True
2850 For Each TItem In mnuTItem
2851     TItem.Enabled = True
2852 Next TItem
2853 Toolbar.Buttons.Item("Add").Enabled = True
2854 Toolbar.Buttons.Item("Add Folder").Enabled = True
2855 Toolbar.Buttons.Item("Extract").Enabled = True
2856 Toolbar.Buttons.Item("Compact").Enabled = True
2857 Toolbar.Buttons.Item("List").Enabled = True
2858 Caption = "WinMPQ - " + CD.FileTitle
2859 AddRecentFile CD.FileName
2860 Cancel:
2861 End Sub
2862 Private Sub mnuFOpen_Click()
2863 Dim OldFileName As String
2864 CD.Flags = &H1000 Or &H4 Or &H2
2865 CD.Filter = "Mpq Archives (*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m)|*.mpq;*.exe;*.snp;*.scm;*.scx;*.w3m|All Files (*.*)|*.*"
2866 OldFileName = CD.FileName
2867 CD.hwndOwner = hWnd
2868 If ShowOpen(CD) = False Then GoTo Cancel
2869 OpenMpq
2870 If CD.FileName = "" Then CD.FileName = OldFileName
2871 Cancel:
2872 End Sub
2873 Private Sub mnuMItem_Click(Index As Integer)
2874 FileActionClick mnuMpq, mnuMItem, Index
2875 End Sub
2876 Private Sub mnuMRename_Click()
2877 List.StartLabelEdit
2878 End Sub
2879 Private Sub mnuMSaveList_Click()
2880 Dim fNum As Long, fList As String, OldFileName As String
2881 CD.Flags = &H1000 Or &H4 Or &H2
2882 CD.DefaultExt = "txt"
2883 CD.Filter = "Text File (*.txt)|*.txt|All Files (*.*)|*.*"
2884 OldFileName = CD.FileName
2885 CD.FileName = CD.FileName + ".txt"
2886 CD.hwndOwner = hWnd
2887 If ShowSave(CD) = False Then GoTo Cancel
2888 StatBar.Style = 1
2889 StatBar.SimpleText = "Creating list..."
2890 MousePointer = 11
2891 For fNum = 1 To List.ListItems.Count
2892     fList = fList + List.ListItems.Item(fNum).Tag + vbCrLf
2893 Next fNum
2894 fNum = FreeFile
2895 Open CD.FileName For Binary As #fNum
2896 Put #fNum, 1, fList
2897 Close #fNum
2898 Cancel:
2899 CD.FileName = OldFileName
2900 StatBar.Style = 0
2901 StatBar.SimpleText = ""
2902 MousePointer = 0
2903 End Sub
2904 Private Sub mnuOptions_Click()
2905 Options.Show 1
2906 End Sub
2908 Private Sub mnuPChLCID_Click()
2909 mnuMChLCID_Click
2910 End Sub
2911 Private Sub mnuPDelete_Click()
2912 mnuMDelete_Click
2913 End Sub
2914 Private Sub mnuPExtract_Click()
2915 mnuMExtract_Click
2916 End Sub
2917 Private Sub mnuPItem_Click(Index As Integer)
2918 FileActionClick mnuPopup, mnuPItem, Index
2919 End Sub
2920 Private Sub mnuPRename_Click()
2921 mnuMRename_Click
2922 End Sub
2923 Private Sub mnuPTItem_Click(Index As Integer)
2924 mnuTItem_Click Index
2925 End Sub
2926 Private Sub mnuTAdd_Click()
2927 ToolList.Show 1
2928 BuildToolsList
2929 End Sub
2930 Private Sub mnuTItem_Click(Index As Integer)
2931 Dim Param As String, bNum As Long, FileName As String, Path As String, fNum As Long, AlreadyInList As Boolean, UseFile As Boolean, NewParam As String, FileNameList As String, hMPQ As Long
2932 Param = mnuTItem(Index).Tag
2933 On Error GoTo NoProgram
2934 If Param = "" Then Err.Raise 53
2935 On Error GoTo 0
2936 Do
2937     If InStr(1, Param, "%mpq", 1) Then
2938         bNum = InStr(1, Param, "%mpq", 1)
2939         Param = Left(Param, bNum - 1) + CD.FileName + Mid(Param, bNum + 4)
2940     End If
2941 Loop While InStr(1, Param, "%mpq", 1)
2942 NewParam = Param
2943 On Error GoTo NotSelected
2944 List.SelectedItem.Tag = List.SelectedItem.Tag
2945 On Error GoTo 0
2946 If List.SelectedItem.Selected Then FileName = List.SelectedItem.Tag
2947 NotSelected:
2948 If FileName <> "" And (InStr(Param, "%1") Or (InStr(Param, "%1") = 0 And InStr(1, mnuTItem(Index).Tag, "%mpq", 1) = 0)) Then
2949     Path = App.Path
2950     If Right(Path, 1) <> "\" Then Path = Path + "\"
2951     Path = Path + "Temp_extract\"
2952     If ExtractPathNum = -1 Then
2953         fNum = 0
2954         Do
2955         If DirEx(Path + CStr(fNum), "*", 6, True) = "" Then Exit Do
2956         fNum = fNum + 1
2957         Loop
2958         ExtractPathNum = fNum
2959     End If
2960     Path = Path + CStr(ExtractPathNum) + "\"
2961     If SFileOpenArchive(CD.FileName, 0, 0, hMPQ) = 0 Then Exit Sub
2962     For fNum = 1 To List.ListItems.Count
2963         If List.ListItems.Item(fNum).Selected Then
2964             StatBar.Style = 1
2965             StatBar.SimpleText = "Extracting " + List.ListItems.Item(fNum).Tag + "..."
2966             MousePointer = 11
2967             SFileSetLocale List.ListItems.Item(fNum).ListSubItems(4).Tag
2968             sGetFile hMPQ, List.ListItems.Item(fNum).Tag, Path, True
2969             SFileSetLocale LocaleID
2970             If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then
2971                 For bNum = 1 To UBound(OpenFiles)
2972                     If LCase(OpenFiles(bNum)) = LCase(List.ListItems.Item(fNum).Tag) Then
2973                         AlreadyInList = True
2974                         If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(bNum) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2975                         Exit For
2976                     End If
2977                 Next bNum
2978                 If AlreadyInList = False Then
2979                     ReDim Preserve OpenFiles(UBound(OpenFiles) + 1) As String, OpenFileDates(UBound(OpenFileDates) + 1) As Date
2980                     OpenFiles(UBound(OpenFiles)) = List.ListItems.Item(fNum).Tag
2981                     If FileExists(FullPath(Path, List.ListItems.Item(fNum).Tag)) Then OpenFileDates(UBound(OpenFileDates)) = FileDateTime(FullPath(Path, List.ListItems.Item(fNum).Tag))
2982                 End If
2983             End If
2984             StatBar.Style = 1
2985             StatBar.SimpleText = "Opening " + List.ListItems.Item(fNum).Tag + "..."
2986             FileName = FullPath(Path, List.ListItems.Item(fNum).Tag)
2987             UseFile = True
2988             Param = NewParam
2989             Do
2990                 If InStr(Param, "%1") = 0 And InStr(1, mnuTItem(Index).Tag, "%mpq", 1) = 0 Then
2991                     If FileName <> "" Then
2992                         Param = Param + " " + FileName
2993                     End If
2994                 ElseIf InStr(Param, Chr(34) + "%1" + Chr(34)) Then
2995                     bNum = InStr(Param, Chr(34) + "%1" + Chr(34))
2996                     If FileName <> "" Then
2997                         Param = Left(Param, bNum - 1) + Chr(34) + FileName + Chr(34) + Mid(Param, bNum + 4)
2998                     Else
2999                         Param = Left(Param, bNum - 1) + Mid(Param, bNum + 4)
3000                     End If
3001                 ElseIf InStr(Param, "%1") Then
3002                     bNum = InStr(Param, "%1")
3003                     If FileName <> "" Then
3004                         Param = Left(Param, bNum - 1) + FileName + Mid(Param, bNum + 2)
3005                     Else
3006                         Param = Left(Param, bNum - 1) + Mid(Param, bNum + 2)
3007                     End If
3008                 End If
3009             Loop While InStr(Param, "%1")
3010             On Error GoTo NoProgram
3011             Shell Param, 1
3012             On Error GoTo 0
3013             If GetReg(AppKey + "CheckModDateTime", 1) > 0 Then Timer1.Enabled = True
3014         End If
3015     Next fNum
3016     SFileCloseArchive hMPQ
3017 ElseIf InStr(1, mnuTItem(Index).Tag, "%mpq", 1) Then
3018     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
3019     On Error GoTo NoProgram
3020     Shell Param, 1
3021     On Error GoTo 0
3022     Timer1.Enabled = True
3023 Else
3024     MsgBox "No files are selected.", , "WinMPQ"
3025 End If
3026 If FileName <> "" Then
3027     StatBar.Style = 0
3028     StatBar.SimpleText = ""
3029     MousePointer = 0
3030 End If
3031 Exit Sub
3032 NoProgram:
3033 If Err.Number = 53 Then MsgBox "No program is assigned for this action.", , "WinMPQ"
3034 End Sub
3036 Private Sub mnuTMpqEmbed_Click()
3037 frmMpq.Show
3038 End Sub
3039 Private Sub Timer1_Timer()
3040 Dim fNum As Long, Path As String, result As Long, bNum As Long, hMPQ As Long, dwFlags As Long
3041 If Screen.ActiveForm.Name <> "MpqEx" Then Exit Sub
3042 Path = App.Path
3043 If Right(Path, 1) <> "\" Then Path = Path + "\"
3044 Path = Path + "Temp_extract\"
3045 Path = Path + CStr(ExtractPathNum) + "\"
3046 For fNum = 1 To UBound(OpenFiles)
3047     If FileExists(FullPath(Path, OpenFiles(fNum))) Then
3048         If FileDateTime(FullPath(Path, OpenFiles(fNum))) > OpenFileDates(fNum) Then
3049             If GetReg(AppKey + "ShowConfirmation", 1) = 0 Then
3050                 result = vbYes
3051             Else
3052             result = MsgBox("File " + OpenFiles(fNum) + " has been changed since it was extracted." + vbCrLf + vbCrLf + "Update archive with this file?", vbYesNo Or vbInformation, "WinMPQ")
3053             End If
3054             If FileExists(FullPath(Path, OpenFiles(fNum))) Then
3055                 OpenFileDates(fNum) = FileDateTime(FullPath(Path, OpenFiles(fNum)))
3056                 If result = vbYes Then
3057                     List.Sorted = False
3058                     StatBar.Style = 1
3059                     StatBar.SimpleText = "Adding " + OpenFiles(fNum) + "..."
3060                     MousePointer = 11
3061                     dwFlags = MAFA_REPLACE_EXISTING
3062                     If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT
3063                     hMPQ = mOpenMpq(CD.FileName)
3064                     If hMPQ Then
3065                         If mnuMCNone.Checked Then
3066                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags, 0, 0
3067                         ElseIf mnuMCStandard.Checked Then
3068                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0
3069                         ElseIf mnuMCDeflate.Checked Then
3070                             MpqAddFileToArchiveEx hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel
3071                         ElseIf mnuMCAMedium.Checked Then
3072                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 0
3073                         ElseIf mnuMCAHighest.Checked Then
3074                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 1
3075                         ElseIf mnuMCALowest.Checked Then
3076                             MpqAddWaveToArchive hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum), dwFlags Or MAFA_COMPRESS, 2
3077                         ElseIf mnuMCAuto.Checked Then
3078                             mAddAutoFile hMPQ, FullPath(Path, OpenFiles(fNum)), OpenFiles(fNum)
3079                         End If
3080                     End If
3081                     MpqAddToListing hMPQ, OpenFiles(fNum)
3082                     MpqCloseUpdatedArchive hMPQ, 0
3083                     If FileExists(CD.FileName) Then MpqDate = FileDateTime(CD.FileName)
3084                     StatBar.Style = 0
3085                     StatBar.SimpleText = ""
3086                     MousePointer = 0
3087                     List.Sorted = True
3088                     RemoveDuplicates
3089                     ShowTotal
3090                 End If
3091             End If
3092         End If
3093     Else
3094         For bNum = fNum To UBound(OpenFiles) - 1
3095             OpenFiles(bNum) = OpenFiles(bNum + 1)
3096             OpenFileDates(bNum) = OpenFileDates(bNum + 1)
3097         Next bNum
3098         ReDim Preserve OpenFiles(UBound(OpenFiles) - 1) As String, OpenFileDates(UBound(OpenFileDates) - 1) As Date
3099         fNum = fNum - 1
3100         If UBound(OpenFiles) = 0 Then Timer1.Enabled = False
3101     End If
3102     If fNum >= UBound(OpenFiles) Then Exit For
3103 Next fNum
3104 If FileExists(CD.FileName) Then
3105     If FileDateTime(CD.FileName) <> MpqDate And NewFile = False Then OpenMpq
3106 Else
3107     OpenMpq
3108 End If
3109 End Sub
3110 Private Sub Toolbar_ButtonClick(ByVal Button As Button)
3111 Select Case Button.Key
3112 Case "New"
3113     mnuFNew_Click
3114 Case "Open"
3115     mnuFOpen_Click
3116 Case "Add"
3117     mnuMAdd_Click
3118 Case "Add Folder"
3119     mnuMAddFolder_Click
3120 Case "Extract"
3121     mnuMExtract_Click
3122 Case "Compact"
3123     mnuMCompact_Click
3124 Case "List"
3125     If NewFile = False Then OpenMpq
3126 End Select
3127 End Sub
3128 Private Sub txtCommand_GotFocus()
3129 cmdGo.Default = True
3130 txtCommandHasFocus = True
3131 StatBar.Style = 1
3132 StatBar.SimpleText = "Current directory: " + Chr(34) + CurDir + Chr(34)
3133 End Sub
3134 Private Sub txtCommand_LostFocus()
3135 cmdGo.Default = False
3136 txtCommandHasFocus = False
3137 StatBar.Style = 0
3138 StatBar.SimpleText = ""
3139 End Sub