Welcome to mirror list, hosted at ThFree Co, Russian Federation.

filelist.hpp « src « far2l - github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 66aaf9154127438a6bed3aa0ad6613e33279f16c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
#pragma once

/*
filelist.hpp

Файловая панель - общие функции
*/
/*
Copyright (c) 1996 Eugene Roshal
Copyright (c) 2000 Far Group
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The name of the authors may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "panel.hpp"
#include "dizlist.hpp"
#include "filefilterparams.hpp"
#include "DList.hpp"
#include "panelctype.hpp"
#include "plugins.hpp"
#include "ConfigRW.hpp"
#include "FSNotify.h"
#include <memory>

class FileFilter;

struct FileListItem
{
	FARString strName;
	FARString strOwner, strGroup;
	FARString strCustomData;

	uint64_t FileSize;
	uint64_t PhysicalSize;

	FILETIME CreationTime;
	FILETIME AccessTime;
	FILETIME WriteTime;
	FILETIME ChangeTime;

	wchar_t *DizText;
	wchar_t **CustomColumnData;

	DWORD_PTR UserData;

	HighlightDataColor Colors; // 5 DWORDs

	DWORD NumberOfLinks;
	DWORD UserFlags;
	DWORD FileAttr;
	DWORD FileMode;
	DWORD CRC32;

	int Position;
	int SortGroup;
	int CustomColumnNumber;

	bool Selected;
	bool PrevSelected;
	bool DeleteDiz;
	uint8_t ShowFolderSize;

	/// temporary values used to optimize sorting, they fit into
	/// 8-bytes alignment gap so there is no memory waisted
	unsigned short FileNamePos;	// offset from beginning of StrName
	unsigned short FileExtPos; // offset from FileNamePos

	void Clear()
	{
		strName.Clear();
		strOwner.Clear();
		strGroup.Clear();
		strCustomData.Clear();;

		FileSize = 0;
		PhysicalSize = 0;

		memset(&CreationTime, 0, sizeof(CreationTime));
		memset(&AccessTime, 0, sizeof(AccessTime));
		memset(&WriteTime, 0, sizeof(WriteTime));
		memset(&ChangeTime, 0, sizeof(ChangeTime));

		DizText = nullptr;
		CustomColumnData = nullptr;;

		UserData = 0;

		memset(&Colors, 0, sizeof(HighlightDataColor));

		NumberOfLinks = 0;
		UserFlags = 0;
		FileAttr = 0;
		FileMode = 0;
		CRC32 = 0;

		Position = 0;
		SortGroup = 0;
		CustomColumnNumber = 0;

		Selected = false;
		PrevSelected = false;
		DeleteDiz = false;
		ShowFolderSize = 0;
	}

	FileListItem& operator=(const FileListItem &fliCopy)
	{
		if (this != &fliCopy)
		{
			Selected = fliCopy.Selected;
			PrevSelected = fliCopy.PrevSelected;
			ShowFolderSize = fliCopy.ShowFolderSize;
			Colors=fliCopy.Colors;
			NumberOfLinks = fliCopy.NumberOfLinks;
			UserFlags = fliCopy.UserFlags;
			UserData = fliCopy.UserData;
			Position = fliCopy.Position;
			SortGroup = fliCopy.SortGroup;
			DizText = fliCopy.DizText;
			DeleteDiz = fliCopy.DeleteDiz;
			strOwner = fliCopy.strOwner;
			strGroup = fliCopy.strGroup;
			CustomColumnData = fliCopy.CustomColumnData;
			CustomColumnNumber = fliCopy.CustomColumnNumber;
			CRC32 = fliCopy.CRC32;
			FileAttr = fliCopy.FileAttr;
			FileMode = fliCopy.FileMode;
			CreationTime=fliCopy.CreationTime;
			AccessTime=fliCopy.AccessTime;
			WriteTime=fliCopy.WriteTime;
			ChangeTime=fliCopy.ChangeTime;
			FileSize = fliCopy.FileSize;
			PhysicalSize = fliCopy.PhysicalSize;
			strName = fliCopy.strName;
			strCustomData = fliCopy.strCustomData;
		}

		return *this;
	}
};

struct PluginsListItem
{
	HANDLE hPlugin;
	FARString strHostFile;
	FARString strPrevOriginalCurDir;
	std::map<FARString, FARString> Dir2CursorFile;
	int Modified;
	int PrevViewMode;
	int PrevSortMode;
	int PrevSortOrder;
	int PrevNumericSort;
	int PrevCaseSensitiveSort;
	int PrevDirectoriesFirst;
	PanelViewSettings PrevViewSettings;
};

struct PrevDataItem
{
	FileListItem **PrevListData;
	int PrevFileCount;
	FARString strPrevName;
	int PrevTopFile;
};

class FileList:public Panel
{
	private:
		FileFilter *Filter;
		DizList Diz;
		int DizRead;
		/* $ 09.11.2001 IS
		     Открывающий и закрывающий символ, которые используются для показа
		     имени, которое не помещается в панели. По умолчанию - фигурные скобки.
		*/
		wchar_t openBracket[2], closeBracket[2];

		FARString strOriginalCurDir;
		FARString strPluginDizName;
		FileListItem **ListData;
		int FileCount;
		HANDLE hPlugin;
		DList<PrevDataItem*>PrevDataList;
		DList<PluginsListItem*>PluginsList;
		std::unique_ptr<IFSNotify> ListChange;
		long UpperFolderTopFile,LastCurFile;
		long ReturnCurrentFile;
		long SelFileCount;
		long GetSelPosition,LastSelPosition;
		long TotalFileCount;
		uint64_t SelFileSize;
		uint64_t TotalFileSize;
		uint64_t FreeDiskSize;
		clock_t LastUpdateTime;
		int Height,Columns;

		int ColumnsInGlobal;

		int LeftPos;
		int ShiftSelection;
		int MouseSelection;
		int SelectedFirst;
		int IsEmpty; // указывает на полностью пустую колонку
		int AccessTimeUpdateRequired;

		int UpdateRequired,UpdateRequiredMode,UpdateDisabled;
		int SortGroupsRead;
		int InternalProcessKey;

		long CacheSelIndex,CacheSelPos;
		long CacheSelClearIndex,CacheSelClearPos;

	private:
		virtual void SetSelectedFirstMode(int Mode);
		virtual int GetSelectedFirstMode() {return SelectedFirst;}
		virtual void DisplayObject();
		void DeleteListData(FileListItem **(&ListData),int &FileCount);
		void Up(int Count);
		void Down(int Count);
		void Scroll(int Count);
		void CorrectPosition();
		void ShowFileList(int Fast);
		void ShowList(int ShowStatus,int StartColumn);
		void SetShowColor(int Position, int ColorType=HIGHLIGHTCOLORTYPE_FILE);
		int  GetShowColor(int Position, int ColorType);
		void ShowSelectedSize();
		void ShowTotalSize(OpenPluginInfo &Info);
		int ConvertName(const wchar_t *SrcName, FARString &strDest, int MaxLength, int RightAlign, int ShowStatus, DWORD dwFileAttr);

		void Select(FileListItem *SelPtr,bool Selection);
		long SelectFiles(int Mode,const wchar_t *Mask=nullptr);
		void ProcessEnter(bool EnableExec,bool SeparateWindow, bool EnableAssoc=true, bool RunAs = false, OPENFILEPLUGINTYPE Type = OFP_NORMAL);
		// ChangeDir возвращает FALSE, eсли не смогла выставить заданный путь
		BOOL ChangeDir(const wchar_t *NewDir,BOOL IsUpdated=TRUE);
		void CountDirSize(DWORD PluginFlags);
		/* $ 19.03.2002 DJ
		   IgnoreVisible - обновить, даже если панель невидима
		*/
		void ReadFileNames(int KeepSelection, int IgnoreVisible, int DrawMessage, int CanBeAnnoying);
		void UpdatePlugin(int KeepSelection, int IgnoreVisible);

		void MoveSelection(FileListItem **FileList,long FileCount,FileListItem **OldList,long OldFileCount);
		virtual int GetSelCount();
		virtual int GetSelName(FARString *strName,DWORD &FileAttr,DWORD &FileMode,FAR_FIND_DATA_EX *fde=nullptr);
		virtual void UngetSelName();
		virtual void ClearLastGetSelection();

		virtual uint64_t GetLastSelectedSize();
		virtual int GetLastSelectedItem(FileListItem *LastItem);

		virtual int GetCurName(FARString &strName);
		virtual int GetCurBaseName(FARString &strName);

		void PushPlugin(HANDLE hPlugin,const wchar_t *HostFile);
		int PopPlugin(int EnableRestoreViewMode);
		void CopyFiles();
		void CopyNames(bool FullPathName, bool UNC);
		void SelectSortMode();
		bool ApplyCommand();
		void DescribeFiles();
		void CreatePluginItemList(PluginPanelItem *(&ItemList),int &ItemNumber,BOOL AddTwoDot=TRUE);
		void DeletePluginItemList(PluginPanelItem *(&ItemList),int &ItemNumber);
		HANDLE OpenPluginForFile(const wchar_t *FileName,DWORD FileAttr, OPENFILEPLUGINTYPE Type);
		int PreparePanelView(PanelViewSettings *PanelView);
		int PrepareColumnWidths(unsigned int *ColumnTypes,int *ColumnWidths,
		                        int *ColumnWidthsTypes,int &ColumnCount,int FullScreen);
		void PrepareViewSettings(int ViewMode,OpenPluginInfo *PlugInfo);

		void PluginDelete();
		void PutDizToPlugin(FileList *DestPanel,PluginPanelItem *ItemList,
		                    int ItemNumber,int Delete,int Move,DizList *SrcDiz,
		                    DizList *DestDiz);
		void PluginGetFiles(const wchar_t **DestPath,int Move);
		void PluginToPluginFiles(int Move);
		void PluginHostGetFiles();
		void PluginPutFilesToNew();
		// возвращает то, что возвращает PutFiles
		int PluginPutFilesToAnother(int Move,Panel *AnotherPanel);
		void ProcessPluginCommand();
		void PluginClearSelection(PluginPanelItem *ItemList,int ItemNumber);
		void ProcessCopyKeys(int Key);
		void ReadSortGroups(bool UpdateFilterCurrentTime=true);
		void AddParentPoint(FileListItem *CurPtr,long CurFilePos,FILETIME* Times=nullptr,FARString Owner=L"",FARString Group=L"");
		int  ProcessOneHostFile(int Idx);

	protected:
		virtual void ClearAllItem();

	public:
		FileList();
		virtual ~FileList();

	public:
		virtual int ProcessKey(int Key);
		virtual int ProcessMouse(MOUSE_EVENT_RECORD *MouseEvent);
		virtual int64_t VMProcess(int OpCode,void *vParam=nullptr,int64_t iParam=0);
		virtual void MoveToMouse(MOUSE_EVENT_RECORD *MouseEvent);
		virtual void SetFocus();
		virtual void Update(int Mode);
		/*$ 22.06.2001 SKV
		  Параметр для игнорирования времени последнего Update.
		  Используется для Update после исполнения команды.
		*/
		virtual int UpdateIfChanged(int UpdateMode);

		/* $ 19.03.2002 DJ
		   UpdateIfRequired() - обновить, если апдейт был пропущен из-за того,
		   что панель невидима
		*/
		virtual void UpdateIfRequired();

		virtual int SendKeyToPlugin(DWORD Key,BOOL Pred=FALSE);
		void CreateChangeNotification(int CheckTree);
		virtual void CloseChangeNotification();
		virtual void SortFileList(int KeepPosition);
		virtual void SetViewMode(int ViewMode);
		virtual void SetSortMode(int SortMode);
		void SetSortMode0(int SortMode);
		virtual void ChangeSortOrder(int NewOrder);
		virtual void ChangeNumericSort(int Mode);
		virtual void ChangeCaseSensitiveSort(int Mode);
		virtual void ChangeDirectoriesFirst(int Mode);
		virtual BOOL SetCurDir(const wchar_t *NewDir,int ClosePlugin);
		virtual int GetPrevSortMode();
		virtual int GetPrevSortOrder();
		virtual int GetPrevViewMode();
		virtual int GetPrevNumericSort();
		virtual int GetPrevCaseSensitiveSort();
		virtual int GetPrevDirectoriesFirst();

		HANDLE OpenFilePlugin(const wchar_t *FileName,int PushPrev, OPENFILEPLUGINTYPE Type);
		virtual int GetFileName(FARString &strName,int Pos,DWORD &FileAttr);
		virtual int GetCurrentPos();
		virtual bool FindPartName(const wchar_t *Name,int Next,int Direct=1,int ExcludeSets=0);
		long FindFile(const char *Name,BOOL OnlyPartName=FALSE);

		virtual int GoToFile(long idxItem);
		virtual int GoToFile(const wchar_t *Name,BOOL OnlyPartName=FALSE);
		virtual long FindFile(const wchar_t *Name,BOOL OnlyPartName=FALSE);

		virtual bool IsSelected(const wchar_t *Name);
		virtual bool IsSelected(long idxItem);

		virtual long FindFirst(const wchar_t *Name);
		virtual long FindNext(int StartPos, const wchar_t *Name);

		void ProcessHostFile();
		virtual void UpdateViewPanel();
		virtual void CompareDir();
		virtual void ClearSelection();
		virtual void SaveSelection();
		virtual void RestoreSelection();
		virtual void EditFilter();
		virtual bool FileInFilter(long idxItem);
		virtual void ReadDiz(PluginPanelItem *ItemList=nullptr,int ItemLength=0, DWORD dwFlags=0);
		virtual void DeleteDiz(const wchar_t *Name);
		virtual void FlushDiz();
		virtual void GetDizName(FARString &strDizName);
		virtual void CopyDiz(const wchar_t *Name, const wchar_t *DestName, DizList *DestDiz);
		virtual int IsFullScreen();
		virtual int IsDizDisplayed();
		virtual int IsColumnDisplayed(int Type);
		virtual int GetColumnsCount() { return Columns;}
		virtual void SetReturnCurrentFile(int Mode);
		virtual void GetOpenPluginInfo(OpenPluginInfo *Info);
		virtual void SetPluginMode(HANDLE hPlugin,const wchar_t *PluginFile,bool SendOnFocus=false);

		void PluginGetPanelInfo(PanelInfo &Info);
		size_t PluginGetPanelItem(int ItemNumber,PluginPanelItem *Item);
		size_t PluginGetSelectedPanelItem(int ItemNumber,PluginPanelItem *Item);
		void PluginGetColumnTypesAndWidths(FARString& strColumnTypes,FARString& strColumnWidths);

		void PluginBeginSelection();
		void PluginSetSelection(int ItemNumber,bool Selection);
		void PluginClearSelection(int SelectedItemNumber);
		void PluginEndSelection();

		virtual void SetPluginModified();
		virtual int ProcessPluginEvent(int Event,void *Param);
		virtual void SetTitle();
		//virtual FARString &GetTitle(FARString &Title,int SubLen=-1,int TruncSize=0);
		int PluginPanelHelp(HANDLE hPlugin);
		virtual long GetFileCount() {return FileCount;}

		FARString &CreateFullPathName(const wchar_t *Name,DWORD FileAttr, FARString &strDest,int UNC);


		virtual BOOL GetItem(int Index,void *Dest);
		virtual BOOL UpdateKeyBar();

		virtual void IfGoHome(wchar_t Drive);

		void ResetLastUpdateTime() {LastUpdateTime = 0;}
		virtual HANDLE GetPluginHandle();
		virtual int GetRealSelCount();
		static void SetFilePanelModes();
		static void SavePanelModes(ConfigWriter &cfg_writer);
		static void ReadPanelModes(ConfigReader &cfg_reader);
		static int FileNameToPluginItem(const wchar_t *Name,PluginPanelItem *pi);
		static void FileListToPluginItem(FileListItem *fi,PluginPanelItem *pi);
		static void FreePluginPanelItem(PluginPanelItem *pi);
		size_t FileListToPluginItem2(FileListItem *fi,PluginPanelItem *pi);
		static void PluginToFileListItem(PluginPanelItem *pi,FileListItem *fi);
		static int IsModeFullScreen(int Mode);
};