#include "dolphinmainwindow.h"
#include "dolphinviewactionhandler.h"
+#include "dolphinremoteencoding.h"
#include <config-nepomuk.h>
m_tabIndex(0),
m_viewTab(),
m_actionHandler(0),
+ m_remoteEncoding(0),
m_settingsDialog(0)
{
setObjectName("Dolphin#");
{
DolphinSettings& settings = DolphinSettings::instance();
GeneralSettings* generalSettings = settings.generalSettings();
+
+ if ((m_viewTab.count() > 1) && generalSettings->confirmClosingMultipleTabs()) {
+ // Ask the user if he really wants to quit and close all tabs.
+ // Open a confirmation dialog with 3 buttons:
+ // KDialog::Yes -> Quit
+ // KDialog::No -> Close only the current tab
+ // KDialog::Cancel -> do nothing
+ KDialog *dialog = new KDialog(this, Qt::Dialog);
+ dialog->setCaption(i18nc("@title:window", "Confirmation"));
+ dialog->setButtons(KDialog::Yes | KDialog::No | KDialog::Cancel);
+ dialog->setModal(true);
+ dialog->showButtonSeparator(true);
+ dialog->setButtonGuiItem(KDialog::Yes, KStandardGuiItem::quit());
+ dialog->setButtonGuiItem(KDialog::No, KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close")));
+ dialog->setButtonGuiItem(KDialog::Cancel, KStandardGuiItem::cancel());
+ dialog->setDefaultButton(KDialog::Yes);
+
+ bool doNotAskAgainCheckboxResult = false;
+
+ const int result = KMessageBox::createKMessageBox(dialog,
+ QMessageBox::Warning,
+ i18n("You have multiple tabs open in this window, are you sure you want to quit?"),
+ QStringList(),
+ i18n("Do not ask again"),
+ &doNotAskAgainCheckboxResult,
+ KMessageBox::Notify);
+
+ if (doNotAskAgainCheckboxResult) {
+ generalSettings->setConfirmClosingMultipleTabs(false);
+ }
+
+ switch (result) {
+ case KDialog::Yes:
+ // Quit
+ break;
+ case KDialog::No:
+ // Close only the current tab
+ closeTab();
+ default:
+ event->ignore();
+ return;
+ }
+ }
+
generalSettings->setFirstRun(false);
settings.save();
void DolphinMainWindow::saveProperties(KConfigGroup& group)
{
- // TODO: remember tabs
- DolphinViewContainer* cont = m_viewTab[m_tabIndex].primaryView;
- group.writeEntry("Primary Url", cont->url().url());
- group.writeEntry("Primary Editable Url", cont->isUrlEditable());
+ const int tabCount = m_viewTab.count();
+ group.writeEntry("Tab Count", tabCount);
+ group.writeEntry("Active Tab Index", m_tabBar->currentIndex());
- cont = m_viewTab[m_tabIndex].secondaryView;
- if (cont != 0) {
- group.writeEntry("Secondary Url", cont->url().url());
- group.writeEntry("Secondary Editable Url", cont->isUrlEditable());
+ for (int i = 0; i < tabCount; ++i) {
+ const DolphinViewContainer* cont = m_viewTab[i].primaryView;
+ group.writeEntry(tabProperty("Primary URL", i), cont->url().url());
+ group.writeEntry(tabProperty("Primary Editable", i), cont->isUrlEditable());
+
+ cont = m_viewTab[i].secondaryView;
+ if (cont != 0) {
+ group.writeEntry(tabProperty("Secondary URL", i), cont->url().url());
+ group.writeEntry(tabProperty("Secondary Editable", i), cont->isUrlEditable());
+ }
}
}
void DolphinMainWindow::readProperties(const KConfigGroup& group)
{
- // TODO: read tabs
- DolphinViewContainer* cont = m_viewTab[m_tabIndex].primaryView;
+ const int tabCount = group.readEntry("Tab Count", 1);
+ for (int i = 0; i < tabCount; ++i) {
+ DolphinViewContainer* cont = m_viewTab[i].primaryView;
- cont->setUrl(group.readEntry("Primary Url"));
- bool editable = group.readEntry("Primary Editable Url", false);
- cont->urlNavigator()->setUrlEditable(editable);
+ cont->setUrl(group.readEntry(tabProperty("Primary URL", i)));
+ const bool editable = group.readEntry(tabProperty("Primary Editable", i), false);
+ cont->urlNavigator()->setUrlEditable(editable);
- cont = m_viewTab[m_tabIndex].secondaryView;
- const QString secondaryUrl = group.readEntry("Secondary Url");
- if (!secondaryUrl.isEmpty()) {
- if (cont == 0) {
- // a secondary view should be shown, but no one is available
- // currently -> create a new view
+ cont = m_viewTab[i].secondaryView;
+ const QString secondaryUrl = group.readEntry(tabProperty("Secondary URL", i));
+ if (!secondaryUrl.isEmpty()) {
+ if (cont == 0) {
+ // a secondary view should be shown, but no one is available
+ // currently -> create a new view
+ toggleSplitView();
+ cont = m_viewTab[i].secondaryView;
+ Q_ASSERT(cont != 0);
+ }
+
+ cont->setUrl(secondaryUrl);
+ const bool editable = group.readEntry(tabProperty("Secondary Editable", i), false);
+ cont->urlNavigator()->setUrlEditable(editable);
+ } else if (cont != 0) {
+ // no secondary view should be shown, but the default setting shows
+ // one already -> close the view
toggleSplitView();
- cont = m_viewTab[m_tabIndex].secondaryView;
- Q_ASSERT(cont != 0);
}
- cont->setUrl(secondaryUrl);
- bool editable = group.readEntry("Secondary Editable Url", false);
- cont->urlNavigator()->setUrlEditable(editable);
- } else if (cont != 0) {
- // no secondary view should be shown, but the default setting shows
- // one already -> close the view
- toggleSplitView();
+ // openNewTab() needs to be called only tabCount - 1 times
+ if (i != tabCount - 1) {
+ openNewTab();
+ }
}
+
+ const int index = group.readEntry("Active Tab Index", 0);
+ m_tabBar->setCurrentIndex(index);
}
void DolphinMainWindow::updateNewMenu()
m_newMenu->setPopupFiles(activeViewContainer()->url());
}
+void DolphinMainWindow::createDirectory()
+{
+ m_newMenu->setPopupFiles(activeViewContainer()->url());
+ m_newMenu->createDirectory();
+}
+
void DolphinMainWindow::quit()
{
close();
// action and the separator
QList<QAction*> actions = m_recentTabsMenu->menu()->actions();
const int count = actions.size();
- for (int i = 2; i < count; i++) {
+ for (int i = 2; i < count; ++i) {
m_recentTabsMenu->menu()->removeAction(actions.at(i));
}
} else {
QAction* closeTabAction = menu.addAction(KIcon("tab-close"), i18nc("@action:inmenu", "Close Tab"));
closeTabAction->setShortcut(actionCollection()->action("close_tab")->shortcut());
-
QAction* selectedAction = menu.exec(pos);
if (selectedAction == newTabAction) {
const ViewTab& tab = m_viewTab[index];
setCaption(homeUrl.fileName());
m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
+ connect(m_actionHandler, SIGNAL(createDirectory()), SLOT(createDirectory()));
ViewProperties props(homeUrl);
m_viewTab[m_tabIndex].primaryView = new DolphinViewContainer(this,
m_viewTab[m_tabIndex].splitter,
m_activeViewContainer->show();
m_actionHandler->setCurrentView(view);
+ m_remoteEncoding = new DolphinRemoteEncoding(this, m_actionHandler);
+ connect(this, SIGNAL(urlChanged(const KUrl&)),
+ m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
+
m_tabBar = new KTabBar(this);
m_tabBar->setMovable(true);
m_tabBar->setTabsClosable(true);
backShortcut.setAlternate(Qt::Key_Backspace);
backAction->setShortcut(backShortcut);
- m_recentTabsMenu = new KActionMenu(i18n("&Recently Closed Tabs"), this);
+ m_recentTabsMenu = new KActionMenu(i18n("Recently Closed Tabs"), this);
m_recentTabsMenu->setIcon(KIcon("edit-undo"));
actionCollection()->addAction("closed_tabs", m_recentTabsMenu);
connect(m_recentTabsMenu->menu(), SIGNAL(triggered(QAction *)),
this, SLOT(restoreClosedTab(QAction *)));
- QAction* action = new QAction("&Empty Recently Closed Tabs", m_recentTabsMenu);
+ QAction* action = new QAction("Empty Recently Closed Tabs", m_recentTabsMenu);
action->setIcon(KIcon("edit-clear-list"));
action->setData(QVariant::fromValue(true));
m_recentTabsMenu->addAction(action);
m_viewTab[tabIndex].secondaryView->show();
}
+QString DolphinMainWindow::tabProperty(const QString& property, int tabIndex) const
+{
+ return "Tab " + QString::number(tabIndex) + ' ' + property;
+}
+
DolphinMainWindow::UndoUiInterface::UndoUiInterface() :
KIO::FileUndoManager::UiInterface()
{