]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Patch by Luca Gugelmann: get rid of any mainwindow dependency from the sidebars.
[dolphin.git] / src / dolphinmainwindow.cpp
index 2cf524bbd7f124c9558474387c1361ac3b95006b..775ef9864f75a3fd6396eb5fe06a4260cf6c1461 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *\r
  ***************************************************************************/\r
 \r
+#include <config-kmetadata.h>\r
 #include "dolphinmainwindow.h"\r
 \r
-#include <assert.h>\r
-\r
+#include "bookmarkssidebarpage.h"\r
 #include "dolphinapplication.h"\r
 #include "dolphinnewmenu.h"\r
 #include "dolphinsettings.h"\r
 #include "dolphinsettingsdialog.h"\r
 #include "dolphinstatusbar.h"\r
-#include "dolphinapplication.h"\r
-#include "urlnavigator.h"\r
-#include "dolphinsettings.h"\r
-#include "bookmarkssidebarpage.h"\r
 #include "infosidebarpage.h"\r
-#include "dolphin_generalsettings.h"\r
+#include "metadatawidget.h"\r
+#include "mainwindowadaptor.h"\r
+#include "treeviewsidebarpage.h"\r
+#include "urlnavigator.h"\r
 #include "viewpropertiesdialog.h"\r
 #include "viewproperties.h"\r
-#include "mainwindowadaptor.h"\r
+\r
+#include "dolphin_generalsettings.h"\r
 \r
 #include <kaction.h>\r
 #include <kactioncollection.h>\r
@@ -56,6 +56,7 @@
 #include <kmenu.h>\r
 #include <kmessagebox.h>\r
 #include <konqmimedata.h>\r
+#include <konq_operations.h>\r
 #include <kpropertiesdialog.h>\r
 #include <kprotocolinfo.h>\r
 #include <ktoggleaction.h>\r
@@ -104,7 +105,7 @@ DolphinMainWindow::~DolphinMainWindow()
 \r
 void DolphinMainWindow::setActiveView(DolphinView* view)\r
 {\r
-    assert((view == m_view[PrimaryIdx]) || (view == m_view[SecondaryIdx]));\r
+    Q_ASSERT((view == m_view[PrimaryIdx]) || (view == m_view[SecondaryIdx]));\r
     if (m_activeView == view) {\r
         return;\r
     }\r
@@ -152,21 +153,21 @@ void DolphinMainWindow::dropUrls(const KUrl::List& urls,
 \r
         QString seq = QKeySequence(Qt::ShiftModifier).toString();\r
         seq.chop(1); // chop superfluous '+'\r
-        QAction* moveAction = popup.addAction(KIcon("goto"),\r
-                                              i18n("&Move Here") + "\t" + seq);\r
+        QAction* moveAction = popup.addAction(KIcon("goto-page"),\r
+                                              i18n("&Move Here") + '\t' + seq);\r
 \r
         seq = QKeySequence(Qt::ControlModifier).toString();\r
         seq.chop(1);\r
-        QAction* copyAction = popup.addAction(KIcon("editcopy"),\r
-                                              i18n("&Copy Here") + "\t" + seq);\r
+        QAction* copyAction = popup.addAction(KIcon("edit-copy"),\r
+                                              i18n("&Copy Here") + '\t' + seq);\r
 \r
         seq = QKeySequence(Qt::ControlModifier + Qt::ShiftModifier).toString();\r
         seq.chop(1);\r
         QAction* linkAction = popup.addAction(KIcon("www"),\r
-                                              i18n("&Link Here") + "\t" + seq);\r
+                                              i18n("&Link Here") + '\t' + seq);\r
 \r
         popup.addSeparator();\r
-        popup.addAction(KIcon("stop"), i18n("Cancel"));\r
+        popup.addAction(KIcon("process-stop"), i18n("Cancel"));\r
 \r
         QAction* activatedAction = popup.exec(QCursor::pos());\r
         if (activatedAction == moveAction) {\r
@@ -201,6 +202,13 @@ void DolphinMainWindow::dropUrls(const KUrl::List& urls,
     }\r
 }\r
 \r
+void DolphinMainWindow::rename(const KUrl& oldUrl, const KUrl& newUrl)\r
+{\r
+    clearStatusBar();\r
+    KonqOperations::rename(this, oldUrl, newUrl);\r
+    m_undoCommandTypes.append(KonqUndoManager::RENAME);\r
+}\r
+\r
 void DolphinMainWindow::refreshViews()\r
 {\r
     const bool split = DolphinSettings::instance().generalSettings()->splitView();\r
@@ -230,24 +238,41 @@ void DolphinMainWindow::refreshViews()
     }\r
 \r
     m_activeView = isPrimaryViewActive ? m_view[PrimaryIdx] : m_view[SecondaryIdx];\r
-    assert(m_activeView != 0);\r
+    Q_ASSERT(m_activeView != 0);\r
 \r
     updateViewActions();\r
     emit activeViewChanged();\r
 }\r
 \r
-void DolphinMainWindow::changeUrl(const QString& url)\r
+void DolphinMainWindow::changeUrl(const KUrl& url)\r
 {\r
     if (activeView() != 0) {\r
-        activeView()->setUrl(KUrl(url));\r
+        activeView()->setUrl(url);\r
+        updateEditActions();\r
+        updateViewActions();\r
+        updateGoActions();\r
+        setCaption(url.fileName());\r
+        emit urlChanged(url);\r
     }\r
 }\r
 \r
+void DolphinMainWindow::changeSelection(const KFileItemList& selection)\r
+{\r
+    activeView()->changeSelection(selection);\r
+}\r
+\r
 void DolphinMainWindow::slotViewModeChanged()\r
 {\r
     updateViewActions();\r
 }\r
 \r
+void DolphinMainWindow::slotShowPreviewChanged()\r
+{\r
+    // It is not enough to update the 'Show Preview' action, also\r
+    // the 'Zoom In' and 'Zoom Out' actions must be adapted.\r
+    updateViewActions();\r
+}\r
+\r
 void DolphinMainWindow::slotShowHiddenFilesChanged()\r
 {\r
     KToggleAction* showHiddenFilesAction =\r
@@ -294,11 +319,40 @@ void DolphinMainWindow::slotSortOrderChanged(Qt::SortOrder order)
     descending->setChecked(sortDescending);\r
 }\r
 \r
-void DolphinMainWindow::slotSelectionChanged()\r
+void DolphinMainWindow::slotAdditionalInfoChanged(KFileItemDelegate::AdditionalInformation info)\r
+{\r
+    QAction* action = 0;\r
+    switch (info) {\r
+        case KFileItemDelegate::FriendlyMimeType:\r
+            action = actionCollection()->action("show_mime_info");\r
+            break;\r
+        case KFileItemDelegate::Size:\r
+            action = actionCollection()->action("show_size_info");\r
+            break;\r
+        case KFileItemDelegate::ModificationTime:\r
+            action = actionCollection()->action("show_date_info");\r
+            break;\r
+        case KFileItemDelegate::NoInformation:\r
+        default:\r
+            action = actionCollection()->action("clear_info");\r
+            break;\r
+    }\r
+\r
+    if (action != 0) {\r
+        KToggleAction* toggleAction = static_cast<KToggleAction*>(action);\r
+        toggleAction->setChecked(true);\r
+\r
+        QActionGroup* group = toggleAction->actionGroup();\r
+        Q_ASSERT(group != 0);\r
+        group->setEnabled(m_activeView->mode() == DolphinView::IconsView);\r
+    }\r
+}\r
+\r
+void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection)\r
 {\r
     updateEditActions();\r
 \r
-    assert(m_view[PrimaryIdx] != 0);\r
+    Q_ASSERT(m_view[PrimaryIdx] != 0);\r
     int selectedUrlsCount = m_view[PrimaryIdx]->selectedUrls().count();\r
     if (m_view[SecondaryIdx] != 0) {\r
         selectedUrlsCount += m_view[SecondaryIdx]->selectedUrls().count();\r
@@ -309,7 +363,7 @@ void DolphinMainWindow::slotSelectionChanged()
 \r
     m_activeView->updateStatusBar();\r
 \r
-    emit selectionChanged();\r
+    emit selectionChanged(selection);\r
 }\r
 \r
 void DolphinMainWindow::slotHistoryChanged()\r
@@ -317,13 +371,6 @@ void DolphinMainWindow::slotHistoryChanged()
     updateHistory();\r
 }\r
 \r
-void DolphinMainWindow::slotUrlChanged(const KUrl& url)\r
-{\r
-    updateEditActions();\r
-    updateGoActions();\r
-    setCaption(url.fileName());\r
-}\r
-\r
 void DolphinMainWindow::updateFilterBarAction(bool show)\r
 {\r
     KToggleAction* showFilterBarAction =\r
@@ -405,30 +452,42 @@ void DolphinMainWindow::moveToTrash()
     clearStatusBar();\r
     const KUrl::List selectedUrls = m_activeView->selectedUrls();\r
     KonqOperations::del(this, KonqOperations::TRASH, selectedUrls);\r
-    m_undoOperations.append(KonqOperations::TRASH);\r
+    m_undoCommandTypes.append(KonqUndoManager::TRASH);\r
 }\r
 \r
 void DolphinMainWindow::deleteItems()\r
 {\r
     clearStatusBar();\r
 \r
+    // TODO: if KonqOperations::askDeleteConfirmation() would indicate when\r
+    // the operation has been finished, this method should be used.\r
+\r
     KUrl::List list = m_activeView->selectedUrls();\r
     const uint itemCount = list.count();\r
-    assert(itemCount >= 1);\r
+    Q_ASSERT(itemCount >= 1);\r
 \r
     QString text;\r
     if (itemCount > 1) {\r
-        text = i18n("Do you really want to delete the %1 selected items?",itemCount);\r
+        text = i18n("Do you really want to delete the %1 selected items?", itemCount);\r
     }\r
     else {\r
         const KUrl& url = list.first();\r
-        text = i18n("Do you really want to delete '%1'?",url.fileName());\r
+        QString itemName;\r
+        if (url.protocol() == "trash" ) {\r
+            itemName = url.path();\r
+            // TODO: check comment in konq_undo.cc in the method askDeleteConfirmation()\r
+            itemName.remove(QRegExp("^/[0-9]*-"));\r
+        }\r
+        else {\r
+           itemName = url.pathOrUrl();\r
+        }\r
+        text = i18n("Do you really want to delete '%1'?", itemName);\r
     }\r
 \r
     const bool del = KMessageBox::warningContinueCancel(this,\r
                                                         text,\r
-                                                        QString::null,\r
-                                                        KGuiItem(i18n("Delete"), KIcon("editdelete"))\r
+                                                        QString(),\r
+                                                        KGuiItem(i18n("Delete"), KIcon("edit-delete"))\r
                                                        ) == KMessageBox::Continue;\r
     if (del) {\r
         KIO::Job* job = KIO::del(list);\r
@@ -475,26 +534,36 @@ void DolphinMainWindow::slotUndoAvailable(bool available)
         undoAction->setEnabled(available);\r
     }\r
 \r
-    if (available && (m_undoOperations.count() > 0)) {\r
-        const KonqOperations::Operation op = m_undoOperations.takeFirst();\r
+    if (available && (m_undoCommandTypes.count() > 0)) {\r
+        const KonqUndoManager::CommandType command = m_undoCommandTypes.takeFirst();\r
         DolphinStatusBar* statusBar = m_activeView->statusBar();\r
-        switch (op) {\r
-            case KonqOperations::COPY:\r
+        switch (command) {\r
+            case KonqUndoManager::COPY:\r
                 statusBar->setMessage(i18n("Copy operation completed."),\r
                                       DolphinStatusBar::OperationCompleted);\r
                 break;\r
-            case KonqOperations::MOVE:\r
+            case KonqUndoManager::MOVE:\r
                 statusBar->setMessage(i18n("Move operation completed."),\r
                                       DolphinStatusBar::OperationCompleted);\r
                 break;\r
-            case KonqOperations::LINK:\r
+            case KonqUndoManager::LINK:\r
                 statusBar->setMessage(i18n("Link operation completed."),\r
                                       DolphinStatusBar::OperationCompleted);\r
                 break;\r
-            case KonqOperations::TRASH:\r
+            case KonqUndoManager::TRASH:\r
                 statusBar->setMessage(i18n("Move to trash operation completed."),\r
                                       DolphinStatusBar::OperationCompleted);\r
                 break;\r
+            case KonqUndoManager::RENAME:\r
+                statusBar->setMessage(i18n("Renaming operation completed."),\r
+                                      DolphinStatusBar::OperationCompleted);\r
+                break;\r
+\r
+            case KonqUndoManager::MKDIR:\r
+                statusBar->setMessage(i18n("Created directory."),\r
+                                      DolphinStatusBar::OperationCompleted);\r
+                break;\r
+\r
             default:\r
                 break;\r
         }\r
@@ -585,13 +654,7 @@ void DolphinMainWindow::updatePasteAction()
     if (!urls.isEmpty()) {\r
         pasteAction->setEnabled(true);\r
 \r
-        const int count = urls.count();\r
-        if (count == 1) {\r
-            pasteAction->setText(i18n("Paste 1 File"));\r
-        }\r
-        else {\r
-            pasteAction->setText(i18n("Paste %1 Files", count));\r
-        }\r
+        pasteAction->setText(i18np("Paste One File", "Paste %1 Files", urls.count()));\r
     }\r
     else {\r
         pasteAction->setEnabled(false);\r
@@ -679,6 +742,29 @@ void DolphinMainWindow::toggleSortOrder()
     m_activeView->setSortOrder(order);\r
 }\r
 \r
+void DolphinMainWindow::clearInfo()\r
+{\r
+    m_activeView->setAdditionalInfo(KFileItemDelegate::NoInformation);\r
+}\r
+\r
+void DolphinMainWindow::showMimeInfo()\r
+{\r
+    clearStatusBar();\r
+    m_activeView->setAdditionalInfo(KFileItemDelegate::FriendlyMimeType);\r
+}\r
+\r
+void DolphinMainWindow::showSizeInfo()\r
+{\r
+    clearStatusBar();\r
+    m_activeView->setAdditionalInfo(KFileItemDelegate::Size);\r
+}\r
+\r
+void DolphinMainWindow::showDateInfo()\r
+{\r
+    clearStatusBar();\r
+    m_activeView->setAdditionalInfo(KFileItemDelegate::ModificationTime);\r
+}\r
+\r
 void DolphinMainWindow::toggleSplitView()\r
 {\r
     if (m_view[SecondaryIdx] == 0) {\r
@@ -692,6 +778,7 @@ void DolphinMainWindow::toggleSplitView()
         connectViewSignals(SecondaryIdx);\r
         m_splitter->addWidget(m_view[SecondaryIdx]);\r
         m_splitter->setSizes(QList<int>() << newWidth << newWidth);\r
+        m_view[SecondaryIdx]->reload();\r
         m_view[SecondaryIdx]->show();\r
     }\r
     else {\r
@@ -835,7 +922,7 @@ void DolphinMainWindow::compareFiles()
     // - both in the secondary view\r
     // - one in the primary view and the other in the secondary\r
     //   view\r
-    assert(m_view[PrimaryIdx] != 0);\r
+    Q_ASSERT(m_view[PrimaryIdx] != 0);\r
 \r
     KUrl urlA;\r
     KUrl urlB;\r
@@ -843,9 +930,9 @@ void DolphinMainWindow::compareFiles()
 \r
     switch (urls.count()) {\r
         case 0: {\r
-            assert(m_view[SecondaryIdx] != 0);\r
+            Q_ASSERT(m_view[SecondaryIdx] != 0);\r
             urls = m_view[SecondaryIdx]->selectedUrls();\r
-            assert(urls.count() == 2);\r
+            Q_ASSERT(urls.count() == 2);\r
             urlA = urls[0];\r
             urlB = urls[1];\r
             break;\r
@@ -853,9 +940,9 @@ void DolphinMainWindow::compareFiles()
 \r
         case 1: {\r
             urlA = urls[0];\r
-            assert(m_view[SecondaryIdx] != 0);\r
+            Q_ASSERT(m_view[SecondaryIdx] != 0);\r
             urls = m_view[SecondaryIdx]->selectedUrls();\r
-            assert(urls.count() == 1);\r
+            Q_ASSERT(urls.count() == 1);\r
             urlB = urls[0];\r
             break;\r
         }\r
@@ -869,7 +956,7 @@ void DolphinMainWindow::compareFiles()
         default: {\r
             // may not happen: compareFiles may only get invoked if 2\r
             // files are selected\r
-            assert(false);\r
+            Q_ASSERT(false);\r
         }\r
     }\r
 \r
@@ -906,19 +993,19 @@ void DolphinMainWindow::init()
     DolphinSettings& settings = DolphinSettings::instance();\r
 \r
     KBookmarkManager* manager = settings.bookmarkManager();\r
-    assert(manager != 0);\r
+    Q_ASSERT(manager != 0);\r
     KBookmarkGroup root = manager->root();\r
     if (root.first().isNull()) {\r
-        root.addBookmark(manager, i18n("Home"), settings.generalSettings()->homeUrl(), "folder_home");\r
-        root.addBookmark(manager, i18n("Storage Media"), KUrl("media:/"), "blockdevice");\r
-        root.addBookmark(manager, i18n("Network"), KUrl("remote:/"), "network_local");\r
-        root.addBookmark(manager, i18n("Root"), KUrl("/"), "folder_red");\r
-        root.addBookmark(manager, i18n("Trash"), KUrl("trash:/"), "trashcan_full");\r
+        root.addBookmark(manager, i18n("Home"), settings.generalSettings()->homeUrl(), "folder-home");\r
+        root.addBookmark(manager, i18n("Storage Media"), KUrl("media:/"), "hdd-mount");\r
+        root.addBookmark(manager, i18n("Network"), KUrl("remote:/"), "network-local");\r
+        root.addBookmark(manager, i18n("Root"), KUrl("/"), "folder-red");\r
+        root.addBookmark(manager, i18n("Trash"), KUrl("trash:/"), "user-trash");\r
     }\r
 \r
     setupActions();\r
 \r
-    const KUrl& homeUrl = root.first().url();\r
+    const KUrl& homeUrl = settings.generalSettings()->homeUrl();\r
     setCaption(homeUrl.fileName());\r
     ViewProperties props(homeUrl);\r
     m_view[PrimaryIdx] = new DolphinView(this,\r
@@ -926,10 +1013,11 @@ void DolphinMainWindow::init()
                                          homeUrl,\r
                                          props.viewMode(),\r
                                          props.showHiddenFiles());\r
-    connectViewSignals(PrimaryIdx);\r
-    m_view[PrimaryIdx]->show();\r
 \r
     m_activeView = m_view[PrimaryIdx];\r
+    connectViewSignals(PrimaryIdx);\r
+    m_view[PrimaryIdx]->reload();\r
+    m_view[PrimaryIdx]->show();\r
 \r
     setCentralWidget(m_splitter);\r
     setupDockWidgets();\r
@@ -952,6 +1040,12 @@ void DolphinMainWindow::init()
         // assure a proper default size if Dolphin runs the first time\r
         resize(640, 480);\r
     }\r
+    #ifdef HAVE_KMETADATA\r
+    if ( !MetaDataWidget::metaDataAvailable() )\r
+        activeView()->statusBar()->setMessage(i18n("Failed to contact Nepomuk service, annotation and tagging are disabled."), DolphinStatusBar::Error);\r
+    #endif\r
+\r
+    emit urlChanged(homeUrl);\r
 }\r
 \r
 void DolphinMainWindow::loadSettings()\r
@@ -984,14 +1078,15 @@ void DolphinMainWindow::setupActions()
     m_newMenu = new DolphinNewMenu(this);\r
     KMenu* menu = m_newMenu->menu();\r
     menu->setTitle(i18n("Create New..."));\r
-    menu->setIcon(SmallIcon("filenew"));\r
+    menu->setIcon(SmallIcon("document-new"));\r
     connect(menu, SIGNAL(aboutToShow()),\r
             this, SLOT(updateNewMenu()));\r
 \r
-    QAction* action = actionCollection()->addAction("new_window");\r
-    action->setIcon(KIcon("window_new"));\r
-    action->setText(i18n("New &Window"));\r
-    connect(action, SIGNAL(triggered()), this, SLOT(openNewMainWindow()));\r
+    QAction* newWindow = actionCollection()->addAction("new_window");\r
+    newWindow->setIcon(KIcon("window-new"));\r
+    newWindow->setText(i18n("New &Window"));\r
+    newWindow->setShortcut(Qt::CTRL | Qt::Key_N);\r
+    connect(newWindow, SIGNAL(triggered()), this, SLOT(openNewMainWindow()));\r
 \r
     QAction* rename = actionCollection()->addAction("rename");\r
     rename->setText(i18n("Rename"));\r
@@ -1000,14 +1095,14 @@ void DolphinMainWindow::setupActions()
 \r
     QAction* moveToTrash = actionCollection()->addAction("move_to_trash");\r
     moveToTrash->setText(i18n("Move to Trash"));\r
-    moveToTrash->setIcon(KIcon("edittrash"));\r
+    moveToTrash->setIcon(KIcon("edit-trash"));\r
     moveToTrash->setShortcut(QKeySequence::Delete);\r
     connect(moveToTrash, SIGNAL(triggered()), this, SLOT(moveToTrash()));\r
 \r
     QAction* deleteAction = actionCollection()->addAction("delete");\r
     deleteAction->setText(i18n("Delete"));\r
-    deleteAction->setShortcut(Qt::ALT | Qt::Key_Delete);\r
-    deleteAction->setIcon(KIcon("editdelete"));\r
+    deleteAction->setShortcut(Qt::SHIFT | Qt::Key_Delete);\r
+    deleteAction->setIcon(KIcon("edit-delete"));\r
     connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
 \r
     QAction* properties = actionCollection()->addAction("properties");\r
@@ -1048,13 +1143,13 @@ void DolphinMainWindow::setupActions()
     KToggleAction* iconsView = actionCollection()->add<KToggleAction>("icons");\r
     iconsView->setText(i18n("Icons"));\r
     iconsView->setShortcut(Qt::CTRL | Qt::Key_1);\r
-    iconsView->setIcon(KIcon("view_icon"));\r
+    iconsView->setIcon(KIcon("view-icon"));\r
     connect(iconsView, SIGNAL(triggered()), this, SLOT(setIconsView()));\r
 \r
     KToggleAction* detailsView = actionCollection()->add<KToggleAction>("details");\r
     detailsView->setText(i18n("Details"));\r
     detailsView->setShortcut(Qt::CTRL | Qt::Key_2);\r
-    detailsView->setIcon(KIcon("view_text"));\r
+    detailsView->setIcon(KIcon("fileview-text"));\r
     connect(detailsView, SIGNAL(triggered()), this, SLOT(setDetailsView()));\r
 \r
     QActionGroup* viewModeGroup = new QActionGroup(this);\r
@@ -1097,8 +1192,31 @@ void DolphinMainWindow::setupActions()
     sortDescending->setText(i18n("Descending"));\r
     connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));\r
 \r
+    KToggleAction* clearInfo = actionCollection()->add<KToggleAction>("clear_info");\r
+    clearInfo->setText(i18n("No Information"));\r
+    connect(clearInfo, SIGNAL(triggered()), this, SLOT(clearInfo()));\r
+\r
+    KToggleAction* showMimeInfo = actionCollection()->add<KToggleAction>("show_mime_info");\r
+    showMimeInfo->setText(i18n("Type"));\r
+    connect(showMimeInfo, SIGNAL(triggered()), this, SLOT(showMimeInfo()));\r
+\r
+    KToggleAction* showSizeInfo = actionCollection()->add<KToggleAction>("show_size_info");\r
+    showSizeInfo->setText(i18n("Size"));\r
+    connect(showSizeInfo, SIGNAL(triggered()), this, SLOT(showSizeInfo()));\r
+\r
+    KToggleAction* showDateInfo = actionCollection()->add<KToggleAction>("show_date_info");\r
+    showDateInfo->setText(i18n("Date"));\r
+    connect(showDateInfo, SIGNAL(triggered()), this, SLOT(showDateInfo()));\r
+\r
+    QActionGroup* infoGroup = new QActionGroup(this);\r
+    infoGroup->addAction(clearInfo);\r
+    infoGroup->addAction(showMimeInfo);\r
+    infoGroup->addAction(showSizeInfo);\r
+    infoGroup->addAction(showDateInfo);\r
+\r
     KToggleAction* showPreview = actionCollection()->add<KToggleAction>("show_preview");\r
-    showPreview->setText(i18n("Show Preview"));\r
+    showPreview->setText(i18n("Preview"));\r
+    showPreview->setIcon(KIcon("thumbnail-show"));\r
     connect(showPreview, SIGNAL(triggered()), this, SLOT(togglePreview()));\r
 \r
     KToggleAction* showHiddenFiles = actionCollection()->add<KToggleAction>("show_hidden_files");\r
@@ -1107,20 +1225,20 @@ void DolphinMainWindow::setupActions()
     connect(showHiddenFiles, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
 \r
     KToggleAction* split = actionCollection()->add<KToggleAction>("split_view");\r
-    split->setText(i18n("Split View"));\r
+    split->setText(i18n("Split"));\r
     split->setShortcut(Qt::Key_F10);\r
-    split->setIcon(KIcon("view_left_right"));\r
+    split->setIcon(KIcon("view-left-right"));\r
     connect(split, SIGNAL(triggered()), this, SLOT(toggleSplitView()));\r
 \r
     QAction* reload = actionCollection()->addAction("reload");\r
     reload->setText(i18n("Reload"));\r
     reload->setShortcut(Qt::Key_F5);\r
-    reload->setIcon(KIcon("reload"));\r
+    reload->setIcon(KIcon("view-refresh"));\r
     connect(reload, SIGNAL(triggered()), this, SLOT(reloadView()));\r
 \r
     QAction* stop = actionCollection()->addAction("stop");\r
     stop->setText(i18n("Stop"));\r
-    stop->setIcon(KIcon("stop"));\r
+    stop->setIcon(KIcon("process-stop"));\r
     connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));\r
 \r
     // TODO: the URL navigator must emit a signal if the editable state has been\r
@@ -1156,7 +1274,7 @@ void DolphinMainWindow::setupActions()
     QAction* findFile = actionCollection()->addAction("find_file");\r
     findFile->setText(i18n("Find File..."));\r
     findFile->setShortcut(Qt::Key_F);\r
-    findFile->setIcon(KIcon("filefind"));\r
+    findFile->setIcon(KIcon("file-find"));\r
     connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));\r
 \r
     KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");\r
@@ -1176,25 +1294,55 @@ void DolphinMainWindow::setupActions()
 \r
 void DolphinMainWindow::setupDockWidgets()\r
 {\r
-    QDockWidget* shortcutsDock = new QDockWidget(i18n("Bookmarks"));\r
+    // TODO: there's a lot copy/paste code here. Provide a generic approach\r
+    // after the dock concept has been finalized.\r
+\r
+    // setup "Bookmarks"\r
+    QDockWidget* shortcutsDock = new QDockWidget(i18n("Bookmarks"), this);\r
     shortcutsDock->setObjectName("bookmarksDock");\r
     shortcutsDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
-    shortcutsDock->setWidget(new BookmarksSidebarPage(this));\r
+    SidebarPage* shortcutsWidget = new BookmarksSidebarPage(shortcutsDock);\r
+    shortcutsDock->setWidget(shortcutsWidget);\r
+\r
 \r
     shortcutsDock->toggleViewAction()->setText(i18n("Show Bookmarks Panel"));\r
     actionCollection()->addAction("show_bookmarks_panel", shortcutsDock->toggleViewAction());\r
 \r
     addDockWidget(Qt::LeftDockWidgetArea, shortcutsDock);\r
+    connectSidebarPage(shortcutsWidget);\r
 \r
-    QDockWidget* infoDock = new QDockWidget(i18n("Information"));\r
+    // setup "Information"\r
+    QDockWidget* infoDock = new QDockWidget(i18n("Information"), this);\r
     infoDock->setObjectName("infoDock");\r
     infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
-    infoDock->setWidget(new InfoSidebarPage(this));\r
+    SidebarPage* infoWidget = new InfoSidebarPage(infoDock);\r
+    infoDock->setWidget(infoWidget);\r
+\r
 \r
     infoDock->toggleViewAction()->setText(i18n("Show Information Panel"));\r
     actionCollection()->addAction("show_info_panel", infoDock->toggleViewAction());\r
 \r
     addDockWidget(Qt::RightDockWidgetArea, infoDock);\r
+    connectSidebarPage(infoWidget);\r
+\r
+    // setup "Tree View"\r
+    QDockWidget* treeViewDock = new QDockWidget(i18n("Folders")); // TODO: naming?\r
+    treeViewDock->setObjectName("treeViewDock");\r
+    treeViewDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
+    TreeViewSidebarPage* treeWidget = new TreeViewSidebarPage(treeViewDock);\r
+    treeViewDock->setWidget(treeWidget);\r
+\r
+    treeViewDock->toggleViewAction()->setText(i18n("Show Folders Panel"));\r
+    actionCollection()->addAction("show_folders_panel", treeViewDock->toggleViewAction());\r
+\r
+    addDockWidget(Qt::LeftDockWidgetArea, treeViewDock);\r
+    connectSidebarPage(treeWidget);\r
+\r
+    const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();\r
+    if (firstRun) {\r
+        infoDock->hide();\r
+        treeViewDock->hide();\r
+    }\r
 }\r
 \r
 void DolphinMainWindow::updateHistory()\r
@@ -1278,11 +1426,16 @@ void DolphinMainWindow::updateViewActions()
 \r
     slotSortingChanged(m_activeView->sorting());\r
     slotSortOrderChanged(m_activeView->sortOrder());\r
+    slotAdditionalInfoChanged(m_activeView->additionalInfo());\r
 \r
     KToggleAction* showFilterBarAction =\r
         static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));\r
     showFilterBarAction->setChecked(m_activeView->isFilterBarVisible());\r
 \r
+    KToggleAction* showPreviewAction =\r
+        static_cast<KToggleAction*>(actionCollection()->action("show_preview"));\r
+    showPreviewAction->setChecked(m_activeView->showPreview());\r
+\r
     KToggleAction* showHiddenFilesAction =\r
         static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));\r
     showHiddenFilesAction->setChecked(m_activeView->showHiddenFiles());\r
@@ -1305,19 +1458,19 @@ void DolphinMainWindow::updateGoActions()
 void DolphinMainWindow::copyUrls(const KUrl::List& source, const KUrl& dest)\r
 {\r
     KonqOperations::copy(this, KonqOperations::COPY, source, dest);\r
-    m_undoOperations.append(KonqOperations::COPY);\r
+    m_undoCommandTypes.append(KonqUndoManager::COPY);\r
 }\r
 \r
 void DolphinMainWindow::moveUrls(const KUrl::List& source, const KUrl& dest)\r
 {\r
     KonqOperations::copy(this, KonqOperations::MOVE, source, dest);\r
-    m_undoOperations.append(KonqOperations::MOVE);\r
+    m_undoCommandTypes.append(KonqUndoManager::MOVE);\r
 }\r
 \r
 void DolphinMainWindow::linkUrls(const KUrl::List& source, const KUrl& dest)\r
 {\r
     KonqOperations::copy(this, KonqOperations::LINK, source, dest);\r
-    m_undoOperations.append(KonqOperations::LINK);\r
+    m_undoCommandTypes.append(KonqUndoManager::LINK);\r
 }\r
 \r
 void DolphinMainWindow::clearStatusBar()\r
@@ -1330,30 +1483,49 @@ void DolphinMainWindow::connectViewSignals(int viewIndex)
     DolphinView* view = m_view[viewIndex];\r
     connect(view, SIGNAL(modeChanged()),\r
             this, SLOT(slotViewModeChanged()));\r
+    connect(view, SIGNAL(showPreviewChanged()),\r
+            this, SLOT(slotShowPreviewChanged()));\r
     connect(view, SIGNAL(showHiddenFilesChanged()),\r
             this, SLOT(slotShowHiddenFilesChanged()));\r
     connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)),\r
             this, SLOT(slotSortingChanged(DolphinView::Sorting)));\r
     connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)),\r
             this, SLOT(slotSortOrderChanged(Qt::SortOrder)));\r
-    connect(view, SIGNAL(selectionChanged()),\r
-            this, SLOT(slotSelectionChanged()));\r
+    connect(view, SIGNAL(additionalInfoChanged(KFileItemDelegate::AdditionalInformation)),\r
+            this, SLOT(slotAdditionalInfoChanged(KFileItemDelegate::AdditionalInformation)));\r
+    connect(view, SIGNAL(selectionChanged(KFileItemList)),\r
+            this, SLOT(slotSelectionChanged(KFileItemList)));\r
     connect(view, SIGNAL(showFilterBarChanged(bool)),\r
             this, SLOT(updateFilterBarAction(bool)));\r
+    connect(view, SIGNAL(urlChanged(KUrl)),\r
+            this, SLOT(changeUrl(KUrl)));\r
 \r
     const UrlNavigator* navigator = view->urlNavigator();\r
     connect(navigator, SIGNAL(urlChanged(const KUrl&)),\r
-            this, SLOT(slotUrlChanged(const KUrl&)));\r
+            this, SLOT(changeUrl(const KUrl&)));\r
     connect(navigator, SIGNAL(historyChanged()),\r
             this, SLOT(slotHistoryChanged()));\r
+}\r
+void DolphinMainWindow::connectSidebarPage(SidebarPage* page)\r
+{\r
+    connect(page, SIGNAL(changeUrl(KUrl)),\r
+            this, SLOT(changeUrl(KUrl)));\r
+    connect(page, SIGNAL(changeSelection(KFileItemList)),\r
+            this, SLOT(changeSelection(KFileItemList)));\r
+    connect(page, SIGNAL(urlsDropped(KUrl::List,KUrl)),\r
+            this, SLOT(dropUrls(KUrl::List,KUrl)));\r
 \r
+    connect(this, SIGNAL(urlChanged(KUrl)),\r
+            page, SLOT(setUrl(KUrl)));\r
+     connect(this, SIGNAL(selectionChanged(KFileItemList)),\r
+             page, SLOT(setSelection(KFileItemList)));\r
 }\r
 \r
 DolphinMainWindow::UndoUiInterface::UndoUiInterface(DolphinMainWindow* mainWin) :\r
     KonqUndoManager::UiInterface(mainWin),\r
     m_mainWin(mainWin)\r
 {\r
-    assert(m_mainWin != 0);\r
+    Q_ASSERT(m_mainWin != 0);\r
 }\r
 \r
 DolphinMainWindow::UndoUiInterface::~UndoUiInterface()\r