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:
Robin Dunn
2005-02-11 23:36:59 +00:00
parent e8cd0e5884
commit d429e18743
4 changed files with 160 additions and 2 deletions

View File

@@ -211,6 +211,7 @@ void ScintillaWX::Finalise() {
ScintillaBase::Finalise();
SetTicking(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*/) {
return 0;
}
@@ -687,12 +752,15 @@ void ScintillaWX::DoLoseFocus(){
focusEvent = true;
SetFocusState(false);
focusEvent = false;
DestroySystemCaret();
}
void ScintillaWX::DoGainFocus(){
focusEvent = true;
SetFocusState(true);
focusEvent = false;
DestroySystemCaret();
CreateSystemCaret();
}
void ScintillaWX::DoSysColourChange() {

View File

@@ -127,6 +127,8 @@ public:
virtual void CancelModes();
virtual void UpdateSystemCaret();
// Event delegates
void DoPaint(wxDC* dc, wxRect rect);
void DoHScroll(int type, int pos);
@@ -178,7 +180,16 @@ private:
#endif
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;
};

View File

@@ -211,6 +211,7 @@ void ScintillaWX::Finalise() {
ScintillaBase::Finalise();
SetTicking(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*/) {
return 0;
}
@@ -687,12 +752,15 @@ void ScintillaWX::DoLoseFocus(){
focusEvent = true;
SetFocusState(false);
focusEvent = false;
DestroySystemCaret();
}
void ScintillaWX::DoGainFocus(){
focusEvent = true;
SetFocusState(true);
focusEvent = false;
DestroySystemCaret();
CreateSystemCaret();
}
void ScintillaWX::DoSysColourChange() {

View File

@@ -127,6 +127,8 @@ public:
virtual void CancelModes();
virtual void UpdateSystemCaret();
// Event delegates
void DoPaint(wxDC* dc, wxRect rect);
void DoHScroll(int type, int pos);
@@ -178,7 +180,16 @@ private:
#endif
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;
};