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
|