joachim99@81: /* This file is part of the KDiff3 project joachim99@81: joachim99@81: Copyright (C) 2008 Joachim Eibl joachim99@81: joachim99@81: This program is free software; you can redistribute it and/or joachim99@81: modify it under the terms of the GNU General Public joachim99@81: License as published by the Free Software Foundation; version 2 joachim99@81: of the License. joachim99@81: joachim99@81: This program is distributed in the hope that it will be useful, joachim99@81: but WITHOUT ANY WARRANTY; without even the implied warranty of joachim99@81: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU joachim99@81: General Public License for more details. joachim99@81: joachim99@81: You should have received a copy of the GNU General Public License joachim99@81: along with this program; see the file COPYING. If not, write to joachim99@81: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, joachim99@81: Boston, MA 02111-1307, USA. joachim99@81: */ joachim99@81: joachim99@81: #include "kdiff3plugin.h" joachim99@81: joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: #include joachim99@81: joachim99@81: //#include joachim99@81: joachim99@81: static QStringList* s_pHistory=0; joachim99@81: joachim99@81: class KDiff3PluginFactory : public KGenericFactory < KDiff3Plugin, KonqPopupMenu > joachim99@81: { joachim99@81: KConfig* m_pConfig; joachim99@81: KConfigGroup* m_pConfigGroup; joachim99@81: public: joachim99@81: KDiff3PluginFactory( const char* instanceName = 0 ) joachim99@81: : KGenericFactory< KDiff3Plugin, KonqPopupMenu >( instanceName ) joachim99@81: { joachim99@81: m_pConfig = 0; joachim99@81: if (s_pHistory==0) joachim99@81: { joachim99@81: //std::cout << "New History: " << instanceName << std::endl; joachim99@81: s_pHistory = new QStringList; joachim99@81: m_pConfig = new KConfig( "kdiff3pluginrc", KConfig::SimpleConfig ); joachim99@81: m_pConfigGroup = new KConfigGroup( m_pConfig, "KDiff3Plugin" ); joachim99@81: *s_pHistory = m_pConfigGroup->readEntry("HistoryStack", QStringList() ); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: ~KDiff3PluginFactory() joachim99@81: { joachim99@81: //std::cout << "Delete History" << std::endl; joachim99@81: if ( s_pHistory && m_pConfigGroup ) joachim99@81: m_pConfigGroup->writeEntry("HistoryStack",*s_pHistory); joachim99@81: delete s_pHistory; joachim99@81: delete m_pConfigGroup; joachim99@81: delete m_pConfig; joachim99@81: s_pHistory = 0; joachim99@81: m_pConfig = 0; joachim99@81: } joachim99@81: }; joachim99@81: joachim99@81: K_EXPORT_COMPONENT_FACTORY (libkdiff3plugin, KDiff3PluginFactory ("kdiff3plugin")) joachim99@81: joachim99@81: KDiff3Plugin::KDiff3Plugin( KonqPopupMenu* pPopupMenu, const QStringList & /* list */ ) joachim99@81: :KonqPopupMenuPlugin(pPopupMenu) joachim99@81: { joachim99@81: KGlobal::locale()->insertCatalog("kdiff3_plugin"); joachim99@81: m_pPopupMenu = pPopupMenu; joachim99@81: m_pParentWidget = pPopupMenu->parentWidget(); joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::setup( KActionCollection* actionCollection, const KonqPopupMenuInformation& popupMenuInfo, QMenu* pMenu ) joachim99@81: { joachim99@81: if (KStandardDirs::findExe("kdiff3").isNull ()) joachim99@81: return; joachim99@81: joachim99@81: // remember currently selected files (copy to a QStringList) joachim99@81: KFileItemList itemList = popupMenuInfo.items(); joachim99@81: foreach ( const KFileItem& item, itemList ) joachim99@81: { joachim99@81: //m_urlList.append( item.url() ); joachim99@81: m_list.append( item.url().url() ); joachim99@81: } joachim99@81: joachim99@81: joachim99@81: /* Menu structure: joachim99@81: KDiff3 -> (1 File selected): Save 'selection' for later comparison (push onto history stack) joachim99@81: Compare 'selection' with first file on history stack. joachim99@81: Compare 'selection' with -> choice from history stack joachim99@81: Merge 'selection' with first file on history stack. joachim99@81: Merge 'selection' with last two files on history stack. joachim99@81: (2 Files selected): Compare 's1' with 's2' joachim99@81: Merge 's1' with 's2' joachim99@81: (3 Files selected): Compare 's1', 's2' and 's3' joachim99@81: */ joachim99@81: joachim99@81: KActionMenu* pActionMenu = new KActionMenu (i18n ("KDiff3"), actionCollection ); joachim99@81: KAction* pAction = 0; joachim99@81: QString s; joachim99@81: joachim99@81: if(m_list.count() == 1) joachim99@81: { joachim99@81: int historyCount = s_pHistory ? s_pHistory->count() : 0; joachim99@81: s = i18n("Compare with %1", (historyCount>0 ? s_pHistory->front() : QString()) ); joachim99@81: pAction = new KAction ( s, actionCollection ); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareWith())); joachim99@81: pAction->setEnabled( m_list.count()>0 && historyCount>0 ); joachim99@81: pActionMenu->addAction(pAction); joachim99@81: joachim99@81: s = i18n("Merge with %1", historyCount>0 ? s_pHistory->front() : QString() ); joachim99@81: pAction = new KAction( s, actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotMergeWith())); joachim99@81: pAction->setEnabled( m_list.count()>0 && historyCount>0 ); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: joachim99@81: s = i18n("Save '%1' for later", ( m_list.front() ) ); joachim99@81: pAction = new KAction ( s, actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotSaveForLater())); joachim99@81: pAction->setEnabled( m_list.count()>0 ); joachim99@81: pActionMenu->addAction(pAction); joachim99@81: joachim99@81: pAction = new KAction (i18n("3-way merge with base"), actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotMergeThreeWay())); joachim99@81: pAction->setEnabled( m_list.count()>0 && historyCount>=2 ); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: joachim99@81: if ( s_pHistory && !s_pHistory->empty() ) joachim99@81: { joachim99@81: KActionMenu* pHistoryMenu = new KActionMenu( i18n("Compare with ..."), actionCollection ); joachim99@81: pHistoryMenu->setEnabled( m_list.count()>0 && historyCount>0 ); joachim99@81: pActionMenu->addAction(pHistoryMenu); joachim99@81: for (QStringList::iterator i = s_pHistory->begin(); i!=s_pHistory->end(); ++i) joachim99@81: { joachim99@81: pAction = new KAction( *i, actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareWithHistoryItem())); joachim99@81: pHistoryMenu->addAction (pAction); joachim99@81: } joachim99@81: joachim99@81: pAction = new KAction (i18n("Clear list"), actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotClearList())); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: pAction->setEnabled( historyCount>0 ); joachim99@81: } joachim99@81: } joachim99@81: else if(m_list.count() == 2) joachim99@81: { joachim99@81: pAction = new KAction (i18n("Compare"), actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareTwoFiles())); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: } joachim99@81: else if ( m_list.count() == 3 ) joachim99@81: { joachim99@81: pAction = new KAction (i18n("3 way comparison"), actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotCompareThreeFiles())); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: } joachim99@81: pAction = new KAction (i18n("About KDiff3 menu plugin ..."), actionCollection); joachim99@81: connect( pAction, SIGNAL(triggered(bool)), this, SLOT(slotAbout())); joachim99@81: pActionMenu->addAction (pAction); joachim99@81: joachim99@81: pMenu->addSeparator(); joachim99@81: pMenu->addAction( pActionMenu ); joachim99@81: pMenu->addSeparator(); joachim99@81: } joachim99@81: joachim99@81: KDiff3Plugin::~KDiff3Plugin () joachim99@81: { joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotCompareWith() joachim99@81: { joachim99@81: if ( m_list.count() > 0 && s_pHistory && ! s_pHistory->empty() ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << s_pHistory->front(); joachim99@81: args << m_list.front(); joachim99@81: KProcess::execute("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotCompareWithHistoryItem() joachim99@81: { joachim99@81: const KAction* pAction = dynamic_cast( sender() ); joachim99@81: if ( m_list.count() > 0 && pAction ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << pAction->text(); joachim99@81: args << m_list.front(); joachim99@81: KProcess::execute ("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotCompareTwoFiles() joachim99@81: { joachim99@81: if ( m_list.count() == 2 ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << m_list.front(); joachim99@81: args << m_list.back(); joachim99@81: KProcess::execute ("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotCompareThreeFiles() joachim99@81: { joachim99@81: if ( m_list.count() == 3 ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << m_list[0]; joachim99@81: args << m_list[1]; joachim99@81: args << m_list[2]; joachim99@81: KProcess::execute ("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotMergeWith() joachim99@81: { joachim99@81: if ( m_list.count() > 0 && s_pHistory && ! s_pHistory->empty() ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << s_pHistory->front(); joachim99@81: args << m_list.front(); joachim99@81: args << ( "-o" + m_list.front() ); joachim99@81: KProcess::execute ("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotMergeThreeWay() joachim99@81: { joachim99@81: if ( m_list.count() > 0 && s_pHistory && s_pHistory->count()>=2 ) joachim99@81: { joachim99@81: QStringList args; joachim99@81: args << (*s_pHistory)[1]; joachim99@81: args << (*s_pHistory)[0]; joachim99@81: args << m_list.front(); joachim99@81: args << ("-o" + m_list.front()); joachim99@81: KProcess::execute ("kdiff3", args); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotSaveForLater() joachim99@81: { joachim99@81: if ( !m_list.isEmpty() && s_pHistory ) joachim99@81: { joachim99@81: while ( s_pHistory->count()>=10 ) joachim99@81: s_pHistory->pop_back(); joachim99@81: s_pHistory->push_front( m_list.front() ); joachim99@81: } joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotClearList() joachim99@81: { joachim99@81: if ( s_pHistory ) joachim99@81: s_pHistory->clear(); joachim99@81: } joachim99@81: joachim99@81: void KDiff3Plugin::slotAbout() joachim99@81: { joachim99@81: QString s = i18n("KDiff3 Menu Plugin: Copyright (C) 2008 Joachim Eibl\n" joachim99@81: "KDiff3 homepage: http://kdiff3.sourceforge.net\n\n"); joachim99@81: s += i18n("Using the contextmenu extension:\n" joachim99@81: "For simple comparison of two selected files choose \"Compare\".\n" joachim99@81: "If the other file is somewhere else \"Save\" the first file for later. " joachim99@81: "It will appear in the \"Compare With ...\" submenu. " joachim99@81: "Then use \"Compare With\" on second file.\n" joachim99@81: "For a 3-way merge first \"Save\" the base file, then the branch to merge and " joachim99@81: "choose \"3-way merge with base\" on the other branch which will be used as destination.\n" joachim99@81: "Same also applies to directory comparison and merge."); joachim99@81: KMessageBox::information(m_pParentWidget, s, tr("About KDiff3 Menu Plugin") ); joachim99@81: } joachim99@81: