fix bug when editor is removed during on-char and other callbacks (PR 9887)
svn: r12238
This commit is contained in:
parent
37aae202c5
commit
5026445695
|
@ -413,10 +413,12 @@ void wxMediaCanvas::OnFocus(Bool focus)
|
|||
media->SetAdmin(admin);
|
||||
}
|
||||
|
||||
media->OwnCaret(focus);
|
||||
if (media)
|
||||
media->OwnCaret(focus);
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -440,10 +442,12 @@ void wxMediaCanvas::BlinkCaret()
|
|||
media->SetAdmin(admin);
|
||||
}
|
||||
|
||||
media->BlinkCaret();
|
||||
if (media)
|
||||
media->BlinkCaret();
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -465,7 +469,8 @@ void *wxMediaCanvas::CallAsPrimaryOwner(void *(*f)(void *), void *data)
|
|||
r = f(data);
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
} else
|
||||
r = f(data);
|
||||
|
@ -572,15 +577,17 @@ void wxMediaCanvas::OnEvent(wxMouseEvent *event)
|
|||
media->SetAdmin(admin);
|
||||
}
|
||||
|
||||
{
|
||||
if (media) {
|
||||
wxCursor *c;
|
||||
c = media->AdjustCursor(event);
|
||||
SetCustomCursor(c);
|
||||
}
|
||||
media->OnEvent(event);
|
||||
if (media)
|
||||
media->OnEvent(event);
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
|
||||
if (event->Dragging()) {
|
||||
|
@ -622,14 +629,16 @@ void wxMediaCanvas::UpdateCursorNow(void)
|
|||
if (PTRNE((oldadmin = (wxCanvasMediaAdmin *)media->GetAdmin()), admin))
|
||||
media->SetAdmin(admin);
|
||||
|
||||
{
|
||||
if (media) {
|
||||
wxCursor *c;
|
||||
c = media->AdjustCursor(event);
|
||||
SetCustomCursor(c);
|
||||
}
|
||||
|
||||
if (PTRNE(oldadmin, admin))
|
||||
media->SetAdmin(oldadmin);
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
}
|
||||
|
||||
wxMenu *wxMediaCanvas::PopupForMedia(wxMediaBuffer *WXUNUSED(b), void *WXUNUSED(m))
|
||||
|
@ -663,10 +672,12 @@ void wxMediaCanvas::OnChar(wxKeyEvent *event)
|
|||
media->SetAdmin(admin);
|
||||
}
|
||||
|
||||
media->OnChar(event);
|
||||
if (media)
|
||||
media->OnChar(event);
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -889,14 +900,16 @@ void wxMediaCanvas::Redraw(double localx, double localy, double fw, double fh)
|
|||
media->SetAdmin(admin);
|
||||
}
|
||||
|
||||
media->Refresh(x, y, w, h,
|
||||
(focuson || focusforcedon)
|
||||
? wxSNIP_DRAW_SHOW_CARET
|
||||
: wxSNIP_DRAW_SHOW_INACTIVE_CARET,
|
||||
GetCanvasBackground());
|
||||
if (media)
|
||||
media->Refresh(x, y, w, h,
|
||||
(focuson || focusforcedon)
|
||||
? wxSNIP_DRAW_SHOW_CARET
|
||||
: wxSNIP_DRAW_SHOW_INACTIVE_CARET,
|
||||
GetCanvasBackground());
|
||||
|
||||
if (PTRNE(oldadmin, admin)) {
|
||||
media->SetAdmin(oldadmin);
|
||||
if (media)
|
||||
media->SetAdmin(oldadmin);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -910,8 +923,9 @@ Bool wxMediaCanvas::ScrollTo(double localx, double localy, double fw, double fh,
|
|||
double iw, ih;
|
||||
double x, y;
|
||||
double find_dy;
|
||||
wxMediaBuffer *med = media;
|
||||
|
||||
if (!media || media->printing || (!allowXScroll && !allowYScroll))
|
||||
if (!med || med->printing || (!allowXScroll && !allowYScroll))
|
||||
return FALSE;
|
||||
|
||||
GetView(&x, &y, &iw, &ih);
|
||||
|
@ -933,25 +947,25 @@ Bool wxMediaCanvas::ScrollTo(double localx, double localy, double fw, double fh,
|
|||
|| (fh <= ih && localy < y)
|
||||
// doesn't fit, no conflicting bias, can shift up to see more:
|
||||
|| (fh > ih && bias != 1 && localy < y))
|
||||
sy = media->FindScrollLine(find_dy + localy) - scrollOffset;
|
||||
sy = med->FindScrollLine(find_dy + localy) - scrollOffset;
|
||||
else if (// doesn't fit, bias is set:
|
||||
(bias == 1 && fh > ih)
|
||||
// fits, need to shift up into view:
|
||||
|| (fh <= ih && y + ih < localy + fh)) {
|
||||
double l = find_dy + localy + fh - ih;
|
||||
// Find scroll pos for top of region to show:
|
||||
sy = media->FindScrollLine(l);
|
||||
sy = med->FindScrollLine(l);
|
||||
// Unless l is exactly the top of a line, move down to the next whole line:
|
||||
if (media->ScrollLineLocation(sy) != l)
|
||||
if (med->ScrollLineLocation(sy) != l)
|
||||
sy++;
|
||||
sy -= scrollOffset;
|
||||
} else if (// doesn't fit, no conflicting bias, maybe shift down to see more:
|
||||
(fh > ih && bias != -1 && localy + fh > y + ih)) {
|
||||
// Shift to one more than the first scroll position that shows last line
|
||||
long my;
|
||||
my = media->FindScrollLine(find_dy + localy + fh - ih) + 1 - scrollOffset;
|
||||
my = med->FindScrollLine(find_dy + localy + fh - ih) + 1 - scrollOffset;
|
||||
// But only shift down the extra line if doing so doesn't skip the whole area
|
||||
if (media->ScrollLineLocation(my) < find_dy + localy + fh)
|
||||
if (med->ScrollLineLocation(my) < find_dy + localy + fh)
|
||||
sy = my;
|
||||
else if (my > 0)
|
||||
sy = my - 1;
|
||||
|
@ -1012,6 +1026,8 @@ Bool wxMediaCanvas::ResetVisual(Bool reset_scroll)
|
|||
lastheight = lh;
|
||||
|
||||
if (media && (allowXScroll || allowYScroll)) {
|
||||
wxMediaBuffer *med = media;
|
||||
|
||||
if (reset_scroll)
|
||||
x = y = 0;
|
||||
else {
|
||||
|
@ -1022,18 +1038,18 @@ Bool wxMediaCanvas::ResetVisual(Bool reset_scroll)
|
|||
w = h = 0.0;
|
||||
GetView(NULL, NULL, &w, &h);
|
||||
totalWidth = totalHeight = 0.0;
|
||||
media->GetExtent(&totalWidth, &totalHeight);
|
||||
med->GetExtent(&totalWidth, &totalHeight);
|
||||
|
||||
if (!h || (!scrollToLast && (h >= totalHeight))) {
|
||||
vnumScrolls = 0;
|
||||
scrollOffset = 0;
|
||||
} else {
|
||||
if (scrollBottomBased) {
|
||||
vnumScrolls = media->NumScrollLines() - 1;
|
||||
vnumScrolls = med->NumScrollLines() - 1;
|
||||
scrollOffset = 1;
|
||||
if (!scrollToLast) {
|
||||
long start;
|
||||
start = media->FindScrollLine(h + 1) - 1;
|
||||
start = med->FindScrollLine(h + 1) - 1;
|
||||
scrollOffset += start;
|
||||
vnumScrolls -= start;
|
||||
}
|
||||
|
@ -1041,16 +1057,16 @@ Bool wxMediaCanvas::ResetVisual(Bool reset_scroll)
|
|||
long top = (long)(totalHeight - (scrollToLast ? 0 : h));
|
||||
if (top)
|
||||
--top;
|
||||
vnumScrolls = media->FindScrollLine(top) + 1;
|
||||
if (vnumScrolls >= media->NumScrollLines())
|
||||
vnumScrolls = media->NumScrollLines() - 1;
|
||||
vnumScrolls = med->FindScrollLine(top) + 1;
|
||||
if (vnumScrolls >= med->NumScrollLines())
|
||||
vnumScrolls = med->NumScrollLines() - 1;
|
||||
scrollOffset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (vnumScrolls > 0) {
|
||||
int numLines;
|
||||
numLines = media->NumScrollLines() - 1;
|
||||
numLines = med->NumScrollLines() - 1;
|
||||
vspp = (long)(((double)h * numLines) / totalHeight) - 1;
|
||||
if (vspp < 1)
|
||||
vspp = 1;
|
||||
|
|
Loading…
Reference in New Issue
Block a user