Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/dvi/view.cc
blob: 0f2f4b53781c1274832fe8e289cdca1d2e295224 (plain)
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;
}