adjust editor-cavas% refresh to clear border before calling on-paint

svn: r12198
This commit is contained in:
Matthew Flatt 2008-10-31 15:08:21 +00:00
parent cc12402a34
commit 51f5d193dd
7 changed files with 86 additions and 38 deletions

View File

@ -728,6 +728,7 @@
set-x-margin set-x-margin
get-y-margin get-y-margin
get-x-margin get-x-margin
clear-margins
scroll-to scroll-to
set-lazy-refresh set-lazy-refresh
get-lazy-refresh get-lazy-refresh

View File

@ -14,12 +14,17 @@
(define (make-canvas-glue% %) ; implies make-window-glue% (define (make-canvas-glue% %) ; implies make-window-glue%
(class100 (make-window-glue% %) (mred proxy . args) (class100 (make-window-glue% %) (mred proxy . args)
(inherit get-mred get-top-level) (inherit get-mred get-top-level clear-margins)
(public (public
[do-on-char (lambda (e) (super on-char e))] [do-on-char (lambda (e) (super on-char e))]
[do-on-event (lambda (e) (super on-event e))] [do-on-event (lambda (e) (super on-event e))]
[do-on-scroll (lambda (e) (super on-scroll e))] [do-on-scroll (lambda (e) (super on-scroll e))]
[do-on-paint (lambda () (super on-paint))]) [do-on-paint (lambda () (super on-paint))])
(private
[clear-and-on-paint
(lambda (mred)
(clear-margins)
(send mred on-paint))])
(override (override
[on-char (entry-point [on-char (entry-point
(lambda (e) (lambda (e)
@ -54,9 +59,9 @@
;; Windows circumvented the event queue; delay ;; Windows circumvented the event queue; delay
(queue-window-callback (queue-window-callback
this this
(lambda () (send mred on-paint))) (lambda () (clear-and-on-paint mred)))
(as-exit (lambda () (send mred on-paint)))) (as-exit (lambda () (clear-and-on-paint mred))))
(as-exit (lambda () (super on-paint)))))))]) (as-exit (lambda () (clear-margins) (super on-paint)))))))])
(sequence (apply super-init mred proxy args)))) (sequence (apply super-init mred proxy args))))
(define wx-canvas% (define wx-canvas%
@ -66,6 +71,7 @@
(private-field (private-field
[tabable? #f]) [tabable? #f])
(public (public
[clear-margins (lambda () (void))]
[on-tab-in (lambda () (send (wx->mred this) on-tab-in))] [on-tab-in (lambda () (send (wx->mred this) on-tab-in))]
[get-tab-focus (lambda () tabable?)] [get-tab-focus (lambda () tabable?)]
[set-tab-focus (lambda (v) (set! tabable? v))]) [set-tab-focus (lambda (v) (set! tabable? v))])

View File

@ -235,7 +235,15 @@ Enables or disables the caret in the @techlink{display}'s editor, if
(on-paint) (on-paint)
void?]{ void?]{
Repaints the editor. Repaints the editor, or clears the canvas if no editor is being
displayed.
This method is called after clearing the margin around the editor,
unless the canvas is created with the @scheme['transparent] style, but
the editor area is not automatically cleared. In other words,
@scheme[editor-canvas%] update by default is like @scheme[canvas%]
update with the @scheme['no-autoclear] style, except that the margin
around the editor area is always cleared.
} }

View File

@ -671,42 +671,49 @@ void wxMediaCanvas::OnChar(wxKeyEvent *event)
} }
} }
void wxMediaCanvas::ClearMargins(void)
{
/* This method is called by `on-paint' in `wx:canvas%'
before it calls the `on-paint' in `canvas%'. It's
essentially a compromise between autoclear mode and
no-autoclear mode. */
if (xmargin || ymargin) {
wxDC *adc;
wxColor *bg;
bg = GetCanvasBackground();
if (bg) {
wxBrush *b, *ob;
wxPen *p, *op;
int cw, ch;
GetClientSize(&cw, &ch);
b = wxTheBrushList->FindOrCreateBrush(bg, wxSOLID);
p = wxThePenList->FindOrCreatePen("BLACK", 0, wxTRANSPARENT);
adc = GetDC();
ob = adc->GetBrush();
op = adc->GetPen();
adc->SetBrush(b);
adc->SetPen(p);
adc->DrawRectangle(0, 0, xmargin, ch);
adc->DrawRectangle(cw-xmargin, 0, cw, ch);
adc->DrawRectangle(0, 0, cw, ymargin);
adc->DrawRectangle(0, ch-ymargin, cw, ch);
adc->SetBrush(ob);
adc->SetPen(op);
}
}
}
void wxMediaCanvas::OnPaint(void) void wxMediaCanvas::OnPaint(void)
{ {
need_refresh = FALSE; need_refresh = FALSE;
if (media) { if (media) {
/* Clear the margins */
if (xmargin || ymargin) {
wxDC *adc;
wxColor *bg;
bg = GetCanvasBackground();
if (bg) {
wxBrush *b, *ob;
wxPen *p, *op;
int cw, ch;
GetClientSize(&cw, &ch);
b = wxTheBrushList->FindOrCreateBrush(bg, wxSOLID);
p = wxThePenList->FindOrCreatePen("BLACK", 0, wxTRANSPARENT);
adc = GetDC();
ob = adc->GetBrush();
op = adc->GetPen();
adc->SetBrush(b);
adc->SetPen(p);
adc->DrawRectangle(0, 0, xmargin, ch);
adc->DrawRectangle(cw-xmargin, 0, cw, ch);
adc->DrawRectangle(0, 0, cw, ymargin);
adc->DrawRectangle(0, ch-ymargin, cw, ch);
adc->SetBrush(ob);
adc->SetPen(op);
}
}
if (!media->printing) { if (!media->printing) {
double w, h, x, y; double w, h, x, y;
GetView(&x, &y, &w, &h); GetView(&x, &y, &w, &h);

View File

@ -455,6 +455,8 @@ class wxMediaCanvas : public wxCanvas
virtual void Scroll(int x, int y, Bool refresh); virtual void Scroll(int x, int y, Bool refresh);
void ClearMargins();
/* To block bad uses: */ /* To block bad uses: */
virtual void Scroll(int x, int y); virtual void Scroll(int x, int y);
virtual void SetScrollbars(int h_pixels, int v_pixels, int x_len, int y_len, virtual void SetScrollbars(int h_pixels, int v_pixels, int x_len, int y_len,

View File

@ -241,6 +241,7 @@ typedef void *(*CAPOFunc)(void*);
class os_wxMediaCanvas : public wxMediaCanvas { class os_wxMediaCanvas : public wxMediaCanvas {
public: public:
@ -1114,6 +1115,26 @@ static Scheme_Object *os_wxMediaCanvasGetXMargin(int n, Scheme_Object *p[])
return scheme_make_integer(r); return scheme_make_integer(r);
} }
static Scheme_Object *os_wxMediaCanvasClearMargins(int n, Scheme_Object *p[])
{
WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p)
REMEMBER_VAR_STACK();
objscheme_check_valid(os_wxMediaCanvas_class, "clear-margins in editor-canvas%", n, p);
SETUP_VAR_STACK_REMEMBERED(1);
VAR_STACK_PUSH(0, p);
WITH_VAR_STACK(((wxMediaCanvas *)((Scheme_Class_Object *)p[0])->primdata)->ClearMargins());
READY_TO_RETURN;
return scheme_void;
}
static Scheme_Object *os_wxMediaCanvasScrollTo(int n, Scheme_Object *p[]) static Scheme_Object *os_wxMediaCanvasScrollTo(int n, Scheme_Object *p[])
{ {
WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p)
@ -1474,7 +1495,7 @@ void objscheme_setup_wxMediaCanvas(Scheme_Env *env)
wxREGGLOB(os_wxMediaCanvas_class); wxREGGLOB(os_wxMediaCanvas_class);
os_wxMediaCanvas_class = WITH_VAR_STACK(objscheme_def_prim_class(env, "editor-canvas%", "canvas%", (Scheme_Method_Prim *)os_wxMediaCanvas_ConstructScheme, 29)); os_wxMediaCanvas_class = WITH_VAR_STACK(objscheme_def_prim_class(env, "editor-canvas%", "canvas%", (Scheme_Method_Prim *)os_wxMediaCanvas_ConstructScheme, 30));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "on-char" " method", (Scheme_Method_Prim *)os_wxMediaCanvasOnChar, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "on-char" " method", (Scheme_Method_Prim *)os_wxMediaCanvasOnChar, 1, 1));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "on-event" " method", (Scheme_Method_Prim *)os_wxMediaCanvasOnEvent, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "on-event" " method", (Scheme_Method_Prim *)os_wxMediaCanvasOnEvent, 1, 1));
@ -1493,6 +1514,7 @@ void objscheme_setup_wxMediaCanvas(Scheme_Env *env)
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "set-x-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasSetXMargin, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "set-x-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasSetXMargin, 1, 1));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-y-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetYMargin, 0, 0)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-y-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetYMargin, 0, 0));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-x-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetXMargin, 0, 0)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-x-margin" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetXMargin, 0, 0));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "clear-margins" " method", (Scheme_Method_Prim *)os_wxMediaCanvasClearMargins, 0, 0));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "scroll-to" " method", (Scheme_Method_Prim *)os_wxMediaCanvasScrollTo, 5, 6)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "scroll-to" " method", (Scheme_Method_Prim *)os_wxMediaCanvasScrollTo, 5, 6));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "set-lazy-refresh" " method", (Scheme_Method_Prim *)os_wxMediaCanvasSetLazyRefresh, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "set-lazy-refresh" " method", (Scheme_Method_Prim *)os_wxMediaCanvasSetLazyRefresh, 1, 1));
WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-lazy-refresh" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetLazyRefresh, 0, 0)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxMediaCanvas_class, "get-lazy-refresh" " method", (Scheme_Method_Prim *)os_wxMediaCanvasGetLazyRefresh, 0, 0));

View File

@ -88,6 +88,8 @@ typedef void *(*CAPOFunc)(void*);
@ "scroll-to" : bool ScrollTo(double,double,nndouble,nndouble, bool,SYM[bias]=0); : : : rFALSE @ "scroll-to" : bool ScrollTo(double,double,nndouble,nndouble, bool,SYM[bias]=0); : : : rFALSE
@ "clear-margins" : void ClearMargins();
@ "get-x-margin" : nnint GetXMargin(); @ "get-x-margin" : nnint GetXMargin();
@ "get-y-margin" : nnint GetYMargin(); @ "get-y-margin" : nnint GetYMargin();
@ "set-x-margin" : void SetXMargin(nnint); @ "set-x-margin" : void SetXMargin(nnint);