support full-width/composite characters and true color palette in terminal (#1386)
[far2l.git] / far2l / src / viewer.hpp
blob9f8684f30f20e65af7229250fc652fae5012dff7
1 #pragma once
3 /*
4 viewer.hpp
6 Internal viewer
7 */
8 /*
9 Copyright (c) 1996 Eugene Roshal
10 Copyright (c) 2000 Far Group
11 All rights reserved.
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions
15 are met:
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
18 2. Redistributions in binary form must reproduce the above copyright
19 notice, this list of conditions and the following disclaimer in the
20 documentation and/or other materials provided with the distribution.
21 3. The name of the authors may not be used to endorse or promote products
22 derived from this software without specific prior written permission.
24 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #include "scrobj.hpp"
37 #include "namelist.hpp"
38 #include <farplug-wide.h>
39 #include "poscache.hpp"
40 #include "config.hpp"
41 #include "cache.hpp"
42 #include "fileholder.hpp"
44 /* $ 10.07.2000 tran
45 ! modified MAXSCRY from 120 to 300
46 on win200, with Console height FAR work, but trap on viewer... */
47 #define MAXSCRY 0x400
49 /* $ 12.07.2000 SVS
50 - из-за увеличения длины строки до 0x800 вылетал FAR
51 по Alt-F7. Сократим MAX_VIEWLINE до 1024 (0x400)
53 #define MAX_VIEWLINE 0x2000 // 0x400
54 #define MAX_VIEWLINEB 0x200f // 0x40f
56 #define VIEWER_UNDO_COUNT 64
58 enum {VIEW_UNWRAP=0,VIEW_WRAP=1, VIEW_WORDWRAP=2};
60 class FileViewer;
61 class KeyBar;
63 struct ViewerString
65 int64_t nFilePos;
66 int64_t nSelStart;
67 int64_t nSelEnd;
68 bool bSelection;
69 wchar_t lpData[MAX_VIEWLINEB + 1];
72 struct InternalViewerBookMark
74 DWORD64 SavePosAddr[POSCACHE_BOOKMARK_COUNT];
75 DWORD64 SavePosLeft[POSCACHE_BOOKMARK_COUNT];
78 struct ViewerUndoData
80 int64_t UndoAddr;
81 int64_t UndoLeft;
84 enum SEARCH_FLAGS
86 SEARCH_MODE2 = 0x00000001,
87 REVERSE_SEARCH = 0x00000002
90 enum SHOW_MODES
92 SHOW_RELOAD,
93 SHOW_HEX,
94 SHOW_UP,
95 SHOW_DOWN
98 class Viewer:public ScreenObject
100 friend class FileViewer;
102 private:
104 unsigned iBoostPg = 0;
105 BitFlags SearchFlags;
107 struct ViewerOptions ViOpt;
109 NamesList ViewNamesList;
110 KeyBar *ViewKeyBar;
112 ViewerString *Strings[MAXSCRY+1];
114 FARString strFileName;
115 FARString strFullFileName;
117 BufferedFileView ViewFile;
119 FAR_FIND_DATA_EX ViewFindData;
121 FARString strProcessedViewName;
123 FARString strLastSearchStr;
124 int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchHex,LastSearchRegexp;
126 struct ViewerMode VM;
128 int64_t FilePos;
129 int64_t SecondPos;
130 int64_t LastScrPos;
131 int64_t FileSize;
132 int64_t LastSelPos;
134 int64_t LeftPos;
135 int64_t LastPage;
136 int CRSym;
137 int64_t SelectPos,SelectSize;
138 DWORD SelectFlags;
139 int ShowStatusLine,HideCursor;
141 FARString strTitle;
143 FARString strPluginData;
144 int CodePageChangedByUser;
145 int InternalKey;
147 struct InternalViewerBookMark BMSavePos;
148 struct ViewerUndoData UndoData[VIEWER_UNDO_COUNT];
150 int LastKeyUndo;
151 int Width,XX2; // , используется при расчете ширины при скролбаре
152 int ViewerID;
153 bool OpenFailed;
154 bool bVE_READ_Sent;
155 FileViewer *HostFileViewer;
156 bool AdjustSelPosition;
158 bool m_bQuickView;
160 UINT DefCodePage;
162 std::shared_ptr<IFileHolder> FileHolder;
164 private:
165 virtual void DisplayObject();
167 void ShowPage(int nMode);
169 void FilePosShiftLeft(uint64_t Offset);
170 void Up();
171 void ShowHex();
172 void ShowStatus();
173 /* $ 27.04.2001 DJ
174 функции для рисования скроллбара, для корректировки ширины в
175 зависимости от наличия скроллбара и для корректировки позиции файла
176 на границу строки
178 void DrawScrollbar();
179 void AdjustWidth();
180 void AdjustFilePos();
182 void ReadString(ViewerString *pString, int MaxSize, int StrSize);
183 int CalcStrSize(const wchar_t *Str,int Length);
184 void ChangeViewKeyBar();
185 void SetCRSym();
186 void Search(int Next,int FirstChar);
187 void ConvertToHex(char *SearchStr,int &SearchLength);
188 int HexToNum(int Hex);
190 int vread(wchar_t *Buf,int Count, bool Raw=false);
191 void vseek(int64_t Offset,int Whence);
193 int64_t vtell();
194 bool vgetc(WCHAR& C);
195 void SetFileSize();
196 int GetStrBytesNum(const wchar_t *Str, int Length);
198 FARString ComposeCacheName();
199 void SavePosCache();
201 public:
202 Viewer(bool bQuickView = false, UINT aCodePage = CP_AUTODETECT);
203 virtual ~Viewer();
206 public:
207 int OpenFile(const wchar_t *Name,int warning);
208 void SetViewKeyBar(KeyBar *ViewKeyBar);
210 virtual int ProcessKey(int Key);
211 virtual int ProcessMouse(MOUSE_EVENT_RECORD *MouseEvent);
212 virtual int64_t VMProcess(int OpCode,void *vParam=nullptr,int64_t iParam=0);
214 void SetStatusMode(int Mode);
215 void EnableHideCursor(int HideCursor);
216 int GetWrapMode();
217 void SetWrapMode(int Wrap);
218 int GetWrapType();
219 void SetWrapType(int TypeWrap);
220 void KeepInitParameters();
221 void GetFileName(FARString &strName);
222 void SetProcessed(bool Processed);
223 bool GetProcessed() const { return VM.Processed; }
224 virtual void ShowConsoleTitle();
226 void SetTitle(const wchar_t *Title);
227 FARString &GetTitle(FARString &Title,int SubLen=-1,int TruncSize=0);
229 void SetFileHolder(std::shared_ptr<IFileHolder> Observer) { FileHolder = Observer;}
230 std::shared_ptr<IFileHolder> &GetFileHolder() { return FileHolder;}
232 void SetFilePos(int64_t Pos); // $ 18.07.2000 tran - change 'long' to 'unsigned long'
233 int64_t GetFilePos() const { return FilePos; };
234 int64_t GetViewFilePos() const { return FilePos; };
235 int64_t GetViewFileSize() const { return FileSize; };
237 void SetPluginData(const wchar_t *PluginData);
238 void SetNamesList(NamesList *List);
240 int ViewerControl(int Command,void *Param);
241 void SetHostFileViewer(FileViewer *Viewer) {HostFileViewer=Viewer;};
243 void GoTo(int ShowDlg=TRUE,int64_t NewPos=0,DWORD Flags=0);
244 void GetSelectedParam(int64_t &Pos, int64_t &Length, DWORD &Flags);
245 // Функция выделения - как самостоятельная функция
246 void SelectText(const int64_t &MatchPos,const int64_t &SearchLength, const DWORD Flags=0x1);
248 int GetTabSize() const { return ViOpt.TabSize; }
249 void SetTabSize(int newValue) { ViOpt.TabSize=newValue; }
251 int GetAutoDetectCodePage() const { return ViOpt.AutoDetectCodePage; }
252 void SetAutoDetectCodePage(int newValue) { ViOpt.AutoDetectCodePage=newValue; }
254 int GetShowScrollbar() const { return ViOpt.ShowScrollbar; }
255 void SetShowScrollbar(int newValue) { ViOpt.ShowScrollbar=newValue; }
257 int GetShowArrows() const { return ViOpt.ShowArrows; }
258 void SetShowArrows(int newValue) { ViOpt.ShowArrows=newValue; }
259 /* IS $ */
260 int GetPersistentBlocks() const { return ViOpt.PersistentBlocks; }
261 void SetPersistentBlocks(int newValue) { ViOpt.PersistentBlocks=newValue; }
263 int GetHexMode() const { return VM.Hex; }
265 UINT GetCodePage() const { return VM.CodePage; }
267 NamesList *GetNamesList() { return &ViewNamesList; }
269 int ProcessHexMode(int newMode, bool isRedraw=TRUE);
270 int ProcessWrapMode(int newMode, bool isRedraw=TRUE);
271 int ProcessTypeWrapMode(int newMode, bool isRedraw=TRUE);