1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include "view.hh"
#include "dl-dvi-fontdefinition.hh"
using DviLib::DviPage;
using DviLib::DviFontdefinition;
View::View (Model *model_arg)
{
model = model_arg;
model->add_observer (*this);
drawing_area = gtk_drawing_area_new ();
gtk_widget_show (drawing_area);
gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area),
BASE_DPI * PAPER_WIDTH,
BASE_DPI * PAPER_HEIGHT);
gtk_signal_connect (GTK_OBJECT (drawing_area), "realize",
(GtkSignalFunc) on_da_realize, this);
gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
(GtkSignalFunc) on_da_expose, this);
}
void
View::create_pixmap (void)
{
pixmap = gdk_pixmap_new(drawing_area->window,
BASE_DPI * PAPER_WIDTH,
BASE_DPI * PAPER_HEIGHT,
-1);
}
void
View::expose (GdkEventExpose *event)
{
gdk_draw_pixmap (
drawing_area->window,
drawing_area->style->fg_gc[GTK_WIDGET_STATE (drawing_area)],
pixmap,
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
}
void
View::redraw (void) const
{
// clear page
gdk_draw_rectangle (pixmap,
drawing_area->style->white_gc,
TRUE, 0, 0,
BASE_DPI * PAPER_WIDTH,
BASE_DPI * PAPER_HEIGHT);
cout << "width " << BASE_DPI * PAPER_WIDTH << endl;
cout << "height " << BASE_DPI * PAPER_HEIGHT << endl;
// create a painter
DviPainter *painter =
new DviPainter (pixmap,
drawing_area->style->fg_gc[GTK_WIDGET_STATE
(drawing_area)],
model->get_dvi_file (),
BASE_DPI,
new FontFactory());
// get page
DviPage *page;
try
{
page = model->get_dvi_file ()->get_page (0);
}
catch (string s)
{
cout << s;
abort ();
}
// draw it with the painter
page->execute (* painter);
}
void
View::notify (void) const
{
ModelState state = model->get_state ();
switch (state) {
case HAS_FILE:
redraw ();
break;
case NO_FILE:
break;
case ERROR:
break;
}
}
void
on_da_realize (GtkDrawingArea *da, View *v)
{
v->create_pixmap ();
v->notify ();
}
gint
on_da_expose (GtkWidget *widget, GdkEventExpose *event, View *v)
{
v->expose (event);
return FALSE;
}
|