File indexing completed on 2024-04-28 17:00:47

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 "settings/kdesvnsettings.h"
0023 #include "settings/displaysettings_impl.h"
0024 #include "settings/dispcolorsettings_impl.h"
0025 #include "settings/revisiontreesettingsdlg_impl.h"
0026 #include "settings/diffmergesettings_impl.h"
0027 #include "settings/subversionsettings_impl.h"
0028 #include "settings/cmdexecsettings_impl.h"
0029 #include "settings/polling_settings_impl.h"
0030 #include "kdesvnview.h"
0031 #include "commandline_part.h"
0032 #include "svnqt/version_check.h"
0033 #include "svnqt/url.h"
0034 #include "helpers/kdesvn_debug.h"
0035 #include "helpers/sshagent.h"
0036 #include "svnfrontend/database/dboverview.h"
0037 
0038 #include <ktoggleaction.h>
0039 #include <kactioncollection.h>
0040 #include <kstandardaction.h>
0041 #include <kxmlguifactory.h>
0042 #include <kaboutapplicationdialog.h>
0043 #include <kconfigdialog.h>
0044 #include <kaboutdata.h>
0045 #include <klocalizedstring.h>
0046 #include <khelpclient.h>
0047 #include <kpluginfactory.h>
0048 
0049 K_PLUGIN_FACTORY(KdesvnFactory, registerPlugin<kdesvnpart>(); registerPlugin<commandline_part>(QStringLiteral("commandline_part"));)
0050 
0051 static const char version[] = KDESVN_VERSION;
0052 
0053 kdesvnpart::kdesvnpart(QWidget *parentWidget, QObject *parent, const QVariantList &args)
0054     : KParts::ReadOnlyPart(parent)
0055 {
0056     Q_UNUSED(args);
0057     init(parentWidget, false);
0058 }
0059 
0060 kdesvnpart::kdesvnpart(QWidget *parentWidget, QObject *parent, bool ownapp, const QVariantList &args)
0061     : KParts::ReadOnlyPart(parent)
0062 {
0063     Q_UNUSED(args);
0064     init(parentWidget, ownapp);
0065 }
0066 
0067 void kdesvnpart::init(QWidget *parentWidget, bool full)
0068 {
0069     m_aboutDlg = nullptr;
0070     // we need an instance
0071     // TODO: KF5 port
0072     //setComponentData(KdesvnFactory::componentData());
0073 
0074     m_browserExt = new KdesvnBrowserExtension(this);
0075 
0076     // this should be your custom internal widget
0077     m_view = new kdesvnView(actionCollection(), parentWidget, full);
0078 
0079     // notify the part that this is our internal widget
0080     setWidget(m_view);
0081 
0082     // create our actions
0083     setupActions();
0084     // set our XML-UI resource file
0085 #ifdef TESTING_PARTRC
0086     setXMLFile(TESTING_PARTRC);
0087     qCDebug(KDESVN_LOG) << "Using test rc file in " << TESTING_PARTRC << endl;
0088 #else
0089     setXMLFile(QStringLiteral("kdesvn_part.rc"));
0090 #endif
0091     connect(m_view, &kdesvnView::sigShowPopup, this, &kdesvnpart::slotDispPopup);
0092     connect(m_view, &kdesvnView::sigSwitchUrl, this, &kdesvnpart::openUrl);
0093     connect(this, &kdesvnpart::refreshTree, m_view, &kdesvnView::refreshCurrentTree);
0094     connect(m_view, &kdesvnView::setWindowCaption, this, &kdesvnpart::setWindowCaption);
0095     connect(m_view, &kdesvnView::sigUrlChanged, this, &kdesvnpart::slotUrlChanged);
0096     connect(this, SIGNAL(settingsChanged()), widget(), SLOT(slotSettingsChanged()));
0097     SshAgent ssh;
0098     ssh.querySshAgent();
0099 }
0100 
0101 kdesvnpart::~kdesvnpart()
0102 {
0103     ///@todo replace with KDE4 like stuff
0104     //kdesvnpartFactory::instance()->config()->sync();
0105 }
0106 
0107 void kdesvnpart::slotUrlChanged(const QUrl &url)
0108 {
0109     setUrl(url);
0110 }
0111 
0112 bool kdesvnpart::openFile()
0113 {
0114     m_view->openUrl(url());
0115     // just for fun, set the status bar
0116     emit setStatusBarText(url().toString());
0117 
0118     return true;
0119 }
0120 
0121 bool kdesvnpart::openUrl(const QUrl &aUrl)
0122 {
0123     QUrl _url(aUrl);
0124 
0125     _url.setScheme(svn::Url::transformProtokoll(_url.scheme()));
0126 
0127     if (!_url.isValid() || !closeUrl()) {
0128         return false;
0129     }
0130     setUrl(_url);
0131     emit started(nullptr);
0132     bool ret = m_view->openUrl(url());
0133     if (ret) {
0134         emit completed();
0135         emit setWindowCaption(url().toString());
0136     }
0137     return ret;
0138 }
0139 
0140 void kdesvnpart::slotFileProperties()
0141 {
0142 }
0143 
0144 void kdesvnpart::slotDispPopup(const QString &name, QWidget **target)
0145 {
0146     *target = hostContainer(name);
0147 }
0148 
0149 /*!
0150     \fn kdesvnpart::setupActions()
0151  */
0152 void kdesvnpart::setupActions()
0153 {
0154     KToggleAction *toggletemp;
0155 
0156     toggletemp = new KToggleAction(i18n("Logs follow node changes"), this);
0157     actionCollection()->addAction(QStringLiteral("toggle_log_follows"), toggletemp);
0158     toggletemp->setChecked(Kdesvnsettings::log_follows_nodes());
0159     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotLogFollowNodes);
0160 
0161     toggletemp = new KToggleAction(i18n("Display ignored files"), this);
0162     actionCollection()->addAction(QStringLiteral("toggle_ignored_files"), toggletemp);
0163     toggletemp->setChecked(Kdesvnsettings::display_ignored_files());
0164     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotDisplayIgnored);
0165 
0166     toggletemp = new KToggleAction(i18n("Display unknown files"), this);
0167     actionCollection()->addAction(QStringLiteral("toggle_unknown_files"), toggletemp);
0168     toggletemp->setChecked(Kdesvnsettings::display_unknown_files());
0169     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotDisplayUnkown);
0170 
0171     toggletemp = new KToggleAction(i18n("Hide unchanged files"), this);
0172     actionCollection()->addAction(QStringLiteral("toggle_hide_unchanged_files"), toggletemp);
0173     toggletemp->setChecked(Kdesvnsettings::hide_unchanged_files());
0174     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotHideUnchanged);
0175 
0176     toggletemp = new KToggleAction(i18n("Work online"), this);
0177     actionCollection()->addAction(QStringLiteral("toggle_network"), toggletemp);
0178     toggletemp->setChecked(Kdesvnsettings::network_on());
0179     connect(toggletemp, &QAction::toggled, this, &kdesvnpart::slotEnableNetwork);
0180 
0181     QAction *t = KStandardAction::preferences(this, SLOT(slotShowSettings()), actionCollection());
0182 
0183     t->setText(i18n("Configure Kdesvn..."));
0184     actionCollection()->addAction(QStringLiteral("kdesvnpart_pref"), t);
0185 
0186     if (QCoreApplication::applicationName() != QLatin1String("kdesvn")) {
0187         t = new QAction(QIcon::fromTheme(QStringLiteral("kdesvn")), i18n("About kdesvn part"), this);
0188         connect(t, &QAction::triggered, this, &kdesvnpart::showAboutApplication);
0189         actionCollection()->addAction(QStringLiteral("help_about_kdesvnpart"), t);
0190 
0191         t = new QAction(QIcon::fromTheme(QStringLiteral("help-contents")), i18n("Kdesvn Handbook"), this);
0192         connect(t, &QAction::triggered, this, &kdesvnpart::appHelpActivated);
0193         actionCollection()->addAction(QStringLiteral("help_kdesvn"), t);
0194     }
0195 }
0196 
0197 void kdesvnpart::slotSshAdd()
0198 {
0199     SshAgent ag;
0200     ag.addSshIdentities(true);
0201 }
0202 
0203 /*!
0204     \fn kdesvnpart::slotLogFollowNodes(bool)
0205  */
0206 void kdesvnpart::slotLogFollowNodes(bool how)
0207 {
0208     Kdesvnsettings::setLog_follows_nodes(how);
0209     Kdesvnsettings::self()->save();
0210 }
0211 
0212 /*!
0213     \fn kdesvnpart::slotDiplayIgnored(bool)
0214  */
0215 void kdesvnpart::slotDisplayIgnored(bool how)
0216 {
0217     Kdesvnsettings::setDisplay_ignored_files(how);
0218     Kdesvnsettings::self()->save();
0219     emit settingsChanged();
0220 }
0221 
0222 /*!
0223     \fn kdesvnpart::slotDisplayUnknown(bool)
0224  */
0225 void kdesvnpart::slotDisplayUnkown(bool how)
0226 {
0227     Kdesvnsettings::setDisplay_unknown_files(how);
0228     Kdesvnsettings::self()->save();
0229     emit settingsChanged();
0230 }
0231 
0232 /*!
0233     \fn kdesvnpart::slotHideUnchanged(bool)
0234  */
0235 void kdesvnpart::slotHideUnchanged(bool how)
0236 {
0237     Kdesvnsettings::setHide_unchanged_files(how);
0238     Kdesvnsettings::self()->save();
0239     emit settingsChanged();
0240 }
0241 
0242 void kdesvnpart::slotEnableNetwork(bool how)
0243 {
0244     Kdesvnsettings::setNetwork_on(how);
0245     Kdesvnsettings::self()->save();
0246     emit settingsChanged();
0247 }
0248 
0249 /*!
0250     \fn kdesvnpart::closeURL()
0251  */
0252 bool kdesvnpart::closeUrl()
0253 {
0254     KParts::ReadOnlyPart::closeUrl();
0255     setUrl(QUrl());
0256     m_view->closeMe();
0257     emit setWindowCaption(QString());
0258     return true;
0259 }
0260 
0261 KdesvnBrowserExtension::KdesvnBrowserExtension(kdesvnpart *p)
0262     : KParts::BrowserExtension(p)
0263 {}
0264 
0265 KdesvnBrowserExtension::~KdesvnBrowserExtension()
0266 {
0267 
0268 }
0269 
0270 void KdesvnBrowserExtension::properties()
0271 {
0272     static_cast<kdesvnpart *>(parent())->slotFileProperties();
0273 }
0274 
0275 /*!
0276     \fn kdesvnpart::showAboutApplication()
0277  */
0278 void kdesvnpart::showAboutApplication()
0279 {
0280     if (!m_aboutDlg) {
0281         QString m_Extratext = 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(),
0324             QStringLiteral("kdesvnpart_settings"),
0325             Kdesvnsettings::self());
0326     dialog->setFaceType(KPageDialog::List);
0327 
0328     // TODO: KF5
0329     //dialog->setHelp("setup", "kdesvn");
0330     dialog->addPage(new DisplaySettings_impl(nullptr),
0331                     i18n("General"), QStringLiteral("configure"), i18n("General Settings"), true);
0332     dialog->addPage(new SubversionSettings_impl(nullptr),
0333                     i18n("Subversion"), QStringLiteral("kdesvn"), i18n("Subversion Settings"), true);
0334     dialog->addPage(new PollingSettings_impl(nullptr),
0335                     i18n("Timed jobs"), QStringLiteral("kdesvnclock"), i18n("Settings for timed jobs"), true);
0336     dialog->addPage(new DiffMergeSettings_impl(nullptr),
0337                     i18n("Diff & Merge"), QStringLiteral("kdesvnmerge"), i18n("Settings for diff and merge"), true);
0338     dialog->addPage(new DispColorSettings_impl(nullptr),
0339                     i18n("Colors"), QStringLiteral("kdesvncolors"), i18n("Color Settings"), true);
0340     dialog->addPage(new RevisiontreeSettingsDlg_impl(nullptr),
0341                     i18n("Revision tree"), QStringLiteral("kdesvntree"), i18n("Revision tree Settings"), true);
0342     dialog->addPage(new CmdExecSettings_impl(nullptr),
0343                     i18n("KIO / Command line"), QStringLiteral("kdesvnterminal"), i18n("Settings for command line and KIO execution"), true);
0344 
0345     connect(dialog, &KConfigDialog::settingsChanged, this, &kdesvnpart::slotSettingsChanged);
0346     dialog->show();
0347 }
0348 
0349 /*!
0350     \fn kdesvnpart::slotSettingsChanged()
0351  */
0352 void kdesvnpart::slotSettingsChanged(const QString &)
0353 {
0354     QAction *temp;
0355     temp = actionCollection()->action(QStringLiteral("toggle_log_follows"));
0356     if (temp) {
0357         temp->setChecked(Kdesvnsettings::log_follows_nodes());
0358     }
0359     temp = actionCollection()->action(QStringLiteral("toggle_ignored_files"));
0360     if (temp) {
0361         temp->setChecked(Kdesvnsettings::display_ignored_files());
0362     }
0363 #if 0
0364     /// not needed this momenta
0365     temp = actionCollection()->action("toggle_unknown_files");
0366     if (temp) {
0367         ((KToggleAction *)temp)->setChecked(kdesvnpart_Prefs::self()->mdisp_unknown_files);
0368     }
0369 #endif
0370     emit settingsChanged();
0371 }
0372 
0373 void kdesvnpart::showDbStatus()
0374 {
0375     if (m_view) {
0376         m_view->stopCacheThreads();
0377         DbOverview::showDbOverview(svn::ClientP());
0378     }
0379 }
0380 
0381 #include "kdesvn_part.moc"