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"
|