commitmonitor Code
Monitor your SVN repositories and notifies you on new commits
Brought to you by:
steveking
--- a/trunk/src/DiffViewer.cpp +++ b/trunk/src/DiffViewer.cpp @@ -29,10 +29,10 @@ CDiffViewer::CDiffViewer(HINSTANCE hInst, const WNDCLASSEX* wcx /* = NULL*/) : CWindow(hInst, wcx) - , m_bShowFindBar(false) -{ - Scintilla_RegisterClasses(hInst); - SetWindowTitle(_T("CommitMonitorDiff")); + , m_bShowFindBar(false) +{ + Scintilla_RegisterClasses(hInst); + SetWindowTitle(_T("CommitMonitorDiff")); } CDiffViewer::~CDiffViewer(void) @@ -41,116 +41,116 @@ bool CDiffViewer::RegisterAndCreateWindow() { - WNDCLASSEX wcx; - - // Fill in the window class structure with default parameters - wcx.cbSize = sizeof(WNDCLASSEX); - wcx.style = CS_HREDRAW | CS_VREDRAW; - wcx.lpfnWndProc = CWindow::stWinMsgHandler; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = 0; - wcx.hInstance = hResource; - wcx.hCursor = NULL; - wcx.lpszClassName = ResString(hResource, IDS_APP_TITLE); - wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_DIFF)); - wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); - wcx.lpszMenuName = NULL; - wcx.hIconSm = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_DIFF)); - if (RegisterWindow(&wcx)) - { - if (Create(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN, NULL)) - { + WNDCLASSEX wcx; + + // Fill in the window class structure with default parameters + wcx.cbSize = sizeof(WNDCLASSEX); + wcx.style = CS_HREDRAW | CS_VREDRAW; + wcx.lpfnWndProc = CWindow::stWinMsgHandler; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = 0; + wcx.hInstance = hResource; + wcx.hCursor = NULL; + wcx.lpszClassName = ResString(hResource, IDS_APP_TITLE); + wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_DIFF)); + wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); + wcx.lpszMenuName = NULL; + wcx.hIconSm = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_DIFF)); + if (RegisterWindow(&wcx)) + { + if (Create(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN, NULL)) + { m_FindBar.SetParent(*this); m_FindBar.Create(hInst, IDD_FINDBAR, *this); ShowWindow(*this, SW_SHOW); - UpdateWindow(*this); - return true; - } - } - return false; + UpdateWindow(*this); + return true; + } + } + return false; } LRESULT CALLBACK CDiffViewer::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - switch (uMsg) - { - case WM_CREATE: - { - m_hwnd = hwnd; - Initialize(); - } - break; - case WM_COMMAND: - { - return DoCommand(LOWORD(wParam)); - } - break; - case WM_MOUSEWHEEL: - { - if (GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT) - { - // scroll sideways - SendEditor(SCI_LINESCROLL, -GET_WHEEL_DELTA_WPARAM(wParam)/40, 0); - } - else - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - break; - case WM_SIZE: - { - RECT rect; - GetClientRect(*this, &rect); - if (m_bShowFindBar) - { - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top-30, - SWP_SHOWWINDOW); - ::SetWindowPos(m_FindBar, HWND_TOP, - rect.left, rect.bottom-30, - rect.right-rect.left, 30, - SWP_SHOWWINDOW); - } - else - { - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top, - SWP_SHOWWINDOW); - ::ShowWindow(m_FindBar, SW_HIDE); - } - } - break; - case WM_GETMINMAXINFO: - { - MINMAXINFO * mmi = (MINMAXINFO*)lParam; - mmi->ptMinTrackSize.x = 100; - mmi->ptMinTrackSize.y = 100; - return 0; - } - break; - case WM_DESTROY: - PostQuitMessage(0); - break; - case WM_CLOSE: - { - CRegStdDWORD w = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerWidth"), (DWORD)CW_USEDEFAULT); - CRegStdDWORD h = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerHeight"), (DWORD)CW_USEDEFAULT); - CRegStdDWORD p = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerPos"), 0); - RECT rect; - ::GetWindowRect(*this, &rect); - w = rect.right-rect.left; - h = rect.bottom-rect.top; - p = MAKELONG(rect.left, rect.top); - } - ::DestroyWindow(m_hwnd); - break; + switch (uMsg) + { + case WM_CREATE: + { + m_hwnd = hwnd; + Initialize(); + } + break; + case WM_COMMAND: + { + return DoCommand(LOWORD(wParam)); + } + break; + case WM_MOUSEWHEEL: + { + if (GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT) + { + // scroll sideways + SendEditor(SCI_LINESCROLL, -GET_WHEEL_DELTA_WPARAM(wParam)/40, 0); + } + else + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + break; + case WM_SIZE: + { + RECT rect; + GetClientRect(*this, &rect); + if (m_bShowFindBar) + { + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top-30, + SWP_SHOWWINDOW); + ::SetWindowPos(m_FindBar, HWND_TOP, + rect.left, rect.bottom-30, + rect.right-rect.left, 30, + SWP_SHOWWINDOW); + } + else + { + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top, + SWP_SHOWWINDOW); + ::ShowWindow(m_FindBar, SW_HIDE); + } + } + break; + case WM_GETMINMAXINFO: + { + MINMAXINFO * mmi = (MINMAXINFO*)lParam; + mmi->ptMinTrackSize.x = 100; + mmi->ptMinTrackSize.y = 100; + return 0; + } + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_CLOSE: + { + CRegStdDWORD w = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerWidth"), (DWORD)CW_USEDEFAULT); + CRegStdDWORD h = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerHeight"), (DWORD)CW_USEDEFAULT); + CRegStdDWORD p = CRegStdDWORD(_T("Software\\CommitMonitor\\DiffViewerPos"), 0); + RECT rect; + ::GetWindowRect(*this, &rect); + w = rect.right-rect.left; + h = rect.bottom-rect.top; + p = MAKELONG(rect.left, rect.top); + } + ::DestroyWindow(m_hwnd); + break; case COMMITMONITOR_FINDMSGNEXT: { SendEditor(SCI_CHARRIGHT); SendEditor(SCI_SEARCHANCHOR); - m_bMatchCase = !!wParam; - m_findtext = (LPCTSTR)lParam; + m_bMatchCase = !!wParam; + m_findtext = (LPCTSTR)lParam; SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); SendEditor(SCI_SCROLLCARET); } @@ -158,318 +158,318 @@ case COMMITMONITOR_FINDMSGPREV: { SendEditor(SCI_SEARCHANCHOR); - m_bMatchCase = !!wParam; - m_findtext = (LPCTSTR)lParam; + m_bMatchCase = !!wParam; + m_findtext = (LPCTSTR)lParam; SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); SendEditor(SCI_SCROLLCARET); } break; - case COMMITMONITOR_FINDEXIT: - { - if (IsWindowVisible(m_FindBar)) - { - RECT rect; - GetClientRect(*this, &rect); - m_bShowFindBar = false; - ::ShowWindow(m_FindBar, SW_HIDE); - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top, - SWP_SHOWWINDOW); - } - else - PostQuitMessage(0); - } - break; - case COMMITMONITOR_FINDRESET: - SendEditor(SCI_SETSELECTIONSTART, 0); - SendEditor(SCI_SETSELECTIONEND, 0); - SendEditor(SCI_SEARCHANCHOR); - break; - default: - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - - return 0; + case COMMITMONITOR_FINDEXIT: + { + if (IsWindowVisible(m_FindBar)) + { + RECT rect; + GetClientRect(*this, &rect); + m_bShowFindBar = false; + ::ShowWindow(m_FindBar, SW_HIDE); + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top, + SWP_SHOWWINDOW); + } + else + PostQuitMessage(0); + } + break; + case COMMITMONITOR_FINDRESET: + SendEditor(SCI_SETSELECTIONSTART, 0); + SendEditor(SCI_SETSELECTIONEND, 0); + SendEditor(SCI_SEARCHANCHOR); + break; + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + + return 0; }; LRESULT CDiffViewer::DoCommand(int id) { - switch (id) - { - case IDM_EXIT: - ::PostQuitMessage(0); - return 0; - case IDM_SHOWFINDBAR: - { - m_bShowFindBar = true; - ::ShowWindow(m_FindBar, SW_SHOW); - RECT rect; - GetClientRect(*this, &rect); - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top-30, - SWP_SHOWWINDOW); - ::SetWindowPos(m_FindBar, HWND_TOP, - rect.left, rect.bottom-30, - rect.right-rect.left, 30, - SWP_SHOWWINDOW); - ::SetFocus(m_FindBar); - SendEditor(SCI_SETSELECTIONSTART, 0); - SendEditor(SCI_SETSELECTIONEND, 0); - SendEditor(SCI_SEARCHANCHOR); - } - break; - case IDM_FINDNEXT: - SendEditor(SCI_CHARRIGHT); - SendEditor(SCI_SEARCHANCHOR); - SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); - SendEditor(SCI_SCROLLCARET); - break; - case IDM_FINDPREV: - SendEditor(SCI_SEARCHANCHOR); - SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); - SendEditor(SCI_SCROLLCARET); - break; - case IDM_FINDEXIT: - { - if (!m_bShowFindBar) - { - ::PostQuitMessage(0); - return 0; - } - RECT rect; - GetClientRect(*this, &rect); - m_bShowFindBar = false; - ::ShowWindow(m_FindBar, SW_HIDE); - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top, - SWP_SHOWWINDOW); - } - break; - default: - break; - }; - return 1; + switch (id) + { + case IDM_EXIT: + ::PostQuitMessage(0); + return 0; + case IDM_SHOWFINDBAR: + { + m_bShowFindBar = true; + ::ShowWindow(m_FindBar, SW_SHOW); + RECT rect; + GetClientRect(*this, &rect); + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top-30, + SWP_SHOWWINDOW); + ::SetWindowPos(m_FindBar, HWND_TOP, + rect.left, rect.bottom-30, + rect.right-rect.left, 30, + SWP_SHOWWINDOW); + ::SetFocus(m_FindBar); + SendEditor(SCI_SETSELECTIONSTART, 0); + SendEditor(SCI_SETSELECTIONEND, 0); + SendEditor(SCI_SEARCHANCHOR); + } + break; + case IDM_FINDNEXT: + SendEditor(SCI_CHARRIGHT); + SendEditor(SCI_SEARCHANCHOR); + SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); + SendEditor(SCI_SCROLLCARET); + break; + case IDM_FINDPREV: + SendEditor(SCI_SEARCHANCHOR); + SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str()); + SendEditor(SCI_SCROLLCARET); + break; + case IDM_FINDEXIT: + { + if (!m_bShowFindBar) + { + ::PostQuitMessage(0); + return 0; + } + RECT rect; + GetClientRect(*this, &rect); + m_bShowFindBar = false; + ::ShowWindow(m_FindBar, SW_HIDE); + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top, + SWP_SHOWWINDOW); + } + break; + default: + break; + }; + return 1; } LRESULT CDiffViewer::SendEditor(UINT Msg, WPARAM wParam, LPARAM lParam) { - if (m_directFunction) - { - return ((SciFnDirect) m_directFunction)(m_directPointer, Msg, wParam, lParam); - } - return ::SendMessage(m_hWndEdit, Msg, wParam, lParam); + if (m_directFunction) + { + return ((SciFnDirect) m_directFunction)(m_directPointer, Msg, wParam, lParam); + } + return ::SendMessage(m_hWndEdit, Msg, wParam, lParam); } bool CDiffViewer::Initialize() { - CRegStdDWORD pos(_T("Software\\CommitMonitor\\DiffViewerPos"), 0); - CRegStdDWORD width(_T("Software\\CommitMonitor\\DiffViewerWidth"), (DWORD)640); - CRegStdDWORD height(_T("Software\\CommitMonitor\\DiffViewerHeight"), (DWORD)480); - if (DWORD(pos) && DWORD(width) && DWORD(height)) - { - RECT rc; - rc.left = LOWORD(DWORD(pos)); - rc.top = HIWORD(DWORD(pos)); - rc.right = rc.left + DWORD(width); - rc.bottom = rc.top + DWORD(height); - HMONITOR hMon = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL); - if (hMon) - { - // only restore the window position if the monitor is valid - MoveWindow(*this, LOWORD(DWORD(pos)), HIWORD(DWORD(pos)), - DWORD(width), DWORD(height), FALSE); - } - } - - m_hWndEdit = ::CreateWindow( - _T("Scintilla"), - _T("Source"), - WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - *this, - 0, - hInst, - 0); - if (m_hWndEdit == NULL) - return false; - - RECT rect; - GetClientRect(*this, &rect); - ::SetWindowPos(m_hWndEdit, HWND_TOP, - rect.left, rect.top, - rect.right-rect.left, rect.bottom-rect.top, - SWP_SHOWWINDOW); - - m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); - m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); - - // Set up the global default style. These attributes are used wherever no explicit choices are made. - SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), 10, "Courier New"); - SendEditor(SCI_SETTABWIDTH, 4); - SendEditor(SCI_SETREADONLY, TRUE); - LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999"); - SendEditor(SCI_SETMARGINWIDTHN, 0, pix); - SendEditor(SCI_SETMARGINWIDTHN, 1); - SendEditor(SCI_SETMARGINWIDTHN, 2); - //Set the default windows colors for edit controls - SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT)); - SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW)); - SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT)); - SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT)); - SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT)); - - return true; + CRegStdDWORD pos(_T("Software\\CommitMonitor\\DiffViewerPos"), 0); + CRegStdDWORD width(_T("Software\\CommitMonitor\\DiffViewerWidth"), (DWORD)640); + CRegStdDWORD height(_T("Software\\CommitMonitor\\DiffViewerHeight"), (DWORD)480); + if (DWORD(pos) && DWORD(width) && DWORD(height)) + { + RECT rc; + rc.left = LOWORD(DWORD(pos)); + rc.top = HIWORD(DWORD(pos)); + rc.right = rc.left + DWORD(width); + rc.bottom = rc.top + DWORD(height); + HMONITOR hMon = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL); + if (hMon) + { + // only restore the window position if the monitor is valid + MoveWindow(*this, LOWORD(DWORD(pos)), HIWORD(DWORD(pos)), + DWORD(width), DWORD(height), FALSE); + } + } + + m_hWndEdit = ::CreateWindow( + _T("Scintilla"), + _T("Source"), + WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + *this, + 0, + hInst, + 0); + if (m_hWndEdit == NULL) + return false; + + RECT rect; + GetClientRect(*this, &rect); + ::SetWindowPos(m_hWndEdit, HWND_TOP, + rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top, + SWP_SHOWWINDOW); + + m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0); + m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0); + + // Set up the global default style. These attributes are used wherever no explicit choices are made. + SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW), 10, "Courier New"); + SendEditor(SCI_SETTABWIDTH, 4); + SendEditor(SCI_SETREADONLY, TRUE); + LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999"); + SendEditor(SCI_SETMARGINWIDTHN, 0, pix); + SendEditor(SCI_SETMARGINWIDTHN, 1); + SendEditor(SCI_SETMARGINWIDTHN, 2); + //Set the default windows colors for edit controls + SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT)); + SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW)); + SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT)); + SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT)); + SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT)); + + return true; } bool CDiffViewer::LoadFile(LPCTSTR filename) { - SendEditor(SCI_SETREADONLY, FALSE); - SendEditor(SCI_CLEARALL); - SendEditor(EM_EMPTYUNDOBUFFER); - SendEditor(SCI_SETSAVEPOINT); - SendEditor(SCI_CANCEL); - SendEditor(SCI_SETUNDOCOLLECTION, 0); - - FILE *fp = NULL; - _tfopen_s(&fp, filename, _T("rb")); - if (fp) - { - //SetTitle(); - char data[4096]; - int lenFile = fread(data, 1, sizeof(data), fp); - bool bUTF8 = IsUTF8(data, lenFile); - while (lenFile > 0) - { - SendEditor(SCI_ADDTEXT, lenFile, - reinterpret_cast<LPARAM>(static_cast<char *>(data))); - lenFile = fread(data, 1, sizeof(data), fp); - } - fclose(fp); - SendEditor(SCI_SETCODEPAGE, bUTF8 ? SC_CP_UTF8 : GetACP()); - } - else - { - return false; - } - - SendEditor(SCI_SETUNDOCOLLECTION, 1); - ::SetFocus(m_hWndEdit); - SendEditor(EM_EMPTYUNDOBUFFER); - SendEditor(SCI_SETSAVEPOINT); - SendEditor(SCI_GOTOPOS, 0); - SendEditor(SCI_SETREADONLY, TRUE); - - SendEditor(SCI_CLEARDOCUMENTSTYLE, 0, 0); - SendEditor(SCI_SETSTYLEBITS, 5, 0); - - //SetAStyle(SCE_DIFF_DEFAULT, RGB(0, 0, 0)); - SetAStyle(SCE_DIFF_COMMAND, RGB(0x0A, 0x24, 0x36)); - SetAStyle(SCE_DIFF_POSITION, RGB(0xFF, 0, 0)); - SetAStyle(SCE_DIFF_HEADER, RGB(0x80, 0, 0), RGB(0xFF, 0xFF, 0x80)); - SetAStyle(SCE_DIFF_COMMENT, RGB(0, 0x80, 0)); - SendEditor(SCI_STYLESETBOLD, SCE_DIFF_COMMENT, TRUE); - SetAStyle(SCE_DIFF_DELETED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0xFF, 0x80, 0x80)); - SetAStyle(SCE_DIFF_ADDED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0x80, 0xFF, 0x80)); - - SendEditor(SCI_SETLEXER, SCLEX_DIFF); - SendEditor(SCI_SETKEYWORDS, 0, (LPARAM)"revision"); - SendEditor(SCI_COLOURISE, 0, -1); - ::ShowWindow(m_hWndEdit, SW_SHOW); - return true; + SendEditor(SCI_SETREADONLY, FALSE); + SendEditor(SCI_CLEARALL); + SendEditor(EM_EMPTYUNDOBUFFER); + SendEditor(SCI_SETSAVEPOINT); + SendEditor(SCI_CANCEL); + SendEditor(SCI_SETUNDOCOLLECTION, 0); + + FILE *fp = NULL; + _tfopen_s(&fp, filename, _T("rb")); + if (fp) + { + //SetTitle(); + char data[4096]; + int lenFile = fread(data, 1, sizeof(data), fp); + bool bUTF8 = IsUTF8(data, lenFile); + while (lenFile > 0) + { + SendEditor(SCI_ADDTEXT, lenFile, + reinterpret_cast<LPARAM>(static_cast<char *>(data))); + lenFile = fread(data, 1, sizeof(data), fp); + } + fclose(fp); + SendEditor(SCI_SETCODEPAGE, bUTF8 ? SC_CP_UTF8 : GetACP()); + } + else + { + return false; + } + + SendEditor(SCI_SETUNDOCOLLECTION, 1); + ::SetFocus(m_hWndEdit); + SendEditor(EM_EMPTYUNDOBUFFER); + SendEditor(SCI_SETSAVEPOINT); + SendEditor(SCI_GOTOPOS, 0); + SendEditor(SCI_SETREADONLY, TRUE); + + SendEditor(SCI_CLEARDOCUMENTSTYLE, 0, 0); + SendEditor(SCI_SETSTYLEBITS, 5, 0); + + //SetAStyle(SCE_DIFF_DEFAULT, RGB(0, 0, 0)); + SetAStyle(SCE_DIFF_COMMAND, RGB(0x0A, 0x24, 0x36)); + SetAStyle(SCE_DIFF_POSITION, RGB(0xFF, 0, 0)); + SetAStyle(SCE_DIFF_HEADER, RGB(0x80, 0, 0), RGB(0xFF, 0xFF, 0x80)); + SetAStyle(SCE_DIFF_COMMENT, RGB(0, 0x80, 0)); + SendEditor(SCI_STYLESETBOLD, SCE_DIFF_COMMENT, TRUE); + SetAStyle(SCE_DIFF_DELETED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0xFF, 0x80, 0x80)); + SetAStyle(SCE_DIFF_ADDED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0x80, 0xFF, 0x80)); + + SendEditor(SCI_SETLEXER, SCLEX_DIFF); + SendEditor(SCI_SETKEYWORDS, 0, (LPARAM)"revision"); + SendEditor(SCI_COLOURISE, 0, -1); + ::ShowWindow(m_hWndEdit, SW_SHOW); + return true; } void CDiffViewer::SetTitle(LPCTSTR title) { - int len = _tcslen(title); - TCHAR * pBuf = new TCHAR[len+40]; - _stprintf_s(pBuf, len+40, _T("%s - CMDiff"), title); - SetWindowTitle(std::wstring(pBuf)); - delete [] pBuf; + int len = _tcslen(title); + TCHAR * pBuf = new TCHAR[len+40]; + _stprintf_s(pBuf, len+40, _T("%s - CMDiff"), title); + SetWindowTitle(std::wstring(pBuf)); + delete [] pBuf; } void CDiffViewer::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face) { - SendEditor(SCI_STYLESETFORE, style, fore); - SendEditor(SCI_STYLESETBACK, style, back); - if (size >= 1) - SendEditor(SCI_STYLESETSIZE, style, size); - if (face) - SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(face)); + SendEditor(SCI_STYLESETFORE, style, fore); + SendEditor(SCI_STYLESETBACK, style, back); + if (size >= 1) + SendEditor(SCI_STYLESETSIZE, style, size); + if (face) + SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(face)); } bool CDiffViewer::IsUTF8(LPVOID pBuffer, int cb) { - if (cb < 2) - return true; - UINT16 * pVal = (UINT16 *)pBuffer; - UINT8 * pVal2 = (UINT8 *)(pVal+1); - // scan the whole buffer for a 0x0000 sequence - // if found, we assume a binary file - for (int i=0; i<(cb-2); i=i+2) - { - if (0x0000 == *pVal++) - return false; - } - pVal = (UINT16 *)pBuffer; - if (*pVal == 0xFEFF) - return false; - if (cb < 3) - return false; - if (*pVal == 0xBBEF) - { - if (*pVal2 == 0xBF) - return true; - } - // check for illegal UTF8 chars - pVal2 = (UINT8 *)pBuffer; - for (int i=0; i<cb; ++i) - { - if ((*pVal2 == 0xC0)||(*pVal2 == 0xC1)||(*pVal2 >= 0xF5)) - return false; - pVal2++; - } - pVal2 = (UINT8 *)pBuffer; - bool bUTF8 = false; - for (int i=0; i<(cb-3); ++i) - { - if ((*pVal2 & 0xE0)==0xC0) - { - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - bUTF8 = true; - } - if ((*pVal2 & 0xF0)==0xE0) - { - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - bUTF8 = true; - } - if ((*pVal2 & 0xF8)==0xF0) - { - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - pVal2++;i++; - if ((*pVal2 & 0xC0)!=0x80) - return false; - bUTF8 = true; - } - pVal2++; - } - if (bUTF8) - return true; - return false; -} + if (cb < 2) + return true; + UINT16 * pVal = (UINT16 *)pBuffer; + UINT8 * pVal2 = (UINT8 *)(pVal+1); + // scan the whole buffer for a 0x0000 sequence + // if found, we assume a binary file + for (int i=0; i<(cb-2); i=i+2) + { + if (0x0000 == *pVal++) + return false; + } + pVal = (UINT16 *)pBuffer; + if (*pVal == 0xFEFF) + return false; + if (cb < 3) + return false; + if (*pVal == 0xBBEF) + { + if (*pVal2 == 0xBF) + return true; + } + // check for illegal UTF8 chars + pVal2 = (UINT8 *)pBuffer; + for (int i=0; i<cb; ++i) + { + if ((*pVal2 == 0xC0)||(*pVal2 == 0xC1)||(*pVal2 >= 0xF5)) + return false; + pVal2++; + } + pVal2 = (UINT8 *)pBuffer; + bool bUTF8 = false; + for (int i=0; i<(cb-3); ++i) + { + if ((*pVal2 & 0xE0)==0xC0) + { + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + bUTF8 = true; + } + if ((*pVal2 & 0xF0)==0xE0) + { + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + bUTF8 = true; + } + if ((*pVal2 & 0xF8)==0xF0) + { + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + pVal2++;i++; + if ((*pVal2 & 0xC0)!=0x80) + return false; + bUTF8 = true; + } + pVal2++; + } + if (bUTF8) + return true; + return false; +}