You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeaddons/konq-plugins/sidebar/delicious/mainWidget.cpp

355 lines
11 KiB

// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
//////////////////////////////////////////////////////////////////////////
// mainWidget.cpp //
// //
// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
// //
// 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., 51 Franklin Street, Fifth Floor, Boston, MA //
// 02110-1301, USA. //
//////////////////////////////////////////////////////////////////////////
#include "mainWidget.h"
#include "tagListItem.h"
#include "bookmarkListItem.h"
#include <tqlistview.h>
#include <tqdom.h>
#include <tqpopupmenu.h>
#include <tqpushbutton.h>
#include <tqtimer.h>
#include <tqdatetime.h>
#include <kdebug.h>
#include <kio/job.h>
#include <krfcdate.h>
#include <klistview.h>
#include <klocale.h>
#include <kglobal.h>
#include <kiconloader.h>
#include <kmessagebox.h>
#include <kconfig.h>
#include <kinputdialog.h>
MainWidget::MainWidget( KConfig * config, TQWidget * tqparent )
: MainWidget_base( tqparent ), m_config( config )
{
loadTags();
KIconLoader * il = KGlobal::iconLoader();
btnRefreshTags->setIconSet( il->loadIconSet( "reload", KIcon::Small ) );
btnRefreshBookmarks->setIconSet( il->loadIconSet( "reload", KIcon::Small ) );
btnNew->setIconSet( il->loadIconSet( "bookmark_add", KIcon::Small ) );
connect( ( TQWidget * ) btnRefreshTags, TQT_SIGNAL( clicked() ),
this, TQT_SLOT( slotGetTags() ) );
connect( ( TQWidget * ) btnRefreshBookmarks, TQT_SIGNAL( clicked() ),
this, TQT_SLOT( slotGetBookmarks() ) );
connect( ( TQWidget * ) btnNew, TQT_SIGNAL( clicked() ),
this, TQT_SLOT( slotNewBookmark() ) );
connect( lvBookmarks, TQT_SIGNAL( executed( TQListViewItem * ) ),
this, TQT_SLOT( slotBookmarkExecuted( TQListViewItem * ) ) );
connect( lvBookmarks, TQT_SIGNAL( mouseButtonClicked ( int, TQListViewItem *, const TQPoint &, int ) ),
this, TQT_SLOT( slotBookmarkClicked( int, TQListViewItem *, const TQPoint &, int ) ) );
connect( lvTags, TQT_SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint &, int ) ),
this, TQT_SLOT( slotTagsContextMenu( TQListViewItem *, const TQPoint &, int ) ) );
connect( lvBookmarks, TQT_SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint &, int ) ),
this, TQT_SLOT( slotBookmarksContextMenu( TQListViewItem *, const TQPoint &, int ) ) );
m_updateTimer = new TQTimer( this );
connect( m_updateTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotGetBookmarks() ) );
slotGetTags();
}
MainWidget::~MainWidget()
{
saveTags();
}
void MainWidget::setCurrentURL( const KURL & url )
{
m_currentURL = url;
}
void MainWidget::slotGetTags()
{
kdDebug() << k_funcinfo << endl;
KIO::StoredTransferJob * job = KIO::storedGet( "http://del.icio.us/api/tags/get" );
connect( job, TQT_SIGNAL( result( KIO::Job * ) ),
this, TQT_SLOT( slotFillTags( KIO::Job * ) ) );
}
void MainWidget::slotFillTags( KIO::Job * job )
{
kdDebug() << k_funcinfo << endl;
if ( job->error() )
{
job->showErrorDialog( this );
return;
}
lvTags->clear();
m_tags.clear();
// fill lvTags with job->data()
TQDomDocument doc;
doc.setContent( static_cast<KIO::StoredTransferJob *>( job )->data() );
TQDomNodeList tags = doc.elementsByTagName( "tag" );
for ( uint i = 0; i < tags.length(); ++i )
{
TQDomElement tag = tags.item( i ).toElement();
if ( !tag.isNull() )
{
TagListItem *item = new TagListItem( lvTags, tag.attribute( "tag" ), tag.attribute( "count" ).toInt() );
m_tags.append( tag.attribute( "tag" ) );
connect( item, TQT_SIGNAL( signalItemChecked( TagListItem * ) ), TQT_SLOT( itemToggled() ) );
}
}
}
void MainWidget::slotGetBookmarks()
{
KURL url( "http://del.icio.us/api/posts/recent" );
url.setQuery( "tag=" + checkedTags().join( " " ) );
kdDebug() << k_funcinfo << url.url() << endl;
KIO::StoredTransferJob * job = KIO::storedGet( url );
connect( job, TQT_SIGNAL( result( KIO::Job * ) ),
this, TQT_SLOT( slotFillBookmarks( KIO::Job * ) ) );
}
void MainWidget::slotFillBookmarks( KIO::Job * job )
{
kdDebug() << k_funcinfo << endl;
if ( job->error() )
{
job->showErrorDialog( this );
return;
}
lvBookmarks->clear();
// fill lvBookmarks with job->data()
TQDomDocument doc;
doc.setContent( static_cast<KIO::StoredTransferJob *>( job )->data() );
TQDomNodeList posts = doc.elementsByTagName( "post" );
for ( uint i = 0; i < posts.length(); ++i )
{
TQDomElement post = posts.item( i ).toElement();
if ( !post.isNull() )
{
new BookmarkListItem( lvBookmarks, post.attribute( "href" ), post.attribute( "description" ),
KRFCDate::parseDateISO8601( post.attribute( "time" ) ) );
}
}
}
TQStringList MainWidget::checkedTags() const
{
TQListViewItemIterator it( lvTags, TQListViewItemIterator::Visible | TQListViewItemIterator::Checked );
TQStringList tmp;
while ( it.current() )
{
tmp.append( it.current()->text( 0 ) );
++it;
}
return tmp;
}
void MainWidget::slotBookmarkExecuted( TQListViewItem * item )
{
BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( item );
if ( bookmark )
{
kdDebug() << k_funcinfo << "Clicked bookmark URL: " << bookmark->url() << endl;
emit signalURLClicked( bookmark->url() );
}
}
void MainWidget::slotBookmarkClicked( int button, TQListViewItem * item, const TQPoint &, int )
{
BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( item );
if ( bookmark && button == Qt::MidButton ) // handle middle click
{
kdDebug() << k_funcinfo << "Middle clicked bookmark URL: " << bookmark->url() << endl;
emit signalURLMidClicked( bookmark->url() );
}
}
TQStringList MainWidget::tags() const
{
return m_tags;
}
TQStringList MainWidget::bookmarks() const
{
TQListViewItemIterator it( lvBookmarks );
TQStringList tmp;
while ( it.current() )
{
tmp.append( static_cast<BookmarkListItem *>( it.current() )->url().url() );
++it;
}
return tmp;
}
void MainWidget::slotTagsContextMenu( TQListViewItem *, const TQPoint & pos, int )
{
if ( lvTags->childCount() == 0 )
return;
TQPopupMenu * tagMenu = new TQPopupMenu( this );
Q_CHECK_PTR( tagMenu );
tagMenu->insertItem( i18n( "Check All" ), this, TQT_SLOT( slotCheckAllTags() ) );
tagMenu->insertItem( i18n( "Uncheck All" ), this, TQT_SLOT( slotUncheckAllTags() ) );
tagMenu->insertItem( i18n( "Toggle All" ), this, TQT_SLOT( slotToggleTags() ) );
tagMenu->insertSeparator();
tagMenu->insertItem( KGlobal::iconLoader()->loadIconSet( "edit", KIcon::Small ),
i18n( "Rename Tag..." ), this, TQT_SLOT( slotRenameTag() ) );
tagMenu->exec( pos );
}
void MainWidget::slotCheckAllTags()
{
TQListViewItemIterator it( lvTags );
while ( it.current() )
{
TQCheckListItem * item = static_cast<TQCheckListItem *>( *it );
if ( item )
item->setOn( true );
++it;
}
}
void MainWidget::slotUncheckAllTags()
{
TQListViewItemIterator it( lvTags );
while ( it.current() )
{
TQCheckListItem * item = static_cast<TQCheckListItem *>( *it );
if ( item )
item->setOn( false );
++it;
}
}
void MainWidget::slotToggleTags()
{
TQListViewItemIterator it( lvTags );
while ( it.current() )
{
TQCheckListItem * item = static_cast<TQCheckListItem *>( *it );
if ( item )
item->setOn( !item->isOn() );
++it;
}
}
void MainWidget::itemToggled()
{
m_updateTimer->start( 2000, true );
}
void MainWidget::slotNewBookmark()
{
emit signalURLClicked( "http://del.icio.us/post/?url=" + m_currentURL.url() );
}
void MainWidget::saveTags()
{
m_config->writeEntry( "Tags", m_tags );
}
void MainWidget::loadTags()
{
m_tags = m_config->readListEntry( "Tags" );
}
void MainWidget::slotRenameTag()
{
TagListItem * tag = static_cast<TagListItem *>( lvTags->currentItem() );
if ( tag )
{
TQString oldName = tag->name();
TQString newName = KInputDialog::getText( i18n( "Rename Tag" ), i18n( "Provide a new name for tag '%1':" ).tqarg( oldName ) );
if ( !newName.isEmpty() )
{
KURL url( "http://del.icio.us/api/tags/rename" );
url.addQueryItem( "old", oldName );
url.addQueryItem( "new", newName );
KIO::get( url ); // rename the tag
tag->setName( newName );
}
}
}
void MainWidget::slotBookmarksContextMenu( TQListViewItem *, const TQPoint & pos, int )
{
if ( lvBookmarks->childCount() == 0 )
return;
TQPopupMenu * menu = new TQPopupMenu( this );
Q_CHECK_PTR( menu );
menu->insertItem( KGlobal::iconLoader()->loadIconSet( "editdelete", KIcon::Small ),
i18n( "Delete Bookmark" ), this, TQT_SLOT( slotDeleteBookmark() ) );
menu->exec( pos );
}
void MainWidget::slotDeleteBookmark()
{
BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( lvBookmarks->currentItem() );
if ( bookmark )
{
int result = KMessageBox::warningContinueCancel( this, i18n( "Do you really want to remove the bookmark\n%1?" ).tqarg( bookmark->desc() ),
i18n( "Delete Bookmark" ), KStdGuiItem::del() );
if ( result == KMessageBox::Continue )
{
KURL url( "http://del.icio.us/api/posts/delete" );
url.addQueryItem( "url", bookmark->url().url() );
kdDebug() << k_funcinfo << url << endl;
KIO::get( url );
delete bookmark;
slotGetTags(); // re-read the tags
}
}
}
#include "mainWidget.moc"