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"