fix bug when editor is removed during on-char and other callbacks (PR 9887)

svn: r12238
This commit is contained in:
Matthew Flatt 2008-11-04 23:52:14 +00:00
parent 37aae202c5
commit 5026445695

View File

@ -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;