On wxMSW Move an invisible system caret around with the Scintilla
caret to help screen readers and such can follow. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31950 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -211,6 +211,7 @@ void ScintillaWX::Finalise() {
|
|||||||
ScintillaBase::Finalise();
|
ScintillaBase::Finalise();
|
||||||
SetTicking(false);
|
SetTicking(false);
|
||||||
SetIdle(false);
|
SetIdle(false);
|
||||||
|
DestroySystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -520,6 +521,70 @@ void ScintillaWX::ClaimSelection() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ScintillaWX::UpdateSystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
if (hasFocus) {
|
||||||
|
if (HasCaretSizeChanged()) {
|
||||||
|
DestroySystemCaret();
|
||||||
|
CreateSystemCaret();
|
||||||
|
}
|
||||||
|
Point pos = LocationFromPosition(currentPos);
|
||||||
|
::SetCaretPos(pos.x, pos.y);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ScintillaWX::HasCaretSizeChanged() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
if (( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) )
|
||||||
|
|| (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScintillaWX::CreateSystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
sysCaretWidth = vs.caretWidth;
|
||||||
|
if (0 == sysCaretWidth) {
|
||||||
|
sysCaretWidth = 1;
|
||||||
|
}
|
||||||
|
sysCaretHeight = vs.lineHeight;
|
||||||
|
int bitmapSize = (((sysCaretWidth + 15) & ~15) >> 3) * sysCaretHeight;
|
||||||
|
char *bits = new char[bitmapSize];
|
||||||
|
memset(bits, 0, bitmapSize);
|
||||||
|
sysCaretBitmap = ::CreateBitmap(sysCaretWidth, sysCaretHeight, 1,
|
||||||
|
1, reinterpret_cast<BYTE *>(bits));
|
||||||
|
delete [] bits;
|
||||||
|
BOOL retval = ::CreateCaret(GetHwndOf(stc), sysCaretBitmap,
|
||||||
|
sysCaretWidth, sysCaretHeight);
|
||||||
|
::ShowCaret(GetHwndOf(stc));
|
||||||
|
return retval != 0;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScintillaWX::DestroySystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
::HideCaret(GetHwndOf(stc));
|
||||||
|
BOOL retval = ::DestroyCaret();
|
||||||
|
if (sysCaretBitmap) {
|
||||||
|
::DeleteObject(sysCaretBitmap);
|
||||||
|
sysCaretBitmap = 0;
|
||||||
|
}
|
||||||
|
return retval != 0;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) {
|
long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -687,12 +752,15 @@ void ScintillaWX::DoLoseFocus(){
|
|||||||
focusEvent = true;
|
focusEvent = true;
|
||||||
SetFocusState(false);
|
SetFocusState(false);
|
||||||
focusEvent = false;
|
focusEvent = false;
|
||||||
|
DestroySystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaWX::DoGainFocus(){
|
void ScintillaWX::DoGainFocus(){
|
||||||
focusEvent = true;
|
focusEvent = true;
|
||||||
SetFocusState(true);
|
SetFocusState(true);
|
||||||
focusEvent = false;
|
focusEvent = false;
|
||||||
|
DestroySystemCaret();
|
||||||
|
CreateSystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaWX::DoSysColourChange() {
|
void ScintillaWX::DoSysColourChange() {
|
||||||
|
@@ -127,6 +127,8 @@ public:
|
|||||||
|
|
||||||
virtual void CancelModes();
|
virtual void CancelModes();
|
||||||
|
|
||||||
|
virtual void UpdateSystemCaret();
|
||||||
|
|
||||||
// Event delegates
|
// Event delegates
|
||||||
void DoPaint(wxDC* dc, wxRect rect);
|
void DoPaint(wxDC* dc, wxRect rect);
|
||||||
void DoHScroll(int type, int pos);
|
void DoHScroll(int type, int pos);
|
||||||
@@ -178,6 +180,15 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
int wheelRotation;
|
int wheelRotation;
|
||||||
|
|
||||||
|
// For use in creating a system caret
|
||||||
|
bool HasCaretSizeChanged();
|
||||||
|
bool CreateSystemCaret();
|
||||||
|
bool DestroySystemCaret();
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
HBITMAP sysCaretBitmap;
|
||||||
|
int sysCaretWidth;
|
||||||
|
int sysCaretHeight;
|
||||||
|
#endif
|
||||||
|
|
||||||
friend class wxSTCCallTip;
|
friend class wxSTCCallTip;
|
||||||
};
|
};
|
||||||
|
@@ -211,6 +211,7 @@ void ScintillaWX::Finalise() {
|
|||||||
ScintillaBase::Finalise();
|
ScintillaBase::Finalise();
|
||||||
SetTicking(false);
|
SetTicking(false);
|
||||||
SetIdle(false);
|
SetIdle(false);
|
||||||
|
DestroySystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -520,6 +521,70 @@ void ScintillaWX::ClaimSelection() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ScintillaWX::UpdateSystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
if (hasFocus) {
|
||||||
|
if (HasCaretSizeChanged()) {
|
||||||
|
DestroySystemCaret();
|
||||||
|
CreateSystemCaret();
|
||||||
|
}
|
||||||
|
Point pos = LocationFromPosition(currentPos);
|
||||||
|
::SetCaretPos(pos.x, pos.y);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ScintillaWX::HasCaretSizeChanged() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
if (( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) )
|
||||||
|
|| (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScintillaWX::CreateSystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
sysCaretWidth = vs.caretWidth;
|
||||||
|
if (0 == sysCaretWidth) {
|
||||||
|
sysCaretWidth = 1;
|
||||||
|
}
|
||||||
|
sysCaretHeight = vs.lineHeight;
|
||||||
|
int bitmapSize = (((sysCaretWidth + 15) & ~15) >> 3) * sysCaretHeight;
|
||||||
|
char *bits = new char[bitmapSize];
|
||||||
|
memset(bits, 0, bitmapSize);
|
||||||
|
sysCaretBitmap = ::CreateBitmap(sysCaretWidth, sysCaretHeight, 1,
|
||||||
|
1, reinterpret_cast<BYTE *>(bits));
|
||||||
|
delete [] bits;
|
||||||
|
BOOL retval = ::CreateCaret(GetHwndOf(stc), sysCaretBitmap,
|
||||||
|
sysCaretWidth, sysCaretHeight);
|
||||||
|
::ShowCaret(GetHwndOf(stc));
|
||||||
|
return retval != 0;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScintillaWX::DestroySystemCaret() {
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
::HideCaret(GetHwndOf(stc));
|
||||||
|
BOOL retval = ::DestroyCaret();
|
||||||
|
if (sysCaretBitmap) {
|
||||||
|
::DeleteObject(sysCaretBitmap);
|
||||||
|
sysCaretBitmap = 0;
|
||||||
|
}
|
||||||
|
return retval != 0;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) {
|
long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -687,12 +752,15 @@ void ScintillaWX::DoLoseFocus(){
|
|||||||
focusEvent = true;
|
focusEvent = true;
|
||||||
SetFocusState(false);
|
SetFocusState(false);
|
||||||
focusEvent = false;
|
focusEvent = false;
|
||||||
|
DestroySystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaWX::DoGainFocus(){
|
void ScintillaWX::DoGainFocus(){
|
||||||
focusEvent = true;
|
focusEvent = true;
|
||||||
SetFocusState(true);
|
SetFocusState(true);
|
||||||
focusEvent = false;
|
focusEvent = false;
|
||||||
|
DestroySystemCaret();
|
||||||
|
CreateSystemCaret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaWX::DoSysColourChange() {
|
void ScintillaWX::DoSysColourChange() {
|
||||||
|
@@ -127,6 +127,8 @@ public:
|
|||||||
|
|
||||||
virtual void CancelModes();
|
virtual void CancelModes();
|
||||||
|
|
||||||
|
virtual void UpdateSystemCaret();
|
||||||
|
|
||||||
// Event delegates
|
// Event delegates
|
||||||
void DoPaint(wxDC* dc, wxRect rect);
|
void DoPaint(wxDC* dc, wxRect rect);
|
||||||
void DoHScroll(int type, int pos);
|
void DoHScroll(int type, int pos);
|
||||||
@@ -178,6 +180,15 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
int wheelRotation;
|
int wheelRotation;
|
||||||
|
|
||||||
|
// For use in creating a system caret
|
||||||
|
bool HasCaretSizeChanged();
|
||||||
|
bool CreateSystemCaret();
|
||||||
|
bool DestroySystemCaret();
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
HBITMAP sysCaretBitmap;
|
||||||
|
int sysCaretWidth;
|
||||||
|
int sysCaretHeight;
|
||||||
|
#endif
|
||||||
|
|
||||||
friend class wxSTCCallTip;
|
friend class wxSTCCallTip;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user