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

viewer.hpp « src « far2l - github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9f8684f30f20e65af7229250fc652fae5012dff7 (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
#pragma once

/*
viewer.hpp

Internal viewer
*/
/*
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 "scrobj.hpp"
#include "namelist.hpp"
#include <farplug-wide.h>
#include "poscache.hpp"
#include "config.hpp"
#include "cache.hpp"
#include "fileholder.hpp"

/* $ 10.07.2000 tran
   ! modified MAXSCRY from 120 to 300
   on win200, with Console height FAR work, but trap on viewer... */
#define  MAXSCRY     0x400

/* $ 12.07.2000 SVS
  - из-за увеличения длины строки до 0x800 вылетал FAR
    по Alt-F7. Сократим MAX_VIEWLINE до 1024 (0x400)
*/
#define MAX_VIEWLINE  0x2000 // 0x400
#define MAX_VIEWLINEB 0x200f // 0x40f

#define VIEWER_UNDO_COUNT   64

enum {VIEW_UNWRAP=0,VIEW_WRAP=1, VIEW_WORDWRAP=2};

class FileViewer;
class KeyBar;

struct ViewerString
{
	int64_t nFilePos;
	int64_t nSelStart;
	int64_t nSelEnd;
	bool bSelection;
	wchar_t lpData[MAX_VIEWLINEB + 1];
};

struct InternalViewerBookMark
{
	DWORD64 SavePosAddr[POSCACHE_BOOKMARK_COUNT];
	DWORD64 SavePosLeft[POSCACHE_BOOKMARK_COUNT];
};

struct ViewerUndoData
{
	int64_t UndoAddr;
	int64_t UndoLeft;
};

enum SEARCH_FLAGS
{
	SEARCH_MODE2   = 0x00000001,
	REVERSE_SEARCH = 0x00000002
};

enum SHOW_MODES
{
	SHOW_RELOAD,
	SHOW_HEX,
	SHOW_UP,
	SHOW_DOWN
};

class Viewer:public ScreenObject
{
		friend class FileViewer;

	private:

		unsigned iBoostPg = 0;
		BitFlags SearchFlags;

		struct ViewerOptions ViOpt;

		NamesList ViewNamesList;
		KeyBar *ViewKeyBar;

		ViewerString *Strings[MAXSCRY+1];

		FARString strFileName;
		FARString strFullFileName;

		BufferedFileView ViewFile;

		FAR_FIND_DATA_EX ViewFindData;

		FARString strProcessedViewName;

		FARString strLastSearchStr;
		int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchHex,LastSearchRegexp;

		struct ViewerMode VM;

		int64_t FilePos;
		int64_t SecondPos;
		int64_t LastScrPos;
		int64_t FileSize;
		int64_t LastSelPos;

		int64_t LeftPos;
		int64_t LastPage;
		int CRSym;
		int64_t SelectPos,SelectSize;
		DWORD SelectFlags;
		int ShowStatusLine,HideCursor;

		FARString strTitle;

		FARString strPluginData;
		int CodePageChangedByUser;
		int InternalKey;

		struct InternalViewerBookMark BMSavePos;
		struct ViewerUndoData UndoData[VIEWER_UNDO_COUNT];

		int LastKeyUndo;
		int Width,XX2;  // , используется при расчете ширины при скролбаре
		int ViewerID;
		bool OpenFailed;
		bool bVE_READ_Sent;
		FileViewer *HostFileViewer;
		bool AdjustSelPosition;

		bool m_bQuickView;

		UINT DefCodePage;

		std::shared_ptr<IFileHolder>  FileHolder;

	private:
		virtual void DisplayObject();

		void ShowPage(int nMode);

		void FilePosShiftLeft(uint64_t Offset);
		void Up();
		void ShowHex();
		void ShowStatus();
		/* $ 27.04.2001 DJ
		   функции для рисования скроллбара, для корректировки ширины в
		   зависимости от наличия скроллбара и для корректировки позиции файла
		   на границу строки
		*/
		void DrawScrollbar();
		void AdjustWidth();
		void AdjustFilePos();

		void ReadString(ViewerString *pString, int MaxSize, int StrSize);
		int CalcStrSize(const wchar_t *Str,int Length);
		void ChangeViewKeyBar();
		void SetCRSym();
		void Search(int Next,int FirstChar);
		void ConvertToHex(char *SearchStr,int &SearchLength);
		int HexToNum(int Hex);

		int vread(wchar_t *Buf,int Count, bool Raw=false);
		void vseek(int64_t Offset,int Whence);

		int64_t vtell();
		bool vgetc(WCHAR& C);
		void SetFileSize();
		int GetStrBytesNum(const wchar_t *Str, int Length);

		FARString ComposeCacheName();
		void SavePosCache();

	public:
		Viewer(bool bQuickView = false, UINT aCodePage = CP_AUTODETECT);
		virtual ~Viewer();


	public:
		int OpenFile(const wchar_t *Name,int warning);
		void SetViewKeyBar(KeyBar *ViewKeyBar);

		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);

		void SetStatusMode(int Mode);
		void EnableHideCursor(int HideCursor);
		int GetWrapMode();
		void SetWrapMode(int Wrap);
		int GetWrapType();
		void SetWrapType(int TypeWrap);
		void KeepInitParameters();
		void GetFileName(FARString &strName);
		void SetProcessed(bool Processed);
		bool GetProcessed() const { return VM.Processed; }
		virtual void ShowConsoleTitle();

		void SetTitle(const wchar_t *Title);
		FARString &GetTitle(FARString &Title,int SubLen=-1,int TruncSize=0);

		void SetFileHolder(std::shared_ptr<IFileHolder> Observer) { FileHolder = Observer;}
		std::shared_ptr<IFileHolder> &GetFileHolder() { return FileHolder;}

		void SetFilePos(int64_t Pos); // $ 18.07.2000 tran - change 'long' to 'unsigned long'
		int64_t GetFilePos() const { return FilePos; };
		int64_t GetViewFilePos() const { return FilePos; };
		int64_t GetViewFileSize() const { return FileSize; };

		void SetPluginData(const wchar_t *PluginData);
		void SetNamesList(NamesList *List);

		int  ViewerControl(int Command,void *Param);
		void SetHostFileViewer(FileViewer *Viewer) {HostFileViewer=Viewer;};

		void GoTo(int ShowDlg=TRUE,int64_t NewPos=0,DWORD Flags=0);
		void GetSelectedParam(int64_t &Pos, int64_t &Length, DWORD &Flags);
		// Функция выделения - как самостоятельная функция
		void SelectText(const int64_t &MatchPos,const int64_t &SearchLength, const DWORD Flags=0x1);

		int GetTabSize() const { return ViOpt.TabSize; }
		void SetTabSize(int newValue) { ViOpt.TabSize=newValue; }

		int GetAutoDetectCodePage() const { return ViOpt.AutoDetectCodePage; }
		void SetAutoDetectCodePage(int newValue) { ViOpt.AutoDetectCodePage=newValue; }

		int GetShowScrollbar() const { return ViOpt.ShowScrollbar; }
		void SetShowScrollbar(int newValue) { ViOpt.ShowScrollbar=newValue; }

		int GetShowArrows() const { return ViOpt.ShowArrows; }
		void SetShowArrows(int newValue) { ViOpt.ShowArrows=newValue; }
		/* IS $ */
		int GetPersistentBlocks() const { return ViOpt.PersistentBlocks; }
		void SetPersistentBlocks(int newValue) { ViOpt.PersistentBlocks=newValue; }

		int GetHexMode() const { return VM.Hex; }

		UINT GetCodePage() const { return VM.CodePage; }

		NamesList *GetNamesList() { return &ViewNamesList; }

		int ProcessHexMode(int newMode, bool isRedraw=TRUE);
		int ProcessWrapMode(int newMode, bool isRedraw=TRUE);
		int ProcessTypeWrapMode(int newMode, bool isRedraw=TRUE);
};