diff --git a/src/kdiff3_part.cpp b/src/kdiff3_part.cpp index e55871c..b72c30f 100644 --- a/src/kdiff3_part.cpp +++ b/src/kdiff3_part.cpp @@ -1,276 +1,273 @@ /*************************************************************************** * Copyright (C) 2003-2007 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; either version 2 of the License, or * * (at your option) any later version. * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "kdiff3_part.h" - -#include -#include -#include +#include "fileaccess.h" +#include "kdiff3.h" #include #include #include -#include "fileaccess.h" -#include "kdiff3.h" - +#include +#include #include #include #include static KAboutData createAboutData() { QString appVersion = QString(KDIFF3_VERSION_STRING); if(sizeof(void*) == 8) appVersion += " (64 bit)"; else if(sizeof(void*) == 4) appVersion += " (32 bit)"; KAboutData aboutData(QLatin1String("kdiff3part"), i18n("KDiff3 Part"), appVersion, i18n("A KPart to display SVG images"), KAboutLicense::GPL_V2, i18n("Copyright 2007, Aurélien Gâteau ")); aboutData.addAuthor(i18n("Joachim Eibl"), QString(), QString("joachim.eibl at gmx.de")); return aboutData; } K_PLUGIN_FACTORY(KDiff3PartFactory, registerPlugin();) //K_EXPORT_PLUGIN( KDiff3PartFactory(createAboutData())) KDiff3Part::KDiff3Part(QWidget* parentWidget, QObject* parent, const QVariantList& args) : KParts::ReadWritePart(parent) { //set AboutData setComponentData(createAboutData()); const QString widgetName = args[0].toString(); // this should be your custom internal widget m_widget = new KDiff3App(parentWidget, widgetName, this); //FIXME: This hack is necessary to avoid a crash when the program terminates. m_bIsShell = qobject_cast(parentWidget) != nullptr; // notify the part that this is our internal widget setWidget(m_widget); // create our actions //KStandardAction::open(this, SLOT(fileOpen()), actionCollection()); //KStandardAction::saveAs(this, SLOT(fileSaveAs()), actionCollection()); //KStandardAction::save(this, SLOT(save()), actionCollection()); setXMLFile("kdiff3_part.rc"); // we are read-write by default setReadWrite(true); // we are not modified since we haven't done anything yet setModified(false); } KDiff3Part::~KDiff3Part() { if(m_widget != nullptr && !m_bIsShell) { m_widget->saveOptions(KSharedConfig::openConfig()); } } void KDiff3Part::setReadWrite(bool /*rw*/) { // ReadWritePart::setReadWrite(rw); } void KDiff3Part::setModified(bool /*modified*/) { /* // get a handle on our Save action and make sure it is valid QAction *save = actionCollection()->action(KStandardAction::stdName(KStandardAction::Save)); if (!save) return; // if so, we either enable or disable it based on the current // state if (modified) save->setEnabled(true); else save->setEnabled(false); // in any event, we want our parent to do it's thing ReadWritePart::setModified(modified); */ } static void getNameAndVersion(const QString& str, const QString& lineStart, QString& fileName, QString& version) { if(str.left(lineStart.length()) == lineStart && fileName.isEmpty()) { int pos = lineStart.length(); while(pos < str.length() && (str[pos] == ' ' || str[pos] == '\t')) ++pos; int pos2 = str.length() - 1; while(pos2 > pos) { while(pos2 > pos && str[pos2] != ' ' && str[pos2] != '\t') --pos2; fileName = str.mid(pos, pos2 - pos); fprintf(stderr, "KDiff3: %s\n", fileName.toLatin1().constData()); if(FileAccess(fileName).exists()) break; --pos2; } int vpos = str.lastIndexOf("\t", -1); if(vpos > 0 && vpos > (int)pos2) { version = str.mid(vpos + 1); while(!version.right(1)[0].isLetterOrNumber()) version.truncate(version.length() - 1); } } } bool KDiff3Part::openFile() { // m_file is always local so we can use QFile on it fprintf(stderr, "KDiff3: %s\n", localFilePath().toLatin1().constData()); QFile file(localFilePath()); if(file.open(QIODevice::ReadOnly) == false) return false; // our example widget is text-based, so we use QTextStream instead // of a raw QDataStream QTextStream stream(&file); QString str; QString fileName1; QString fileName2; QString version1; QString version2; while(!stream.atEnd() && (fileName1.isEmpty() || fileName2.isEmpty())) { str = stream.readLine() + "\n"; getNameAndVersion(str, "---", fileName1, version1); getNameAndVersion(str, "+++", fileName2, version2); } file.close(); if(fileName1.isEmpty() && fileName2.isEmpty()) { KMessageBox::sorry(m_widget, i18n("Could not find files for comparison.")); return false; } FileAccess f1(fileName1); FileAccess f2(fileName2); if(f1.exists() && f2.exists() && fileName1 != fileName2) { m_widget->slotFileOpen2(fileName1, fileName2, "", "", "", "", "", nullptr); return true; } else if(version1.isEmpty() && f1.exists()) { // Normal patch // patch -f -u --ignore-whitespace -i [inputfile] -o [outfile] [patchfile] QString tempFileName = FileAccess::tempFileName(); QString cmd = "patch -f -u --ignore-whitespace -i \"" + localFilePath() + "\" -o \"" + tempFileName + "\" \"" + fileName1 + "\""; QProcess process; process.start(cmd); process.waitForFinished(-1); m_widget->slotFileOpen2(fileName1, tempFileName, "", "", "", version2.isEmpty() ? fileName2 : "REV:" + version2 + ":" + fileName2, "", nullptr); // alias names // std::cerr << "KDiff3: f1:" << fileName1.toLatin1() <<"<->"<slotFileOpen2(tempFileName, fileName2, "", "", version1.isEmpty() ? fileName1 : "REV:" + version1 + ":" + fileName1, "", "", nullptr); // alias name // std::cerr << "KDiff3: f2:" << fileName2.toLatin1() <<"<->"<%s\n", fileName1.toLatin1().constData(), fileName2.toLatin1().constData()); // Assuming that files are on CVS: Try to get them // cvs update -p -r [REV] [FILE] > [OUTPUTFILE] QString tempFileName1 = FileAccess::tempFileName(); QString cmd1 = "cvs update -p -r " + version1 + " \"" + fileName1 + "\" >\"" + tempFileName1 + "\""; QProcess process1; process1.start(cmd1); process1.waitForFinished(-1); QString tempFileName2 = FileAccess::tempFileName(); QString cmd2 = "cvs update -p -r " + version2 + " \"" + fileName2 + "\" >\"" + tempFileName2 + "\""; QProcess process2; process2.start(cmd2); process2.waitForFinished(-1); m_widget->slotFileOpen2(tempFileName1, tempFileName2, "", "", "REV:" + version1 + ":" + fileName1, "REV:" + version2 + ":" + fileName2, "", nullptr); // std::cerr << "KDiff3: f1/2:" << tempFileName1.toLatin1() <<"<->"<text(); file.close(); return true; */ return false; // Not implemented } #include "kdiff3_part.moc" diff --git a/src/main.cpp b/src/main.cpp index 683cd21..80c3f66 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,212 +1,207 @@ /*************************************************************************** main.cpp - Where everything starts. ------------------- begin : Don Jul 11 12:31:29 CEST 2002 copyright : (C) 2002-2007 by Joachim Eibl email : joachim.eibl at gmx.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; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ -#include "common.h" #include "kdiff3_shell.h" #include #include #include #include #include #include #include #include #include #include #include #include -#include #include -#include -//#include -#include #ifdef Q_OS_WIN #include #include #endif void initialiseCmdLineArgs(QCommandLineParser* cmdLineParser) { QString configFileName = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, "kdiff3rc"); QFile configFile(configFileName); QString ignorableOptionsLine = "-u;-query;-html;-abort"; if(configFile.open(QIODevice::ReadOnly)) { QTextStream ts(&configFile); while(!ts.atEnd()) { QString line = ts.readLine(); if(line.startsWith(QLatin1String("IgnorableCmdLineOptions="))) { int pos = line.indexOf('='); if(pos >= 0) { ignorableOptionsLine = line.mid(pos + 1); } break; } } } //support our own old preferances this is obsolete QStringList sl = ignorableOptionsLine.split(','); if(!sl.isEmpty()) { QStringList ignorableOptions = sl.front().split(';'); for(QStringList::iterator i = ignorableOptions.begin(); i != ignorableOptions.end(); ++i) { (*i).remove('-'); if(!(*i).isEmpty()) { if(i->length() == 1) { cmdLineParser->addOption(QCommandLineOption(QStringList() << *i << QLatin1String("ignore"), i18n("Ignored. (User defined.)"))); } else { cmdLineParser->addOption(QCommandLineOption(QStringList() << *i, i18n("Ignored. (User defined.)"))); } } } } } #ifdef Q_OS_WIN // This command checks the comm static bool isOptionUsed(const QString& s, int argc, char* argv[]) { for(int j = 0; j < argc; ++j) { if(QString("-" + s) == QLatin1String(argv[j]) || QString("--" + s) == QLatin1String(argv[j])) { return true; } } return false; } #endif int main(int argc, char* argv[]) { const QLatin1String appName("kdiff3"); QApplication app(argc, argv); // KAboutData and QCommandLineParser depend on this being setup. KLocalizedString::setApplicationDomain(appName.data()); KCrash::initialize(); const QString i18nName = i18n("KDiff3"); QString appVersion(KDIFF3_VERSION_STRING); if(sizeof(void*) == 8) appVersion += i18n(" (64 bit)"); else if(sizeof(void*) == 4) appVersion += i18n(" (32 bit)"); const QString description = i18n("Tool for Comparison and Merge of Files and Directories"); const QString copyright = i18n("(c) 2002-2014 Joachim Eibl, (c) 2017 Michael Reeves KF5/Qt5 port"); const QString homePage = QStringLiteral(""); const QString bugsAddress = QStringLiteral("reeves.87""@""gmail.com"); KAboutData aboutData(appName, i18nName, appVersion, description, KAboutLicense::GPL_V2, copyright, description, homePage, bugsAddress); KAboutData::setApplicationData(aboutData); QCommandLineParser* cmdLineParser = KDiff3Shell::getParser(); cmdLineParser->setApplicationDescription(aboutData.shortDescription()); cmdLineParser->addVersionOption(); cmdLineParser->addHelpOption(); aboutData.setupCommandLine(cmdLineParser); initialiseCmdLineArgs(cmdLineParser); // ignorable command options cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("m") << QLatin1String("merge"), i18n("Merge the input."))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("b") << QLatin1String("base"), i18n("Explicit base file. For compatibility with certain tools."), QLatin1String("file"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("o") << QLatin1String("output"), i18n("Output file. Implies -m. E.g.: -o newfile.txt"), QLatin1String("file"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("out"), i18n("Output file, again. (For compatibility with certain tools.)"), QLatin1String("file"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("auto"), i18n("No GUI if all conflicts are auto-solvable. (Needs -o file)"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("qall"), i18n("Do not solve conflicts automatically."))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("L1"), i18n("Visible name replacement for input file 1 (base)."), QLatin1String("alias1"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("L2"), i18n("Visible name replacement for input file 2."), QLatin1String("alias2"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("L3"), i18n("Visible name replacement for input file 3."), QLatin1String("alias3"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("L") << QLatin1String("fname alias"), i18n("Alternative visible name replacement. Supply this once for every input."))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("cs"), i18n("Override a config setting. Use once for every setting. E.g.: --cs \"AutoAdvance=1\""), QLatin1String("string"))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("confighelp"), i18n("Show list of config settings and current values."))); cmdLineParser->addOption(QCommandLineOption(QStringList() << QLatin1String("config"), i18n("Use a different config file."), QLatin1String("file"))); // other command options cmdLineParser->addPositionalArgument(QLatin1String("[File1]"), i18n("file1 to open (base, if not specified via --base)")); cmdLineParser->addPositionalArgument(QLatin1String("[File2]"), i18n("file2 to open")); cmdLineParser->addPositionalArgument(QLatin1String("[File3]"), i18n("file3 to open")); /* Don't use QCommandLineParser::process as it auto terminates the program if an option is not reconized. Further more errors are directed to the console alone if not running on windows. This makes for a bad user experiance when run from a graphical interface such as kde. Don't assume that this only happens when running from a commandline. */ if(!cmdLineParser->parse(QCoreApplication::arguments())) { QString errorMessage = cmdLineParser->errorText(); QString helpText = cmdLineParser->helpText(); QMessageBox::warning(nullptr, aboutData.displayName(), "

" + errorMessage + "

" + i18n("See kdiff3 --help for supported options.") + "
"); #if !defined(Q_OS_WIN) fputs(qPrintable(errorMessage), stderr); fputs("\n\n", stderr); fputs(qPrintable(helpText + "\n"), stderr); fputs("\n", stderr); #endif exit(1); } if(cmdLineParser->isSet(QStringLiteral("version"))) { QMessageBox::information(nullptr, aboutData.displayName(), aboutData.displayName() + ' ' + aboutData.version()); #if !defined(Q_OS_WIN) printf("%s %s\n", appName.data(), appVersion.toLocal8Bit().constData()); #endif exit(0); } if(cmdLineParser->isSet(QStringLiteral("help"))) { QMessageBox::warning(nullptr, aboutData.displayName(), "
" + cmdLineParser->helpText() + "
"); #if !defined(Q_OS_WIN) fputs(qPrintable(cmdLineParser->helpText()), stdout); #endif exit(0); } aboutData.processCommandLine(cmdLineParser); /** * take component name and org. name from KAboutData */ app.setApplicationName(aboutData.componentName()); app.setApplicationDisplayName(aboutData.displayName()); app.setOrganizationDomain(aboutData.organizationDomain()); app.setApplicationVersion(aboutData.version()); KDiff3Shell* p = new KDiff3Shell(); p->show(); //p->setWindowState( p->windowState() | Qt::WindowActive ); // Patch for ubuntu: window not active on startup //app.installEventFilter( new CFilter ); int retVal = app.exec(); /* if (QApplication::clipboard()->text().size() == 0) QApplication::clipboard()->clear(); // Patch for Ubuntu: Fix issue with Qt clipboard*/ return retVal; }