📄 fshedview.cpp
字号:
// fshedView.cpp : implementation of the CFshedView class
//
#include "stdafx.h"
#include "atlbase.h"
#include "fshed.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
//#include "fshedDoc.h"
#include "fshedView.h"
#include "AddBookmarkDlg.h"
#include "RemoveBookmarkDlg.h"
#include "HexDumpDlg.h"
#include "AppendDialog.h"
#include "ManipulateBitsDlg.h"
#include "SelectBlockDlg.h"
#include "PasteSpecialDlg.h"
#include "FindDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SUB_RELEASE_NO "156"
#define NO_FILE (Doc->filename[0] == '\0')
#define LASTBYTE (Doc->DataArray.GetUpperBound ())
//--------------------------------------------------------------------------------------------
// FIND_BYTES
// Arguments:
// ps = Start position.
// ls = Length of src array.
// pb = Start of searchstring.
// lb = Length searchstring.
// mode = -1 : backwards search.
// 1 : forward search.
// cmp = pointer to function that is applied to data before comparing.
//
// Return:
// Position of found string or -1 if not there.
int find_bytes (char* ps, int ls, char* pb, int lb, int mode, char (*cmp) (char))
{
int start, inc, end, i;
if (mode == 1)
{
start = 0;
inc = 1;
end = ls - lb + 1;
}
else
{
start = ls - lb;
inc = -1;
end = 1;
}
for (; mode * start < end; start += inc)
{
for (i = start; i < start + lb; i++)
{
if (cmp (ps[i]) != cmp (pb[i - start]))
break;
}
if (i == start + lb)
return start;
}
return -1;
}
extern AFX_DATA const BOOL _afxDBCS;
typedef int (WINAPI* AFX_COMPARE_PROC)(LPCTSTR str1, LPCTSTR str2);
int find_bytes (char* ps, int ls, long lStartSel, long lEndSel,
char* lpszFind, int lb, BOOL bNext, BOOL bCase, BOOL bWholeWord)
{
UINT nLen = ls;
int nStartChar = lStartSel, nEndChar = lEndSel;
if (bWholeWord)
++nStartChar;
UINT nStart = nStartChar;
int iDir = bNext ? +1 : -1;
// can't find a match before the first character
if (nStart == 0 && iDir < 0)
return FALSE;
CWaitCursor wait;
LPCTSTR lpszText = ps;
if (iDir < 0)
{
// always go back one for search backwards
nStart -= (lpszText+nStart) -
_tcsdec(lpszText, lpszText+nStart);
}
else if (nStartChar != nEndChar) // && SameAsSelected(lpszFind, bCase))
{
// easy to go backward/forward with SBCS
if (_istlead(lpszText[nStart]))
nStart++;
nStart += iDir;
}
// handle search with nStart past end of buffer
size_t nLenFind = lstrlen(lpszFind);
if (nStart+nLenFind-1 >= nLen)
{
if (iDir < 0 && nLen >= nLenFind)
{
if (_afxDBCS)
{
// walk back to previous character n times
nStart = nLen;
int n = nLenFind;
while (n--)
{
nStart -= (lpszText+nStart) -
_tcsdec(lpszText, lpszText+nStart);
}
}
else
{
// single-byte character set is easy and fast
nStart = nLen - nLenFind;
}
ASSERT(nStart+nLenFind-1 <= nLen);
}
else
{
return -1;
}
}
// start the search at nStart
LPCTSTR lpsz = lpszText + nStart;
AFX_COMPARE_PROC pfnCompare = bCase ? lstrcmp : lstrcmpi;
if (_afxDBCS)
{
// double-byte string search
LPCTSTR lpszStop;
if (iDir > 0)
{
// start at current and find _first_ occurrance
lpszStop = lpszText + nLen - nLenFind + 1;
}
else
{
// start at top and find _last_ occurrance
lpszStop = lpsz;
lpsz = lpszText;
}
LPCTSTR lpszFound = NULL;
while (lpsz <= lpszStop)
{
if (!bCase || (*lpsz == *lpszFind &&
(!_istlead(*lpsz) || lpsz[1] == lpszFind[1])))
{
LPTSTR lpch = (LPTSTR)(lpsz + nLenFind);
TCHAR chSave = *lpch;
*lpch = '\0';
int nResult = (*pfnCompare)(lpsz, lpszFind);
*lpch = chSave;
if (nResult == 0)
{
lpszFound = lpsz;
if (iDir > 0)
break;
}
}
lpsz = _tcsinc(lpsz);
}
if (lpszFound != NULL)
{
int n = (int)(lpszFound - lpszText);
return n;
}
}
else
{
// single-byte string search
UINT nCompare;
if (iDir < 0)
nCompare = (UINT)(lpsz - lpszText) + 1;
else
nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1;
while (nCompare > 0)
{
ASSERT(lpsz >= lpszText);
ASSERT(lpsz+nLenFind-1 <= lpszText+nLen-1);
LPSTR lpch = (LPSTR)(lpsz + nLenFind);
char chSave = *lpch;
*lpch = '\0';
int nResult = (*pfnCompare)(lpsz, lpszFind);
*lpch = chSave;
if (nResult == 0)
{
int n = (int)(lpsz - lpszText);
return n;
}
// restore character at end of search
*lpch = chSave;
// move on to next substring
nCompare--;
lpsz += iDir;
}
}
return -1;
}
inline char equal (char c)
{
return c;
}
inline char lower_case (char c)
{
if (c >= 'A' && c <= 'Z')
return 'a' + c - 'A';
else
return c;
}
//Pabs changed - line insert
//used to swap tmpstart and tmpend if start>end
template<class T>void swap(T& x, T& y){
T temp = x;
x = y;
y = temp;
}
/////////////////////////////////////////////////////////////////////////////
// CFshedView
static const UINT _myMsgForFindReplace = ::RegisterWindowMessage(FINDMSGSTRING);
IMPLEMENT_DYNCREATE(CFshedView, CView)
BEGIN_MESSAGE_MAP(CFshedView, CView)
//{{AFX_MSG_MAP(CFshedView)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_WM_KEYDOWN()
ON_WM_CHAR()
ON_WM_TIMER()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
ON_COMMAND(ID_EDIT_FIND, OnEditFind)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_COMMAND(ID_EDIT_REPEAT, OnEditRepeat)
ON_COMMAND(ID_EDIT_REPLACE, OnEditReplace)
ON_COMMAND_RANGE(IDM_BOOKMARK1, IDM_BOOKMARK9, OnBookmark)
ON_COMMAND(IDM_REMOVE_BKM, OnRemoveBkm)
ON_COMMAND(IDM_CLEARALL_BMK, OnClearallBmk)
ON_COMMAND(IDM_ADDBOOKMARK, OnAddbookmark)
ON_COMMAND(IDM_COPY_HEXDUMP, OnCopyHexdump)
ON_COMMAND(IDM_INSERTFILE, OnInsertfile)
ON_COMMAND(IDM_SAVESELAS, OnSaveselas)
ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
ON_COMMAND(IDA_INSERTMODETOGGLE, OnInsertmodetoggle)
ON_COMMAND(IDM_CHANGE_MODE, OnChangeMode)
ON_COMMAND(IDM_EDIT_READONLYMODE, OnEditReadonlymode)
ON_COMMAND(IDM_EDIT_APPEND, OnEditAppend)
ON_COMMAND(IDM_EDIT_MANIPULATEBITS, OnEditManipulatebits)
ON_COMMAND(IDM_SELECT_BLOCK, OnSelectBlock)
ON_COMMAND(IDM_READFLOAT, OnReadfloat)
ON_COMMAND(IDM_PROPERTIES, OnProperties)
ON_COMMAND(IDM_REVERT, OnRevert)
ON_COMMAND(ID_BOOKMARKS_GOTOBOOKMARK, OnBookmarksGotobookmark)
ON_UPDATE_COMMAND_UI(ID_BOOKMARKS_GOTOBOOKMARK, OnUpdateBookmarksGotobookmark)
ON_COMMAND(ID_EDIT_PASTE_SPECIAL, OnEditPasteSpecial)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_REGISTERED_MESSAGE(_myMsgForFindReplace, OnFindReplaceCmd)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFshedView construction/destruction
CFshedView::CFshedView()
{
hFont = NULL;
m_bPrinting = FALSE;
m_cfPrintFont = NULL;
iCutMode = BST_CHECKED;
bDontMarkCurrentPos = FALSE;
bInsertingHex = FALSE;
iWindowX = CW_USEDEFAULT;
iWindowY = CW_USEDEFAULT;
iWindowWidth = CW_USEDEFAULT;
iWindowHeight = CW_USEDEFAULT;
iWindowShowCmd = SW_SHOW;
iHexWidth = 3;
// iClipboardEncode = TRUE;
pcGotoDlgBuffer = NULL;
iGotoDlgBufLen = 0;
iBmkCount=0;
szFileName[0] = '\0';
iInsertMode = FALSE;
bSelected = FALSE;
bLButtonIsDown = FALSE;
iStartOfSelection = 0;
iEndOfSelection = 0;
m_stScreenSettings.iByteSpace = 2;
m_stScreenSettings.iCharSpace = 1;
m_stScreenSettings.iCharsPerLine = App->m_iOffsetLen + m_stScreenSettings.iByteSpace +
App->m_iBytesPerLine * 3 + m_stScreenSettings.iCharSpace +
App->m_iBytesPerLine;
m_iEnteringMode = BYTES;
// m_iFileChanged = FALSE;
// Read in the last saved preferences.
// count_instances();
// read_ini_data ();
bSelected = FALSE;
bLButtonIsDown = FALSE;
// m_iFileChanged = FALSE;
m_bFirstSearch = TRUE;
m_pFindReplaceDlg = NULL; // find or replace dialog
m_bFindOnly = TRUE; // Is pFindReplace the find or replace?
m_bCase = FALSE; // TRUE==case sensitive, FALSE==not
m_bNext = TRUE; // TRUE==search down, FALSE== search up
m_bWord = FALSE; // TRUE==match whole word, FALSE==not
m_lInitialSearchPos = 0;
}
CFshedView::~CFshedView()
{
if (m_cfPrintFont)
delete m_cfPrintFont;
if (hFont != NULL)
DeleteObject (hFont);
if( pcGotoDlgBuffer != NULL )
delete [] pcGotoDlgBuffer;
if (m_pFindReplaceDlg)
delete m_pFindReplaceDlg;
}
BOOL CFshedView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFshedView drawing
void CFshedView::OnDraw(CDC* pDC)
{
CFshedDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// PAINTSTRUCT ps;
// HDC hdc = ::BeginPaint (m_hWnd, &ps);
HDC hdc = pDC->m_hDC;
//-------------------------------------------------------
HideCaret ();
// Delete remains of last position.
int a, b;
b = min (m_stScreenSettings.iCurLine + m_stScreenSettings.cyBuffer, m_stScreenSettings.iNumlines-1);
iBkColor = PALETTERGB (GetRValue(App->m_clrBk),GetGValue(App->m_clrBk),GetBValue(App->m_clrBk));
iTextColor = PALETTERGB (GetRValue(App->m_clrText),GetGValue(App->m_clrText),GetBValue(App->m_clrText));
SetTextColor (hdc, iTextColor);
SetBkColor (hdc, iBkColor);
HPEN pen1 = CreatePen (PS_SOLID, 1, iBkColor);
HPEN oldpen = (HPEN) SelectObject (hdc, pen1);
HBRUSH brush1 = CreateSolidBrush (iBkColor);
HBRUSH oldbrush = (HBRUSH) SelectObject (hdc, brush1);
// Delete lower border if there are empty lines on screen.
if ((b-m_stScreenSettings.iCurLine+1)*m_stScreenSettings.cyChar+CLIENT_BORDER_WIDTH < m_stScreenSettings.cyClient-CLIENT_BORDER_WIDTH)
Rectangle (hdc, CLIENT_BORDER_WIDTH, (b-m_stScreenSettings.iCurLine+1)*m_stScreenSettings.cyChar+CLIENT_BORDER_WIDTH + m_stScreenSettings.iToolbarHeight, m_stScreenSettings.cxClient-CLIENT_BORDER_WIDTH,
m_stScreenSettings.cyClient-CLIENT_BORDER_WIDTH + m_stScreenSettings.iToolbarHeight);
// Delete right border.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -