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"