From 76718abdb2138623102398a10f3228e576dd0ae8 Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 10 Feb 2010 01:27:27 +0000 Subject: Added abandoned KDE3 version of kdiff3 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kdiff3@1088041 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdiff3plugin/kdiff3plugin.cpp | 263 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100755 kdiff3plugin/kdiff3plugin.cpp (limited to 'kdiff3plugin/kdiff3plugin.cpp') diff --git a/kdiff3plugin/kdiff3plugin.cpp b/kdiff3plugin/kdiff3plugin.cpp new file mode 100755 index 0000000..293f899 --- /dev/null +++ b/kdiff3plugin/kdiff3plugin.cpp @@ -0,0 +1,263 @@ +/* This file is part of the KDiff3 project + + Copyright (C) 2006 Joachim Eibl + + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kdiff3plugin.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +//#include + +static QStringList* s_pHistory=0; + +class KDiff3PluginFactory : public KGenericFactory < KDiff3Plugin, KonqPopupMenu > +{ + KSimpleConfig* m_pConfig; +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 KSimpleConfig( "kdiff3pluginrc", false ); + *s_pHistory = m_pConfig->readListEntry("HistoryStack"); + } + } + + ~KDiff3PluginFactory() + { + //std::cout << "Delete History" << std::endl; + if ( s_pHistory && m_pConfig ) + m_pConfig->writeEntry("HistoryStack",*s_pHistory); + delete s_pHistory; + delete m_pConfig; + s_pHistory = 0; + m_pConfig = 0; + } +}; + +K_EXPORT_COMPONENT_FACTORY (libkdiff3plugin, KDiff3PluginFactory ("kdiff3plugin")) + +KDiff3Plugin::KDiff3Plugin( KonqPopupMenu* pPopupmenu, const char *name, const QStringList & /* list */ ) +:KonqPopupMenuPlugin (pPopupmenu, name) +{ + if (KStandardDirs::findExe ("kdiff3").isNull ()) + return; + + m_pParentWidget = pPopupmenu->parentWidget(); + + KGlobal::locale()->insertCatalogue("kdiff3_plugin"); + + // remember currently selected files (copy to a QStringList) + KFileItemList itemList = pPopupmenu->fileItemList(); + for ( KFileItem *item = itemList.first(); item; item = itemList.next() ) + { + //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"), "kdiff3", actionCollection (), "kdiff3_menu" ); + KAction* pAction = 0; + QString s; + + if(m_list.count() == 1) + { + int historyCount = s_pHistory ? s_pHistory->count() : 0; + s = i18n("Compare with %1").arg( historyCount>0 ? s_pHistory->front() : QString() ); + pAction = new KAction ( s,0, this, SLOT(slotCompareWith()), actionCollection()); + pAction->setEnabled( m_list.count()>0 && historyCount>0 ); + pActionMenu->insert (pAction); + + s = i18n("Merge with %1").arg( historyCount>0 ? s_pHistory->front() : QString() ); + pAction = new KAction( s, 0, this, SLOT(slotMergeWith()), actionCollection()); + pAction->setEnabled( m_list.count()>0 && historyCount>0 ); + pActionMenu->insert (pAction); + + s = i18n("Save '%1' for later").arg( ( m_list.front() ) ); + pAction = new KAction ( s, 0, this, SLOT(slotSaveForLater()), actionCollection()); + pAction->setEnabled( m_list.count()>0 ); + pActionMenu->insert(pAction); + + pAction = new KAction (i18n("3-way merge with base"), 0, this, SLOT(slotMergeThreeWay()), actionCollection()); + pAction->setEnabled( m_list.count()>0 && historyCount>=2 ); + pActionMenu->insert (pAction); + + if ( s_pHistory && !s_pHistory->empty() ) + { + KActionMenu* pHistoryMenu = new KActionMenu( i18n("Compare with ..."), "CompareWith", actionCollection (), "kdiff3_history_menu"); + pHistoryMenu->setEnabled( m_list.count()>0 && historyCount>0 ); + pActionMenu->insert(pHistoryMenu); + for (QStringList::iterator i = s_pHistory->begin(); i!=s_pHistory->end(); ++i) + { + pAction = new KAction( *i, "History", 0, this, SLOT(slotCompareWithHistoryItem()), actionCollection()); + pHistoryMenu->insert (pAction); + } + + pAction = new KAction (i18n("Clear list"), 0, this, SLOT(slotClearList()), actionCollection()); + pActionMenu->insert (pAction); + pAction->setEnabled( historyCount>0 ); + } + } + else if(m_list.count() == 2) + { + pAction = new KAction (i18n("Compare"), 0, this, SLOT(slotCompareTwoFiles()), actionCollection()); + pActionMenu->insert (pAction); + } + else if ( m_list.count() == 3 ) + { + pAction = new KAction (i18n("3 way comparison"), 0, this, SLOT(slotCompareThreeFiles()), actionCollection()); + pActionMenu->insert (pAction); + } + pAction = new KAction (i18n("About KDiff3 menu plugin ..."), 0, this, SLOT(slotAbout()), actionCollection()); + pActionMenu->insert (pAction); + + addSeparator(); + addAction( pActionMenu ); + 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(); + kapp->kdeinitExec ("kdiff3", args); + } +} + +void KDiff3Plugin::slotCompareWithHistoryItem() +{ + const KAction* pAction = dynamic_cast( sender() ); + if ( m_list.count() > 0 && pAction ) + { + QStringList args; + args << pAction->text(); + args << m_list.front(); + kapp->kdeinitExec ("kdiff3", args); + } +} + +void KDiff3Plugin::slotCompareTwoFiles() +{ + if ( m_list.count() == 2 ) + { + QStringList args; + args << m_list.front(); + args << m_list.back(); + kapp->kdeinitExec ("kdiff3", args); + } +} + +void KDiff3Plugin::slotCompareThreeFiles() +{ + if ( m_list.count() == 3 ) + { + QStringList args; + args << m_list[0]; + args << m_list[1]; + args << m_list[2]; + kapp->kdeinitExec ("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() ); + kapp->kdeinitExec ("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()); + kapp->kdeinitExec ("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) 2006 Joachim Eibl\n" + "KDiff3 homepage: http://kdiff3.sourceforge.net\n\n"); + s += i18n("Using the contextmenu extension:\n" + "For simple comparison of two selected 2 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") ); +} + +#include "kdiff3plugin.moc" -- cgit v1.2.1