##############################################################################
#
# Jarl - Headline Tk Interface Code
#
# Perl code to handle showing the Jarl Headline GUI and interfacing with the
# headlines.
#
##############################################################################
##############################################################################
#
# 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/
#
##############################################################################
##############################################################################
#
# jarlHeadlineIF_PopupGUI - creates the headline popup GUI.
#
##############################################################################
sub jarlHeadlineIF_PopupGUI {
$GUI{HeadlinePopup} =
$GUI{Main}->{top}->
Menu(-tearoff=>0,
-borderwidth=>2,
-relief=>"raised",
-background=>$GUI{color}->{jarl}->{menu}->{background},
-foreground=>$GUI{color}->{jarl}->{menu}->{text},
);
$GUI{HeadlinePopup}->
add("command",
-label=>"Delete Headline",
-font=>$GUI{fonts}->{normal},
-foreground=>$GUI{color}->{jarl}->{menu}->{text},
-background=>$GUI{color}->{jarl}->{menu}->{background},
-command=>sub{
return if ($GUI{Headline}->{MulColListbox}->curselection eq "");
splice(@headlines,$GUI{Headline}->{MulColListbox}->curselection,1);
$GUI{Headline}->{MulColListbox}->
delete($GUI{Headline}->{MulColListbox}->curselection);
&jarlHeadlineIF_Show();
});
$GUI{HeadlinePopup}->
add("command",
-label=>"Fetch URL",
-font=>$GUI{fonts}->{normal},
-foreground=>$GUI{color}->{jarl}->{menu}->{text},
-background=>$GUI{color}->{jarl}->{menu}->{background},
-command=>sub{
return if ($GUI{Headline}->{MulColListbox}->curselection eq "");
my $message = $headlines[$GUI{Headline}->{MulColListbox}->curselection];
&jarlFetchURL($message);
});
}
##############################################################################
#
# jarlHeadlineIF_AddMessage - adds the headline based on the .
#
##############################################################################
sub jarlHeadlineIF_AddMessage {
my ($message,$doNotStore) = @_;
$doNotStore = 0 unless defined($doNotStore);
$Debug->Log1("jarlHeadlineIF_AddMessage: message($message) doNotStore($doNotStore)");
splice(@headlines,0,0,$message) unless ($doNotStore == 1);
return unless (Exists($TabBar) &&
$TabBar->ismapped());
if (!($TabBar->ExistsTab("headline"))) {
$Debug->Log1("jarlHeadlineIF_AddMessage: New GUI");
$GUI{Headline}->{top} =
$TabBar->AddTab(-type=>"docked",
-tag=>"headline",
-text=>"Headlines");
&jarlHeadlineIF_NewGUI();
} else {
my $fromJID = $message->GetFrom("jid");
my $channel = $fromJID->GetJID();
my $rosterName = $Roster->GetValue($fromJID->GetJID("full"),"name");
$channel = $rosterName unless($rosterName eq "");
my $date;
my @xDelays = $message->GetX("jabber:x:delay");
if ($#xDelays > -1) {
$date = &Net::Jabber::GetTimeStamp("utcdelaylocal",$xDelays[0]->GetStamp());
} else {
$date = &Net::Jabber::GetTimeStamp("local",time);
}
$GUI{Headline}->{MulColListbox}->
insert({
date=>$date,
headline=>$message->GetSubject(),
channel=>$channel
}
);
}
$TabBar->HighlightTab("headline");
$GUI{Headline}->{top}->bell() unless ($doNotStore == 1);
}
##############################################################################
#
# jarlHeadlineIF_NewGUI - populates the headline GUI.
#
##############################################################################
sub jarlHeadlineIF_NewGUI {
$GUI{Headline}->{Header} =
$GUI{Headline}->{top}->
Label(-text=>"Headlines",
-anchor=>"w",
-font=>$GUI{fonts}->{header},
-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
)->pack(-side=>"top",
-fill=>"x");
$GUI{Headline}->{MulColListbox} =
$GUI{Headline}->{top}->
MulColListbox(-headerbackground=>$GUI{color}->{jarl}->{main}->{bg}->{normal},
-headerforeground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
-headerborderwidth=>1,
-marker=>1,
-markerstyle=>"diamond",
-background=>$GUI{color}->{jarl}->{main}->{bg}->{light},
-foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
-relief=>"sunken",
-borderwidth=>2,
-height=>0,
-width=>0,
-font=>$GUI{fonts}->{normal},
-selectbackground=>$GUI{color}->{jarl}->{main}->{bg}->{normal},
-selectforeground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
-scrollbarborderwidth=>1,
-scrollbarrelief=>"flat",
)->pack(-side=>"top",
-fill=>"both",
-expand=>1,
-padx=>5,
-pady=>5);
$GUI{Headline}->{MulColListbox}->
AddColumn(-header=>"Channel",
-key=>"channel",
-width=>10);
$GUI{Headline}->{MulColListbox}->
AddColumn(-header=>"Headline",
-key=>"headline",
-width=>100);
$GUI{Headline}->{MulColListbox}->
AddColumn(-header=>"Date",
-key=>"date",
-width=>10);
$GUI{Headline}->{MulColListbox}->
bind("",
sub {
return
if ($GUI{Headline}->{MulColListbox}->curselection eq "");
&jarlHeadlineIF_Show($GUI{Headline}->{MulColListbox}->curselection);
}
);
$GUI{Headline}->{MulColListbox}->
bind("",
[ sub{
my ($mcl,$y) = @_;
$mcl->selectionClear(0,"end");
$mcl->selectionSet($mcl->nearest($y));
return if ($mcl->curselection eq "");
$GUI{HeadlinePopup}->Popup(-popover=>"cursor",
-popanchor=>"nw");
},
Ev('y')
]
);
$GUI{Headline}->{Body}->{top} =
$GUI{Headline}->{top}->
Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
-relief=>"sunken",
-borderwidth=>2
)->pack(-side=>"top",
-fill=>"x",
-padx=>5,
-pady=>5);
$GUI{Headline}->{Body}->{Scrolled} =
$GUI{Headline}->{Body}->{top}->
Scrolled("Text",
-scrollbars=>"oe",
-background=>$GUI{color}->{jarl}->{main}->{bg}->{light},
-foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
-font=>$GUI{fonts}->{normal},
-height=>5,
-width=>0,
-borderwidth=>0,
-highlightthickness=>0,
-selectborderwidth=>0,
-exportselection=>1,
-takefocus=>0,
-wrap=>"word",
-state=>"disabled"
)->pack(-side=>"left",
-fill=>"both",
-expand=>1,
-padx=>0,
-pady=>0);
$GUI{Headline}->{Body}->{Scrollbar} =
$GUI{Headline}->{Body}->{Scrolled}->Subwidget("yscrollbar");
$GUI{Headline}->{Body}->{Scrollbar}->
configure(-width=>10,
-borderwidth=>1,
-relief=>"flat");
$GUI{Headline}->{Body}->{Text} =
$GUI{Headline}->{Body}->{Scrolled}->Subwidget("text");
$GUI{Headline}->{Body}->{Text}->
bind("",
sub{
$GUI{Headline}->{Body}->{Text}->
yviewScroll(-1,"units");
});
$GUI{Headline}->{Body}->{Text}->
bind("",
sub{
$GUI{Headline}->{Body}->{Text}->
yviewScroll(1,"units");
});
$GUI{HeadlineButtons}->{top} =
$GUI{Headline}->{top}->
Frame(-background=>$GUI{color}->{jarl}->{main}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{main}->{fg}->{dark},
)->pack(-side=>"top",
-fill=>"x");
$GUI{HeadlineButtons}->{Close} =
$GUI{HeadlineButtons}->{top}->
Button(-text=>"Close",
-width=>$GUI{width}->{jarl}->{config}->{profile}->{button},
-background=>$GUI{color}->{jarl}->{config}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{config}->{fg}->{dark},
-disabledforeground=>$GUI{color}->{jarl}->{config}->{fg}->{light},
-font=>$GUI{fonts}->{normal},
-command=>sub{
$TabBar->DeleteTab("headline");
delete($GUI{Headline});
}
)->pack(-side=>"right",
-padx=>$GUI{width}->{jarl}->{config}->{pad});
$GUI{HeadlineButtons}->{DeleteAll} =
$GUI{HeadlineButtons}->{top}->
Button(-text=>"Delete All",
-width=>$GUI{width}->{jarl}->{config}->{profile}->{button},
-background=>$GUI{color}->{jarl}->{config}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{config}->{fg}->{dark},
-disabledforeground=>$GUI{color}->{jarl}->{config}->{fg}->{light},
-font=>$GUI{fonts}->{normal},
-command=>sub{
splice(@headlines,0,($#headlines+1));
$GUI{Headline}->{MulColListbox}->delete(0,"end");
&jarlHeadlineIF_Show();
}
)->pack(-side=>"right",
-padx=>$GUI{width}->{jarl}->{config}->{pad});
$GUI{HeadlineButtons}->{FetchURL} =
$GUI{HeadlineButtons}->{top}->
Button(-text=>"Fetch URL",
-width=>$GUI{width}->{jarl}->{config}->{profile}->{button},
-background=>$GUI{color}->{jarl}->{config}->{bg}->{normal},
-foreground=>$GUI{color}->{jarl}->{config}->{fg}->{dark},
-disabledforeground=>$GUI{color}->{jarl}->{config}->{fg}->{light},
-font=>$GUI{fonts}->{normal},
-command=>sub{
return if ($GUI{Headline}->{MulColListbox}->curselection eq "");
my $message = $headlines[$GUI{Headline}->{MulColListbox}->curselection];
&jarlFetchURL($message);
}
)->pack(-side=>"right",
-padx=>$GUI{width}->{jarl}->{config}->{pad});
&jarlHeadlineIF_List();
}
##############################################################################
#
# jarlHeadlineIF_List - lists the headlines.
#
##############################################################################
sub jarlHeadlineIF_List {
if (exists($GUI{Headline}) &&
Exists($GUI{Headline}->{MulColListbox})) {
$GUI{Headline}->{MulColListbox}->delete(0,"end");
$GUI{Headline}->{MulColListbox}->draw(0);
}
my $index;
foreach $index (0..$#headlines) {
&jarlHeadlineIF_AddMessage($headlines[$index],1);
}
if (exists($GUI{Headline}) &&
Exists($GUI{Headline}->{MulColListbox})) {
$GUI{Headline}->{MulColListbox}->draw(1);
$GUI{Headline}->{top}->bell() if ($#headlines > -1);
}
}
##############################################################################
#
# jarlHeadlineIF_Show - shows the current headline.
#
##############################################################################
sub jarlHeadlineIF_Show {
my ($index) = @_;
$index = "" unless defined($index);
$GUI{Headline}->{Body}->{Text}->configure(-state=>"normal");
$GUI{Headline}->{Body}->{Text}->delete("1.0","end");
$GUI{Headline}->{Body}->{Text}->insert("end",$headlines[$index]->GetBody()) unless ($index eq "");
$GUI{Headline}->{Body}->{Text}->configure(-state=>"disabled");
}
##############################################################################
#
# Stuff to do when we load the headline code.
#
##############################################################################
&jarlHeadlineIF_PopupGUI();
1;