annotate kdiff3/src/kdiff3_part.cpp @ 66:efe33e938730

0.9.86
author joachim99
date Thu, 16 Sep 2004 02:40:08 +0000
parents 32d5cbf9db71
children d7cafcda8c99
rev   line source
joachim99@8 1 /*
joachim99@8 2 * Copyright (C) 2003 Joachim Eibl <joachim.eibl@gmx.de>
joachim99@8 3 */
joachim99@8 4
joachim99@8 5 #include "kdiff3_part.h"
joachim99@8 6
joachim99@8 7 #include <kinstance.h>
joachim99@8 8 #include <kaction.h>
joachim99@8 9 #include <kstdaction.h>
joachim99@8 10 #include <kfiledialog.h>
joachim99@8 11
joachim99@8 12 #include <qfile.h>
joachim99@8 13 #include <qtextstream.h>
joachim99@8 14 #include "kdiff3.h"
joachim99@8 15 #include "fileaccess.h"
joachim99@8 16
joachim99@8 17 #include <kmessagebox.h>
joachim99@8 18 #include <klocale.h>
joachim99@8 19 #include <iostream>
joachim99@66 20
joachim99@66 21 #include "version.h"
joachim99@66 22
joachim99@8 23 KDiff3Part::KDiff3Part( QWidget *parentWidget, const char *widgetName,
joachim99@8 24 QObject *parent, const char *name )
joachim99@8 25 : KParts::ReadOnlyPart(parent, name)
joachim99@8 26 {
joachim99@8 27 // we need an instance
joachim99@8 28 setInstance( KDiff3PartFactory::instance() );
joachim99@8 29
joachim99@8 30 // this should be your custom internal widget
joachim99@8 31 m_widget = new KDiff3App( parentWidget, widgetName, this );
joachim99@8 32
joachim99@8 33 // This hack is necessary to avoid a crash when the program terminates.
joachim99@8 34 m_bIsShell = dynamic_cast<KParts::MainWindow*>(parentWidget)!=0;
joachim99@8 35
joachim99@8 36 // notify the part that this is our internal widget
joachim99@8 37 setWidget(m_widget);
joachim99@8 38
joachim99@8 39 // create our actions
joachim99@8 40 //KStdAction::open(this, SLOT(fileOpen()), actionCollection());
joachim99@8 41 //KStdAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
joachim99@8 42 //KStdAction::save(this, SLOT(save()), actionCollection());
joachim99@8 43
joachim99@8 44 setXMLFile("kdiff3_part.rc");
joachim99@8 45
joachim99@8 46 // we are read-write by default
joachim99@8 47 setReadWrite(true);
joachim99@8 48
joachim99@8 49 // we are not modified since we haven't done anything yet
joachim99@8 50 setModified(false);
joachim99@8 51 }
joachim99@8 52
joachim99@8 53 KDiff3Part::~KDiff3Part()
joachim99@8 54 {
joachim99@8 55 if ( m_widget!=0 && ! m_bIsShell )
joachim99@8 56 {
joachim99@8 57 m_widget->saveOptions( m_widget->isPart() ? instance()->config() : kapp->config() );
joachim99@8 58 }
joachim99@8 59 }
joachim99@8 60
joachim99@8 61 void KDiff3Part::setReadWrite(bool /*rw*/)
joachim99@8 62 {
joachim99@8 63 // ReadWritePart::setReadWrite(rw);
joachim99@8 64 }
joachim99@8 65
joachim99@8 66 void KDiff3Part::setModified(bool /*modified*/)
joachim99@8 67 {
joachim99@8 68 /*
joachim99@8 69 // get a handle on our Save action and make sure it is valid
joachim99@8 70 KAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save));
joachim99@8 71 if (!save)
joachim99@8 72 return;
joachim99@8 73
joachim99@8 74 // if so, we either enable or disable it based on the current
joachim99@8 75 // state
joachim99@8 76 if (modified)
joachim99@8 77 save->setEnabled(true);
joachim99@8 78 else
joachim99@8 79 save->setEnabled(false);
joachim99@8 80
joachim99@8 81 // in any event, we want our parent to do it's thing
joachim99@8 82 ReadWritePart::setModified(modified);
joachim99@8 83 */
joachim99@8 84 }
joachim99@8 85
joachim99@8 86 bool KDiff3Part::openFile()
joachim99@8 87 {
joachim99@8 88 // m_file is always local so we can use QFile on it
joachim99@8 89 QFile file(m_file);
joachim99@8 90 if (file.open(IO_ReadOnly) == false)
joachim99@8 91 return false;
joachim99@8 92
joachim99@8 93 // our example widget is text-based, so we use QTextStream instead
joachim99@8 94 // of a raw QDataStream
joachim99@8 95 QTextStream stream(&file);
joachim99@8 96 QString str;
joachim99@8 97 QString fileName1;
joachim99@8 98 QString fileName2;
joachim99@8 99 QString version1;
joachim99@8 100 QString version2;
joachim99@8 101 while (!stream.eof() && (fileName1.isEmpty() || fileName2.isEmpty()) )
joachim99@8 102 {
joachim99@8 103 str = stream.readLine() + "\n";
joachim99@8 104 if ( str.left(4)=="--- " && fileName1.isEmpty() )
joachim99@8 105 {
joachim99@8 106 int pos = str.find("\t");
joachim99@8 107 fileName1 = str.mid( 4, pos-4 );
joachim99@8 108 int vpos = str.findRev("\t", -1);
joachim99@8 109 if ( pos>0 && vpos>0 && vpos>pos )
joachim99@8 110 {
joachim99@8 111 version1 = str.mid( vpos+1 );
joachim99@8 112 while( !version1.right(1)[0].isLetterOrNumber() )
joachim99@8 113 version1.truncate( version1.length()-1 );
joachim99@8 114 }
joachim99@8 115 }
joachim99@8 116 if ( str.left(4)=="+++ " && fileName2.isEmpty() )
joachim99@8 117 {
joachim99@8 118 int pos = str.find("\t");
joachim99@8 119 fileName2 = str.mid( 4, pos-4 );
joachim99@8 120 int vpos = str.findRev("\t", -1);
joachim99@8 121 if ( pos>0 && vpos>0 && vpos>pos )
joachim99@8 122 {
joachim99@8 123 version2 = str.mid( vpos+1 );
joachim99@8 124 while( !version2.right(1)[0].isLetterOrNumber() )
joachim99@8 125 version2.truncate( version2.length()-1 );
joachim99@8 126 }
joachim99@8 127 }
joachim99@8 128 }
joachim99@8 129
joachim99@8 130 file.close();
joachim99@8 131
joachim99@8 132 if ( fileName1.isEmpty() && fileName2.isEmpty() )
joachim99@8 133 {
joachim99@8 134 KMessageBox::sorry(m_widget, i18n("Couldn't find files for comparison."));
joachim99@8 135 return false;
joachim99@8 136 }
joachim99@8 137
joachim99@8 138 FileAccess f1(fileName1);
joachim99@8 139 FileAccess f2(fileName2);
joachim99@8 140
joachim99@8 141 if ( f1.exists() && f2.exists() && fileName1!=fileName2 )
joachim99@8 142 {
joachim99@66 143 m_widget->slotFileOpen2( fileName1, fileName2, "", "", "", "", "", 0 );
joachim99@8 144 return true;
joachim99@8 145 }
joachim99@8 146 else if ( version1.isEmpty() && f1.exists() )
joachim99@8 147 {
joachim99@8 148 // Normal patch
joachim99@8 149 // patch -f -u --ignore-whitespace -i [inputfile] -o [outfile] [patchfile]
joachim99@8 150 QString tempFileName = FileAccess::tempFileName();
joachim99@8 151 QString cmd = "patch -f -u --ignore-whitespace -i " + m_file +
joachim99@8 152 " -o "+tempFileName + " " + fileName1;
joachim99@8 153
joachim99@8 154 ::system( cmd.ascii() );
joachim99@8 155
joachim99@8 156 m_widget->slotFileOpen2( fileName1, tempFileName, "", "",
joachim99@66 157 "", version2.isEmpty() ? fileName2 : "REV:"+version2+":"+fileName2, "", 0 ); // alias names
joachim99@8 158 FileAccess::removeFile( tempFileName );
joachim99@8 159 }
joachim99@8 160 else if ( version2.isEmpty() && f2.exists() )
joachim99@8 161 {
joachim99@8 162 // Reverse patch
joachim99@8 163 // patch -f -u -R --ignore-whitespace -i [inputfile] -o [outfile] [patchfile]
joachim99@8 164 QString tempFileName = FileAccess::tempFileName();
joachim99@8 165 QString cmd = "patch -f -u -R --ignore-whitespace -i " + m_file +
joachim99@8 166 " -o "+tempFileName + " " + fileName2;
joachim99@8 167
joachim99@8 168 ::system( cmd.ascii() );
joachim99@8 169
joachim99@8 170 m_widget->slotFileOpen2( tempFileName, fileName2, "", "",
joachim99@66 171 version1.isEmpty() ? fileName1 : "REV:"+version1+":"+fileName1, "", "", 0 ); // alias name
joachim99@8 172 FileAccess::removeFile( tempFileName );
joachim99@8 173 }
joachim99@8 174 else if ( !version1.isEmpty() && !version2.isEmpty() )
joachim99@8 175 {
joachim99@8 176 // Assuming that files are on CVS: Try to get them
joachim99@8 177 // cvs update -p -r [REV] [FILE] > [OUTPUTFILE]
joachim99@8 178
joachim99@8 179 QString tempFileName1 = FileAccess::tempFileName();
joachim99@8 180 QString cmd1 = "cvs update -p -r " + version1 + " " + fileName1 + " >"+tempFileName1;
joachim99@8 181 ::system( cmd1.ascii() );
joachim99@8 182
joachim99@8 183 QString tempFileName2 = FileAccess::tempFileName();
joachim99@8 184 QString cmd2 = "cvs update -p -r " + version2 + " " + fileName2 + " >"+tempFileName2;
joachim99@8 185 ::system( cmd2.ascii() );
joachim99@8 186
joachim99@8 187 m_widget->slotFileOpen2( tempFileName1, tempFileName2, "", "",
joachim99@8 188 "REV:"+version1+":"+fileName1,
joachim99@8 189 "REV:"+version2+":"+fileName2,
joachim99@66 190 "", 0
joachim99@8 191 );
joachim99@8 192
joachim99@8 193 FileAccess::removeFile( tempFileName1 );
joachim99@8 194 FileAccess::removeFile( tempFileName2 );
joachim99@8 195 return true;
joachim99@8 196 }
joachim99@8 197 else
joachim99@8 198 {
joachim99@8 199 KMessageBox::sorry(m_widget, i18n("Couldn't find files for comparison."));
joachim99@8 200 }
joachim99@8 201
joachim99@8 202 return true;
joachim99@8 203 }
joachim99@8 204
joachim99@8 205 bool KDiff3Part::saveFile()
joachim99@8 206 {
joachim99@8 207 /* // if we aren't read-write, return immediately
joachim99@8 208 if (isReadWrite() == false)
joachim99@8 209 return false;
joachim99@8 210
joachim99@8 211 // m_file is always local, so we use QFile
joachim99@8 212 QFile file(m_file);
joachim99@8 213 if (file.open(IO_WriteOnly) == false)
joachim99@8 214 return false;
joachim99@8 215
joachim99@8 216 // use QTextStream to dump the text to the file
joachim99@8 217 QTextStream stream(&file);
joachim99@8 218 //stream << m_widget->text();
joachim99@8 219
joachim99@8 220 file.close();
joachim99@8 221 return true;
joachim99@8 222 */
joachim99@8 223 return false; // Not implemented
joachim99@8 224 }
joachim99@8 225
joachim99@8 226
joachim99@8 227 // It's usually safe to leave the factory code alone.. with the
joachim99@8 228 // notable exception of the KAboutData data
joachim99@8 229 #include <kaboutdata.h>
joachim99@8 230 #include <klocale.h>
joachim99@8 231
joachim99@8 232 KInstance* KDiff3PartFactory::s_instance = 0L;
joachim99@8 233 KAboutData* KDiff3PartFactory::s_about = 0L;
joachim99@8 234
joachim99@8 235 KDiff3PartFactory::KDiff3PartFactory()
joachim99@8 236 : KParts::Factory()
joachim99@8 237 {
joachim99@8 238 }
joachim99@8 239
joachim99@8 240 KDiff3PartFactory::~KDiff3PartFactory()
joachim99@8 241 {
joachim99@8 242 delete s_instance;
joachim99@8 243 delete s_about;
joachim99@8 244
joachim99@8 245 s_instance = 0L;
joachim99@8 246 }
joachim99@8 247
joachim99@8 248 KParts::Part* KDiff3PartFactory::createPartObject( QWidget *parentWidget, const char *widgetName,
joachim99@8 249 QObject *parent, const char *name,
joachim99@8 250 const char *classname, const QStringList&/*args*/ )
joachim99@8 251 {
joachim99@8 252 // Create an instance of our Part
joachim99@8 253 KDiff3Part* obj = new KDiff3Part( parentWidget, widgetName, parent, name );
joachim99@8 254
joachim99@8 255 // See if we are to be read-write or not
joachim99@8 256 if (QCString(classname) == "KParts::ReadOnlyPart")
joachim99@8 257 obj->setReadWrite(false);
joachim99@8 258
joachim99@8 259 return obj;
joachim99@8 260 }
joachim99@8 261
joachim99@8 262 KInstance* KDiff3PartFactory::instance()
joachim99@8 263 {
joachim99@8 264 if( !s_instance )
joachim99@8 265 {
joachim99@66 266 s_about = new KAboutData("kdiff3part", I18N_NOOP("KDiff3Part"), VERSION);
joachim99@8 267 s_about->addAuthor("Joachim Eibl", 0, "joachim.eibl@gmx.de");
joachim99@8 268 s_instance = new KInstance(s_about);
joachim99@8 269 }
joachim99@8 270 return s_instance;
joachim99@8 271 }
joachim99@8 272
joachim99@8 273 extern "C"
joachim99@8 274 {
joachim99@8 275 void* init_libkdiff3part()
joachim99@8 276 {
joachim99@8 277 return new KDiff3PartFactory;
joachim99@8 278 }
joachim99@53 279 }
joachim99@8 280
joachim99@66 281 // Suppress warning with --enable-final
joachim99@66 282 #undef VERSION
joachim99@66 283
joachim99@8 284 #include "kdiff3_part.moc"