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.
355 lines
11 KiB
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 * parent )
|
|
: MainWidget_base( parent ), 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':" ).arg( 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?" ).arg( 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"
|