diff options
author | XhmikosR <xhmikosr@gmail.com> | 2016-12-04 18:20:31 +0200 |
---|---|---|
committer | XhmikosR <xhmikosr@gmail.com> | 2016-12-04 18:24:16 +0200 |
commit | 4b604e07bbbf07d3d5ad04e65f0cef56959e3807 (patch) | |
tree | 44a5924e0ef508167b285c8016e6394992153817 /scintilla/win32 | |
parent | a3ee58329361322b321ee2a708e793b1a5e5729a (diff) | |
download | notepad2-mod-master.zip notepad2-mod-master.tar.gz notepad2-mod-master.tar.bz2 |
Update Scintilla to v3.7.1.HEADorigin/masterorigin/HEADmaster
Diffstat (limited to 'scintilla/win32')
-rw-r--r-- | scintilla/win32/ScintillaWin.cxx | 154 |
1 files changed, 75 insertions, 79 deletions
diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx index d4da2f8..4dea4b1 100644 --- a/scintilla/win32/ScintillaWin.cxx +++ b/scintilla/win32/ScintillaWin.cxx @@ -710,6 +710,35 @@ static bool BoundsContains(PRectangle rcBounds, HRGN hRgnBounds, PRectangle rcCh return contains;
}
+static std::string StringEncode(const std::wstring &s, int codePage) {
+ const int cchMulti = s.length() ? ::WideCharToMultiByte(codePage, 0, s.c_str(), static_cast<int>(s.length()), NULL, 0, NULL, NULL) : 0;
+ std::string sMulti(cchMulti, 0);
+ if (cchMulti) {
+ ::WideCharToMultiByte(codePage, 0, s.c_str(), static_cast<int>(s.size()), &sMulti[0], cchMulti, NULL, NULL);
+ }
+ return sMulti;
+}
+
+static std::wstring StringDecode(const std::string &s, int codePage) {
+ const int cchWide = s.length() ? ::MultiByteToWideChar(codePage, 0, s.c_str(), static_cast<int>(s.length()), NULL, 0) : 0;
+ std::wstring sWide(cchWide, 0);
+ if (cchWide) {
+ ::MultiByteToWideChar(codePage, 0, s.c_str(), static_cast<int>(s.length()), &sWide[0], cchWide);
+ }
+ return sWide;
+}
+
+static std::wstring StringMapCase(const std::wstring &ws, DWORD mapFlags) {
+ const int charsConverted = ::LCMapStringW(LOCALE_SYSTEM_DEFAULT, mapFlags,
+ ws.c_str(), static_cast<int>(ws.length()), NULL, 0);
+ std::wstring wsConverted(charsConverted, 0);
+ if (charsConverted) {
+ ::LCMapStringW(LOCALE_SYSTEM_DEFAULT, mapFlags,
+ ws.c_str(), static_cast<int>(ws.length()), &wsConverted[0], charsConverted);
+ }
+ return wsConverted;
+}
+
// Returns the target converted to UTF8.
// Return the length in bytes.
int ScintillaWin::TargetAsUTF8(char *text) {
@@ -720,14 +749,11 @@ int ScintillaWin::TargetAsUTF8(char *text) { }
} else {
// Need to convert
- std::string s = RangeText(targetStart, targetEnd);
- int charsLen = ::MultiByteToWideChar(CodePageOfDocument(), 0, &s[0], targetLength, NULL, 0);
- std::wstring characters(charsLen, '\0');
- ::MultiByteToWideChar(CodePageOfDocument(), 0, &s[0], targetLength, &characters[0], charsLen);
-
- int utf8Len = ::WideCharToMultiByte(CP_UTF8, 0, &characters[0], charsLen, NULL, 0, 0, 0);
+ const std::string s = RangeText(targetStart, targetEnd);
+ const std::wstring characters = StringDecode(s, CodePageOfDocument());
+ const int utf8Len = ::WideCharToMultiByte(CP_UTF8, 0, characters.c_str(), static_cast<int>(characters.length()), NULL, 0, 0, 0);
if (text) {
- ::WideCharToMultiByte(CP_UTF8, 0, &characters[0], charsLen, text, utf8Len, 0, 0);
+ ::WideCharToMultiByte(CP_UTF8, 0, characters.c_str(), static_cast<int>(characters.length()), text, utf8Len, 0, 0);
text[utf8Len] = '\0';
}
return utf8Len;
@@ -819,7 +845,7 @@ sptr_t ScintillaWin::WndPaint(uptr_t wParam) { Paint(surfaceWindow, rcPaint);
surfaceWindow->Release();
HRESULT hr = pRenderTarget->EndDraw();
- if (hr == D2DERR_RECREATE_TARGET) {
+ if (hr == static_cast<HRESULT>(D2DERR_RECREATE_TARGET)) {
DropRenderTarget();
paintState = paintAbandoned;
}
@@ -911,28 +937,6 @@ void ScintillaWin::SetCandidateWindowPos() { }
}
-static std::string StringEncode(std::wstring s, int codePage) {
- if (s.length()) {
- int cchMulti = ::WideCharToMultiByte(codePage, 0, s.c_str(), static_cast<int>(s.length()), NULL, 0, NULL, NULL);
- std::string sMulti(cchMulti, 0);
- ::WideCharToMultiByte(codePage, 0, s.c_str(), static_cast<int>(s.size()), &sMulti[0], cchMulti, NULL, NULL);
- return sMulti;
- } else {
- return std::string();
- }
-}
-
-static std::wstring StringDecode(std::string s, int codePage) {
- if (s.length()) {
- int cchWide = ::MultiByteToWideChar(codePage, 0, s.c_str(), static_cast<int>(s.length()), NULL, 0);
- std::wstring sWide(cchWide, 0);
- ::MultiByteToWideChar(codePage, 0, s.c_str(), static_cast<int>(s.length()), &sWide[0], cchWide);
- return sWide;
- } else {
- return std::wstring();
- }
-}
-
void ScintillaWin::SelectionToHangul() {
// Convert every hanja to hangul within the main range.
const int selStart = sel.RangeMain().Start().Position();
@@ -1349,6 +1353,12 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam // when there's a message posted. So, several times a second, we stop and let
// the low priority events have a turn (after which the timer will fire again).
+ // Suppress a warning from Code Analysis that the GetTickCount function
+ // wraps after 49 days. The WM_TIMER will kick off another SC_WIN_IDLE
+ // after the wrap.
+#ifdef _MSC_VER
+#pragma warning(suppress: 28159)
+#endif
DWORD dwCurrent = GetTickCount();
DWORD dwStart = wParam ? static_cast<DWORD>(wParam) : dwCurrent;
const DWORD maxWorkTime = 50;
@@ -1408,11 +1418,17 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam (wParam & MK_CONTROL) != 0);
break;
- case WM_RBUTTONDOWN:
- ::SetFocus(MainHWND());
- if (!PointInSelection(Point::FromLong(static_cast<long>(lParam)))) {
- CancelModes();
- SetEmptySelection(PositionFromLocation(Point::FromLong(static_cast<long>(lParam))));
+ case WM_RBUTTONDOWN: {
+ ::SetFocus(MainHWND());
+ Point pt = Point::FromLong(static_cast<long>(lParam));
+ if (!PointInSelection(pt)) {
+ CancelModes();
+ SetEmptySelection(PositionFromLocation(Point::FromLong(static_cast<long>(lParam))));
+ }
+
+ RightButtonDownWithModifiers(pt, ::GetMessageTime(), ModifierFlags((wParam & MK_SHIFT) != 0,
+ (wParam & MK_CONTROL) != 0,
+ Platform::IsKeyDown(VK_MENU)));
}
break;
@@ -1561,18 +1577,22 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam return HandleCompositionWindowed(wParam, lParam);
}
- case WM_CONTEXTMENU:
- if (displayPopupMenu) {
+ case WM_CONTEXTMENU: {
Point pt = Point::FromLong(static_cast<long>(lParam));
- if ((pt.x == -1) && (pt.y == -1)) {
- // Caused by keyboard so display menu near caret
- pt = PointMainCaret();
- POINT spt = {static_cast<int>(pt.x), static_cast<int>(pt.y)};
- ::ClientToScreen(MainHWND(), &spt);
- pt = PointFromPOINT(spt);
+ POINT rpt = {static_cast<int>(pt.x), static_cast<int>(pt.y)};
+ ::ScreenToClient(MainHWND(), &rpt);
+ const Point ptClient = PointFromPOINT(rpt);
+ if (ShouldDisplayPopup(ptClient)) {
+ if ((pt.x == -1) && (pt.y == -1)) {
+ // Caused by keyboard so display menu near caret
+ pt = PointMainCaret();
+ POINT spt = {static_cast<int>(pt.x), static_cast<int>(pt.y)};
+ ::ClientToScreen(MainHWND(), &spt);
+ pt = PointFromPOINT(spt);
+ }
+ ContextMenu(pt);
+ return 0;
}
- ContextMenu(pt);
- return 0;
}
return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
@@ -1659,11 +1679,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam if (nStart == -1) {
nStart = nEnd; // Remove selection
}
- if (nStart > nEnd) {
- SetSelection(nEnd, nStart);
- } else {
- SetSelection(nStart, nEnd);
- }
+ SetSelection(nEnd, nStart);
EnsureCaretVisible();
}
break;
@@ -2095,44 +2111,24 @@ std::string ScintillaWin::CaseMapString(const std::string &s, int caseMapping) { if ((s.size() == 0) || (caseMapping == cmSame))
return s;
- UINT cpDoc = CodePageOfDocument();
+ const UINT cpDoc = CodePageOfDocument();
if (cpDoc == SC_CP_UTF8) {
- std::string retMapped(s.length() * maxExpansionCaseConversion, 0);
- size_t lenMapped = CaseConvertString(&retMapped[0], retMapped.length(), s.c_str(), s.length(),
- (caseMapping == cmUpper) ? CaseConversionUpper : CaseConversionLower);
- retMapped.resize(lenMapped);
- return retMapped;
+ return CaseConvertString(s, (caseMapping == cmUpper) ? CaseConversionUpper : CaseConversionLower);
}
- unsigned int lengthUTF16 = ::MultiByteToWideChar(cpDoc, 0, s.c_str(),
- static_cast<int>(s.size()), NULL, 0);
- if (lengthUTF16 == 0) // Failed to convert
- return s;
+ // Change text to UTF-16
+ const std::wstring wsText = StringDecode(s, cpDoc);
- DWORD mapFlags = LCMAP_LINGUISTIC_CASING |
+ const DWORD mapFlags = LCMAP_LINGUISTIC_CASING |
((caseMapping == cmUpper) ? LCMAP_UPPERCASE : LCMAP_LOWERCASE);
- // Change text to UTF-16
- std::vector<wchar_t> vwcText(lengthUTF16);
- ::MultiByteToWideChar(cpDoc, 0, s.c_str(), static_cast<int>(s.size()), &vwcText[0], lengthUTF16);
-
// Change case
- int charsConverted = ::LCMapStringW(LOCALE_SYSTEM_DEFAULT, mapFlags,
- &vwcText[0], lengthUTF16, NULL, 0);
- std::vector<wchar_t> vwcConverted(charsConverted);
- ::LCMapStringW(LOCALE_SYSTEM_DEFAULT, mapFlags,
- &vwcText[0], lengthUTF16, &vwcConverted[0], charsConverted);
+ const std::wstring wsConverted = StringMapCase(wsText, mapFlags);
// Change back to document encoding
- unsigned int lengthConverted = ::WideCharToMultiByte(cpDoc, 0,
- &vwcConverted[0], static_cast<int>(vwcConverted.size()),
- NULL, 0, NULL, 0);
- std::vector<char> vcConverted(lengthConverted);
- ::WideCharToMultiByte(cpDoc, 0,
- &vwcConverted[0], static_cast<int>(vwcConverted.size()),
- &vcConverted[0], static_cast<int>(vcConverted.size()), NULL, 0);
+ std::string sConverted = StringEncode(wsConverted, cpDoc);
- return std::string(&vcConverted[0], vcConverted.size());
+ return sConverted;
}
void ScintillaWin::Copy() {
@@ -2942,7 +2938,7 @@ void ScintillaWin::FullPaintDC(HDC hdc) { Paint(surfaceWindow, rcPaint);
surfaceWindow->Release();
HRESULT hr = pRenderTarget->EndDraw();
- if (hr == D2DERR_RECREATE_TARGET) {
+ if (hr == static_cast<HRESULT>(D2DERR_RECREATE_TARGET)) {
DropRenderTarget();
}
}
|