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