############################################################################## # # Jarl - SXPM Tk Interface Code # # Perl code to handle showing the Jarl SXPM GUI and interfacing with it. # ############################################################################## ############################################################################## # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Jabber # Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ # ############################################################################## ############################################################################## # # jarlSXPMIF_AddMessage - takes a and adds it to the proper # channel based on the from JID. # ############################################################################## sub jarlSXPMIF_AddXPM { my ($tag,$xpm) = @_; $Debug->Log1("jarlSXPMIF_AddMessage: tag($tag) x($x) y($y) xpm($xpm)"); # # erasing.... # my $priority = "low"; $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}->delete("xpm"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> createImage(0,0, image=>$GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}->Pixmap(-data=>$xpm), anchor=>"nw", tag=>[ "xpm" ]); $TabBar->HighlightTab($tag,$priority); } ############################################################################## # # jarlSXPMIF_SXPMExists - returns 1 if the GUI for the groupchat # exists, 0 if not. # ############################################################################## sub jarlSXPMIF_SXPMExists { my ($tag) = @_; return exists($GUI{Jabber}->{SXPM}->{$tag}); } ############################################################################## # # jarlSXPMIF_NewSXPM - function to do all GUI calls needed to create # a new groupchat. # ############################################################################## sub jarlSXPMIF_NewSXPM { my ($tag) = @_; $Debug->Log3("jarlSXPMIF_NewSXPM: tag($tag)"); $GUI{Jabber}->{SXPM}->{$tag}->{top} = $TabBar->AddTab(-type=>"docked", -tag=>$tag, -text=>"SXPM - ".&jarlSXPM_BoardName($tag)); &jarlSXPMIF_NewGUI($tag); &jarlSXPMIF_RaiseSXPM($tag); } ############################################################################## # # jarlSXPMIF_RaiseSXPM - function to bring the specified groupchat # to the top of the window list. # ############################################################################## sub jarlSXPMIF_RaiseSXPM { my ($tag) = @_; $TabBar->RaiseTab($tag); } ############################################################################## # # jarlSXPMIF_NewGUI - populates the new tab with a groupchat GUI. # ############################################################################## sub jarlSXPMIF_NewGUI { my ($tag) = @_; $Debug->Log3("jarlSXPMIF_NewGUI: tag($tag)"); #--------------------------------------------------------------------------- # Groupchat Window #--------------------------------------------------------------------------- $GUI{Jabber}->{SXPM}->{$tag}->{Top}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, )->pack(-side=>"top", -fill=>"x"); $GUI{Jabber}->{SXPM}->{$tag}->{Bottom}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, )->pack(-side=>"bottom", -fill=>"x"); $GUI{Jabber}->{SXPM}->{$tag}->{Left}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, )->pack(-side=>"left", -fill=>"both", -expand=>1); $GUI{Jabber}->{SXPM}->{$tag}->{Right}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, )->pack(-side=>"right", -fill=>"y"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{Left}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, -relief=>"sunken", -borderwidth=>2 )->pack(-side=>"top", -fill=>"both", -expand=>1, -padx=>5, -pady=>5); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Scrolled} = $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{top}-> Scrolled("Canvas", -scrollbars=>"osoe", -background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -scrollregion=>[ 0,0,&jarlSXPM_BoardWidth($tag),&jarlSXPM_BoardHeight($tag)], -cursor=>"crosshair" )->pack(-side=>"left", -fill=>"both", -expand=>1, -padx=>0, -pady=>0); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{YScrollbar} = $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Scrolled}-> Subwidget("yscrollbar"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{YScrollbar}-> configure(-width=>10, -borderwidth=>1, -highlightthickness=>0, -relief=>"flat", ); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{XScrollbar} = $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Scrolled}-> Subwidget("xscrollbar"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{XScrollbar}-> configure(-width=>10, -borderwidth=>1, -highlightthickness=>0, -relief=>"flat", ); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas} = $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Scrolled}-> Subwidget("canvas"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> createRectangle(0,0,&jarlSXPM_BoardWidth($tag),&jarlSXPM_BoardHeight($tag), -outline=>undef, -fill=>$GUI{color}->{jarl}->{main}->{bg}->{light}, -tag=>[ "board" ]); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> Tk::bind("", sub{ $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> yviewScroll(-1,"units"); }); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> Tk::bind("", sub{ $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> yviewScroll(1,"units"); }); $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}= $GUI{Jabber}->{SXPM}->{$tag}->{Right}->{top}-> Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark}, )->pack(-side=>"bottom", -fill=>"y", -expand=>1, -padx=>5, -pady=>5); $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} = "rect"; $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}-> Radiobutton(-variable=>\$GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem}, -text=>"Rectangle", -value=>"rect", -command=>sub { &jarlSXPMIF_BindStart($tag); } )->pack(-side=>"top", -anchor => 'w'); $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}-> Radiobutton(-variable=>\$GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem}, -text=>"Oval", -value=>"oval", -command=>sub { &jarlSXPMIF_BindStart($tag); } )->pack(-side=>"top", -anchor => 'w'); $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}-> Radiobutton(-variable=>\$GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem}, -text=>"Line", -value=>"line", -command=>sub { &jarlSXPMIF_BindStart($tag); } )->pack(-side=>"top", -anchor => 'w'); $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}-> Label(-text => "Line Width:" )->pack(-side=>"top", -anchor => 'w'); $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness} = 1; $GUI{Jabber}->{SXPM}->{$tag}->{ControlPanel}->{top}-> Entry(-textvariable=>\$GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness} )->pack(-side=>"top", -anchor=>'w'); &jarlSXPMIF_BindStart($tag); $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Leave} = $GUI{Jabber}->{SXPM}->{$tag}->{Bottom}->{top}-> Button(-image=>$GUI{Icons}->{Leave}, -background=>$GUI{color}->{jarl}->{newmessage}->{bg}->{normal}, -foreground=>$GUI{color}->{jarl}->{newmessage}->{fg}->{dark}, -disabledforeground=>$GUI{color}->{jarl}->{newmessage}->{fg}->{light}, -font=>$GUI{fonts}->{normal}, -command=>sub{ &jarlSXPM_Leave($tag); # &jarlGroupChat_Leave($tag); $TabBar->DeleteTab($tag); delete($GUI{Jabber}->{SXPM}->{$tag}); } )->pack(-side=>"right"); &jarlMainIF_RegisterIcon($GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Leave}, "Leave"); $GUI{ToolBar}->{Balloon}-> attach($GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Leave}, -balloonmsg=>"Leave the Room "); } sub jarlSXPMIF_BindStart { my $tag = shift; # If there is a "Motion" binding, we need to allow the user # to finish drawing the item before rebinding Button-1 # this fcn gets called when the finish drawing the item again $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{bindings} = $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}->Tk::bind(""); return if ($#{$GUI{Jabber}->{SXPM}->{$tag}->{vars}->{bindings}} >= 0); if ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "rect") { $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> Tk::bind("", [\&jarlSXPMIF_StartDrawing, $tag, Ev('x'), Ev('y')]); } elsif ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "oval") { $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> Tk::bind("", [\&jarlSXPMIF_StartDrawing, $tag, Ev('x'), Ev('y')]); } elsif ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "line") { $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> Tk::bind("", [\&jarlSXPMIF_StartDrawing, $tag, Ev('x'), Ev('y')]); } } sub jarlSXPMIF_StartDrawing { my ($canvas, $tag, $x, $y) = @_; $x = $canvas->canvasx($x); $y = $canvas->canvasy($y); # Do a little error checking return if ($x >= &jarlSXPM_BoardWidth($tag)); return if ($y >= &jarlSXPM_BoardHeight($tag)); return if ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawing} ne ""); $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness} = 1 if (($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness} !~ /[0-9]+/) || ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness} < 1)); $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawing} = $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem}; $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawingthickness} = $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness}; if ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "rect") { $canvas->createRectangle($x, $y, $x, $y, -width => $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness}, -tags => "drawmenow"); } elsif ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "oval") { $canvas->createOval($x, $y, $x, $y, -width => $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness}, -tags => "drawmenow"); } elsif ($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawitem} eq "line") { $canvas->createLine($x, $y, $x, $y, -width => $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{thickness}, -tags => "drawmenow"); } $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx} = $x; $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty} = $y; # Map the Button-1 binding to &jarlSXPMIF_EndDrawing instead of start drawing $canvas->Tk::bind("", [\&jarlSXPMIF_SizeItem, $tag, Ev('x'), Ev('y')]); $canvas->Tk::bind("", [\&jarlSXPMIF_EndDrawing, $tag, Ev('x'), Ev('y')]); } sub jarlSXPMIF_SizeItem { my ($canvas, $tag, $x, $y) = @_; $x = $canvas->canvasx($x); $y = $canvas->canvasy($y); return if ($x >= &jarlSXPM_BoardWidth($tag)); return if ($y >= &jarlSXPM_BoardHeight($tag)); $canvas->coords("drawmenow", $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty}, $x, $y); } sub jarlSXPMIF_EndDrawing { my ($canvas, $tag, $x, $y) = @_; $x = $canvas->canvasx($x); $y = $canvas->canvasy($y); return if ($x >= &jarlSXPM_BoardWidth($tag)); return if ($y >= &jarlSXPM_BoardHeight($tag)); # finalize the size of the item, and remove the tag from the item $canvas->coords("drawmenow", $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty}, $x, $y); # remove motion binding. $canvas->Tk::bind("", ""); &jarlSXPMIF_BindStart($tag); my $drawing = $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawing}; $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawing} = ""; $canvas->delete("drawmenow"); if (($x != $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}) || ($y != $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty})) { my ($offsetX,$offsetY,$dataWidth,$data); ($offsetX,$offsetY,$dataWidth,$data) = &jarlSXPM_Rect($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty}, $x, $y, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawingthickness}, " ", "a", " ") if ($drawing eq "rect"); ($offsetX,$offsetY,$dataWidth,$data) = &jarlSXPM_Oval($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty}, $x, $y, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawingthickness}, " ", "a", " ") if ($drawing eq "oval"); ($offsetX,$offsetY,$dataWidth,$data) = &jarlSXPM_Line($GUI{Jabber}->{SXPM}->{$tag}->{vars}->{startx}, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{starty}, $x, $y, $GUI{Jabber}->{SXPM}->{$tag}->{vars}->{drawingthickness}, " ", "a", " ") if ($drawing eq "line"); my $message = $jabber{client}->SXPMSend(to=>&jarlSXPM_JID($tag), type=>&jarlSXPM_Type($tag), data=>$data, datawidth=>$dataWidth, datax=>$offsetX, datay=>$offsetY); &jarlSXPM_AddMessage(&jarlSXPM_JID($tag),$message); } } sub jarlSXPMIF_ResizeBoard { my $tag = shift; $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> delete("board"); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> createRectangle(0,0,&jarlSXPM_BoardWidth($tag),&jarlSXPM_BoardHeight($tag), -outline=>undef, -fill=>$GUI{color}->{jarl}->{main}->{bg}->{light}, -tag=>[ "board" ]); $GUI{Jabber}->{SXPM}->{$tag}->{Board}->{Canvas}-> configure(-scrollregion=>[ 0,0,&jarlSXPM_BoardWidth($tag),&jarlSXPM_BoardHeight($tag)], ); } ############################################################################## # # jarlSXPMIF_CurrentSay - if $value is defined then the Entry contents # are set to $value, otherwise the contents of # the Entry are returned. # ############################################################################## sub jarlSXPMIF_CurrentSay { my ($tag,$value) = @_; $Debug->Log3("jarlSXPMIF_CurrentSay: tag($tag) value($value)"); if (defined($value)) { $Debug->Log3("jarlSXPMIF_CurrentSay: set the entry to value($value)"); $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->delete(0,"end"); $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->insert(0,$value); $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->icursor("end"); $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->xview(0); return; } $Debug->Log3("jarlSXPMIF_CurrentSay: return(".$GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->get().")"); return $GUI{Jabber}->{SXPM}->{$tag}->{Say}->{Entry}->get(); } 1;