ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
(Generate patch)

Comparing kgsueme/kgsueme/gtk.pl (file contents):
Revision 1.27 by pcg, Tue Jul 22 21:45:44 2003 UTC vs.
Revision 1.28 by pcg, Fri Jul 25 03:50:33 2003 UTC

149sub DESTROY { 149sub DESTROY {
150 my ($self) = @_; 150 my ($self) = @_;
151 warn "DESTROY($self)";#d# 151 warn "DESTROY($self)";#d#
152} 152}
153 153
154package gtk::text;
155
156use base gtk::widget;
157
158my $tagtable = new Gtk2::TextTagTable;
159
160{
161 my %tags = (
162 default => { foreground => "black" },
163 node => { foreground => "#0000b0", event => 1 },
164 move => { foreground => "#0000b0", event => 1 },
165 user => { foreground => "#0000b0", event => 1 },
166 coord => { foreground => "#0000b0", event => 1 },
167 header => { weight => 800, pixels_above_lines => 6 },
168 description => { weight => 800, foreground => "blue" },
169 infoblock => { weight => 700, foreground => "blue" },
170 );
171
172 while (my ($k, $v) = each %tags) {
173 my $tag = new Gtk2::TextTag $k;
174 if (delete $v->{event}) {
175 ###
176 }
177 $tag->set (%$v);
178 $tagtable->add ($tag);
179 }
180}
181
182sub new {
183 my $class = shift;
184 my $self = $class->SUPER::new(@_);
185
186 $self->{buffer} = new Gtk2::TextBuffer $tagtable;
187
188 $self->{widget} = new Gtk2::ScrolledWindow;
189 $self->{widget}->set_policy("never", "always");
190
191 $self->{widget}->add ($self->{view} = new_with_buffer Gtk2::TextView $self->{buffer});
192 $self->{view}->set_wrap_mode ("word");
193 $self->{view}->set_cursor_visible (0);
194
195 $self->{view}->set_editable (0);
196
197 use PApp::Util; warn PApp::Util::dumpval ($self->{view}->get_events);
198 $self->{view}->signal_connect (motion_notify_event => sub {
199 my ($widget, $event) = @_;
200
201 my $window = $widget->get_window ("text");
202 if ($event->window == $window) {
203 my ($win, $x, $y, $mask) = $window->get_pointer;
204 # warn "TAG EVENT @_ ($window, $win, $x, $y, $mask)\n";
205 #gtk_text_view_window_to_buffer_coords (text_view,
206 # GTK_TEXT_WINDOW_TEXT,
207 # text_view->drag_start_x,
208 # text_view->drag_start_y,
209 # &buffer_x,
210 # &buffer_y);
211#
212# gtk_text_layout_get_iter_at_pixel (text_view->layout,
213# &iter,
214# buffer_x, buffer_y);
215#
216# gtk_text_view_start_selection_dnd (text_view, &iter, event);
217# return TRUE;
218 }
219 0;
220 });
221
222 $self->set_end;
223
224 $self;
225}
226
227sub set_end {
228 my ($self) = @_;
229
230 # this is probably also a hack...
231 $self->{idle} ||= add Glib::Idle sub {
232 $self->{view}->scroll_to_iter ($self->{buffer}->get_end_iter, 0, 0, 0, 0)
233 if $self->{view};
234 delete $self->{idle};
235 };
236}
237
238sub at_end {
239 my ($self) = @_;
240
241 # this is, maybe, a bad hack :/
242 my $adj = $self->{widget}->get_vadjustment;
243 $adj->value + $adj->page_size >= $adj->upper - 0.5;
244}
245
246sub append_text {
247 my ($self, $text) = @_;
248
249 my $at_end = $self->at_end;
250
251 my @tag;
252 $text = "<default>$text</default>";
253
254 # pseudo-simplistic-xml-parser
255 for (;;) {
256 $text =~ /\G<([^>]+)>/gc or last;
257 my $tag = $1;
258 if ($tag =~ s/^\///) {
259 pop @tag;
260 } else {
261 push @tag, $tag;
262 }
263
264 $text =~ /\G([^<]*)/gc or last;
265 $self->{buffer}->insert_with_tags_by_name ($self->{buffer}->get_end_iter, util::xmlto $1, $tag[-1])
266 if length $1;
267 }
268
269 $self->set_end if $at_end;
270}
271
272sub set_text {
273 my ($self, $text) = @_;
274
275 my $at_end = $self->at_end;
276
277 $self->{buffer}->set_text ("");
278 $self->append_text ($text);
279
280 $self->set_end if $at_end;
281}
282
2831; 1541;
284 155

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines