/usr/local/CPAN/Qt/XbelHandler.pm
package XbelHandler;
use strict;
use warnings;
use QtCore4;
use QtGui4;
use QtXml4;
use QtCore4::isa qw( Qt::XmlDefaultHandler );
sub treeWidget() {
return this->{treeWidget};
}
sub item() {
return this->{item};
}
sub currentText() {
return this->{currentText};
}
sub errorStr() {
return this->{errorStr};
}
sub metXbelTag() {
return this->{metXbelTag};
}
sub folderIcon() {
return this->{folderIcon};
}
sub bookmarkIcon() {
return this->{bookmarkIcon};
}
sub NEW {
my ($class, $treeWidget) = @_;
$class->SUPER::NEW();
this->{treeWidget} = $treeWidget;
this->{folderIcon} = Qt::Icon();
this->{bookmarkIcon} = Qt::Icon();
this->{item} = 0;
this->{metXbelTag} = 0;
my $style = treeWidget->style();
folderIcon->addPixmap($style->standardPixmap(Qt::Style::SP_DirClosedIcon()),
Qt::Icon::Normal(), Qt::Icon::Off());
folderIcon->addPixmap($style->standardPixmap(Qt::Style::SP_DirOpenIcon()),
Qt::Icon::Normal(), Qt::Icon::On());
bookmarkIcon->addPixmap($style->standardPixmap(Qt::Style::SP_FileIcon()));
}
sub startElement
{
my ($namespaceURI, $localName, $qName, $attributes) = @_;
if (!metXbelTag && $qName ne 'xbel') {
this->{errorStr} = Qt::Object::tr('The file is not an XBEL file.');
return 0;
}
if ($qName eq 'xbel') {
my $version = $attributes->value('version');
if ($version && $version ne '1.0') {
this->{errorStr} = Qt::Object::tr('The file is not an XBEL version 1.0 file.');
return 0;
}
this->{metXbelTag} = 1;
} elsif ($qName eq 'folder') {
this->{item} = createChildItem($qName);
item->setFlags(item->flags() | Qt::ItemIsEditable());
item->setIcon(0, folderIcon);
item->setText(0, Qt::Object::tr('Folder'));
my $folded = ($attributes->value('folded') ne 'no');
treeWidget->setItemExpanded(item, !$folded);
} elsif ($qName eq 'bookmark') {
this->{item} = createChildItem($qName);
item->setFlags(item->flags() | Qt::ItemIsEditable());
item->setIcon(0, bookmarkIcon);
item->setText(0, Qt::Object::tr('Unknown title'));
item->setText(1, $attributes->value('href'));
} elsif ($qName eq 'separator') {
this->{item} = createChildItem($qName);
item->setFlags(item->flags() & ~Qt::ItemIsSelectable());
item->setText(0, chr(0xB7) x 30);
}
this->{currentText} = '';
return 1;
}
sub endElement
{
my ($namespaceURI, $localName, $qName) = @_;
if ($qName eq 'title') {
if (item) {
item->setText(0, currentText);
}
} elsif ($qName eq 'folder' || $qName eq 'bookmark'
|| $qName eq 'separator') {
this->{item} = item->parent();
}
return 1;
}
sub characters
{
my ($str) = @_;
this->{currentText} .= $str;
return 1;
}
sub fatalError
{
my ($exception) = @_;
Qt::MessageBox::information(treeWidget->window(), Qt::Object::tr('SAX Bookmarks'),
sprintf Qt::Object::tr("Parse error at line %d, column %d:\n%s"),
$exception->lineNumber(),
$exception->columnNumber(),
$exception->message());
return 0;
}
sub errorString
{
return errorStr;
}
sub createChildItem
{
my ($tagName) = @_;
my $childItem;
if (item) {
$childItem = Qt::TreeWidgetItem(item);
} else {
$childItem = Qt::TreeWidgetItem(treeWidget);
}
$childItem->setData(0, Qt::UserRole(), Qt::Variant($tagName));
return $childItem;
}
1;