annotate kdiff3/kdiff3plugin-QT4/kdiff3plugin.cpp @ 113:7bca1f1340f6 tip

Build fixes for Xcode 10 / Qt 5.12
author Chris Cannam
date Mon, 17 Dec 2018 11:13:01 +0000
parents 5d7e91c44e6d
children
rev   line source
joachim99@81 1 /* This file is part of the KDiff3 project
joachim99@81 2
joachim99@81 3 Copyright (C) 2008 Joachim Eibl <joachim dot eibl at gmx dot de>
joachim99@81 4
joachim99@81 5 This program is free software; you can redistribute it and/or
joachim99@81 6 modify it under the terms of the GNU General Public
joachim99@81 7 License as published by the Free Software Foundation; version 2
joachim99@81 8 of the License.
joachim99@81 9
joachim99@81 10 This program is distributed in the hope that it will be useful,
joachim99@81 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
joachim99@81 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
joachim99@81 13 General Public License for more details.
joachim99@81 14
joachim99@81 15 You should have received a copy of the GNU General Public License
joachim99@81 16 along with this program; see the file COPYING. If not, write to
joachim99@81 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
joachim99@81 18 Boston, MA 02111-1307, USA.
joachim99@81 19 */
joachim99@81 20
joachim99@81 21 #include "kdiff3plugin.h"
joachim99@81 22
joachim99@81 23 #include <kapplication.h>
joachim99@81 24 #include <kstandarddirs.h>
joachim99@81 25 #include <kaction.h>
joachim99@81 26 #include <kactionmenu.h>
joachim99@81 27 #include <klocale.h>
joachim99@81 28 #include <kgenericfactory.h>
joachim99@81 29 #include <kurl.h>
joachim99@81 30 #include <kconfig.h>
joachim99@81 31 #include <kconfiggroup.h>
joachim99@81 32 #include <konq_popupmenuinformation.h>
joachim99@81 33 #include <kmessagebox.h>
joachim99@81 34 #include <kprocess.h>
joachim99@81 35
joachim99@81 36 //#include <iostream>
joachim99@81 37
joachim99@81 38 static QStringList* s_pHistory=0;
joachim99@81 39
joachim99@81 40 class KDiff3PluginFactory : public KGenericFactory < KDiff3Plugin, KonqPopupMenu >
joachim99@81 41 {
joachim99@81 42 KConfig* m_pConfig;
joachim99@81 43 KConfigGroup* m_pConfigGroup;
joachim99@81 44 public:
joachim99@81 45 KDiff3PluginFactory( const char* instanceName = 0 )
joachim99@81 46 : KGenericFactory< KDiff3Plugin, KonqPopupMenu >( instanceName )
joachim99@81 47 {
joachim99@81 48 m_pConfig = 0;
joachim99@81 49 if (s_pHistory==0)
joachim99@81 50 {
joachim99@81 51 //std::cout << "New History: " << instanceName << std::endl;
joachim99@81 52 s_pHistory = new QStringList;
joachim99@81 53 m_pConfig = new KConfig( "kdiff3pluginrc", KConfig::SimpleConfig );
joachim99@81 54 m_pConfigGroup = new KConfigGroup( m_pConfig, "KDiff3Plugin" );
joachim99@81 55 *s_pHistory = m_pConfigGroup->readEntry("HistoryStack", QStringList() );
joachim99@81 56 }
joachim99@81 57 }
joachim99@81 58
joachim99@81 59 ~KDiff3PluginFactory()
joachim99@81 60 {
joachim99@81 61 //std::cout << "Delete History" << std::endl;
joachim99@81 62 if ( s_pHistory && m_pConfigGroup )
joachim99@81 63 m_pConfigGroup->writeEntry("HistoryStack",*s_pHistory);
joachim99@81 64 delete s_pHistory;
joachim99@81 65 delete m_pConfigGroup;
joachim99@81 66 delete m_pConfig;
joachim99@81 67 s_pHistory = 0;
joachim99@81 68 m_pConfig = 0;
joachim99@81 69 }
joachim99@81 70 };
joachim99@81 71
joachim99@81 72 K_EXPORT_COMPONENT_FACTORY (libkdiff3plugin, KDiff3PluginFactory ("kdiff3plugin"))
joachim99@81 73
joachim99@81 74 KDiff3Plugin::KDiff3Plugin( KonqPopupMenu* pPopupMenu, const QStringList & /* list */ )
joachim99@81 75 :KonqPopupMenuPlugin(pPopupMenu)
joachim99@81 76 {
joachim99@81 77 KGlobal::locale()->insertCatalog("kdiff3_plugin");
joachim99@81 78 m_pPopupMenu = pPopupMenu;
joachim99@81 79 m_pParentWidget = pPopupMenu->parentWidget();
joachim99@81 80 }
joachim99@81 81
joachim99@81 82 void KDiff3Plugin::setup( KActionCollection* actionCollection, const KonqPopupMenuInformation& popupMenuInfo, QMenu* pMenu )
joachim99@81 83 {
joachim99@81 84 if (KStandardDirs::findExe("kdiff3").isNull ())
joachim99@81 85 return;
joachim99@81 86
joachim99@81 87 // remember currently selected files (copy to a QStringList)
joachim99@81 88 KFileItemList itemList = popupMenuInfo.items();
joachim99@81 89 foreach ( const KFileItem& item, itemList )
joachim99@81 90 {
joachim99@81 91 //m_urlList.append( item.url() );
joachim99@81 92 m_list.append( item.url().url() );
joachim99@81 93 }
joachim99@81 94
joachim99@81 95
joachim99@81 96 /* Menu structure:
joachim99@81 97 KDiff3 -> (1 File selected): Save 'selection' for later comparison (push onto history stack)
joachim99@81 98 Compare 'selection' with first file on history stack.
joachim99@81 99 Compare 'selection' with -> choice from history stack
joachim99@81 100 Merge 'selection' with first file on history stack.
joachim99@81 101 Merge 'selection' with last two files on history stack.
joachim99@81 102 (2 Files selected): Compare 's1' with 's2'
joachim99@81 103 Merge 's1' with 's2'
joachim99@81 104 (3 Files selected): Compare 's1', 's2' and 's3'
joachim99@81 105 */
joachim99@81 106
joachim99@81 107 KActionMenu* pActionMenu = new KActionMenu (i18n ("KDiff3"), actionCollection );
joachim99@81 108 KAction* pAction = 0;
joachim99@81 109 QString s;
joachim99@81 110
joachim99@81 111 if(m_list.count() == 1)
joachim99@81 112 {
joachim99@81 113 int historyCount = s_pHistory ? s_pHistory->count() : 0;
joachim99@81 114 s = i18n("Compare with %1", (historyCount>0 ? s_pHistory->front() : QString()) );
joachim99@81 115 pAction = new KAction ( s, actionCollection );
joachim99@81 116 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareWith()));
joachim99@81 117 pAction->setEnabled( m_list.count()>0 && historyCount>0 );
joachim99@81 118 pActionMenu->addAction(pAction);
joachim99@81 119
joachim99@81 120 s = i18n("Merge with %1", historyCount>0 ? s_pHistory->front() : QString() );
joachim99@81 121 pAction = new KAction( s, actionCollection);
joachim99@81 122 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotMergeWith()));
joachim99@81 123 pAction->setEnabled( m_list.count()>0 && historyCount>0 );
joachim99@81 124 pActionMenu->addAction (pAction);
joachim99@81 125
joachim99@81 126 s = i18n("Save '%1' for later", ( m_list.front() ) );
joachim99@81 127 pAction = new KAction ( s, actionCollection);
joachim99@81 128 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotSaveForLater()));
joachim99@81 129 pAction->setEnabled( m_list.count()>0 );
joachim99@81 130 pActionMenu->addAction(pAction);
joachim99@81 131
joachim99@81 132 pAction = new KAction (i18n("3-way merge with base"), actionCollection);
joachim99@81 133 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotMergeThreeWay()));
joachim99@81 134 pAction->setEnabled( m_list.count()>0 && historyCount>=2 );
joachim99@81 135 pActionMenu->addAction (pAction);
joachim99@81 136
joachim99@81 137 if ( s_pHistory && !s_pHistory->empty() )
joachim99@81 138 {
joachim99@81 139 KActionMenu* pHistoryMenu = new KActionMenu( i18n("Compare with ..."), actionCollection );
joachim99@81 140 pHistoryMenu->setEnabled( m_list.count()>0 && historyCount>0 );
joachim99@81 141 pActionMenu->addAction(pHistoryMenu);
joachim99@81 142 for (QStringList::iterator i = s_pHistory->begin(); i!=s_pHistory->end(); ++i)
joachim99@81 143 {
joachim99@81 144 pAction = new KAction( *i, actionCollection);
joachim99@81 145 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareWithHistoryItem()));
joachim99@81 146 pHistoryMenu->addAction (pAction);
joachim99@81 147 }
joachim99@81 148
joachim99@81 149 pAction = new KAction (i18n("Clear list"), actionCollection);
joachim99@81 150 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotClearList()));
joachim99@81 151 pActionMenu->addAction (pAction);
joachim99@81 152 pAction->setEnabled( historyCount>0 );
joachim99@81 153 }
joachim99@81 154 }
joachim99@81 155 else if(m_list.count() == 2)
joachim99@81 156 {
joachim99@81 157 pAction = new KAction (i18n("Compare"), actionCollection);
joachim99@81 158 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareTwoFiles()));
joachim99@81 159 pActionMenu->addAction (pAction);
joachim99@81 160 }
joachim99@81 161 else if ( m_list.count() == 3 )
joachim99@81 162 {
joachim99@81 163 pAction = new KAction (i18n("3 way comparison"), actionCollection);
joachim99@81 164 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareThreeFiles()));
joachim99@81 165 pActionMenu->addAction (pAction);
joachim99@81 166 }
joachim99@81 167 pAction = new KAction (i18n("About KDiff3 menu plugin ..."), actionCollection);
joachim99@81 168 connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotAbout()));
joachim99@81 169 pActionMenu->addAction (pAction);
joachim99@81 170
joachim99@81 171 pMenu->addSeparator();
joachim99@81 172 pMenu->addAction( pActionMenu );
joachim99@81 173 pMenu->addSeparator();
joachim99@81 174 }
joachim99@81 175
joachim99@81 176 KDiff3Plugin::~KDiff3Plugin ()
joachim99@81 177 {
joachim99@81 178 }
joachim99@81 179
joachim99@81 180 void KDiff3Plugin::slotCompareWith()
joachim99@81 181 {
joachim99@81 182 if ( m_list.count() > 0 && s_pHistory && ! s_pHistory->empty() )
joachim99@81 183 {
joachim99@81 184 QStringList args;
joachim99@81 185 args << s_pHistory->front();
joachim99@81 186 args << m_list.front();
joachim99@81 187 KProcess::execute("kdiff3", args);
joachim99@81 188 }
joachim99@81 189 }
joachim99@81 190
joachim99@81 191 void KDiff3Plugin::slotCompareWithHistoryItem()
joachim99@81 192 {
joachim99@81 193 const KAction* pAction = dynamic_cast<const KAction*>( sender() );
joachim99@81 194 if ( m_list.count() > 0 && pAction )
joachim99@81 195 {
joachim99@81 196 QStringList args;
joachim99@81 197 args << pAction->text();
joachim99@81 198 args << m_list.front();
joachim99@81 199 KProcess::execute ("kdiff3", args);
joachim99@81 200 }
joachim99@81 201 }
joachim99@81 202
joachim99@81 203 void KDiff3Plugin::slotCompareTwoFiles()
joachim99@81 204 {
joachim99@81 205 if ( m_list.count() == 2 )
joachim99@81 206 {
joachim99@81 207 QStringList args;
joachim99@81 208 args << m_list.front();
joachim99@81 209 args << m_list.back();
joachim99@81 210 KProcess::execute ("kdiff3", args);
joachim99@81 211 }
joachim99@81 212 }
joachim99@81 213
joachim99@81 214 void KDiff3Plugin::slotCompareThreeFiles()
joachim99@81 215 {
joachim99@81 216 if ( m_list.count() == 3 )
joachim99@81 217 {
joachim99@81 218 QStringList args;
joachim99@81 219 args << m_list[0];
joachim99@81 220 args << m_list[1];
joachim99@81 221 args << m_list[2];
joachim99@81 222 KProcess::execute ("kdiff3", args);
joachim99@81 223 }
joachim99@81 224 }
joachim99@81 225
joachim99@81 226 void KDiff3Plugin::slotMergeWith()
joachim99@81 227 {
joachim99@81 228 if ( m_list.count() > 0 && s_pHistory && ! s_pHistory->empty() )
joachim99@81 229 {
joachim99@81 230 QStringList args;
joachim99@81 231 args << s_pHistory->front();
joachim99@81 232 args << m_list.front();
joachim99@81 233 args << ( "-o" + m_list.front() );
joachim99@81 234 KProcess::execute ("kdiff3", args);
joachim99@81 235 }
joachim99@81 236 }
joachim99@81 237
joachim99@81 238 void KDiff3Plugin::slotMergeThreeWay()
joachim99@81 239 {
joachim99@81 240 if ( m_list.count() > 0 && s_pHistory && s_pHistory->count()>=2 )
joachim99@81 241 {
joachim99@81 242 QStringList args;
joachim99@81 243 args << (*s_pHistory)[1];
joachim99@81 244 args << (*s_pHistory)[0];
joachim99@81 245 args << m_list.front();
joachim99@81 246 args << ("-o" + m_list.front());
joachim99@81 247 KProcess::execute ("kdiff3", args);
joachim99@81 248 }
joachim99@81 249 }
joachim99@81 250
joachim99@81 251 void KDiff3Plugin::slotSaveForLater()
joachim99@81 252 {
joachim99@81 253 if ( !m_list.isEmpty() && s_pHistory )
joachim99@81 254 {
joachim99@81 255 while ( s_pHistory->count()>=10 )
joachim99@81 256 s_pHistory->pop_back();
joachim99@81 257 s_pHistory->push_front( m_list.front() );
joachim99@81 258 }
joachim99@81 259 }
joachim99@81 260
joachim99@81 261 void KDiff3Plugin::slotClearList()
joachim99@81 262 {
joachim99@81 263 if ( s_pHistory )
joachim99@81 264 s_pHistory->clear();
joachim99@81 265 }
joachim99@81 266
joachim99@81 267 void KDiff3Plugin::slotAbout()
joachim99@81 268 {
joachim99@81 269 QString s = i18n("KDiff3 Menu Plugin: Copyright (C) 2008 Joachim Eibl\n"
joachim99@81 270 "KDiff3 homepage: http://kdiff3.sourceforge.net\n\n");
joachim99@81 271 s += i18n("Using the contextmenu extension:\n"
joachim99@81 272 "For simple comparison of two selected files choose \"Compare\".\n"
joachim99@81 273 "If the other file is somewhere else \"Save\" the first file for later. "
joachim99@81 274 "It will appear in the \"Compare With ...\" submenu. "
joachim99@81 275 "Then use \"Compare With\" on second file.\n"
joachim99@81 276 "For a 3-way merge first \"Save\" the base file, then the branch to merge and "
joachim99@81 277 "choose \"3-way merge with base\" on the other branch which will be used as destination.\n"
joachim99@81 278 "Same also applies to directory comparison and merge.");
joachim99@81 279 KMessageBox::information(m_pParentWidget, s, tr("About KDiff3 Menu Plugin") );
joachim99@81 280 }
joachim99@81 281