00001
00002 #include "kbookmarkdialog.h"
00003 #include "kbookmarkmanager.h"
00004 #include "kbookmarkmenu.h"
00005 #include "kbookmarkmenu_p.h"
00006 #include <QGridLayout>
00007 #include <QLabel>
00008 #include <QTreeWidget>
00009 #include <QHeaderView>
00010 #include <klineedit.h>
00011 #include <klocale.h>
00012 #include <kiconloader.h>
00013 #include <kinputdialog.h>
00014 #include <kstandardguiitem.h>
00015
00016
00017 KBookmark KBookmarkDialog::editBookmark(const KBookmark & bm)
00018 {
00019 if(!m_layout)
00020 initLayoutPrivate();
00021 setButtons( Ok | Cancel );
00022 setButtonGuiItem( KDialog::Ok, KGuiItem(i18nc("@action:button", "Update" )) );
00023 setCaption( i18nc("@title:window","Bookmark Properties") );
00024 m_url->setVisible(!bm.isGroup());
00025 m_urlLabel->setVisible(!bm.isGroup());
00026 m_bm = bm;
00027 m_title->setText(bm.fullText());
00028 m_url->setText(bm.url().url());
00029 m_folderTree->setVisible(false);
00030
00031 m_mode = EditBookmark;
00032 aboutToShow(m_mode);
00033
00034 if(exec() == QDialog::Accepted)
00035 return m_bm;
00036 else
00037 return KBookmark();
00038
00039 }
00040
00041 KBookmark KBookmarkDialog::addBookmark(const QString & title, const KUrl & url, KBookmark parent)
00042 {
00043 if(!m_layout)
00044 initLayoutPrivate();
00045 if(parent.isNull())
00046 parent = m_mgr->root();
00047 setButtons( User1 | Ok | Cancel );
00048 setButtonGuiItem( KDialog::Ok, KGuiItem( i18nc("@action:button", "Add" ), "bookmark-new") );
00049 setCaption( i18nc("@title:window","Add Bookmark") );
00050 setButtonGuiItem( User1, KGuiItem( i18nc("@action:button", "&New Folder..." ), "folder-new") );
00051 m_url->setVisible(true);
00052 m_urlLabel->setVisible(true);
00053 m_title->setText(title);
00054 m_url->setText(url.url());
00055 setParentBookmark(parent);
00056 m_folderTree->setVisible(true);
00057
00058 m_mode = NewBookmark;
00059 aboutToShow(m_mode);
00060
00061 if(exec() == QDialog::Accepted)
00062 return m_bm;
00063 else
00064 return KBookmark();
00065 }
00066
00067 KBookmarkGroup KBookmarkDialog::addBookmarks(const QList<QPair<QString, QString> > & list, const QString & name, KBookmarkGroup parent)
00068 {
00069 if(!m_layout)
00070 initLayoutPrivate();
00071 if(parent.isNull())
00072 parent = m_mgr->root();
00073
00074 m_list = list;
00075
00076 setButtons( User1 | Ok | Cancel);
00077 setButtonGuiItem( KDialog::Ok, KGuiItem( i18nc("@action:button", "Add" ), "bookmark-new") );
00078 setCaption( i18nc("@title:window","Add Bookmarks") );
00079 setButtonGuiItem( User1, KGuiItem( i18nc("@action:button", "&New Folder..." ), "folder-new") );
00080 m_url->setVisible(false);
00081 m_urlLabel->setVisible(false);
00082 m_title->setText(name);
00083 setParentBookmark(parent);
00084 m_folderTree->setVisible(true);
00085
00086 m_mode = NewMultipleBookmarks;
00087 aboutToShow(m_mode);
00088
00089 if(exec() == QDialog::Accepted)
00090 return m_bm.toGroup();
00091 else
00092 return KBookmarkGroup();
00093 }
00094
00095 KBookmarkGroup KBookmarkDialog::selectFolder(KBookmark parent)
00096 {
00097 if(!m_layout)
00098 initLayoutPrivate();
00099 if(parent.isNull())
00100 parent = m_mgr->root();
00101 setButtons( User1 | Ok | Cancel );
00102 setButtonGuiItem( KDialog::Ok, KStandardGuiItem::ok() );
00103 setButtonGuiItem( User1, KGuiItem( i18nc("@action:button", "&New Folder..." ), "folder-new") );
00104 setCaption( i18nc("@title:window","Select Folder"));
00105 m_url->setVisible(false);
00106 m_urlLabel->setVisible(false);
00107 m_title->setVisible(false);
00108 m_titleLabel->setVisible(false);
00109 setParentBookmark(parent);
00110 m_folderTree->setVisible(true);
00111
00112 m_mode = SelectFolder;
00113 aboutToShow(m_mode);
00114
00115 if(exec() == QDialog::Accepted)
00116 return m_bm.toGroup();
00117 else
00118 return KBookmarkGroup();
00119 }
00120
00121 KBookmarkGroup KBookmarkDialog::createNewFolder(const QString & name, KBookmark parent)
00122 {
00123 if(!m_layout)
00124 initLayoutPrivate();
00125 if(parent.isNull())
00126 parent = m_mgr->root();
00127 setButtons( Ok | Cancel );
00128 setButtonGuiItem( KDialog::Ok, KStandardGuiItem::ok() );
00129 setCaption( i18nc("@title:window","New Folder"));
00130 m_url->setVisible(false);
00131 m_urlLabel->setVisible(false);
00132 m_title->setText(name);
00133 setParentBookmark(parent);
00134 m_folderTree->setVisible(true);
00135
00136 m_mode = NewFolder;
00137 aboutToShow(m_mode);
00138
00139 if(exec() == QDialog::Accepted)
00140 return m_bm.toGroup();
00141 else
00142 return KBookmarkGroup();
00143 }
00144
00145 void KBookmarkDialog::setParentBookmark(const KBookmark & bm)
00146 {
00147 QString address = bm.address();
00148 KBookmarkTreeItem * item = static_cast<KBookmarkTreeItem *>(m_folderTree->topLevelItem(0));
00149 while(true)
00150 {
00151 if(item->address() == bm.address())
00152 {
00153 m_folderTree->setCurrentItem(item);
00154 return;
00155 }
00156 for(int i=0; i<item->childCount(); ++i)
00157 {
00158 KBookmarkTreeItem * child = static_cast<KBookmarkTreeItem *>(item->child(i));
00159 if( KBookmark::commonParent(child->address(), address) == child->address())
00160 {
00161 item = child;
00162 break;
00163 }
00164 }
00165 }
00166 }
00167
00168 KBookmarkGroup KBookmarkDialog::parentBookmark()
00169 {
00170 KBookmarkTreeItem *item = dynamic_cast<KBookmarkTreeItem *>(m_folderTree->currentItem());
00171 if(!item)
00172 return m_mgr->root();
00173 const QString &address = item->address();
00174 return m_mgr->findByAddress(address).toGroup();
00175 }
00176
00177 void KBookmarkDialog::slotButtonClicked(int button)
00178 {
00179 if(button == Ok)
00180 {
00181 if(m_mode == NewFolder)
00182 {
00183 KBookmarkGroup parent = parentBookmark();
00184 if(m_title->text().isEmpty())
00185 m_title->setText("New Folder");
00186 m_bm = parent.createNewFolder(m_title->text());
00187 save(m_mode, m_bm);
00188 m_mgr->emitChanged(parent);
00189 } else if(m_mode == NewBookmark) {
00190 KBookmarkGroup parent = parentBookmark();
00191 if(m_title->text().isEmpty())
00192 m_title->setText("New Bookmark");
00193 m_bm = parent.addBookmark(m_title->text(), KUrl(m_url->text()));
00194 save(m_mode, m_bm);
00195 m_mgr->emitChanged(parent);
00196 } else if(m_mode == NewMultipleBookmarks) {
00197 KBookmarkGroup parent = parentBookmark();
00198 if(m_title->text().isEmpty())
00199 m_title->setText("New Folder");
00200 m_bm = parent.createNewFolder(m_title->text());
00201 QList< QPair<QString, QString> >::iterator it, end;
00202 end = m_list.end();
00203 for(it = m_list.begin(); it!= m_list.end(); ++it)
00204 {
00205 m_bm.toGroup().addBookmark( (*it).first, KUrl((*it).second));
00206 }
00207 save(m_mode, m_bm);
00208 m_mgr->emitChanged(parent);
00209 } else if(m_mode == EditBookmark) {
00210 m_bm.setFullText(m_title->text());
00211 m_bm.setUrl(KUrl(m_url->text()));
00212 save(m_mode, m_bm);
00213 m_mgr->emitChanged(m_bm.parentGroup());
00214 } else if(m_mode == SelectFolder) {
00215 m_bm = parentBookmark();
00216 save(m_mode, m_bm);
00217 }
00218 }
00219 KDialog::slotButtonClicked(button);
00220 }
00221
00222 void KBookmarkDialog::save(BookmarkDialogMode , const KBookmark & )
00223 {
00224
00225 }
00226
00227 void KBookmarkDialog::aboutToShow(BookmarkDialogMode mode)
00228 {
00229 Q_UNUSED(mode);
00230 }
00231
00232 void KBookmarkDialog::initLayout()
00233 {
00234 QBoxLayout *vbox = new QVBoxLayout( m_main );
00235 QGridLayout * grid = new QGridLayout();
00236 vbox->addLayout(grid);
00237
00238 grid->addWidget( m_title, 0, 1 );
00239 grid->addWidget( m_titleLabel, 0, 0 );
00240
00241 grid->addWidget( m_url, 1, 1 );
00242 grid->addWidget( m_urlLabel, 1, 0 );
00243
00244 vbox->addWidget(m_folderTree);
00245 }
00246
00247
00248 void KBookmarkDialog::initLayoutPrivate()
00249 {
00250 m_main = new QWidget( this );
00251 setMainWidget( m_main );
00252 connect( this, SIGNAL( user1Clicked() ), SLOT( newFolderButton() ) );
00253
00254 m_title = new KLineEdit( m_main );
00255 m_titleLabel = new QLabel( i18nc("@label:textbox", "Name:" ), m_main );
00256 m_titleLabel->setBuddy( m_title );
00257
00258 m_url = new KLineEdit( m_main );
00259 m_urlLabel = new QLabel( i18nc("@label:textbox", "Location:" ), m_main );
00260 m_urlLabel->setBuddy( m_url );
00261
00262 m_folderTree = new QTreeWidget(m_main);
00263 m_folderTree->setColumnCount(1);
00264 m_folderTree->header()->hide();
00265 m_folderTree->setSortingEnabled(false);
00266 m_folderTree->setSelectionMode( QTreeWidget::SingleSelection );
00267 m_folderTree->setSelectionBehavior( QTreeWidget::SelectRows );
00268 m_folderTree->setMinimumSize( 60, 100 );
00269 QTreeWidgetItem *root = new KBookmarkTreeItem(m_folderTree);
00270 fillGroup( root, m_mgr->root() );
00271
00272
00273 initLayout();
00274 m_layout = true;
00275 }
00276
00277
00278 KBookmarkDialog::KBookmarkDialog(KBookmarkManager * mgr, QWidget * parent )
00279 : KDialog(parent),
00280 m_folderTree(0), m_mgr(mgr), m_layout(false)
00281 {
00282
00283 }
00284
00285 void KBookmarkDialog::newFolderButton()
00286 {
00287
00288 QString caption = parentBookmark().fullText().isEmpty() ?
00289 i18nc("@title:window","Create New Bookmark Folder" ) :
00290 i18nc("@title:window","Create New Bookmark Folder in %1" ,
00291 parentBookmark().text() );
00292 bool ok;
00293 QString text = KInputDialog::getText( caption, i18nc("@label:textbox", "New folder:" ), QString(), &ok );
00294 if ( !ok )
00295 return;
00296
00297 KBookmarkGroup group = parentBookmark().createNewFolder(text);
00298 if ( !group.isNull() )
00299 {
00300 KBookmarkGroup parentGroup = group.parentGroup();
00301 m_mgr->emitChanged( parentGroup );
00302 m_folderTree->clear();
00303 QTreeWidgetItem *root = new KBookmarkTreeItem(m_folderTree);
00304 fillGroup( root, m_mgr->root() );
00305 }
00306 }
00307
00308 void KBookmarkDialog::fillGroup( QTreeWidgetItem * parentItem, const KBookmarkGroup &group)
00309 {
00310 for ( KBookmark bk = group.first() ; !bk.isNull() ; bk = group.next(bk) )
00311 {
00312 if ( bk.isGroup() )
00313 {
00314 QTreeWidgetItem* item = new KBookmarkTreeItem(parentItem, m_folderTree, bk.toGroup() );
00315 fillGroup( item, bk.toGroup() );
00316 }
00317 }
00318 }
00319
00320
00321
00322 KBookmarkTreeItem::KBookmarkTreeItem(QTreeWidget * tree)
00323 : QTreeWidgetItem(tree), m_address("")
00324 {
00325 setText(0, i18n("Bookmarks"));
00326 setIcon(0, SmallIcon("bookmarks"));
00327 tree->expandItem(this);
00328 tree->setCurrentItem( this );
00329 tree->setItemSelected( this, true );
00330 }
00331
00332 KBookmarkTreeItem::KBookmarkTreeItem(QTreeWidgetItem * parent, QTreeWidget * tree, const KBookmarkGroup &bk)
00333 : QTreeWidgetItem(parent)
00334 {
00335 setIcon(0, SmallIcon(bk.icon()));
00336 setText(0, bk.fullText() );
00337 tree->expandItem(this);
00338 m_address = bk.address();
00339 }
00340
00341 KBookmarkTreeItem::~KBookmarkTreeItem()
00342 {
00343 }
00344
00345 QString KBookmarkTreeItem::address()
00346 {
00347 return m_address;
00348 }