File indexing completed on 2024-04-14 05:35:35

0001 /***************************************************************************
0002  *   Copyright (C) 2005-2009 by Rajko Albrecht                             *
0003  *   ral@alwins-world.de                                                   *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
0019  ***************************************************************************/
0020 
0021 #include "kdesvn_part.h"
0022 #include "helpers/kdesvn_debug.h"
0023 #include "helpers/sshagent.h"
0024 #include "kdesvnview.h"
0025 #include "settings/cmdexecsettings_impl.h"
0026 #include "settings/diffmergesettings_impl.h"
0027 #include "settings/dispcolorsettings_impl.h"
0028 #include "settings/displaysettings_impl.h"
0029 #include "settings/kdesvnsettings.h"
0030 #include "settings/polling_settings_impl.h"
0031 #include "settings/revisiontreesettingsdlg_impl.h"
0032 #include "settings/subversionsettings_impl.h"
0033 #include "svnfrontend/database/dboverview.h"
0034 #include "svnqt/url.h"
0035 #include "svnqt/version_check.h"
0036 
0037 #include <kaboutapplicationdialog.h>
0038 #include <kaboutdata.h>
0039 #include <kactioncollection.h>
0040 #include <kconfigdialog.h>
0041 #include <khelpclient.h>
0042 #include <klocalizedstring.h>
0043 #include <kpluginfactory.h>
0044 #include <kstandardaction.h>
0045 #include <ktoggleaction.h>
0046 #include <kxmlguifactory.h>
0047 
0048 K_PLUGIN_CLASS_WITH_JSON(kdesvnpart, "kdesvnpart.json")
0049 
0050 static const char version[] = KDESVN_VERSION;
0051 
0052 kdesvnpart::kdesvnpart(QWidget *parentWidget, QObject *parent, const QVariantList &args)
0053     : KParts::ReadOnlyPart(parent)
0054 {
0055     Q_UNUSED(args);
0056     init(parentWidget, false);
0057 }
0058 
0059 kdesvnpart::kdesvnpart(QWidget *parentWidget, QObject *parent, bool ownapp, const QVariantList &args)
0060     : KParts::ReadOnlyPart(parent)
0061 {
0062     Q_UNUSED(args);
0063     init(parentWidget, ownapp);
0064 }
0065 
0066 void kdesvnpart::init(QWidget *parentWidget, bool full)
0067 {
0068     m_aboutDlg = nullptr;
0069     // we need an instance
0070     // TODO: KF5 port
0071     // setComponentData(KdesvnFactory::componentData());
0072 
0073     m_browserExt = new KdesvnBrowserExtension(this);
0074 
0075     // this should be your custom internal widget
0076     m_view = new kdesvnView(actionCollection(), parentWidget, full);
0077 
0078     // notify the part that this is our internal widget
0079     setWidget(m_view);
0080 
0081     // create our actions
0082     setupActions();
0083     // set our XML-UI resource file
0084 #ifdef TESTING_PARTRC
0085     setXMLFile(TESTING_PARTRC);
0086     qCDebug(KDESVN_LOG) << "Using test rc file in " << TESTING_PARTRC << Qt::endl;
0087 #else
0088     setXMLFile(QStringLiteral("kdesvn_part.rc"));
0089 #endif
0090     connect(m_view, &kdesvnView::sigShowPopup, this, &kdesvnpart::slotDispPopup);
0091     connect(m_view, &kdesvnView::sigSwitchUrl, this, &kdesvnpart::openUrl);
0092     connect(this, &kdesvnpart::refreshTree, m_view, &kdesvnView::refreshCurrentTree);
0093     connect(m_view, &kdesvnView::setWindowCaption, this, &kdesvnpart::setWindowCaption);
0094     connect(m_view, &kdesvnView::sigUrlChanged, this, &kdesvnpart::slotUrlChanged);
0095     connect(this, SIGNAL(settingsChanged()), widget(), SLOT(slotSettingsChanged()));
0096     SshAgent ssh;
0097     ssh.querySshAgent();
0098 }
0099 
0100 kdesvnpart::~kdesvnpart()
0101 {
0102     ///@todo replace with KDE4 like stuff
0103     // kdesvnpartFactory::instance()->config()->sync();
0104 }
0105 
0106 void kdesvnpart::slotUrlChanged(const QUrl &url)
0107 {
0108     setUrl(url);
0109 }
0110 
0111 bool kdesvnpart::openFile()
0112 {
0113     m_view->openUrl(url());
0114     // just for fun, set the status bar
0115     emit setStatusBarText(url().toString());
0116 
0117     return true;
0118 }
0119 
0120 bool kdesvnpart::openUrl(const QUrl &aUrl)
0121 {
0122     QUrl _url(aUrl);
0123 
0124     _url.setScheme(svn::Url::transformProtokoll(_url.scheme()));
0125 
0126     if (!_url.isValid() || !closeUrl()) {
0127         return false;
0128     }
0129     setUrl(_url);
0130     emit started(nullptr);
0131     bool ret = m_view->openUrl(url());
0132     if (ret) {
0133         emit completed();
0134         emit setWindowCaption(url().toString());
0135     }
0136     return ret;
0137 }
0138 
0139 void kdesvnpart::slotFileProperties()
0140 {
0141 }
0142 
0143 void kdesvnpart::slotDispPopup(const QString &name, QWidget **target)
0144 {
0145     *target = hostContainer(name);
0146 }
0147 
0148 /*!
0149     \fn kdesvnpart::setupActions()
0150  */
0151 void kdesvnpart::setupActions()
0152 {
0153     KToggleAction *toggletemp;
0154 
0155     toggletemp = new KToggleAction(i18n("Logs follow node changes"), this);
0156     actionCollection()->addAction(QStringLiteral("toggle_log_follows"), toggletemp);
0157     toggletemp->setChecked(Kdesvnsettings::log_follows_nodes());
0158     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotLogFollowNodes);
0159 
0160     toggletemp = new KToggleAction(i18n("Display ignored files"), this);
0161     actionCollection()->addAction(QStringLiteral("toggle_ignored_files"), toggletemp);
0162     toggletemp->setChecked(Kdesvnsettings::display_ignored_files());
0163     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotDisplayIgnored);
0164 
0165     toggletemp = new KToggleAction(i18n("Display unknown files"), this);
0166     actionCollection()->addAction(QStringLiteral("toggle_unknown_files"), toggletemp);
0167     toggletemp->setChecked(Kdesvnsettings::display_unknown_files());
0168     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotDisplayUnkown);
0169 
0170     toggletemp = new KToggleAction(i18n("Hide unchanged files"), this);
0171     actionCollection()->addAction(QStringLiteral("toggle_hide_unchanged_files"), toggletemp);
0172     toggletemp->setChecked(Kdesvnsettings::hide_unchanged_files());
0173     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotHideUnchanged);
0174 
0175     toggletemp = new KToggleAction(i18n("Work online"), this);
0176     actionCollection()->addAction(QStringLiteral("toggle_network"), toggletemp);
0177     toggletemp->setChecked(Kdesvnsettings::network_on());
0178     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotEnableNetwork);
0179 
0180     QAction *t = KStandardAction::preferences(this, SLOT(slotShowSettings()), actionCollection());
0181 
0182     t->setText(i18n("Configure Kdesvn..."));
0183     actionCollection()->addAction(QStringLiteral("kdesvnpart_pref"), t);
0184 
0185     if (QCoreApplication::applicationName() != QLatin1String("kdesvn")) {
0186         t = new QAction(QIcon::fromTheme(QStringLiteral("kdesvn")), i18n("About kdesvn part"), this);
0187         connect(t, &QAction::triggered, this, &kdesvnpart::showAboutApplication);
0188         actionCollection()->addAction(QStringLiteral("help_about_kdesvnpart"), t);
0189 
0190         t = new QAction(QIcon::fromTheme(QStringLiteral("help-contents")), i18n("Kdesvn Handbook"), this);
0191         connect(t, &QAction::triggered, this, &kdesvnpart::appHelpActivated);
0192         actionCollection()->addAction(QStringLiteral("help_kdesvn"), t);
0193     }
0194 }
0195 
0196 void kdesvnpart::slotSshAdd()
0197 {
0198     SshAgent ag;
0199     ag.addSshIdentities(true);
0200 }
0201 
0202 /*!
0203     \fn kdesvnpart::slotLogFollowNodes(bool)
0204  */
0205 void kdesvnpart::slotLogFollowNodes(bool how)
0206 {
0207     Kdesvnsettings::setLog_follows_nodes(how);
0208     Kdesvnsettings::self()->save();
0209 }
0210 
0211 /*!
0212     \fn kdesvnpart::slotDiplayIgnored(bool)
0213  */
0214 void kdesvnpart::slotDisplayIgnored(bool how)
0215 {
0216     Kdesvnsettings::setDisplay_ignored_files(how);
0217     Kdesvnsettings::self()->save();
0218     emit settingsChanged();
0219 }
0220 
0221 /*!
0222     \fn kdesvnpart::slotDisplayUnknown(bool)
0223  */
0224 void kdesvnpart::slotDisplayUnkown(bool how)
0225 {
0226     Kdesvnsettings::setDisplay_unknown_files(how);
0227     Kdesvnsettings::self()->save();
0228     emit settingsChanged();
0229 }
0230 
0231 /*!
0232     \fn kdesvnpart::slotHideUnchanged(bool)
0233  */
0234 void kdesvnpart::slotHideUnchanged(bool how)
0235 {
0236     Kdesvnsettings::setHide_unchanged_files(how);
0237     Kdesvnsettings::self()->save();
0238     emit settingsChanged();
0239 }
0240 
0241 void kdesvnpart::slotEnableNetwork(bool how)
0242 {
0243     Kdesvnsettings::setNetwork_on(how);
0244     Kdesvnsettings::self()->save();
0245     emit settingsChanged();
0246 }
0247 
0248 /*!
0249     \fn kdesvnpart::closeURL()
0250  */
0251 bool kdesvnpart::closeUrl()
0252 {
0253     KParts::ReadOnlyPart::closeUrl();
0254     setUrl(QUrl());
0255     m_view->closeMe();
0256     emit setWindowCaption(QString());
0257     return true;
0258 }
0259 
0260 KdesvnBrowserExtension::KdesvnBrowserExtension(kdesvnpart *p)
0261     : KParts::BrowserExtension(p)
0262 {
0263 }
0264 
0265 KdesvnBrowserExtension::~KdesvnBrowserExtension()
0266 {
0267 }
0268 
0269 void KdesvnBrowserExtension::properties()
0270 {
0271     static_cast<kdesvnpart *>(parent())->slotFileProperties();
0272 }
0273 
0274 /*!
0275     \fn kdesvnpart::showAboutApplication()
0276  */
0277 void kdesvnpart::showAboutApplication()
0278 {
0279     if (!m_aboutDlg) {
0280         QString m_Extratext =
0281             i18n("Built with Subversion library: %1\nRunning Subversion library: %2", svn::Version::linked_version(), svn::Version::running_version());
0282 
0283         KAboutData about(QStringLiteral("kdesvnpart"),
0284                          i18n("kdesvn Part"),
0285                          QLatin1String(version),
0286                          i18n("A Subversion Client by KDE (dynamic Part component)"),
0287                          KAboutLicense::LGPL_V2,
0288                          i18n("(C) 2005-2009 Rajko Albrecht,\n(C) 2015-2018 Christian Ehrlicher"),
0289                          m_Extratext);
0290 
0291         about.addAuthor(QStringLiteral("Rajko Albrecht"), i18n("Original author and maintainer"), QStringLiteral("ral@alwins-world.de"));
0292         about.addAuthor(QStringLiteral("Christian Ehrlicher"), i18n("Developer"), QStringLiteral("ch.ehrlicher@gmx.de"));
0293         about.setHomepage(QStringLiteral("https://commits.kde.org/kdesvn"));
0294         qApp->setWindowIcon(QIcon::fromTheme(QStringLiteral("kdesvn"), qApp->windowIcon()));
0295         m_aboutDlg = new KAboutApplicationDialog(about);
0296     }
0297     if (m_aboutDlg == nullptr) {
0298         return;
0299     }
0300     if (!m_aboutDlg->isVisible()) {
0301         m_aboutDlg->show();
0302     } else {
0303         m_aboutDlg->raise();
0304     }
0305 }
0306 
0307 /*!
0308     \fn kdesvnpart::appHelpActivated()
0309  */
0310 void kdesvnpart::appHelpActivated()
0311 {
0312     KHelpClient::invokeHelp(QString(), QStringLiteral("kdesvn"));
0313 }
0314 
0315 /*!
0316     \fn kdesvnpart::slotShowSettings()
0317  */
0318 void kdesvnpart::slotShowSettings()
0319 {
0320     if (KConfigDialog::showDialog(QStringLiteral("kdesvnpart_settings"))) {
0321         return;
0322     }
0323     KConfigDialog *dialog = new KConfigDialog(widget(), QStringLiteral("kdesvnpart_settings"), Kdesvnsettings::self());
0324     dialog->setFaceType(KPageDialog::List);
0325 
0326     // TODO: KF5
0327     // dialog->setHelp("setup", "kdesvn");
0328     dialog->addPage(new DisplaySettings_impl(nullptr), i18n("General"), QStringLiteral("configure"), i18n("General Settings"), true);
0329     dialog->addPage(new SubversionSettings_impl(nullptr), i18n("Subversion"), QStringLiteral("kdesvn"), i18n("Subversion Settings"), true);
0330     dialog->addPage(new PollingSettings_impl(nullptr), i18n("Timed jobs"), QStringLiteral("kdesvnclock"), i18n("Settings for timed jobs"), true);
0331     dialog->addPage(new DiffMergeSettings_impl(nullptr), i18n("Diff & Merge"), QStringLiteral("kdesvnmerge"), i18n("Settings for diff and merge"), true);
0332     dialog->addPage(new DispColorSettings_impl(nullptr), i18n("Colors"), QStringLiteral("kdesvncolors"), i18n("Color Settings"), true);
0333     dialog->addPage(new RevisiontreeSettingsDlg_impl(nullptr), i18n("Revision tree"), QStringLiteral("kdesvntree"), i18n("Revision tree Settings"), true);
0334     dialog->addPage(new CmdExecSettings_impl(nullptr),
0335                     i18n("KIO / Command line"),
0336                     QStringLiteral("kdesvnterminal"),
0337                     i18n("Settings for command line and KIO execution"),
0338                     true);
0339 
0340     connect(dialog, &KConfigDialog::settingsChanged, this, &kdesvnpart::slotSettingsChanged);
0341     dialog->show();
0342 }
0343 
0344 /*!
0345     \fn kdesvnpart::slotSettingsChanged()
0346  */
0347 void kdesvnpart::slotSettingsChanged(const QString &)
0348 {
0349     QAction *temp;
0350     temp = actionCollection()->action(QStringLiteral("toggle_log_follows"));
0351     if (temp) {
0352         temp->setChecked(Kdesvnsettings::log_follows_nodes());
0353     }
0354     temp = actionCollection()->action(QStringLiteral("toggle_ignored_files"));
0355     if (temp) {
0356         temp->setChecked(Kdesvnsettings::display_ignored_files());
0357     }
0358 #if 0
0359     /// not needed this momenta
0360     temp = actionCollection()->action("toggle_unknown_files");
0361     if (temp) {
0362         ((KToggleAction *)temp)->setChecked(kdesvnpart_Prefs::self()->mdisp_unknown_files);
0363     }
0364 #endif
0365     emit settingsChanged();
0366 }
0367 
0368 void kdesvnpart::showDbStatus()
0369 {
0370     if (m_view) {
0371         m_view->stopCacheThreads();
0372         DbOverview::showDbOverview(svn::ClientP());
0373     }
0374 }
0375 
0376 #include "kdesvn_part.moc"
0377 
0378 #include "moc_kdesvn_part.cpp"