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

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2021-12-31 00:27:16 +0300
committerelfmz <fenix1905@tut.by>2021-12-31 02:27:02 +0300
commita14dc1a81c797928d4f1b7d6a6b46ecc63f98308 (patch)
treec27c61ac33582bc4d469c6608cd042add388f230 /far2l/src/filelist.hpp
parentd5f1bf245e96834d44390d1723cfef3dfbb1fb02 (diff)
shuffle a bit far2l sources
Diffstat (limited to 'far2l/src/filelist.hpp')
-rw-r--r--far2l/src/filelist.hpp426
1 files changed, 426 insertions, 0 deletions
diff --git a/far2l/src/filelist.hpp b/far2l/src/filelist.hpp
new file mode 100644
index 00000000..701bbbb1
--- /dev/null
+++ b/far2l/src/filelist.hpp
@@ -0,0 +1,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 int 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);
+};