9 Copyright (c) 1996 Eugene Roshal
10 Copyright (c) 2000 Far Group
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions
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.
37 #include "namelist.hpp"
38 #include <farplug-wide.h>
39 #include "poscache.hpp"
42 #include "fileholder.hpp"
45 ! modified MAXSCRY from 120 to 300
46 on win200, with Console height FAR work, but trap on viewer... */
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};
69 wchar_t lpData
[MAX_VIEWLINEB
+ 1];
72 struct InternalViewerBookMark
74 DWORD64 SavePosAddr
[POSCACHE_BOOKMARK_COUNT
];
75 DWORD64 SavePosLeft
[POSCACHE_BOOKMARK_COUNT
];
86 SEARCH_MODE2
= 0x00000001,
87 REVERSE_SEARCH
= 0x00000002
98 class Viewer
:public ScreenObject
100 friend class FileViewer
;
104 unsigned iBoostPg
= 0;
105 BitFlags SearchFlags
;
107 struct ViewerOptions ViOpt
;
109 NamesList ViewNamesList
;
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
;
137 int64_t SelectPos
,SelectSize
;
139 int ShowStatusLine
,HideCursor
;
143 FARString strPluginData
;
144 int CodePageChangedByUser
;
147 struct InternalViewerBookMark BMSavePos
;
148 struct ViewerUndoData UndoData
[VIEWER_UNDO_COUNT
];
151 int Width
,XX2
; // , используется при расчете ширины при скролбаре
155 FileViewer
*HostFileViewer
;
156 bool AdjustSelPosition
;
162 std::shared_ptr
<IFileHolder
> FileHolder
;
165 virtual void DisplayObject();
167 void ShowPage(int nMode
);
169 void FilePosShiftLeft(uint64_t Offset
);
174 функции для рисования скроллбара, для корректировки ширины в
175 зависимости от наличия скроллбара и для корректировки позиции файла
178 void DrawScrollbar();
180 void AdjustFilePos();
182 void ReadString(ViewerString
*pString
, int MaxSize
, int StrSize
);
183 int CalcStrSize(const wchar_t *Str
,int Length
);
184 void ChangeViewKeyBar();
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
);
194 bool vgetc(WCHAR
& C
);
196 int GetStrBytesNum(const wchar_t *Str
, int Length
);
198 FARString
ComposeCacheName();
202 Viewer(bool bQuickView
= false, UINT aCodePage
= CP_AUTODETECT
);
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
);
217 void SetWrapMode(int Wrap
);
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
; }
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
);