summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tinykate/libkate/document/katedocument.cpp10
-rw-r--r--noncore/apps/tinykate/libkate/document/katedocument.h11
2 files changed, 15 insertions, 6 deletions
diff --git a/noncore/apps/tinykate/libkate/document/katedocument.cpp b/noncore/apps/tinykate/libkate/document/katedocument.cpp
index 10bc976..df1de8d 100644
--- a/noncore/apps/tinykate/libkate/document/katedocument.cpp
+++ b/noncore/apps/tinykate/libkate/document/katedocument.cpp
@@ -1,3169 +1,3177 @@
1/*************************************************************************** 1/***************************************************************************
2 katedocument.cpp - description 2 katedocument.cpp - description
3 ------------------- 3 -------------------
4 begin : Mon Jan 15 2001 4 begin : Mon Jan 15 2001
5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann 5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann
6 (C) 2002 by Joseph Wenninger 6 (C) 2002 by Joseph Wenninger
7 email : crossfire@babylon2k.de 7 email : crossfire@babylon2k.de
8 jowenn@kde.org 8 jowenn@kde.org
9 9
10***************************************************************************/ 10***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * * 13 * *
14 * This program is free software; you can redistribute it and/or modify * 14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by * 15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or * 16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. * 17 * (at your option) any later version. *
18 * * 18 * *
19 ***************************************************************************/ 19 ***************************************************************************/
20 20
21/* 21/*
22 Copyright (C) 1998, 1999 Jochen Wilhelmy 22 Copyright (C) 1998, 1999 Jochen Wilhelmy
23 digisnap@cs.tu-berlin.de 23 digisnap@cs.tu-berlin.de
24 24
25 This library is free software; you can redistribute it and/or 25 This library is free software; you can redistribute it and/or
26 modify it under the terms of the GNU Library General Public 26 modify it under the terms of the GNU Library General Public
27 License as published by the Free Software Foundation; either 27 License as published by the Free Software Foundation; either
28 version 2 of the License, or (at your option) any later version. 28 version 2 of the License, or (at your option) any later version.
29 29
30 This library is distributed in the hope that it will be useful, 30 This library is distributed in the hope that it will be useful,
31 but WITHOUT ANY WARRANTY; without even the implied warranty of 31 but WITHOUT ANY WARRANTY; without even the implied warranty of
32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 Library General Public License for more details. 33 Library General Public License for more details.
34 34
35 You should have received a copy of the GNU Library General Public License 35 You should have received a copy of the GNU Library General Public License
36 along with this library; see the file COPYING.LIB. If not, write to 36 along with this library; see the file COPYING.LIB. If not, write to
37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
38 Boston, MA 02111-1307, USA. 38 Boston, MA 02111-1307, USA.
39*/ 39*/
40 40
41#include "katedocument.h" 41#include "katedocument.h"
42 42
43 43
44#include <qfileinfo.h> 44#include <qfileinfo.h>
45#include <qdatetime.h> 45#include <qdatetime.h>
46 46
47#include <kmessagebox.h> 47#include <kmessagebox.h>
48#include <klocale.h> 48#include <klocale.h>
49#include <qpe/config.h> 49#include <qpe/config.h>
50#include <qstring.h> 50#include <qstring.h>
51 51
52#include <sys/time.h> 52#include <sys/time.h>
53#include <unistd.h> 53#include <unistd.h>
54 54
55#include <stdio.h> 55#include <stdio.h>
56 56
57#include <qtimer.h> 57#include <qtimer.h>
58#include <qobject.h> 58#include <qobject.h>
59#include <qapplication.h> 59#include <qapplication.h>
60#include <qclipboard.h> 60#include <qclipboard.h>
61#include <qfont.h> 61#include <qfont.h>
62#include <qpainter.h> 62#include <qpainter.h>
63#include <qfile.h> 63#include <qfile.h>
64#include <qtextstream.h> 64#include <qtextstream.h>
65#include <qtextcodec.h> 65#include <qtextcodec.h>
66#include <kglobal.h> 66#include <kglobal.h>
67 67
68#include <klocale.h> 68#include <klocale.h>
69//#include <kcharsets.h> 69//#include <kcharsets.h>
70#include <kdebug.h> 70#include <kdebug.h>
71//#include <kinstance.h> 71//#include <kinstance.h>
72 72
73#include <kglobalsettings.h> 73#include <kglobalsettings.h>
74//#include <kaction.h> 74//#include <kaction.h>
75//#include <kstdaction.h> 75//#include <kstdaction.h>
76 76
77#include "../view/kateview.h" 77#include "../view/kateview.h"
78#include "katebuffer.h" 78#include "katebuffer.h"
79#include "katetextline.h" 79#include "katetextline.h"
80 80
81#include "katecmd.h" 81#include "katecmd.h"
82 82
83KateAction::KateAction(Action a, PointStruc &cursor, int len, const QString &text) 83KateAction::KateAction(Action a, PointStruc &cursor, int len, const QString &text)
84 : action(a), cursor(cursor), len(len), text(text) { 84 : action(a), cursor(cursor), len(len), text(text) {
85} 85}
86 86
87KateActionGroup::KateActionGroup(PointStruc &aStart, int type) 87KateActionGroup::KateActionGroup(PointStruc &aStart, int type)
88 : start(aStart), action(0L), undoType(type) { 88 : start(aStart), action(0L), undoType(type) {
89} 89}
90 90
91KateActionGroup::~KateActionGroup() { 91KateActionGroup::~KateActionGroup() {
92 KateAction *current, *next; 92 KateAction *current, *next;
93 93
94 current = action; 94 current = action;
95 while (current) { 95 while (current) {
96 next = current->next; 96 next = current->next;
97 delete current; 97 delete current;
98 current = next; 98 current = next;
99 } 99 }
100} 100}
101 101
102void KateActionGroup::insertAction(KateAction *a) { 102void KateActionGroup::insertAction(KateAction *a) {
103 a->next = action; 103 a->next = action;
104 action = a; 104 action = a;
105} 105}
106 106
107const char * KateActionGroup::typeName(int type) 107const char * KateActionGroup::typeName(int type)
108{ 108{
109 // return a short text description of the given undo group type suitable for a menu 109 // return a short text description of the given undo group type suitable for a menu
110 // not the lack of i18n's, the caller is expected to handle translation 110 // not the lack of i18n's, the caller is expected to handle translation
111 switch (type) { 111 switch (type) {
112 case ugPaste : return "Paste Text"; 112 case ugPaste : return "Paste Text";
113 case ugDelBlock : return "Selection Overwrite"; 113 case ugDelBlock : return "Selection Overwrite";
114 case ugIndent : return "Indent"; 114 case ugIndent : return "Indent";
115 case ugUnindent : return "Unindent"; 115 case ugUnindent : return "Unindent";
116 case ugComment : return "Comment"; 116 case ugComment : return "Comment";
117 case ugUncomment : return "Uncomment"; 117 case ugUncomment : return "Uncomment";
118 case ugReplace : return "Text Replace"; 118 case ugReplace : return "Text Replace";
119 case ugSpell : return "Spell Check"; 119 case ugSpell : return "Spell Check";
120 case ugInsChar : return "Typing"; 120 case ugInsChar : return "Typing";
121 case ugDelChar : return "Delete Text"; 121 case ugDelChar : return "Delete Text";
122 case ugInsLine : return "New Line"; 122 case ugInsLine : return "New Line";
123 case ugDelLine : return "Delete Line"; 123 case ugDelLine : return "Delete Line";
124 } 124 }
125 return ""; 125 return "";
126} 126}
127 127
128const int KateDocument::maxAttribs = 32; 128const int KateDocument::maxAttribs = 32;
129 129
130QStringList KateDocument::searchForList = QStringList(); 130QStringList KateDocument::searchForList = QStringList();
131QStringList KateDocument::replaceWithList = QStringList(); 131QStringList KateDocument::replaceWithList = QStringList();
132 132
133uint KateDocument::uniqueID = 0; 133uint KateDocument::uniqueID = 0;
134 134
135QPtrDict<KateDocument::KateDocPrivate>* KateDocument::d_ptr = 0; 135QPtrDict<KateDocument::KateDocPrivate>* KateDocument::d_ptr = 0;
136 136
137 137
138KateDocument::KateDocument(bool bSingleViewMode, bool bBrowserView, 138KateDocument::KateDocument(bool bSingleViewMode, bool bBrowserView,
139 QWidget *parentWidget, const char *widgetName, 139 QWidget *parentWidget, const char *widgetName,
140 QObject *, const char *) 140 QObject *, const char *)
141 : Kate::Document (), 141 : Kate::Document (),
142 myFont(KGlobalSettings::generalFont()), myFontBold(KGlobalSettings::generalFont()), myFontItalic(KGlobalSettings::generalFont()), myFontBI(KGlobalSettings::generalFont()), 142 myFont(KGlobalSettings::generalFont()), myFontBold(KGlobalSettings::generalFont()), myFontItalic(KGlobalSettings::generalFont()), myFontBI(KGlobalSettings::generalFont()),
143 myFontMetrics (myFont), myFontMetricsBold (myFontBold), myFontMetricsItalic (myFontItalic), myFontMetricsBI (myFontBI), 143 myFontMetrics (myFont), myFontMetricsBold (myFontBold), myFontMetricsItalic (myFontItalic), myFontMetricsBI (myFontBI),
144 hlManager(HlManager::self ()) 144 hlManager(HlManager::self ())
145{ 145{
146 146
147 d(this)->hlSetByUser = false; 147 d(this)->hlSetByUser = false;
148 PreHighlightedTill=0; 148 PreHighlightedTill=0;
149 RequestPreHighlightTill=0; 149 RequestPreHighlightTill=0;
150 150
151 m_bSingleViewMode=bSingleViewMode; 151 m_bSingleViewMode=bSingleViewMode;
152 m_bBrowserView = bBrowserView; 152 m_bBrowserView = bBrowserView;
153 153
154 m_url = QString::null; 154 m_url = QString::null;
155 155
156 // NOTE: QFont::CharSet doesn't provide all the charsets KDE supports 156 // NOTE: QFont::CharSet doesn't provide all the charsets KDE supports
157 // (esp. it doesn't distinguish between UTF-8 and iso10646-1) 157 // (esp. it doesn't distinguish between UTF-8 and iso10646-1)
158 158
159 myEncoding = QString::fromLatin1(QTextCodec::codecForLocale()->name()); 159 myEncoding = QString::fromLatin1(QTextCodec::codecForLocale()->name());
160 160
161 maxLength = -1; 161 maxLength = -1;
162 162
163 setFont (KGlobalSettings::generalFont()); 163 setFont (KGlobalSettings::generalFont());
164 164
165 myDocID = uniqueID; 165 myDocID = uniqueID;
166 uniqueID++; 166 uniqueID++;
167 167
168 myDocName = QString (""); 168 myDocName = QString ("");
169 fileInfo = new QFileInfo (); 169 fileInfo = new QFileInfo ();
170 170
171 myCmd = new KateCmd (this); 171 myCmd = new KateCmd (this);
172 172
173 connect(this,SIGNAL(modifiedChanged ()),this,SLOT(slotModChanged ())); 173 connect(this,SIGNAL(modifiedChanged ()),this,SLOT(slotModChanged ()));
174 174
175 buffer = new KWBuffer; 175 buffer = new KWBuffer;
176 connect(buffer, SIGNAL(linesChanged(int)), this, SLOT(slotBufferChanged())); 176 connect(buffer, SIGNAL(linesChanged(int)), this, SLOT(slotBufferChanged()));
177// connect(buffer, SIGNAL(textChanged()), this, SIGNAL(textChanged())); 177// connect(buffer, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
178 connect(buffer, SIGNAL(needHighlight(long,long)),this,SLOT(slotBufferHighlight(long,long))); 178 connect(buffer, SIGNAL(needHighlight(long,long)),this,SLOT(slotBufferHighlight(long,long)));
179 179
180 colors[0] = KGlobalSettings::baseColor(); 180 colors[0] = KGlobalSettings::baseColor();
181 colors[1] = KGlobalSettings::highlightColor(); 181 colors[1] = KGlobalSettings::highlightColor();
182 182
183 m_attribs = new Attribute[maxAttribs]; 183 m_attribs = new Attribute[maxAttribs];
184 184
185 m_highlight = 0L; 185 m_highlight = 0L;
186 tabChars = 8; 186 tabChars = 8;
187 187
188 m_singleSelection = false; 188 m_singleSelection = false;
189 189
190 newDocGeometry = false; 190 newDocGeometry = false;
191 readOnly = false; 191 readOnly = false;
192 newDoc = false; 192 newDoc = false;
193 193
194 modified = false; 194 modified = false;
195 195
196 undoList.setAutoDelete(true); 196 undoList.setAutoDelete(true);
197 undoState = 0; 197 undoState = 0;
198 undoSteps = 50; 198 undoSteps = 50;
199 199
200 pseudoModal = 0L; 200 pseudoModal = 0L;
201 clear(); 201 clear();
202 202
203 setHighlight(0); //calls updateFontData() 203 setHighlight(0); //calls updateFontData()
204 // if the user changes the highlight with the dialog, notify the doc 204 // if the user changes the highlight with the dialog, notify the doc
205 connect(hlManager,SIGNAL(changed()),SLOT(hlChanged())); 205 connect(hlManager,SIGNAL(changed()),SLOT(hlChanged()));
206 206
207 newDocGeometry = false; 207 newDocGeometry = false;
208 208
209 readConfig(); 209 readConfig();
210 210
211 setReadOnly(false); 211 setReadOnly(false);
212} 212}
213 213
214void KateDocument::setDontChangeHlOnSave() 214void KateDocument::setDontChangeHlOnSave()
215{ 215{
216 d(this)->hlSetByUser = true; 216 d(this)->hlSetByUser = true;
217} 217}
218 218
219void KateDocument::setFont (QFont font) 219void KateDocument::setFont (QFont font)
220{ 220{
221 kdDebug()<<"Kate:: setFont"<<endl; 221 kdDebug()<<"Kate:: setFont"<<endl;
222 int oldwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 222 int oldwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
223 myFont = font; 223 myFont = font;
224 myFontBold = QFont (font); 224 myFontBold = QFont (font);
225 myFontBold.setBold (true); 225 myFontBold.setBold (true);
226 226
227 myFontItalic = QFont (font); 227 myFontItalic = QFont (font);
228 myFontItalic.setItalic (true); 228 myFontItalic.setItalic (true);
229 229
230 myFontBI = QFont (font); 230 myFontBI = QFont (font);
231 myFontBI.setBold (true); 231 myFontBI.setBold (true);
232 myFontBI.setItalic (true); 232 myFontBI.setItalic (true);
233 233
234 myFontMetrics = CachedFontMetrics (myFont); 234 myFontMetrics = CachedFontMetrics (myFont);
235 myFontMetricsBold = CachedFontMetrics (myFontBold); 235 myFontMetricsBold = CachedFontMetrics (myFontBold);
236 myFontMetricsItalic = CachedFontMetrics (myFontItalic); 236 myFontMetricsItalic = CachedFontMetrics (myFontItalic);
237 myFontMetricsBI = CachedFontMetrics (myFontBI); 237 myFontMetricsBI = CachedFontMetrics (myFontBI);
238 int newwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 238 int newwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
239 maxLength=maxLength*(float)newwidth/(float)oldwidth; //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 239 maxLength=maxLength*(float)newwidth/(float)oldwidth; //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
240 240
241 updateFontData(); 241 updateFontData();
242 updateViews(); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 242 updateViews(); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
243 243
244} 244}
245 245
246long KateDocument::needPreHighlight(long till) 246long KateDocument::needPreHighlight(long till)
247{ 247{
248 int max=numLines()-1; 248 int max=numLines()-1;
249 if (till>max) 249 if (till>max)
250 { 250 {
251 till=max; 251 till=max;
252 } 252 }
253 if (PreHighlightedTill>=till) return -1; 253 if (PreHighlightedTill>=till) return -1;
254 254
255 long tmp=RequestPreHighlightTill; 255 long tmp=RequestPreHighlightTill;
256 if (RequestPreHighlightTill<till) 256 if (RequestPreHighlightTill<till)
257 { 257 {
258 RequestPreHighlightTill=till; 258 RequestPreHighlightTill=till;
259 if (tmp<=PreHighlightedTill) QTimer::singleShot(10,this,SLOT(doPreHighlight())); 259 if (tmp<=PreHighlightedTill) QTimer::singleShot(10,this,SLOT(doPreHighlight()));
260 } 260 }
261 return RequestPreHighlightTill; 261 return RequestPreHighlightTill;
262} 262}
263 263
264void KateDocument::doPreHighlight() 264void KateDocument::doPreHighlight()
265{ 265{
266 int from = PreHighlightedTill; 266 int from = PreHighlightedTill;
267 int till = PreHighlightedTill+200; 267 int till = PreHighlightedTill+200;
268 int max = numLines()-1; 268 int max = numLines()-1;
269 if (till > max) 269 if (till > max)
270 { 270 {
271 till = max; 271 till = max;
272 } 272 }
273 PreHighlightedTill = till; 273 PreHighlightedTill = till;
274 updateLines(from,till); 274 updateLines(from,till);
275 emit preHighlightChanged(PreHighlightedTill); 275 emit preHighlightChanged(PreHighlightedTill);
276 if (PreHighlightedTill<RequestPreHighlightTill) 276 if (PreHighlightedTill<RequestPreHighlightTill)
277 QTimer::singleShot(10,this,SLOT(doPreHighlight())); 277 QTimer::singleShot(10,this,SLOT(doPreHighlight()));
278} 278}
279 279
280KateDocument::~KateDocument() 280KateDocument::~KateDocument()
281{ 281{
282 m_highlight->release(); 282 m_highlight->release();
283 283
284 if ( !m_bSingleViewMode ) 284 if ( !m_bSingleViewMode )
285 { 285 {
286 m_views.setAutoDelete( true ); 286 m_views.setAutoDelete( true );
287 m_views.clear(); 287 m_views.clear();
288 m_views.setAutoDelete( false ); 288 m_views.setAutoDelete( false );
289 } 289 }
290 delete_d(this); 290 delete_d(this);
291} 291}
292 292
293void KateDocument::openURL(const QString &filename) 293void KateDocument::openURL(const QString &filename)
294{ 294{
295 295
296 m_file=filename; 296 m_file=filename;
297 fileInfo->setFile (m_file); 297 fileInfo->setFile (m_file);
298 setMTime(); 298 setMTime();
299 299
300 if (!fileInfo->exists() || !fileInfo->isReadable()) 300 if (!fileInfo->exists() || !fileInfo->isReadable())
301 { 301 {
302 qDebug("File doesn't exit or couldn't be read"); 302 qDebug("File doesn't exit or couldn't be read");
303 return ; 303 return ;
304 } 304 }
305 305
306 buffer->clear(); 306 buffer->clear();
307#warning fixme 307#warning fixme
308// buffer->insertFile(0, m_file, KGlobal::charsets()->codecForName(myEncoding)); 308// buffer->insertFile(0, m_file, KGlobal::charsets()->codecForName(myEncoding));
309 qDebug("Telling buffer to open file"); 309 qDebug("Telling buffer to open file");
310 buffer->insertFile(0, m_file, QTextCodec::codecForLocale()); 310 buffer->insertFile(0, m_file, QTextCodec::codecForLocale());
311 311
312 setMTime(); 312 setMTime();
313 313
314 if (myWordWrap) 314 if (myWordWrap)
315 wrapText (myWordWrapAt); 315 wrapText (myWordWrapAt);
316 316
317 int hl = hlManager->wildcardFind( m_file ); 317 int hl = hlManager->wildcardFind( m_file );
318 318
319 setHighlight(hl); 319 setHighlight(hl);
320 320
321 updateLines(); 321 updateLines();
322 updateViews(); 322 updateViews();
323 323
324 emit fileNameChanged(); 324 emit fileNameChanged();
325 325
326 return ; 326 return ;
327} 327}
328 328
329bool KateDocument::saveFile() 329bool KateDocument::saveFile()
330{ 330{
331
331 QFile f( m_file ); 332 QFile f( m_file );
332 if ( !f.open( IO_WriteOnly ) ) 333 if ( !f.open( IO_WriteOnly ) )
333 return false; // Error 334 return false; // Error
334 335
335 QTextStream stream(&f); 336 QTextStream stream(&f);
336 337
337 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers 338 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers
338#warning fixme 339#warning fixme
339// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding)); 340// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding));
340 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec 341 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec
341 342
342 int maxLine = numLines(); 343 int maxLine = numLines();
343 int line = 0; 344 int line = 0;
344 while(true) 345 while(true)
345 { 346 {
346 stream << getTextLine(line)->getString(); 347 stream << getTextLine(line)->getString();
347 line++; 348 line++;
348 if (line >= maxLine) break; 349 if (line >= maxLine) break;
349 350
350 if (eolMode == KateDocument::eolUnix) stream << "\n"; 351 if (eolMode == KateDocument::eolUnix) stream << "\n";
351 else if (eolMode == KateDocument::eolDos) stream << "\r\n"; 352 else if (eolMode == KateDocument::eolDos) stream << "\r\n";
352 else if (eolMode == KateDocument::eolMacintosh) stream << '\r'; 353 else if (eolMode == KateDocument::eolMacintosh) stream << '\r';
353 }; 354 };
354 f.close(); 355 f.close();
355 356
356 fileInfo->setFile (m_file); 357 fileInfo->setFile (m_file);
357 setMTime(); 358 setMTime();
358 359
359 if (!(d(this)->hlSetByUser)) 360 if (!(d(this)->hlSetByUser))
360 { 361 {
361 int hl = hlManager->wildcardFind( m_file ); 362 int hl = hlManager->wildcardFind( m_file );
362 363
363 setHighlight(hl); 364 setHighlight(hl);
364 } 365 }
365 emit fileNameChanged (); 366 emit fileNameChanged ();
366 367
367 return (f.status() == IO_Ok); 368 return (f.status() == IO_Ok);
368} 369}
369 370
370KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name ) 371KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name )
371{ 372{
372 return new KateView( this, parent, name); 373 return new KateView( this, parent, name);
373} 374}
374 375
375QString KateDocument::textLine( int line ) const 376QString KateDocument::textLine( int line ) const
376{ 377{
377 TextLine::Ptr l = getTextLine( line ); 378 TextLine::Ptr l = getTextLine( line );
378 if ( !l ) 379 if ( !l )
379 return QString(); 380 return QString();
380 381
381 return l->getString(); 382 return l->getString();
382} 383}
383 384
384void KateDocument::replaceLine(const QString& s,int line) 385void KateDocument::replaceLine(const QString& s,int line)
385{ 386{
386 remove_Line(line,false); 387 remove_Line(line,false);
387 insert_Line(s,line,true); 388 insert_Line(s,line,true);
388} 389}
389 390
390void KateDocument::insertLine( const QString &str, int l ) { 391void KateDocument::insertLine( const QString &str, int l ) {
391 insert_Line(str,l,true); 392 insert_Line(str,l,true);
392} 393}
393 394
394void KateDocument::insert_Line(const QString& s,int line, bool update) 395void KateDocument::insert_Line(const QString& s,int line, bool update)
395{ 396{
396 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString(" %1").arg(line)<<endl; 397 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString(" %1").arg(line)<<endl;
397 TextLine::Ptr TL=new TextLine(); 398 TextLine::Ptr TL=new TextLine();
398 TL->append(s.unicode(),s.length()); 399 TL->append(s.unicode(),s.length());
399 buffer->insertLine(line,TL); 400 buffer->insertLine(line,TL);
400 if (update) 401 if (update)
401 { 402 {
402 newDocGeometry=true; 403 newDocGeometry=true;
403 updateLines(line); 404 updateLines(line);
404 updateViews(); 405 updateViews();
405 } 406 }
406} 407}
407 408
408void KateDocument::insertAt( const QString &s, int line, int col, bool ) 409void KateDocument::insertAt( const QString &s, int line, int col, bool )
409{ 410{
410 VConfig c; 411 VConfig c;
411 c.view = 0; // ### FIXME 412 c.view = 0; // ### FIXME
412 c.cursor.x = col; 413 c.cursor.x = col;
413 c.cursor.y = line; 414 c.cursor.y = line;
414 c.cXPos = 0; // ### FIXME 415 c.cXPos = 0; // ### FIXME
415 c.flags = 0; // ### FIXME 416 c.flags = 0; // ### FIXME
416 insert( c, s ); 417 insert( c, s );
417} 418}
418 419
419void KateDocument::removeLine( int line ) { 420void KateDocument::removeLine( int line ) {
420 remove_Line(line,true); 421 remove_Line(line,true);
421} 422}
422 423
423void KateDocument::remove_Line(int line,bool update) 424void KateDocument::remove_Line(int line,bool update)
424{ 425{
425 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl; 426 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl;
426 buffer->removeLine(line); 427 buffer->removeLine(line);
427// newDocGeometry=true; 428// newDocGeometry=true;
428// if line==0) 429// if line==0)
429 if (update) 430 if (update)
430 { 431 {
431 updateLines(line); 432 updateLines(line);
432 updateViews(); 433 updateViews();
433 } 434 }
434} 435}
435 436
436int KateDocument::length() const 437int KateDocument::length() const
437{ 438{
438 return text().length(); 439 return text().length();
439} 440}
440 441
441void KateDocument::setSelection( int , int , int , int ) 442void KateDocument::setSelection( int , int , int , int )
442{ 443{
443} 444}
444 445
445bool KateDocument::hasSelection() const 446bool KateDocument::hasSelection() const
446{ 447{
447 return (selectEnd >= selectStart); 448 return (selectEnd >= selectStart);
448} 449}
449 450
450QString KateDocument::selection() const 451QString KateDocument::selection() const
451{ 452{
452 uint flags = 0; 453 uint flags = 0;
453 TextLine::Ptr textLine; 454 TextLine::Ptr textLine;
454 int len, z, start, end, i; 455 int len, z, start, end, i;
455 456
456 len = 1; 457 len = 1;
457 if (!(flags & KateView::cfVerticalSelect)) { 458 if (!(flags & KateView::cfVerticalSelect)) {
458 for (z = selectStart; z <= selectEnd; z++) { 459 for (z = selectStart; z <= selectEnd; z++) {
459 textLine = getTextLine(z); 460 textLine = getTextLine(z);
460 len += textLine->numSelected(); 461 len += textLine->numSelected();
461 if (textLine->isSelected()) len++; 462 if (textLine->isSelected()) len++;
462 } 463 }
463 QString s; 464 QString s;
464 len = 0; 465 len = 0;
465 for (z = selectStart; z <= selectEnd; z++) { 466 for (z = selectStart; z <= selectEnd; z++) {
466 textLine = getTextLine(z); 467 textLine = getTextLine(z);
467 end = 0; 468 end = 0;
468 do { 469 do {
469 start = textLine->findUnselected(end); 470 start = textLine->findUnselected(end);
470 end = textLine->findSelected(start); 471 end = textLine->findSelected(start);
471 for (i = start; i < end; i++) { 472 for (i = start; i < end; i++) {
472 s[len] = textLine->getChar(i); 473 s[len] = textLine->getChar(i);
473 len++; 474 len++;
474 } 475 }
475 } while (start < end); 476 } while (start < end);
476 if (textLine->isSelected()) { 477 if (textLine->isSelected()) {
477 s[len] = '\n'; 478 s[len] = '\n';
478 len++; 479 len++;
479 } 480 }
480 } 481 }
481// s[len] = '\0'; 482// s[len] = '\0';
482 return s; 483 return s;
483 } else { 484 } else {
484 for (z = selectStart; z <= selectEnd; z++) { 485 for (z = selectStart; z <= selectEnd; z++) {
485 textLine = getTextLine(z); 486 textLine = getTextLine(z);
486 len += textLine->numSelected() + 1; 487 len += textLine->numSelected() + 1;
487 } 488 }
488 QString s; 489 QString s;
489 len = 0; 490 len = 0;
490 for (z = selectStart; z <= selectEnd; z++) { 491 for (z = selectStart; z <= selectEnd; z++) {
491 textLine = getTextLine(z); 492 textLine = getTextLine(z);
492 end = 0; 493 end = 0;
493 do { 494 do {
494 start = textLine->findUnselected(end); 495 start = textLine->findUnselected(end);
495 end = textLine->findSelected(start); 496 end = textLine->findSelected(start);
496 for (i = start; i < end; i++) { 497 for (i = start; i < end; i++) {
497 s[len] = textLine->getChar(i); 498 s[len] = textLine->getChar(i);
498 len++; 499 len++;
499 } 500 }
500 } while (start < end); 501 } while (start < end);
501 s[len] = '\n'; 502 s[len] = '\n';
502 len++; 503 len++;
503 } 504 }
504// s[len] = '\0'; // the final \0 is not counted in length() 505// s[len] = '\0'; // the final \0 is not counted in length()
505 return s; 506 return s;
506 } 507 }
507} 508}
508 509
509int KateDocument::numLines() const 510int KateDocument::numLines() const
510{ 511{
511 return buffer->count(); 512 return buffer->count();
512} 513}
513 514
514 515
515TextLine::Ptr KateDocument::getTextLine(int line) const 516TextLine::Ptr KateDocument::getTextLine(int line) const
516{ 517{
517 // This is a hack to get this stuff working. 518 // This is a hack to get this stuff working.
518 return buffer->line(line); 519 return buffer->line(line);
519} 520}
520 521
521int KateDocument::textLength(int line) { 522int KateDocument::textLength(int line) {
522 TextLine::Ptr textLine = getTextLine(line); 523 TextLine::Ptr textLine = getTextLine(line);
523 if (!textLine) return 0; 524 if (!textLine) return 0;
524 return textLine->length(); 525 return textLine->length();
525} 526}
526 527
527void KateDocument::setTabWidth(int chars) { 528void KateDocument::setTabWidth(int chars) {
528 if (tabChars == chars) return; 529 if (tabChars == chars) return;
529 if (chars < 1) chars = 1; 530 if (chars < 1) chars = 1;
530 if (chars > 16) chars = 16; 531 if (chars > 16) chars = 16;
531 tabChars = chars; 532 tabChars = chars;
532 updateFontData(); 533 updateFontData();
533 534
534 maxLength = -1; 535 maxLength = -1;
535 for (int i=0; i < buffer->count(); i++) 536 for (int i=0; i < buffer->count(); i++)
536 { 537 {
537 TextLine::Ptr textLine = buffer->line(i); 538 TextLine::Ptr textLine = buffer->line(i);
538 int len = textWidth(textLine,textLine->length()); 539 int len = textWidth(textLine,textLine->length());
539 if (len > maxLength) { 540 if (len > maxLength) {
540 maxLength = len; 541 maxLength = len;
541 longestLine = textLine; 542 longestLine = textLine;
542 } 543 }
543 } 544 }
544} 545}
545 546
546void KateDocument::setReadOnly(bool m) { 547void KateDocument::setReadOnly(bool m) {
547 KTextEditor::View *view; 548 KTextEditor::View *view;
548 549
549 if (m != readOnly) { 550 if (m != readOnly) {
550 readOnly = m; 551 readOnly = m;
551// if (readOnly) recordReset(); 552// if (readOnly) recordReset();
552 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 553 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
553 emit static_cast<KateView *>( view )->newStatus(); 554 emit static_cast<KateView *>( view )->newStatus();
554 } 555 }
555 } 556 }
556} 557}
557 558
558bool KateDocument::isReadOnly() const { 559bool KateDocument::isReadOnly() const {
559 return readOnly; 560 return readOnly;
560} 561}
561 562
562void KateDocument::setNewDoc( bool m ) 563void KateDocument::setNewDoc( bool m )
563{ 564{
564// KTextEditor::View *view; 565// KTextEditor::View *view;
565 566
566 if ( m != newDoc ) 567 if ( m != newDoc )
567 { 568 {
568 newDoc = m; 569 newDoc = m;
569//// if (readOnly) recordReset(); 570//// if (readOnly) recordReset();
570// for (view = m_views.first(); view != 0L; view = m_views.next() ) { 571// for (view = m_views.first(); view != 0L; view = m_views.next() ) {
571// emit static_cast<KateView *>( view )->newStatus(); 572// emit static_cast<KateView *>( view )->newStatus();
572// } 573// }
573 } 574 }
574} 575}
575 576
576bool KateDocument::isNewDoc() const { 577bool KateDocument::isNewDoc() const {
577 return newDoc; 578 return newDoc;
578} 579}
579 580
580void KateDocument::setModified(bool m) { 581void KateDocument::setModified(bool m) {
581 KTextEditor::View *view; 582 KTextEditor::View *view;
582 583
583 if (m != modified) { 584 if (m != modified) {
584 modified = m; 585 modified = m;
585 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 586 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
586 emit static_cast<KateView *>( view )->newStatus(); 587 emit static_cast<KateView *>( view )->newStatus();
587 } 588 }
588 emit modifiedChanged (); 589 emit modifiedChanged ();
589 } 590 }
590} 591}
591 592
592bool KateDocument::isModified() const { 593bool KateDocument::isModified() const {
593 return modified; 594 return modified;
594} 595}
595 596
596void KateDocument::readConfig() 597void KateDocument::readConfig()
597{ 598{
598 KConfig *config = KGlobal::config(); 599 KConfig *config = KGlobal::config();
599 config->setGroup("Kate Document"); 600 config->setGroup("Kate Document");
600 601
601 myWordWrap = config->readBoolEntry("Word Wrap On", false); 602 myWordWrap = config->readBoolEntry("Word Wrap On", false);
602 myWordWrapAt = config->readNumEntry("Word Wrap At", 80); 603 myWordWrapAt = config->readNumEntry("Word Wrap At", 80);
603 if (myWordWrap) 604 if (myWordWrap)
604 wrapText (myWordWrapAt); 605 wrapText (myWordWrapAt);
605 606
606 setTabWidth(config->readNumEntry("TabWidth", 8)); 607 setTabWidth(config->readNumEntry("TabWidth", 8));
607 setUndoSteps(config->readNumEntry("UndoSteps", 50)); 608 setUndoSteps(config->readNumEntry("UndoSteps", 50));
608 m_singleSelection = config->readBoolEntry("SingleSelection", false); 609 m_singleSelection = config->readBoolEntry("SingleSelection", false);
609 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name())); 610 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name()));
610 setFont (config->readFontEntry("Font", &myFont)); 611 setFont (config->readFontEntry("Font", &myFont));
611 612
612 colors[0] = config->readColorEntry("Color Background", &colors[0]); 613 colors[0] = config->readColorEntry("Color Background", &colors[0]);
613 colors[1] = config->readColorEntry("Color Selected", &colors[1]); 614 colors[1] = config->readColorEntry("Color Selected", &colors[1]);
614 615
615 config->sync(); 616 config->sync();
616} 617}
617 618
618void KateDocument::writeConfig() 619void KateDocument::writeConfig()
619{ 620{
620 KConfig *config = KGlobal::config(); 621 KConfig *config = KGlobal::config();
621 config->setGroup("Kate Document"); 622 config->setGroup("Kate Document");
622#if 0 623#if 0
623 cofig->writeEntry("Word Wrap On", myWordWrap); 624 cofig->writeEntry("Word Wrap On", myWordWrap);
624 config->writeEntry("Word Wrap At", myWordWrapAt); 625 config->writeEntry("Word Wrap At", myWordWrapAt);
625 config->writeEntry("TabWidth", tabChars); 626 config->writeEntry("TabWidth", tabChars);
626 config->writeEntry("UndoSteps", undoSteps); 627 config->writeEntry("UndoSteps", undoSteps);
627 config->writeEntry("SingleSelection", m_singleSelection); 628 config->writeEntry("SingleSelection", m_singleSelection);
628 config->writeEntry("Encoding", myEncoding); 629 config->writeEntry("Encoding", myEncoding);
629 config->writeEntry("Font", myFont); 630 config->writeEntry("Font", myFont);
630 config->writeEntry("Color Background", colors[0]); 631 config->writeEntry("Color Background", colors[0]);
631 config->writeEntry("Color Selected", colors[1]); 632 config->writeEntry("Color Selected", colors[1]);
632#endif 633#endif
633 config->sync(); 634 config->sync();
634} 635}
635 636
636void KateDocument::readSessionConfig(KConfig *config) 637void KateDocument::readSessionConfig(KConfig *config)
637{ 638{
638 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon) 639 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon)
639 setHighlight(hlManager->nameFind(config->readEntry("Highlight"))); 640 setHighlight(hlManager->nameFind(config->readEntry("Highlight")));
640 // anders: restore bookmarks if possible 641 // anders: restore bookmarks if possible
641 QValueList<int> l = config->readIntListEntry("Bookmarks"); 642 QValueList<int> l = config->readIntListEntry("Bookmarks");
642 if ( l.count() ) { 643 if ( l.count() ) {
643 for (uint i=0; i < l.count(); i++) { 644 for (uint i=0; i < l.count(); i++) {
644 if ( numLines() < l[i] ) break; 645 if ( numLines() < l[i] ) break;
645 getTextLine( l[i] )->addMark( Bookmark ); 646 getTextLine( l[i] )->addMark( Bookmark );
646 } 647 }
647 } 648 }
648} 649}
649 650
650void KateDocument::writeSessionConfig(KConfig *config) 651void KateDocument::writeSessionConfig(KConfig *config)
651{ 652{
652#if 0 653#if 0
653 config->writeEntry("URL", m_url); // ### encoding?? (Simon) 654 config->writeEntry("URL", m_url); // ### encoding?? (Simon)
654 config->writeEntry("Highlight", m_highlight->name()); 655 config->writeEntry("Highlight", m_highlight->name());
655 // anders: save bookmarks 656 // anders: save bookmarks
656 QList<Kate::Mark> l = marks(); 657 QList<Kate::Mark> l = marks();
657 QValueList<int> ml; 658 QValueList<int> ml;
658 for (uint i=0; i < l.count(); i++) { 659 for (uint i=0; i < l.count(); i++) {
659 if ( l.at(i)->type == 1) // only save bookmarks 660 if ( l.at(i)->type == 1) // only save bookmarks
660 ml << l.at(i)->line; 661 ml << l.at(i)->line;
661 } 662 }
662 if ( ml.count() ) 663 if ( ml.count() )
663 config->writeEntry("Bookmarks", ml); 664 config->writeEntry("Bookmarks", ml);
664#endif 665#endif
665} 666}
666 667
667 668
668void KateDocument::setHighlight(int n) { 669void KateDocument::setHighlight(int n) {
669 Highlight *h; 670 Highlight *h;
670 671
671// hlNumber = n; 672// hlNumber = n;
672 673
673 h = hlManager->getHl(n); 674 h = hlManager->getHl(n);
674 if (h == m_highlight) { 675 if (h == m_highlight) {
675 updateLines(); 676 updateLines();
676 } else { 677 } else {
677 if (m_highlight != 0L) m_highlight->release(); 678 if (m_highlight != 0L) m_highlight->release();
678 h->use(); 679 h->use();
679 m_highlight = h; 680 m_highlight = h;
680 makeAttribs(); 681 makeAttribs();
681 } 682 }
682 PreHighlightedTill=0; 683 PreHighlightedTill=0;
683 RequestPreHighlightTill=0; 684 RequestPreHighlightTill=0;
684 emit(highlightChanged()); 685 emit(highlightChanged());
685} 686}
686 687
687void KateDocument::makeAttribs() { 688void KateDocument::makeAttribs() {
688 qDebug("KateDocument::makeAttribs()"); 689 qDebug("KateDocument::makeAttribs()");
689 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs); 690 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs);
690 updateFontData(); 691 updateFontData();
691 updateLines(); 692 updateLines();
692} 693}
693 694
694void KateDocument::updateFontData() { 695void KateDocument::updateFontData() {
695 int maxAscent, maxDescent; 696 int maxAscent, maxDescent;
696 int tabWidth; 697 int tabWidth;
697 KateView *view; 698 KateView *view;
698 699
699 maxAscent = myFontMetrics.ascent(); 700 maxAscent = myFontMetrics.ascent();
700 maxDescent = myFontMetrics.descent(); 701 maxDescent = myFontMetrics.descent();
701 tabWidth = myFontMetrics.width(' '); 702 tabWidth = myFontMetrics.width(' ');
702 703
703 fontHeight = maxAscent + maxDescent + 1; 704 fontHeight = maxAscent + maxDescent + 1;
704 fontAscent = maxAscent; 705 fontAscent = maxAscent;
705 m_tabWidth = tabChars*tabWidth; 706 m_tabWidth = tabChars*tabWidth;
706 707
707 for (view = views.first(); view != 0L; view = views.next() ) { 708 for (view = views.first(); view != 0L; view = views.next() ) {
708 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight); 709 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight);
709 view->tagAll(); 710 view->tagAll();
710 view->updateCursor(); 711 view->updateCursor();
711 } 712 }
712} 713}
713 714
714void KateDocument::hlChanged() { //slot 715void KateDocument::hlChanged() { //slot
715 makeAttribs(); 716 makeAttribs();
716 updateViews(); 717 updateViews();
717} 718}
718 719
719 720
720void KateDocument::addView(KTextEditor::View *view) { 721void KateDocument::addView(KTextEditor::View *view) {
721 views.append( static_cast<KateView *>( view ) ); 722 views.append( static_cast<KateView *>( view ) );
722 KTextEditor::Document::addView( view ); 723 KTextEditor::Document::addView( view );
723 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 724 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
724} 725}
725 726
726void KateDocument::removeView(KTextEditor::View *view) { 727void KateDocument::removeView(KTextEditor::View *view) {
727// if (undoView == view) recordReset(); 728// if (undoView == view) recordReset();
728 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 729 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
729 views.removeRef( static_cast<KateView *>( view ) ); 730 views.removeRef( static_cast<KateView *>( view ) );
730 KTextEditor::Document::removeView( view ); 731 KTextEditor::Document::removeView( view );
731} 732}
732 733
733void KateDocument::slotViewDestroyed() 734void KateDocument::slotViewDestroyed()
734{ 735{
735 views.removeRef( static_cast<const KateView *>( sender() ) ); 736 views.removeRef( static_cast<const KateView *>( sender() ) );
736} 737}
737 738
738bool KateDocument::ownedView(KateView *view) { 739bool KateDocument::ownedView(KateView *view) {
739 // do we own the given view? 740 // do we own the given view?
740 return (views.containsRef(view) > 0); 741 return (views.containsRef(view) > 0);
741} 742}
742 743
743bool KateDocument::isLastView(int numViews) { 744bool KateDocument::isLastView(int numViews) {
744 return ((int) views.count() == numViews); 745 return ((int) views.count() == numViews);
745} 746}
746 747
747int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) { 748int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) {
748 int x; 749 int x;
749 int z; 750 int z;
750 QChar ch; 751 QChar ch;
751 Attribute *a; 752 Attribute *a;
752 753
753 x = 0; 754 x = 0;
754 for (z = 0; z < cursorX; z++) { 755 for (z = 0; z < cursorX; z++) {
755 ch = textLine->getChar(z); 756 ch = textLine->getChar(z);
756 a = &m_attribs[textLine->getAttr(z)]; 757 a = &m_attribs[textLine->getAttr(z)];
757 758
758 if (ch == '\t') 759 if (ch == '\t')
759 x += m_tabWidth - (x % m_tabWidth); 760 x += m_tabWidth - (x % m_tabWidth);
760 else if (a->bold && a->italic) 761 else if (a->bold && a->italic)
761 x += myFontMetricsBI.width(ch); 762 x += myFontMetricsBI.width(ch);
762 else if (a->bold) 763 else if (a->bold)
763 x += myFontMetricsBold.width(ch); 764 x += myFontMetricsBold.width(ch);
764 else if (a->italic) 765 else if (a->italic)
765 x += myFontMetricsItalic.width(ch); 766 x += myFontMetricsItalic.width(ch);
766 else 767 else
767 x += myFontMetrics.width(ch); 768 x += myFontMetrics.width(ch);
768 } 769 }
769 return x; 770 return x;
770} 771}
771 772
772int KateDocument::textWidth(PointStruc &cursor) { 773int KateDocument::textWidth(PointStruc &cursor) {
773 if (cursor.x < 0) 774 if (cursor.x < 0)
774 cursor.x = 0; 775 cursor.x = 0;
775 if (cursor.y < 0) 776 if (cursor.y < 0)
776 cursor.y = 0; 777 cursor.y = 0;
777 if (cursor.y >= numLines()) 778 if (cursor.y >= numLines())
778 cursor.y = lastLine(); 779 cursor.y = lastLine();
779 return textWidth(getTextLine(cursor.y),cursor.x); 780 return textWidth(getTextLine(cursor.y),cursor.x);
780} 781}
781 782
782int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) { 783int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) {
783 int len; 784 int len;
784 int x, oldX; 785 int x, oldX;
785 int z; 786 int z;
786 QChar ch; 787 QChar ch;
787 Attribute *a; 788 Attribute *a;
788 789
789 if (cursor.y < 0) cursor.y = 0; 790 if (cursor.y < 0) cursor.y = 0;
790 if (cursor.y > lastLine()) cursor.y = lastLine(); 791 if (cursor.y > lastLine()) cursor.y = lastLine();
791 TextLine::Ptr textLine = getTextLine(cursor.y); 792 TextLine::Ptr textLine = getTextLine(cursor.y);
792 len = textLine->length(); 793 len = textLine->length();
793 794
794 x = oldX = z = 0; 795 x = oldX = z = 0;
795 while (x < xPos && (!wrapCursor || z < len)) { 796 while (x < xPos && (!wrapCursor || z < len)) {
796 oldX = x; 797 oldX = x;
797 ch = textLine->getChar(z); 798 ch = textLine->getChar(z);
798 a = &m_attribs[textLine->getAttr(z)]; 799 a = &m_attribs[textLine->getAttr(z)];
799 800
800 if (ch == '\t') 801 if (ch == '\t')
801 x += m_tabWidth - (x % m_tabWidth); 802 x += m_tabWidth - (x % m_tabWidth);
802 else if (a->bold && a->italic) 803 else if (a->bold && a->italic)
803 x += myFontMetricsBI.width(ch); 804 x += myFontMetricsBI.width(ch);
804 else if (a->bold) 805 else if (a->bold)
805 x += myFontMetricsBold.width(ch); 806 x += myFontMetricsBold.width(ch);
806 else if (a->italic) 807 else if (a->italic)
807 x += myFontMetricsItalic.width(ch); 808 x += myFontMetricsItalic.width(ch);
808 else 809 else
809 x += myFontMetrics.width(ch); 810 x += myFontMetrics.width(ch);
810 811
811 z++; 812 z++;
812 } 813 }
813 if (xPos - oldX < x - xPos && z > 0) { 814 if (xPos - oldX < x - xPos && z > 0) {
814 z--; 815 z--;
815 x = oldX; 816 x = oldX;
816 } 817 }
817 cursor.x = z; 818 cursor.x = z;
818 return x; 819 return x;
819} 820}
820 821
821 822
822int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) { 823int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) {
823 int x, oldX; 824 int x, oldX;
824 int z; 825 int z;
825 QChar ch; 826 QChar ch;
826 Attribute *a; 827 Attribute *a;
827 828
828 x = oldX = z = 0; 829 x = oldX = z = 0;
829 while (x < xPos) { // && z < len) { 830 while (x < xPos) { // && z < len) {
830 oldX = x; 831 oldX = x;
831 ch = textLine->getChar(z); 832 ch = textLine->getChar(z);
832 a = &m_attribs[textLine->getAttr(z)]; 833 a = &m_attribs[textLine->getAttr(z)];
833 834
834 if (ch == '\t') 835 if (ch == '\t')
835 x += m_tabWidth - (x % m_tabWidth); 836 x += m_tabWidth - (x % m_tabWidth);
836 else if (a->bold && a->italic) 837 else if (a->bold && a->italic)
837 x += myFontMetricsBI.width(ch); 838 x += myFontMetricsBI.width(ch);
838 else if (a->bold) 839 else if (a->bold)
839 x += myFontMetricsBold.width(ch); 840 x += myFontMetricsBold.width(ch);
840 else if (a->italic) 841 else if (a->italic)
841 x += myFontMetricsItalic.width(ch); 842 x += myFontMetricsItalic.width(ch);
842 else 843 else
843 x += myFontMetrics.width(ch); 844 x += myFontMetrics.width(ch);
844 845
845 z++; 846 z++;
846 } 847 }
847 if (xPos - oldX < x - xPos && z > 0) { 848 if (xPos - oldX < x - xPos && z > 0) {
848 z--; 849 z--;
849 // newXPos = oldX; 850 // newXPos = oldX;
850 }// else newXPos = x; 851 }// else newXPos = x;
851 return z; 852 return z;
852} 853}
853 854
854int KateDocument::textWidth() { 855int KateDocument::textWidth() {
855 return int(maxLength + 8); 856 return int(maxLength + 8);
856} 857}
857 858
858int KateDocument::textHeight() { 859int KateDocument::textHeight() {
859 return numLines()*fontHeight; 860 return numLines()*fontHeight;
860} 861}
861 862
862void KateDocument::insert(VConfig &c, const QString &s) { 863void KateDocument::insert(VConfig &c, const QString &s) {
863 int pos; 864 int pos;
864 QChar ch; 865 QChar ch;
865 QString buf; 866 QString buf;
866 867
867 if (s.isEmpty()) return; 868 if (s.isEmpty()) return;
868 869
869 recordStart(c, KateActionGroup::ugPaste); 870 recordStart(c, KateActionGroup::ugPaste);
870 871
871 pos = 0; 872 pos = 0;
872 if (!(c.flags & KateView::cfVerticalSelect)) { 873 if (!(c.flags & KateView::cfVerticalSelect)) {
873 do { 874 do {
874 ch = s[pos]; 875 ch = s[pos];
875 if (ch.isPrint() || ch == '\t') { 876 if (ch.isPrint() || ch == '\t') {
876 buf += ch; // append char to buffer 877 buf += ch; // append char to buffer
877 } else if (ch == '\n') { 878 } else if (ch == '\n') {
878 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line 879 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line
879 recordInsert(c, buf); // append to old line 880 recordInsert(c, buf); // append to old line
880// c.cursor.x += buf.length(); 881// c.cursor.x += buf.length();
881 buf.truncate(0); // clear buffer 882 buf.truncate(0); // clear buffer
882 c.cursor.y++; 883 c.cursor.y++;
883 c.cursor.x = 0; 884 c.cursor.x = 0;
884 } 885 }
885 pos++; 886 pos++;
886 } while (pos < (int) s.length()); 887 } while (pos < (int) s.length());
887 } else { 888 } else {
888 int xPos; 889 int xPos;
889 890
890 xPos = textWidth(c.cursor); 891 xPos = textWidth(c.cursor);
891 do { 892 do {
892 ch = s[pos]; 893 ch = s[pos];
893 if (ch.isPrint() || ch == '\t') { 894 if (ch.isPrint() || ch == '\t') {
894 buf += ch; 895 buf += ch;
895 } else if (ch == '\n') { 896 } else if (ch == '\n') {
896 recordInsert(c, buf); 897 recordInsert(c, buf);
897 c.cursor.x += buf.length(); 898 c.cursor.x += buf.length();
898 buf.truncate(0); 899 buf.truncate(0);
899 c.cursor.y++; 900 c.cursor.y++;
900 if (c.cursor.y >= numLines()) 901 if (c.cursor.y >= numLines())
901 recordAction(KateAction::insLine, c.cursor); 902 recordAction(KateAction::insLine, c.cursor);
902 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos); 903 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos);
903 } 904 }
904 pos++; 905 pos++;
905 } while (pos < (int) s.length()); 906 } while (pos < (int) s.length());
906 } 907 }
907 recordInsert(c, buf); 908 recordInsert(c, buf);
908 c.cursor.x += buf.length(); 909 c.cursor.x += buf.length();
909 recordEnd(c); 910 recordEnd(c);
910} 911}
911 912
912void KateDocument::insertFile(VConfig &c, QIODevice &dev) 913void KateDocument::insertFile(VConfig &c, QIODevice &dev)
913{ 914{
914 recordStart(c, KateActionGroup::ugPaste); 915 recordStart(c, KateActionGroup::ugPaste);
915 916
916 QString buf; 917 QString buf;
917 QChar ch, last; 918 QChar ch, last;
918 919
919 QTextStream stream( &dev ); 920 QTextStream stream( &dev );
920 921
921 while ( !stream.atEnd() ) { 922 while ( !stream.atEnd() ) {
922 stream >> ch; 923 stream >> ch;
923 924
924 if (ch.isPrint() || ch == '\t') { 925 if (ch.isPrint() || ch == '\t') {
925 buf += ch; 926 buf += ch;
926 } else if (ch == '\n' || ch == '\r') { 927 } else if (ch == '\n' || ch == '\r') {
927 if (last != '\r' || ch != '\n') { 928 if (last != '\r' || ch != '\n') {
928 recordAction(KateAction::newLine, c.cursor); 929 recordAction(KateAction::newLine, c.cursor);
929 recordInsert(c, buf); 930 recordInsert(c, buf);
930 buf.truncate(0); 931 buf.truncate(0);
931 c.cursor.y++; 932 c.cursor.y++;
932 c.cursor.x = 0; 933 c.cursor.x = 0;
933 } 934 }
934 last = ch; 935 last = ch;
935 } 936 }
936 } 937 }
937 938
938 recordInsert(c, buf); 939 recordInsert(c, buf);
939 recordEnd(c); 940 recordEnd(c);
940} 941}
941 942
942int KateDocument::currentColumn(PointStruc &cursor) { 943int KateDocument::currentColumn(PointStruc &cursor) {
943 return getTextLine(cursor.y)->cursorX(cursor.x,tabChars); 944 return getTextLine(cursor.y)->cursorX(cursor.x,tabChars);
944} 945}
945 946
946bool KateDocument::insertChars(VConfig &c, const QString &chars) { 947bool KateDocument::insertChars(VConfig &c, const QString &chars) {
947 int z, pos, l; 948 int z, pos, l;
948 bool onlySpaces; 949 bool onlySpaces;
949 QChar ch; 950 QChar ch;
950 QString buf; 951 QString buf;
951 952
952 TextLine::Ptr textLine = getTextLine(c.cursor.y); 953 TextLine::Ptr textLine = getTextLine(c.cursor.y);
953 954
954 pos = 0; 955 pos = 0;
955 onlySpaces = true; 956 onlySpaces = true;
956 for (z = 0; z < (int) chars.length(); z++) { 957 for (z = 0; z < (int) chars.length(); z++) {
957 ch = chars[z]; 958 ch = chars[z];
958 if (ch == '\t' && c.flags & KateView::cfReplaceTabs) { 959 if (ch == '\t' && c.flags & KateView::cfReplaceTabs) {
959 l = tabChars - (textLine->cursorX(c.cursor.x, tabChars) % tabChars); 960 l = tabChars - (textLine->cursorX(c.cursor.x, tabChars) % tabChars);
960 while (l > 0) { 961 while (l > 0) {
961 buf.insert(pos, ' '); 962 buf.insert(pos, ' ');
962 pos++; 963 pos++;
963 l--; 964 l--;
964 } 965 }
965 } else if (ch.isPrint() || ch == '\t') { 966 } else if (ch.isPrint() || ch == '\t') {
966 buf.insert(pos, ch); 967 buf.insert(pos, ch);
967 pos++; 968 pos++;
968 if (ch != ' ') onlySpaces = false; 969 if (ch != ' ') onlySpaces = false;
969 if (c.flags & KateView::cfAutoBrackets) { 970 if (c.flags & KateView::cfAutoBrackets) {
970 if (ch == '(') buf.insert(pos, ')'); 971 if (ch == '(') buf.insert(pos, ')');
971 if (ch == '[') buf.insert(pos, ']'); 972 if (ch == '[') buf.insert(pos, ']');
972 if (ch == '{') buf.insert(pos, '}'); 973 if (ch == '{') buf.insert(pos, '}');
973 } 974 }
974 } 975 }
975 } 976 }
976 //pos = cursor increment 977 //pos = cursor increment
977 978
978 //return false if nothing has to be inserted 979 //return false if nothing has to be inserted
979 if (buf.isEmpty()) return false; 980 if (buf.isEmpty()) return false;
980 981
981 //auto deletion of the marked text occurs not very often and can therefore 982 //auto deletion of the marked text occurs not very often and can therefore
982 // be recorded separately 983 // be recorded separately
983 if (c.flags &KateView:: cfDelOnInput) delMarkedText(c); 984 if (c.flags &KateView:: cfDelOnInput) delMarkedText(c);
984 985
985 recordStart(c, KateActionGroup::ugInsChar); 986 recordStart(c, KateActionGroup::ugInsChar);
986 recordReplace(c/*.cursor*/, (c.flags & KateView::cfOvr) ? buf.length() : 0, buf); 987 recordReplace(c/*.cursor*/, (c.flags & KateView::cfOvr) ? buf.length() : 0, buf);
987 c.cursor.x += pos; 988 c.cursor.x += pos;
988 989
989 if (myWordWrap && myWordWrapAt > 0) { 990 if (myWordWrap && myWordWrapAt > 0) {
990 int line; 991 int line;
991 const QChar *s; 992 const QChar *s;
992// int pos; 993// int pos;
993 PointStruc actionCursor; 994 PointStruc actionCursor;
994 995
995 line = c.cursor.y; 996 line = c.cursor.y;
996 do { 997 do {
997 textLine = getTextLine(line); 998 textLine = getTextLine(line);
998 s = textLine->getText(); 999 s = textLine->getText();
999 l = textLine->length(); 1000 l = textLine->length();
1000 for (z = myWordWrapAt; z < l; z++) if (!s[z].isSpace()) break; //search for text to wrap 1001 for (z = myWordWrapAt; z < l; z++) if (!s[z].isSpace()) break; //search for text to wrap
1001 if (z >= l) break; // nothing more to wrap 1002 if (z >= l) break; // nothing more to wrap
1002 pos = myWordWrapAt; 1003 pos = myWordWrapAt;
1003 for (; z >= 0; z--) { //find wrap position 1004 for (; z >= 0; z--) { //find wrap position
1004 if (s[z].isSpace()) { 1005 if (s[z].isSpace()) {
1005 pos = z + 1; 1006 pos = z + 1;
1006 break; 1007 break;
1007 } 1008 }
1008 } 1009 }
1009 //pos = wrap position 1010 //pos = wrap position
1010 1011
1011 if (line == c.cursor.y && pos <= c.cursor.x) { 1012 if (line == c.cursor.y && pos <= c.cursor.x) {
1012 //wrap cursor 1013 //wrap cursor
1013 c.cursor.y++; 1014 c.cursor.y++;
1014 c.cursor.x -= pos; 1015 c.cursor.x -= pos;
1015 } 1016 }
1016 1017
1017 if (line == lastLine() || (getTextLine(line+1)->length() == 0) ) { 1018 if (line == lastLine() || (getTextLine(line+1)->length() == 0) ) {
1018 //at end of doc: create new line 1019 //at end of doc: create new line
1019 actionCursor.x = pos; 1020 actionCursor.x = pos;
1020 actionCursor.y = line; 1021 actionCursor.y = line;
1021 recordAction(KateAction::newLine,actionCursor); 1022 recordAction(KateAction::newLine,actionCursor);
1022 } else { 1023 } else {
1023 //wrap 1024 //wrap
1024 actionCursor.y = line + 1; 1025 actionCursor.y = line + 1;
1025 if (!s[l - 1].isSpace()) { //add space in next line if necessary 1026 if (!s[l - 1].isSpace()) { //add space in next line if necessary
1026 actionCursor.x = 0; 1027 actionCursor.x = 0;
1027 recordInsert(actionCursor, " "); 1028 recordInsert(actionCursor, " ");
1028 } 1029 }
1029 actionCursor.x = textLine->length() - pos; 1030 actionCursor.x = textLine->length() - pos;
1030 recordAction(KateAction::wordWrap, actionCursor); 1031 recordAction(KateAction::wordWrap, actionCursor);
1031 } 1032 }
1032 line++; 1033 line++;
1033 } while (true); 1034 } while (true);
1034 } 1035 }
1035 recordEnd(c); 1036 recordEnd(c);
1036 return true; 1037 return true;
1037} 1038}
1038 1039
1039QString tabString(int pos, int tabChars) { 1040QString tabString(int pos, int tabChars) {
1040 QString s; 1041 QString s;
1041 while (pos >= tabChars) { 1042 while (pos >= tabChars) {
1042 s += '\t'; 1043 s += '\t';
1043 pos -= tabChars; 1044 pos -= tabChars;
1044 } 1045 }
1045 while (pos > 0) { 1046 while (pos > 0) {
1046 s += ' '; 1047 s += ' ';
1047 pos--; 1048 pos--;
1048 } 1049 }
1049 return s; 1050 return s;
1050} 1051}
1051 1052
1052void KateDocument::newLine(VConfig &c) { 1053void KateDocument::newLine(VConfig &c) {
1053 1054
1054 //auto deletion of marked text is done by the view to have a more 1055 //auto deletion of marked text is done by the view to have a more
1055 // "low level" KateDocument::newLine method 1056 // "low level" KateDocument::newLine method
1056 recordStart(c, KateActionGroup::ugInsLine); 1057 recordStart(c, KateActionGroup::ugInsLine);
1057 1058
1058 if (!(c.flags & KateView::cfAutoIndent)) { 1059 if (!(c.flags & KateView::cfAutoIndent)) {
1059 recordAction(KateAction::newLine,c.cursor); 1060 recordAction(KateAction::newLine,c.cursor);
1060 c.cursor.y++; 1061 c.cursor.y++;
1061 c.cursor.x = 0; 1062 c.cursor.x = 0;
1062 } else { 1063 } else {
1063 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1064 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1064 int pos = textLine->firstChar(); 1065 int pos = textLine->firstChar();
1065 if (c.cursor.x < pos) c.cursor.x = pos; // place cursor on first char if before 1066 if (c.cursor.x < pos) c.cursor.x = pos; // place cursor on first char if before
1066 1067
1067 int y = c.cursor.y; 1068 int y = c.cursor.y;
1068 while ((y > 0) && (pos < 0)) { // search a not empty text line 1069 while ((y > 0) && (pos < 0)) { // search a not empty text line
1069 textLine = getTextLine(--y); 1070 textLine = getTextLine(--y);
1070 pos = textLine->firstChar(); 1071 pos = textLine->firstChar();
1071 } 1072 }
1072 recordAction(KateAction::newLine, c.cursor); 1073 recordAction(KateAction::newLine, c.cursor);
1073 c.cursor.y++; 1074 c.cursor.y++;
1074 c.cursor.x = 0; 1075 c.cursor.x = 0;
1075 if (pos > 0) { 1076 if (pos > 0) {
1076 pos = textLine->cursorX(pos, tabChars); 1077 pos = textLine->cursorX(pos, tabChars);
1077// if (getTextLine(c.cursor.y)->length() > 0) { 1078// if (getTextLine(c.cursor.y)->length() > 0) {
1078 QString s = tabString(pos, (c.flags & KateView::cfSpaceIndent) ? 0xffffff : tabChars); 1079 QString s = tabString(pos, (c.flags & KateView::cfSpaceIndent) ? 0xffffff : tabChars);
1079 recordInsert(c.cursor, s); 1080 recordInsert(c.cursor, s);
1080 pos = s.length(); 1081 pos = s.length();
1081// } 1082// }
1082// recordInsert(c.cursor, QString(textLine->getText(), pos)); 1083// recordInsert(c.cursor, QString(textLine->getText(), pos));
1083 c.cursor.x = pos; 1084 c.cursor.x = pos;
1084 } 1085 }
1085 } 1086 }
1086 1087
1087 recordEnd(c); 1088 recordEnd(c);
1088} 1089}
1089 1090
1090void KateDocument::killLine(VConfig &c) { 1091void KateDocument::killLine(VConfig &c) {
1091 1092
1092 recordStart(c, KateActionGroup::ugDelLine); 1093 recordStart(c, KateActionGroup::ugDelLine);
1093 c.cursor.x = 0; 1094 c.cursor.x = 0;
1094 recordDelete(c.cursor, 0xffffff); 1095 recordDelete(c.cursor, 0xffffff);
1095 if (c.cursor.y < lastLine()) { 1096 if (c.cursor.y < lastLine()) {
1096 recordAction(KateAction::killLine, c.cursor); 1097 recordAction(KateAction::killLine, c.cursor);
1097 } 1098 }
1098 recordEnd(c); 1099 recordEnd(c);
1099} 1100}
1100 1101
1101void KateDocument::backspace(VConfig &c) { 1102void KateDocument::backspace(VConfig &c) {
1102 1103
1103 if (c.cursor.x <= 0 && c.cursor.y <= 0) return; 1104 if (c.cursor.x <= 0 && c.cursor.y <= 0) return;
1104 1105
1105 if (c.cursor.x > 0) { 1106 if (c.cursor.x > 0) {
1106 recordStart(c, KateActionGroup::ugDelChar); 1107 recordStart(c, KateActionGroup::ugDelChar);
1107 if (!(c.flags & KateView::cfBackspaceIndents)) { 1108 if (!(c.flags & KateView::cfBackspaceIndents)) {
1108 // ordinary backspace 1109 // ordinary backspace
1109 c.cursor.x--; 1110 c.cursor.x--;
1110 recordDelete(c.cursor, 1); 1111 recordDelete(c.cursor, 1);
1111 } else { 1112 } else {
1112 // backspace indents: erase to next indent position 1113 // backspace indents: erase to next indent position
1113 int l = 1; // del one char 1114 int l = 1; // del one char
1114 1115
1115 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1116 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1116 int pos = textLine->firstChar(); 1117 int pos = textLine->firstChar();
1117 if (pos < 0 || pos >= c.cursor.x) { 1118 if (pos < 0 || pos >= c.cursor.x) {
1118 // only spaces on left side of cursor 1119 // only spaces on left side of cursor
1119 // search a line with less spaces 1120 // search a line with less spaces
1120 int y = c.cursor.y; 1121 int y = c.cursor.y;
1121 while (y > 0) { 1122 while (y > 0) {
1122 textLine = getTextLine(--y); 1123 textLine = getTextLine(--y);
1123 pos = textLine->firstChar(); 1124 pos = textLine->firstChar();
1124 if (pos >= 0 && pos < c.cursor.x) { 1125 if (pos >= 0 && pos < c.cursor.x) {
1125 l = c.cursor.x - pos; // del more chars 1126 l = c.cursor.x - pos; // del more chars
1126 break; 1127 break;
1127 } 1128 }
1128 } 1129 }
1129 } 1130 }
1130 // break effectively jumps here 1131 // break effectively jumps here
1131 c.cursor.x -= l; 1132 c.cursor.x -= l;
1132 recordDelete(c.cursor, l); 1133 recordDelete(c.cursor, l);
1133 } 1134 }
1134 } else { 1135 } else {
1135 // c.cursor.x == 0: wrap to previous line 1136 // c.cursor.x == 0: wrap to previous line
1136 recordStart(c, KateActionGroup::ugDelLine); 1137 recordStart(c, KateActionGroup::ugDelLine);
1137 c.cursor.y--; 1138 c.cursor.y--;
1138 c.cursor.x = getTextLine(c.cursor.y)->length(); 1139 c.cursor.x = getTextLine(c.cursor.y)->length();
1139 recordAction(KateAction::delLine,c.cursor); 1140 recordAction(KateAction::delLine,c.cursor);
1140 } 1141 }
1141 recordEnd(c); 1142 recordEnd(c);
1142} 1143}
1143 1144
1144 1145
1145void KateDocument::del(VConfig &c) { 1146void KateDocument::del(VConfig &c) {
1146 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1147 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1147 int len = (c.flags & KateView::cfRemoveSpaces) ? textLine->lastChar() : textLine->length(); 1148 int len = (c.flags & KateView::cfRemoveSpaces) ? textLine->lastChar() : textLine->length();
1148 if (c.cursor.x < len/*getTextLine(c.cursor.y)->length()*/) { 1149 if (c.cursor.x < len/*getTextLine(c.cursor.y)->length()*/) {
1149 // delete one character 1150 // delete one character
1150 recordStart(c, KateActionGroup::ugDelChar); 1151 recordStart(c, KateActionGroup::ugDelChar);
1151 recordDelete(c.cursor, 1); 1152 recordDelete(c.cursor, 1);
1152 recordEnd(c); 1153 recordEnd(c);
1153 } else { 1154 } else {
1154 if (c.cursor.y < lastLine()) { 1155 if (c.cursor.y < lastLine()) {
1155 // wrap next line to this line 1156 // wrap next line to this line
1156 textLine->truncate(c.cursor.x); // truncate spaces 1157 textLine->truncate(c.cursor.x); // truncate spaces
1157 recordStart(c, KateActionGroup::ugDelLine); 1158 recordStart(c, KateActionGroup::ugDelLine);
1158 recordAction(KateAction::delLine,c.cursor); 1159 recordAction(KateAction::delLine,c.cursor);
1159 recordEnd(c); 1160 recordEnd(c);
1160 } 1161 }
1161 } 1162 }
1162} 1163}
1163 1164
1164void KateDocument::clear() { 1165void KateDocument::clear() {
1165 PointStruc cursor; 1166 PointStruc cursor;
1166 KateView *view; 1167 KateView *view;
1167 1168
1168 setPseudoModal(0L); 1169 setPseudoModal(0L);
1169 cursor.x = cursor.y = 0; 1170 cursor.x = cursor.y = 0;
1170 for (view = views.first(); view != 0L; view = views.next() ) { 1171 for (view = views.first(); view != 0L; view = views.next() ) {
1171 view->updateCursor(cursor); 1172 view->updateCursor(cursor);
1172 view->tagAll(); 1173 view->tagAll();
1173 } 1174 }
1174 1175
1175 eolMode = KateDocument::eolUnix; 1176 eolMode = KateDocument::eolUnix;
1176 1177
1177 buffer->clear(); 1178 buffer->clear();
1178 longestLine = buffer->line(0); 1179 longestLine = buffer->line(0);
1179 1180
1180 maxLength = 0; 1181 maxLength = 0;
1181 1182
1182 select.x = -1; 1183 select.x = -1;
1183 1184
1184 selectStart = 0xffffff; 1185 selectStart = 0xffffff;
1185 selectEnd = 0; 1186 selectEnd = 0;
1186 oldMarkState = false; 1187 oldMarkState = false;
1187 1188
1188 setModified(false); 1189 setModified(false);
1189 1190
1190 undoList.clear(); 1191 undoList.clear();
1191 currentUndo = 0; 1192 currentUndo = 0;
1192 newUndo(); 1193 newUndo();
1193} 1194}
1194 1195
1195void KateDocument::cut(VConfig &c) { 1196void KateDocument::cut(VConfig &c) {
1196 1197
1197 if (selectEnd < selectStart) return; 1198 if (selectEnd < selectStart) return;
1198 1199
1199 copy(c.flags); 1200 copy(c.flags);
1200 delMarkedText(c); 1201 delMarkedText(c);
1201} 1202}
1202 1203
1203void KateDocument::copy(int flags) { 1204void KateDocument::copy(int flags) {
1204 1205
1205 if (selectEnd < selectStart) return; 1206 if (selectEnd < selectStart) return;
1206 1207
1207 QString s = markedText(flags); 1208 QString s = markedText(flags);
1208 if (!s.isEmpty()) { 1209 if (!s.isEmpty()) {
1209//#if defined(_WS_X11_) 1210//#if defined(_WS_X11_)
1210 if (m_singleSelection) 1211 if (m_singleSelection)
1211 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()), this, 0); 1212 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()), this, 0);
1212//#endif 1213//#endif
1213 QApplication::clipboard()->setText(s); 1214 QApplication::clipboard()->setText(s);
1214//#if defined(_WS_X11_) 1215//#if defined(_WS_X11_)
1215 if (m_singleSelection) { 1216 if (m_singleSelection) {
1216 connect(QApplication::clipboard(), SIGNAL(dataChanged()), 1217 connect(QApplication::clipboard(), SIGNAL(dataChanged()),
1217 this, SLOT(clipboardChanged())); 1218 this, SLOT(clipboardChanged()));
1218 } 1219 }
1219//#endif 1220//#endif
1220 } 1221 }
1221} 1222}
1222 1223
1223void KateDocument::paste(VConfig &c) { 1224void KateDocument::paste(VConfig &c) {
1224 QString s = QApplication::clipboard()->text(); 1225 QString s = QApplication::clipboard()->text();
1225 if (!s.isEmpty()) { 1226 if (!s.isEmpty()) {
1226 insert(c, s); 1227 insert(c, s);
1227 } 1228 }
1228} 1229}
1229 1230
1230void KateDocument::toggleRect(int start, int end, int x1, int x2) { 1231void KateDocument::toggleRect(int start, int end, int x1, int x2) {
1231 int z, line; 1232 int z, line;
1232 bool t; 1233 bool t;
1233 1234
1234 if (x1 > x2) { 1235 if (x1 > x2) {
1235 z = x1; 1236 z = x1;
1236 x1 = x2; 1237 x1 = x2;
1237 x2 = z; 1238 x2 = z;
1238 } 1239 }
1239 if (start > end) { 1240 if (start > end) {
1240 z = start; 1241 z = start;
1241 start = end; 1242 start = end;
1242 end = z; 1243 end = z;
1243 } 1244 }
1244 1245
1245 t = false; 1246 t = false;
1246 for (line = start; line < end; line++) { 1247 for (line = start; line < end; line++) {
1247 int x, oldX, s, e, newX1, newX2; 1248 int x, oldX, s, e, newX1, newX2;
1248 QChar ch; 1249 QChar ch;
1249 Attribute *a; 1250 Attribute *a;
1250 1251
1251 TextLine::Ptr textLine = getTextLine(line); 1252 TextLine::Ptr textLine = getTextLine(line);
1252 1253
1253 //--- speed optimization 1254 //--- speed optimization
1254 //s = textPos(textLine, x1, newX1); 1255 //s = textPos(textLine, x1, newX1);
1255 x = oldX = z = 0; 1256 x = oldX = z = 0;
1256 while (x < x1) { // && z < len) { 1257 while (x < x1) { // && z < len) {
1257 oldX = x; 1258 oldX = x;
1258 ch = textLine->getChar(z); 1259 ch = textLine->getChar(z);
1259 a = &m_attribs[textLine->getAttr(z)]; 1260 a = &m_attribs[textLine->getAttr(z)];
1260 1261
1261 if (ch == '\t') 1262 if (ch == '\t')
1262 x += m_tabWidth - (x % m_tabWidth); 1263 x += m_tabWidth - (x % m_tabWidth);
1263 else if (a->bold && a->italic) 1264 else if (a->bold && a->italic)
1264 x += myFontMetricsBI.width(ch); 1265 x += myFontMetricsBI.width(ch);
1265 else if (a->bold) 1266 else if (a->bold)
1266 x += myFontMetricsBold.width(ch); 1267 x += myFontMetricsBold.width(ch);
1267 else if (a->italic) 1268 else if (a->italic)
1268 x += myFontMetricsItalic.width(ch); 1269 x += myFontMetricsItalic.width(ch);
1269 else 1270 else
1270 x += myFontMetrics.width(ch); 1271 x += myFontMetrics.width(ch);
1271 1272
1272 z++; 1273 z++;
1273 } 1274 }
1274 s = z; 1275 s = z;
1275 if (x1 - oldX < x - x1 && z > 0) { 1276 if (x1 - oldX < x - x1 && z > 0) {
1276 s--; 1277 s--;
1277 newX1 = oldX; 1278 newX1 = oldX;
1278 } else newX1 = x; 1279 } else newX1 = x;
1279 //e = textPos(textLine, x2, newX2); 1280 //e = textPos(textLine, x2, newX2);
1280 while (x < x2) { // && z < len) { 1281 while (x < x2) { // && z < len) {
1281 oldX = x; 1282 oldX = x;
1282 ch = textLine->getChar(z); 1283 ch = textLine->getChar(z);
1283 a = &m_attribs[textLine->getAttr(z)]; 1284 a = &m_attribs[textLine->getAttr(z)];
1284 1285
1285 if (ch == '\t') 1286 if (ch == '\t')
1286 x += m_tabWidth - (x % m_tabWidth); 1287 x += m_tabWidth - (x % m_tabWidth);
1287 else if (a->bold && a->italic) 1288 else if (a->bold && a->italic)
1288 x += myFontMetricsBI.width(ch); 1289 x += myFontMetricsBI.width(ch);
1289 else if (a->bold) 1290 else if (a->bold)
1290 x += myFontMetricsBold.width(ch); 1291 x += myFontMetricsBold.width(ch);
1291 else if (a->italic) 1292 else if (a->italic)
1292 x += myFontMetricsItalic.width(ch); 1293 x += myFontMetricsItalic.width(ch);
1293 else 1294 else
1294 x += myFontMetrics.width(ch); 1295 x += myFontMetrics.width(ch);
1295 1296
1296 z++; 1297 z++;
1297 } 1298 }
1298 e = z; 1299 e = z;
1299 if (x2 - oldX < x - x2 && z > 0) { 1300 if (x2 - oldX < x - x2 && z > 0) {
1300 e--; 1301 e--;
1301 newX2 = oldX; 1302 newX2 = oldX;
1302 } else newX2 = x; 1303 } else newX2 = x;
1303 //--- 1304 //---
1304 1305
1305 if (e > s) { 1306 if (e > s) {
1306 textLine->toggleSelect(s, e); 1307 textLine->toggleSelect(s, e);
1307 tagLineRange(line, newX1, newX2); 1308 tagLineRange(line, newX1, newX2);
1308 t = true; 1309 t = true;
1309 } 1310 }
1310 } 1311 }
1311 if (t) { 1312 if (t) {
1312 end--; 1313 end--;
1313// tagLines(start, end); 1314// tagLines(start, end);
1314 1315
1315 if (start < selectStart) selectStart = start; 1316 if (start < selectStart) selectStart = start;
1316 if (end > selectEnd) selectEnd = end; 1317 if (end > selectEnd) selectEnd = end;
1317 emit selectionChanged(); 1318 emit selectionChanged();
1318 } 1319 }
1319} 1320}
1320 1321
1321void KateDocument::selectTo(VConfig &c, PointStruc &cursor, int cXPos) { 1322void KateDocument::selectTo(VConfig &c, PointStruc &cursor, int cXPos) {
1322 //c.cursor = old cursor position 1323 //c.cursor = old cursor position
1323 //cursor = new cursor position 1324 //cursor = new cursor position
1324 1325
1325 if (c.cursor.x != select.x || c.cursor.y != select.y) { 1326 if (c.cursor.x != select.x || c.cursor.y != select.y) {
1326 //new selection 1327 //new selection
1327 1328
1328 if (!(c.flags & KateView::cfKeepSelection)) deselectAll(); 1329 if (!(c.flags & KateView::cfKeepSelection)) deselectAll();
1329// else recordReset(); 1330// else recordReset();
1330 1331
1331 anchor = c.cursor; 1332 anchor = c.cursor;
1332 aXPos = c.cXPos; 1333 aXPos = c.cXPos;
1333 } 1334 }
1334 1335
1335 if (!(c.flags & KateView::cfVerticalSelect)) { 1336 if (!(c.flags & KateView::cfVerticalSelect)) {
1336 //horizontal selections 1337 //horizontal selections
1337 int x, y, sXPos; 1338 int x, y, sXPos;
1338 int ex, ey, eXPos; 1339 int ex, ey, eXPos;
1339 bool sel; 1340 bool sel;
1340 1341
1341 if (cursor.y > c.cursor.y || (cursor.y == c.cursor.y && cursor.x > c.cursor.x)) { 1342 if (cursor.y > c.cursor.y || (cursor.y == c.cursor.y && cursor.x > c.cursor.x)) {
1342 x = c.cursor.x; 1343 x = c.cursor.x;
1343 y = c.cursor.y; 1344 y = c.cursor.y;
1344 sXPos = c.cXPos; 1345 sXPos = c.cXPos;
1345 ex = cursor.x; 1346 ex = cursor.x;
1346 ey = cursor.y; 1347 ey = cursor.y;
1347 eXPos = cXPos; 1348 eXPos = cXPos;
1348 sel = true; 1349 sel = true;
1349 } else { 1350 } else {
1350 x = cursor.x; 1351 x = cursor.x;
1351 y = cursor.y; 1352 y = cursor.y;
1352 sXPos = cXPos; 1353 sXPos = cXPos;
1353 ex = c.cursor.x; 1354 ex = c.cursor.x;
1354 ey = c.cursor.y; 1355 ey = c.cursor.y;
1355 eXPos = c.cXPos; 1356 eXPos = c.cXPos;
1356 sel = false; 1357 sel = false;
1357 } 1358 }
1358 1359
1359// tagLines(y, ye); 1360// tagLines(y, ye);
1360 if (y < ey) { 1361 if (y < ey) {
1361 //tagLineRange(y, sXPos, 0xffffff); 1362 //tagLineRange(y, sXPos, 0xffffff);
1362 tagLines(y, ey -1); 1363 tagLines(y, ey -1);
1363 tagLineRange(ey, 0, eXPos); 1364 tagLineRange(ey, 0, eXPos);
1364 } else tagLineRange(y, sXPos, eXPos); 1365 } else tagLineRange(y, sXPos, eXPos);
1365 1366
1366 if (y < selectStart) selectStart = y; 1367 if (y < selectStart) selectStart = y;
1367 if (ey > selectEnd) selectEnd = ey; 1368 if (ey > selectEnd) selectEnd = ey;
1368 1369
1369 TextLine::Ptr textLine = getTextLine(y); 1370 TextLine::Ptr textLine = getTextLine(y);
1370 1371
1371 if (c.flags & KateView::cfXorSelect) { 1372 if (c.flags & KateView::cfXorSelect) {
1372 //xor selection with old selection 1373 //xor selection with old selection
1373 while (y < ey) { 1374 while (y < ey) {
1374 textLine->toggleSelectEol(x); 1375 textLine->toggleSelectEol(x);
1375 x = 0; 1376 x = 0;
1376 y++; 1377 y++;
1377 textLine = getTextLine(y); 1378 textLine = getTextLine(y);
1378 } 1379 }
1379 textLine->toggleSelect(x, ex); 1380 textLine->toggleSelect(x, ex);
1380 } else { 1381 } else {
1381 //set selection over old selection 1382 //set selection over old selection
1382 1383
1383 if (anchor.y > y || (anchor.y == y && anchor.x > x)) { 1384 if (anchor.y > y || (anchor.y == y && anchor.x > x)) {
1384 if (anchor.y < ey || (anchor.y == ey && anchor.x < ex)) { 1385 if (anchor.y < ey || (anchor.y == ey && anchor.x < ex)) {
1385 sel = !sel; 1386 sel = !sel;
1386 while (y < anchor.y) { 1387 while (y < anchor.y) {
1387 textLine->selectEol(sel, x); 1388 textLine->selectEol(sel, x);
1388 x = 0; 1389 x = 0;
1389 y++; 1390 y++;
1390 textLine = getTextLine(y); 1391 textLine = getTextLine(y);
1391 } 1392 }
1392 textLine->select(sel, x, anchor.x); 1393 textLine->select(sel, x, anchor.x);
1393 x = anchor.x; 1394 x = anchor.x;
1394 } 1395 }
1395 sel = !sel; 1396 sel = !sel;
1396 } 1397 }
1397 while (y < ey) { 1398 while (y < ey) {
1398 textLine->selectEol(sel, x); 1399 textLine->selectEol(sel, x);
1399 x = 0; 1400 x = 0;
1400 y++; 1401 y++;
1401 textLine = getTextLine(y); 1402 textLine = getTextLine(y);
1402 } 1403 }
1403 textLine->select(sel, x, ex); 1404 textLine->select(sel, x, ex);
1404 } 1405 }
1405 } else { 1406 } else {
1406 //vertical (block) selections 1407 //vertical (block) selections
1407// int ax, sx, ex; 1408// int ax, sx, ex;
1408 1409
1409// ax = textWidth(anchor); 1410// ax = textWidth(anchor);
1410// sx = textWidth(start); 1411// sx = textWidth(start);
1411// ex = textWidth(end); 1412// ex = textWidth(end);
1412 1413
1413 toggleRect(c.cursor.y + 1, cursor.y + 1, aXPos, c.cXPos); 1414 toggleRect(c.cursor.y + 1, cursor.y + 1, aXPos, c.cXPos);
1414 toggleRect(anchor.y, cursor.y + 1, c.cXPos, cXPos); 1415 toggleRect(anchor.y, cursor.y + 1, c.cXPos, cXPos);
1415 } 1416 }
1416 select = cursor; 1417 select = cursor;
1417 optimizeSelection(); 1418 optimizeSelection();
1418 emit selectionChanged(); 1419 emit selectionChanged();
1419} 1420}
1420 1421
1421 1422
1422void KateDocument::selectAll() { 1423void KateDocument::selectAll() {
1423 int z; 1424 int z;
1424 TextLine::Ptr textLine; 1425 TextLine::Ptr textLine;
1425 1426
1426 select.x = -1; 1427 select.x = -1;
1427 1428
1428// if (selectStart != 0 || selectEnd != lastLine()) recordReset(); 1429// if (selectStart != 0 || selectEnd != lastLine()) recordReset();
1429 1430
1430 selectStart = 0; 1431 selectStart = 0;
1431 selectEnd = lastLine(); 1432 selectEnd = lastLine();
1432 1433
1433 tagLines(selectStart,selectEnd); 1434 tagLines(selectStart,selectEnd);
1434 1435
1435 for (z = selectStart; z < selectEnd; z++) { 1436 for (z = selectStart; z < selectEnd; z++) {
1436 textLine = getTextLine(z); 1437 textLine = getTextLine(z);
1437 textLine->selectEol(true,0); 1438 textLine->selectEol(true,0);
1438 } 1439 }
1439 textLine = getTextLine(z); 1440 textLine = getTextLine(z);
1440 textLine->select(true,0,textLine->length()); 1441 textLine->select(true,0,textLine->length());
1441 emit selectionChanged(); 1442 emit selectionChanged();
1442} 1443}
1443 1444
1444void KateDocument::deselectAll() { 1445void KateDocument::deselectAll() {
1445 select.x = -1; 1446 select.x = -1;
1446 if (selectEnd < selectStart) return; 1447 if (selectEnd < selectStart) return;
1447 1448
1448// recordReset(); 1449// recordReset();
1449 1450
1450 tagLines(selectStart,selectEnd); 1451 tagLines(selectStart,selectEnd);
1451 1452
1452 for (int z = selectStart; z <= selectEnd; z++) { 1453 for (int z = selectStart; z <= selectEnd; z++) {
1453 TextLine::Ptr textLine = getTextLine(z); 1454 TextLine::Ptr textLine = getTextLine(z);
1454 textLine->selectEol(false,0); 1455 textLine->selectEol(false,0);
1455 } 1456 }
1456 selectStart = 0xffffff; 1457 selectStart = 0xffffff;
1457 selectEnd = 0; 1458 selectEnd = 0;
1458 emit selectionChanged(); 1459 emit selectionChanged();
1459} 1460}
1460 1461
1461void KateDocument::invertSelection() { 1462void KateDocument::invertSelection() {
1462 TextLine::Ptr textLine; 1463 TextLine::Ptr textLine;
1463 1464
1464 select.x = -1; 1465 select.x = -1;
1465 1466
1466// if (selectStart != 0 || selectEnd != lastLine()) recordReset(); 1467// if (selectStart != 0 || selectEnd != lastLine()) recordReset();
1467 1468
1468 selectStart = 0; 1469 selectStart = 0;
1469 selectEnd = lastLine(); 1470 selectEnd = lastLine();
1470 1471
1471 tagLines(selectStart,selectEnd); 1472 tagLines(selectStart,selectEnd);
1472 1473
1473 for (int z = selectStart; z < selectEnd; z++) { 1474 for (int z = selectStart; z < selectEnd; z++) {
1474 textLine = getTextLine(z); 1475 textLine = getTextLine(z);
1475 textLine->toggleSelectEol(0); 1476 textLine->toggleSelectEol(0);
1476 } 1477 }
1477 textLine = getTextLine(selectEnd); 1478 textLine = getTextLine(selectEnd);
1478 textLine->toggleSelect(0,textLine->length()); 1479 textLine->toggleSelect(0,textLine->length());
1479 optimizeSelection(); 1480 optimizeSelection();
1480 emit selectionChanged(); 1481 emit selectionChanged();
1481} 1482}
1482 1483
1483void KateDocument::selectWord(PointStruc &cursor, int flags) { 1484void KateDocument::selectWord(PointStruc &cursor, int flags) {
1484 int start, end, len; 1485 int start, end, len;
1485 1486
1486 TextLine::Ptr textLine = getTextLine(cursor.y); 1487 TextLine::Ptr textLine = getTextLine(cursor.y);
1487 len = textLine->length(); 1488 len = textLine->length();
1488 start = end = cursor.x; 1489 start = end = cursor.x;
1489 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--; 1490 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--;
1490 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++; 1491 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++;
1491 if (end <= start) return; 1492 if (end <= start) return;
1492 if (!(flags & KateView::cfKeepSelection)) deselectAll(); 1493 if (!(flags & KateView::cfKeepSelection)) deselectAll();
1493// else recordReset(); 1494// else recordReset();
1494 1495
1495 textLine->select(true, start, end); 1496 textLine->select(true, start, end);
1496 1497
1497 anchor.x = start; 1498 anchor.x = start;
1498 select.x = end; 1499 select.x = end;
1499 anchor.y = select.y = cursor.y; 1500 anchor.y = select.y = cursor.y;
1500 tagLines(cursor.y, cursor.y); 1501 tagLines(cursor.y, cursor.y);
1501 if (cursor.y < selectStart) selectStart = cursor.y; 1502 if (cursor.y < selectStart) selectStart = cursor.y;
1502 if (cursor.y > selectEnd) selectEnd = cursor.y; 1503 if (cursor.y > selectEnd) selectEnd = cursor.y;
1503 emit selectionChanged(); 1504 emit selectionChanged();
1504} 1505}
1505 1506
1506void KateDocument::selectLength(PointStruc &cursor, int length, int flags) { 1507void KateDocument::selectLength(PointStruc &cursor, int length, int flags) {
1507 int start, end; 1508 int start, end;
1508 1509
1509 TextLine::Ptr textLine = getTextLine(cursor.y); 1510 TextLine::Ptr textLine = getTextLine(cursor.y);
1510 start = cursor.x; 1511 start = cursor.x;
1511 end = start + length; 1512 end = start + length;
1512 if (end <= start) return; 1513 if (end <= start) return;
1513 if (!(flags & KateView::cfKeepSelection)) deselectAll(); 1514 if (!(flags & KateView::cfKeepSelection)) deselectAll();
1514 1515
1515 textLine->select(true, start, end); 1516 textLine->select(true, start, end);
1516 1517
1517 anchor.x = start; 1518 anchor.x = start;
1518 select.x = end; 1519 select.x = end;
1519 anchor.y = select.y = cursor.y; 1520 anchor.y = select.y = cursor.y;
1520 tagLines(cursor.y, cursor.y); 1521 tagLines(cursor.y, cursor.y);
1521 if (cursor.y < selectStart) selectStart = cursor.y; 1522 if (cursor.y < selectStart) selectStart = cursor.y;
1522 if (cursor.y > selectEnd) selectEnd = cursor.y; 1523 if (cursor.y > selectEnd) selectEnd = cursor.y;
1523 emit selectionChanged(); 1524 emit selectionChanged();
1524} 1525}
1525 1526
1526void KateDocument::doIndent(VConfig &c, int change) { 1527void KateDocument::doIndent(VConfig &c, int change) {
1527 1528
1528 c.cursor.x = 0; 1529 c.cursor.x = 0;
1529 1530
1530 recordStart(c, (change < 0) ? KateActionGroup::ugUnindent 1531 recordStart(c, (change < 0) ? KateActionGroup::ugUnindent
1531 : KateActionGroup::ugIndent); 1532 : KateActionGroup::ugIndent);
1532 1533
1533 if (selectEnd < selectStart) { 1534 if (selectEnd < selectStart) {
1534 // single line 1535 // single line
1535 optimizeLeadingSpace(c.cursor.y, c.flags, change); 1536 optimizeLeadingSpace(c.cursor.y, c.flags, change);
1536 } else { 1537 } else {
1537 // entire selection 1538 // entire selection
1538 TextLine::Ptr textLine; 1539 TextLine::Ptr textLine;
1539 int line, z; 1540 int line, z;
1540 QChar ch; 1541 QChar ch;
1541 1542
1542 if (c.flags & KateView::cfKeepIndentProfile && change < 0) { 1543 if (c.flags & KateView::cfKeepIndentProfile && change < 0) {
1543 // unindent so that the existing indent profile doesn´t get screwed 1544 // unindent so that the existing indent profile doesn´t get screwed
1544 // if any line we may unindent is already full left, don't do anything 1545 // if any line we may unindent is already full left, don't do anything
1545 for (line = selectStart; line <= selectEnd; line++) { 1546 for (line = selectStart; line <= selectEnd; line++) {
1546 textLine = getTextLine(line); 1547 textLine = getTextLine(line);
1547 if (textLine->isSelected() || textLine->numSelected()) { 1548 if (textLine->isSelected() || textLine->numSelected()) {
1548 for (z = 0; z < tabChars; z++) { 1549 for (z = 0; z < tabChars; z++) {
1549 ch = textLine->getChar(z); 1550 ch = textLine->getChar(z);
1550 if (ch == '\t') break; 1551 if (ch == '\t') break;
1551 if (ch != ' ') { 1552 if (ch != ' ') {
1552 change = 0; 1553 change = 0;
1553 goto jumpOut; 1554 goto jumpOut;
1554 } 1555 }
1555 } 1556 }
1556 } 1557 }
1557 } 1558 }
1558 jumpOut:; 1559 jumpOut:;
1559 } 1560 }
1560 1561
1561 for (line = selectStart; line <= selectEnd; line++) { 1562 for (line = selectStart; line <= selectEnd; line++) {
1562 textLine = getTextLine(line); 1563 textLine = getTextLine(line);
1563 if (textLine->isSelected() || textLine->numSelected()) { 1564 if (textLine->isSelected() || textLine->numSelected()) {
1564 optimizeLeadingSpace(line, c.flags, change); 1565 optimizeLeadingSpace(line, c.flags, change);
1565 } 1566 }
1566 } 1567 }
1567 } 1568 }
1568 // recordEnd now removes empty undo records 1569 // recordEnd now removes empty undo records
1569 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent); 1570 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent);
1570} 1571}
1571 1572
1572/* 1573/*
1573 Optimize the leading whitespace for a single line. 1574 Optimize the leading whitespace for a single line.
1574 If change is > 0, it adds indentation units (tabChars) 1575 If change is > 0, it adds indentation units (tabChars)
1575 if change is == 0, it only optimizes 1576 if change is == 0, it only optimizes
1576 If change is < 0, it removes indentation units 1577 If change is < 0, it removes indentation units
1577 This will be used to indent, unindent, and optimal-fill a line. 1578 This will be used to indent, unindent, and optimal-fill a line.
1578 If excess space is removed depends on the flag cfKeepExtraSpaces 1579 If excess space is removed depends on the flag cfKeepExtraSpaces
1579 which has to be set by the user 1580 which has to be set by the user
1580*/ 1581*/
1581void KateDocument::optimizeLeadingSpace(int line, int flags, int change) { 1582void KateDocument::optimizeLeadingSpace(int line, int flags, int change) {
1582 int len; 1583 int len;
1583 int chars, space, okLen; 1584 int chars, space, okLen;
1584 QChar ch; 1585 QChar ch;
1585 int extra; 1586 int extra;
1586 QString s; 1587 QString s;
1587 PointStruc cursor; 1588 PointStruc cursor;
1588 1589
1589 TextLine::Ptr textLine = getTextLine(line); 1590 TextLine::Ptr textLine = getTextLine(line);
1590 len = textLine->length(); 1591 len = textLine->length();
1591 space = 0; // length of space at the beginning of the textline 1592 space = 0; // length of space at the beginning of the textline
1592 okLen = 0; // length of space which does not have to be replaced 1593 okLen = 0; // length of space which does not have to be replaced
1593 for (chars = 0; chars < len; chars++) { 1594 for (chars = 0; chars < len; chars++) {
1594 ch = textLine->getChar(chars); 1595 ch = textLine->getChar(chars);
1595 if (ch == ' ') { 1596 if (ch == ' ') {
1596 space++; 1597 space++;
1597 if (flags & KateView::cfSpaceIndent && okLen == chars) okLen++; 1598 if (flags & KateView::cfSpaceIndent && okLen == chars) okLen++;
1598 } else if (ch == '\t') { 1599 } else if (ch == '\t') {
1599 space += tabChars - space % tabChars; 1600 space += tabChars - space % tabChars;
1600 if (!(flags & KateView::cfSpaceIndent) && okLen == chars) okLen++; 1601 if (!(flags & KateView::cfSpaceIndent) && okLen == chars) okLen++;
1601 } else break; 1602 } else break;
1602 } 1603 }
1603 1604
1604 space += change*tabChars; // modify space width 1605 space += change*tabChars; // modify space width
1605 // if line contains only spaces it will be cleared 1606 // if line contains only spaces it will be cleared
1606 if (space < 0 || chars == len) space = 0; 1607 if (space < 0 || chars == len) space = 0;
1607 1608
1608 extra = space % tabChars; // extra spaces which don´t fit the indentation pattern 1609 extra = space % tabChars; // extra spaces which don´t fit the indentation pattern
1609 if (flags & KateView::cfKeepExtraSpaces) chars -= extra; 1610 if (flags & KateView::cfKeepExtraSpaces) chars -= extra;
1610 1611
1611 if (flags & KateView::cfSpaceIndent) { 1612 if (flags & KateView::cfSpaceIndent) {
1612 space -= extra; 1613 space -= extra;
1613 ch = ' '; 1614 ch = ' ';
1614 } else { 1615 } else {
1615 space /= tabChars; 1616 space /= tabChars;
1616 ch = '\t'; 1617 ch = '\t';
1617 } 1618 }
1618 1619
1619 // don´t replace chars which are already ok 1620 // don´t replace chars which are already ok
1620 cursor.x = QMIN(okLen, QMIN(chars, space)); 1621 cursor.x = QMIN(okLen, QMIN(chars, space));
1621 chars -= cursor.x; 1622 chars -= cursor.x;
1622 space -= cursor.x; 1623 space -= cursor.x;
1623 if (chars == 0 && space == 0) return; //nothing to do 1624 if (chars == 0 && space == 0) return; //nothing to do
1624 1625
1625 s.fill(ch, space); 1626 s.fill(ch, space);
1626 1627
1627//printf("chars %d insert %d cursor.x %d\n", chars, insert, cursor.x); 1628//printf("chars %d insert %d cursor.x %d\n", chars, insert, cursor.x);
1628 cursor.y = line; 1629 cursor.y = line;
1629 recordReplace(cursor, chars, s); 1630 recordReplace(cursor, chars, s);
1630} 1631}
1631 1632
1632void KateDocument::doComment(VConfig &c, int change) 1633void KateDocument::doComment(VConfig &c, int change)
1633{ 1634{
1634 c.flags |=KateView:: cfPersistent; 1635 c.flags |=KateView:: cfPersistent;
1635 1636
1636 recordStart(c, (change < 0) ? KateActionGroup::ugUncomment 1637 recordStart(c, (change < 0) ? KateActionGroup::ugUncomment
1637 : KateActionGroup::ugComment); 1638 : KateActionGroup::ugComment);
1638 1639
1639 QString startComment = m_highlight->getCommentStart(); 1640 QString startComment = m_highlight->getCommentStart();
1640 QString startLineComment = m_highlight->getCommentSingleLineStart(); 1641 QString startLineComment = m_highlight->getCommentSingleLineStart();
1641 QString endComment = m_highlight->getCommentEnd(); 1642 QString endComment = m_highlight->getCommentEnd();
1642 1643
1643 int startCommentLen = startComment.length(); 1644 int startCommentLen = startComment.length();
1644 int startLineCommentLen = startLineComment.length(); 1645 int startLineCommentLen = startLineComment.length();
1645 int endCommentLen = endComment.length(); 1646 int endCommentLen = endComment.length();
1646 1647
1647 if (change > 0) 1648 if (change > 0)
1648 { 1649 {
1649 if ( !hasMarkedText() ) 1650 if ( !hasMarkedText() )
1650 { 1651 {
1651 if (startLineComment != "") 1652 if (startLineComment != "")
1652 { 1653 {
1653 // Add a start comment mark 1654 // Add a start comment mark
1654 c.cursor.x = 0; 1655 c.cursor.x = 0;
1655 recordReplace(c.cursor, 0, startLineComment); 1656 recordReplace(c.cursor, 0, startLineComment);
1656 } 1657 }
1657 else if ((startComment != "") && (endComment != "")) 1658 else if ((startComment != "") && (endComment != ""))
1658 { 1659 {
1659 // Add a start comment mark 1660 // Add a start comment mark
1660 c.cursor.x = 0; 1661 c.cursor.x = 0;
1661 recordReplace(c.cursor, 0, startComment); 1662 recordReplace(c.cursor, 0, startComment);
1662 1663
1663 // Add an end comment mark 1664 // Add an end comment mark
1664 TextLine* textline = getTextLine(c.cursor.y); 1665 TextLine* textline = getTextLine(c.cursor.y);
1665 c.cursor.x = textline->length(); 1666 c.cursor.x = textline->length();
1666 recordReplace(c.cursor, 0, endComment); 1667 recordReplace(c.cursor, 0, endComment);
1667 c.cursor.x = 0; 1668 c.cursor.x = 0;
1668 } 1669 }
1669 } 1670 }
1670 else if ((startComment != "") && (endComment != "")) 1671 else if ((startComment != "") && (endComment != ""))
1671 { 1672 {
1672 QString marked (c.view->markedText ()); 1673 QString marked (c.view->markedText ());
1673 int preDeleteLine = -1, preDeleteCol = -1; 1674 int preDeleteLine = -1, preDeleteCol = -1;
1674 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol); 1675 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol);
1675 1676
1676 if (marked.length() > 0) 1677 if (marked.length() > 0)
1677 c.view->keyDelete (); 1678 c.view->keyDelete ();
1678 1679
1679 int line = -1, col = -1; 1680 int line = -1, col = -1;
1680 c.view->getCursorPosition (&line, &col); 1681 c.view->getCursorPosition (&line, &col);
1681 1682
1682 c.view->insertText (startComment + marked + endComment); 1683 c.view->insertText (startComment + marked + endComment);
1683 } 1684 }
1684 } 1685 }
1685 else 1686 else
1686 { 1687 {
1687 if ( !hasMarkedText() ) 1688 if ( !hasMarkedText() )
1688 { 1689 {
1689 TextLine* textline = getTextLine(c.cursor.y); 1690 TextLine* textline = getTextLine(c.cursor.y);
1690 1691
1691 if(textline->startingWith(startLineComment)) 1692 if(textline->startingWith(startLineComment))
1692 { 1693 {
1693 // Remove start comment mark 1694 // Remove start comment mark
1694 c.cursor.x = 0; 1695 c.cursor.x = 0;
1695 recordReplace(c.cursor, startLineCommentLen, ""); 1696 recordReplace(c.cursor, startLineCommentLen, "");
1696 } 1697 }
1697 else if (textline->startingWith(startComment) && textline->endingWith(endComment)) 1698 else if (textline->startingWith(startComment) && textline->endingWith(endComment))
1698 { 1699 {
1699 // Remove start comment mark 1700 // Remove start comment mark
1700 c.cursor.x = 0; 1701 c.cursor.x = 0;
1701 recordReplace(c.cursor, startCommentLen, ""); 1702 recordReplace(c.cursor, startCommentLen, "");
1702 1703
1703 // Remove end comment mark 1704 // Remove end comment mark
1704 if(endComment != "") 1705 if(endComment != "")
1705 { 1706 {
1706 c.cursor.x = textline->length() - endCommentLen; 1707 c.cursor.x = textline->length() - endCommentLen;
1707 recordReplace(c.cursor, endCommentLen, ""); 1708 recordReplace(c.cursor, endCommentLen, "");
1708 c.cursor.x = 0; 1709 c.cursor.x = 0;
1709 } 1710 }
1710 } 1711 }
1711 } 1712 }
1712 else 1713 else
1713 { 1714 {
1714 QString marked (c.view->markedText ()); 1715 QString marked (c.view->markedText ());
1715 int preDeleteLine = -1, preDeleteCol = -1; 1716 int preDeleteLine = -1, preDeleteCol = -1;
1716 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol); 1717 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol);
1717 1718
1718 int start = marked.find (startComment); 1719 int start = marked.find (startComment);
1719 int end = marked.findRev (endComment); 1720 int end = marked.findRev (endComment);
1720 1721
1721 if ((start > -1) && (end > -1)) 1722 if ((start > -1) && (end > -1))
1722 { 1723 {
1723 marked.remove (start, startCommentLen); 1724 marked.remove (start, startCommentLen);
1724 marked.remove (end-startCommentLen, endCommentLen); 1725 marked.remove (end-startCommentLen, endCommentLen);
1725 1726
1726 c.view->keyDelete (); 1727 c.view->keyDelete ();
1727 1728
1728 int line = -1, col = -1; 1729 int line = -1, col = -1;
1729 c.view->getCursorPosition (&line, &col); 1730 c.view->getCursorPosition (&line, &col);
1730 c.view->insertText (marked); 1731 c.view->insertText (marked);
1731 } 1732 }
1732 } 1733 }
1733 } 1734 }
1734 1735
1735 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent); 1736 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent);
1736} 1737}
1737 1738
1738 1739
1739QString KateDocument::text() const 1740QString KateDocument::text() const
1740{ 1741{
1741 QString s; 1742 QString s;
1742 1743
1743 for (int i=0; i < buffer->count(); i++) 1744 for (int i=0; i < buffer->count(); i++)
1744 { 1745 {
1745 TextLine::Ptr textLine = buffer->line(i); 1746 TextLine::Ptr textLine = buffer->line(i);
1746 s.insert(s.length(), textLine->getText(), textLine->length()); 1747 s.insert(s.length(), textLine->getText(), textLine->length());
1747 if ( (i < (buffer->count()-1)) ) 1748 if ( (i < (buffer->count()-1)) )
1748 s.append('\n'); 1749 s.append('\n');
1749 } 1750 }
1750 1751
1751 return s; 1752 return s;
1752} 1753}
1753 1754
1754QString KateDocument::getWord(PointStruc &cursor) { 1755QString KateDocument::getWord(PointStruc &cursor) {
1755 int start, end, len; 1756 int start, end, len;
1756 1757
1757 TextLine::Ptr textLine = getTextLine(cursor.y); 1758 TextLine::Ptr textLine = getTextLine(cursor.y);
1758 len = textLine->length(); 1759 len = textLine->length();
1759 start = end = cursor.x; 1760 start = end = cursor.x;
1760 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--; 1761 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--;
1761 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++; 1762 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++;
1762 len = end - start; 1763 len = end - start;
1763 return QString(&textLine->getText()[start], len); 1764 return QString(&textLine->getText()[start], len);
1764} 1765}
1765 1766
1766void KateDocument::setText(const QString &s) { 1767void KateDocument::setText(const QString &s) {
1767 int pos; 1768 int pos;
1768 QChar ch; 1769 QChar ch;
1769 1770
1770 clear(); 1771 clear();
1771 1772
1772 int line=1; 1773 int line=1;
1773 1774
1774 TextLine::Ptr textLine = buffer->line(0); 1775 TextLine::Ptr textLine = buffer->line(0);
1775 for (pos = 0; pos <= (int) s.length(); pos++) { 1776 for (pos = 0; pos <= (int) s.length(); pos++) {
1776 ch = s[pos]; 1777 ch = s[pos];
1777 if (ch.isPrint() || ch == '\t') { 1778 if (ch.isPrint() || ch == '\t') {
1778 textLine->append(&ch, 1); 1779 textLine->append(&ch, 1);
1779 } else if (ch == '\n') 1780 } else if (ch == '\n')
1780 { 1781 {
1781 textLine = new TextLine(); 1782 textLine = new TextLine();
1782 buffer->insertLine (line, textLine); 1783 buffer->insertLine (line, textLine);
1783 line++; 1784 line++;
1784 } 1785 }
1785 } 1786 }
1786 updateLines(); 1787 updateLines();
1787} 1788}
1788 1789
1789 1790
1790QString KateDocument::markedText(int flags) { 1791QString KateDocument::markedText(int flags) {
1791 TextLine::Ptr textLine; 1792 TextLine::Ptr textLine;
1792 int len, z, start, end, i; 1793 int len, z, start, end, i;
1793 1794
1794 len = 1; 1795 len = 1;
1795 if (!(flags & KateView::cfVerticalSelect)) { 1796 if (!(flags & KateView::cfVerticalSelect)) {
1796 for (z = selectStart; z <= selectEnd; z++) { 1797 for (z = selectStart; z <= selectEnd; z++) {
1797 textLine = getTextLine(z); 1798 textLine = getTextLine(z);
1798 len += textLine->numSelected(); 1799 len += textLine->numSelected();
1799 if (textLine->isSelected()) len++; 1800 if (textLine->isSelected()) len++;
1800 } 1801 }
1801 QString s; 1802 QString s;
1802 len = 0; 1803 len = 0;
1803 for (z = selectStart; z <= selectEnd; z++) { 1804 for (z = selectStart; z <= selectEnd; z++) {
1804 textLine = getTextLine(z); 1805 textLine = getTextLine(z);
1805 end = 0; 1806 end = 0;
1806 do { 1807 do {
1807 start = textLine->findUnselected(end); 1808 start = textLine->findUnselected(end);
1808 end = textLine->findSelected(start); 1809 end = textLine->findSelected(start);
1809 for (i = start; i < end; i++) { 1810 for (i = start; i < end; i++) {
1810 s[len] = textLine->getChar(i); 1811 s[len] = textLine->getChar(i);
1811 len++; 1812 len++;
1812 } 1813 }
1813 } while (start < end); 1814 } while (start < end);
1814 if (textLine->isSelected()) { 1815 if (textLine->isSelected()) {
1815 s[len] = '\n'; 1816 s[len] = '\n';
1816 len++; 1817 len++;
1817 } 1818 }
1818 } 1819 }
1819// s[len] = '\0'; 1820// s[len] = '\0';
1820 return s; 1821 return s;
1821 } else { 1822 } else {
1822 for (z = selectStart; z <= selectEnd; z++) { 1823 for (z = selectStart; z <= selectEnd; z++) {
1823 textLine = getTextLine(z); 1824 textLine = getTextLine(z);
1824 len += textLine->numSelected() + 1; 1825 len += textLine->numSelected() + 1;
1825 } 1826 }
1826 QString s; 1827 QString s;
1827 len = 0; 1828 len = 0;
1828 for (z = selectStart; z <= selectEnd; z++) { 1829 for (z = selectStart; z <= selectEnd; z++) {
1829 textLine = getTextLine(z); 1830 textLine = getTextLine(z);
1830 end = 0; 1831 end = 0;
1831 do { 1832 do {
1832 start = textLine->findUnselected(end); 1833 start = textLine->findUnselected(end);
1833 end = textLine->findSelected(start); 1834 end = textLine->findSelected(start);
1834 for (i = start; i < end; i++) { 1835 for (i = start; i < end; i++) {
1835 s[len] = textLine->getChar(i); 1836 s[len] = textLine->getChar(i);
1836 len++; 1837 len++;
1837 } 1838 }
1838 } while (start < end); 1839 } while (start < end);
1839 s[len] = '\n'; 1840 s[len] = '\n';
1840 len++; 1841 len++;
1841 } 1842 }
1842// s[len] = '\0'; // the final \0 is not counted in length() 1843// s[len] = '\0'; // the final \0 is not counted in length()
1843 return s; 1844 return s;
1844 } 1845 }
1845} 1846}
1846 1847
1847void KateDocument::delMarkedText(VConfig &c/*, bool undo*/) { 1848void KateDocument::delMarkedText(VConfig &c/*, bool undo*/) {
1848 int end = 0; 1849 int end = 0;
1849 1850
1850 if (selectEnd < selectStart) return; 1851 if (selectEnd < selectStart) return;
1851 1852
1852 // the caller may have already started an undo record for the current action 1853 // the caller may have already started an undo record for the current action
1853// if (undo) 1854// if (undo)
1854 1855
1855 //auto deletion of the marked text occurs not very often and can therefore 1856 //auto deletion of the marked text occurs not very often and can therefore
1856 // be recorded separately 1857 // be recorded separately
1857 recordStart(c, KateActionGroup::ugDelBlock); 1858 recordStart(c, KateActionGroup::ugDelBlock);
1858 1859
1859 for (c.cursor.y = selectEnd; c.cursor.y >= selectStart; c.cursor.y--) { 1860 for (c.cursor.y = selectEnd; c.cursor.y >= selectStart; c.cursor.y--) {
1860 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1861 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1861 1862
1862 c.cursor.x = textLine->length(); 1863 c.cursor.x = textLine->length();
1863 do { 1864 do {
1864 end = textLine->findRevUnselected(c.cursor.x); 1865 end = textLine->findRevUnselected(c.cursor.x);
1865 if (end == 0) break; 1866 if (end == 0) break;
1866 c.cursor.x = textLine->findRevSelected(end); 1867 c.cursor.x = textLine->findRevSelected(end);
1867 recordDelete(c.cursor, end - c.cursor.x); 1868 recordDelete(c.cursor, end - c.cursor.x);
1868 } while (true); 1869 } while (true);
1869 end = c.cursor.x; 1870 end = c.cursor.x;
1870 c.cursor.x = textLine->length(); 1871 c.cursor.x = textLine->length();
1871 if (textLine->isSelected()) recordAction(KateAction::delLine,c.cursor); 1872 if (textLine->isSelected()) recordAction(KateAction::delLine,c.cursor);
1872 } 1873 }
1873 c.cursor.y++; 1874 c.cursor.y++;
1874 /*if (end < c.cursor.x)*/ c.cursor.x = end; 1875 /*if (end < c.cursor.x)*/ c.cursor.x = end;
1875 1876
1876 selectEnd = -1; 1877 selectEnd = -1;
1877 select.x = -1; 1878 select.x = -1;
1878 1879
1879 /*if (undo)*/ recordEnd(c); 1880 /*if (undo)*/ recordEnd(c);
1880} 1881}
1881 1882
1882void KateDocument::tagLineRange(int line, int x1, int x2) { 1883void KateDocument::tagLineRange(int line, int x1, int x2) {
1883 int z; 1884 int z;
1884 1885
1885 for (z = 0; z < (int) views.count(); z++) { 1886 for (z = 0; z < (int) views.count(); z++) {
1886 views.at(z)->tagLines(line, line, x1, x2); 1887 views.at(z)->tagLines(line, line, x1, x2);
1887 } 1888 }
1888} 1889}
1889 1890
1890void KateDocument::tagLines(int start, int end) { 1891void KateDocument::tagLines(int start, int end) {
1891 int z; 1892 int z;
1892 1893
1893 for (z = 0; z < (int) views.count(); z++) { 1894 for (z = 0; z < (int) views.count(); z++) {
1894 views.at(z)->tagLines(start, end, 0, 0xffffff); 1895 views.at(z)->tagLines(start, end, 0, 0xffffff);
1895 } 1896 }
1896} 1897}
1897 1898
1898void KateDocument::tagAll() { 1899void KateDocument::tagAll() {
1899 int z; 1900 int z;
1900 1901
1901 for (z = 0; z < (int) views.count(); z++) { 1902 for (z = 0; z < (int) views.count(); z++) {
1902 views.at(z)->tagAll(); 1903 views.at(z)->tagAll();
1903 } 1904 }
1904} 1905}
1905 1906
1906void KateDocument::updateLines(int startLine, int endLine, int flags, int cursorY) { 1907void KateDocument::updateLines(int startLine, int endLine, int flags, int cursorY) {
1907 TextLine::Ptr textLine; 1908 TextLine::Ptr textLine;
1908 int line, last_line; 1909 int line, last_line;
1909 int ctxNum, endCtx; 1910 int ctxNum, endCtx;
1910// kdDebug(13020)<<"******************KateDocument::updateLines Checkpoint 1"<<endl; 1911// kdDebug(13020)<<"******************KateDocument::updateLines Checkpoint 1"<<endl;
1911 if (buffer->line(startLine)==0) {kdDebug(13020)<<"********************No buffer for line " << startLine << " found**************"<<endl; return;}; 1912 if (buffer->line(startLine)==0) {kdDebug(13020)<<"********************No buffer for line " << startLine << " found**************"<<endl; return;};
1912// kdDebug(13020)<<"KateDocument::updateLines Checkpoint 2"<<endl; 1913// kdDebug(13020)<<"KateDocument::updateLines Checkpoint 2"<<endl;
1913 last_line = lastLine(); 1914 last_line = lastLine();
1914// if (endLine >= last_line) endLine = last_line; 1915// if (endLine >= last_line) endLine = last_line;
1915 1916
1916 line = startLine; 1917 line = startLine;
1917 ctxNum = 0; 1918 ctxNum = 0;
1918 if (line > 0) ctxNum = getTextLine(line - 1)->getContext(); 1919 if (line > 0) ctxNum = getTextLine(line - 1)->getContext();
1919 do { 1920 do {
1920// kdDebug(13020)<<QString("**************Working on line: %1").arg(line)<<endl; 1921// kdDebug(13020)<<QString("**************Working on line: %1").arg(line)<<endl;
1921 textLine = getTextLine(line); 1922 textLine = getTextLine(line);
1922 if (textLine==0) kdDebug(13020)<<"****updateLines()>> error textLine==0"<<endl; 1923 if (textLine==0) kdDebug(13020)<<"****updateLines()>> error textLine==0"<<endl;
1923 if (line <= endLine && line != cursorY) { 1924 if (line <= endLine && line != cursorY) {
1924 if (flags & KateView::cfRemoveSpaces) textLine->removeSpaces(); 1925 if (flags & KateView::cfRemoveSpaces) textLine->removeSpaces();
1925 updateMaxLength(textLine); 1926 updateMaxLength(textLine);
1926 } 1927 }
1927 endCtx = textLine->getContext(); 1928 endCtx = textLine->getContext();
1928 qDebug("DOHIGHLIGHT"); 1929// qDebug("DOHIGHLIGHT");
1930
1929 ctxNum = m_highlight->doHighlight(ctxNum,textLine); 1931 ctxNum = m_highlight->doHighlight(ctxNum,textLine);
1930 textLine->setContext(ctxNum); 1932 textLine->setContext(ctxNum);
1931 line++; 1933 line++;
1932 } while ((buffer->line(line)!=0) && (line <= endLine || endCtx != ctxNum)); 1934 } while ((buffer->line(line)!=0) && (line <= endLine || endCtx != ctxNum));
1933// kdDebug(13020)<<"updateLines :: while loop left"<<endl; 1935// kdDebug(13020)<<"updateLines :: while loop left"<<endl;
1934 tagLines(startLine, line - 1); 1936 tagLines(startLine, line - 1);
1935} 1937}
1936 1938
1937 1939
1938void KateDocument::updateMaxLength(TextLine::Ptr &textLine) { 1940void KateDocument::updateMaxLength(TextLine::Ptr &textLine) {
1939 int len; 1941 int len;
1940 1942
1941 len = textWidth(textLine,textLine->length()); 1943 len = textWidth(textLine,textLine->length());
1942 1944
1943 if (len > maxLength) { 1945 if (len > maxLength) {
1944 longestLine = textLine; 1946 longestLine = textLine;
1945 maxLength = len; 1947 maxLength = len;
1946 newDocGeometry = true; 1948 newDocGeometry = true;
1947 } else { 1949 } else {
1948 if (!longestLine || (textLine == longestLine && len <= maxLength*3/4)) { 1950 if (!longestLine || (textLine == longestLine && len <= maxLength*3/4)) {
1949 maxLength = -1; 1951 maxLength = -1;
1950 for (int i = 0; i < numLines();i++) { 1952 for (int i = 0; i < numLines();i++) {
1951 textLine = getTextLine(i); 1953 textLine = getTextLine(i);
1952 len = textWidth(textLine,textLine->length()); 1954 len = textWidth(textLine,textLine->length());
1953 if (len > maxLength) { 1955 if (len > maxLength) {
1954 maxLength = len; 1956 maxLength = len;
1955 longestLine = textLine; 1957 longestLine = textLine;
1956 } 1958 }
1957 } 1959 }
1958 newDocGeometry = true; 1960 newDocGeometry = true;
1959 } 1961 }
1960 } 1962 }
1961} 1963}
1962 1964
1963void KateDocument::slotBufferChanged() { 1965void KateDocument::slotBufferChanged() {
1964 newDocGeometry = true; 1966 newDocGeometry = true;
1965 //updateLines();//JW 1967 //updateLines();//JW
1966 updateViews(); 1968 updateViews();
1967} 1969}
1968 1970
1969void KateDocument::slotBufferHighlight(long start,long stop) { 1971void KateDocument::slotBufferHighlight(long start,long stop) {
1970 kdDebug(13020)<<"KateDocument::slotBufferHighlight"<<QString("%1-%2").arg(start).arg(stop)<<endl; 1972 kdDebug(13020)<<"KateDocument::slotBufferHighlight"<<QString("%1-%2").arg(start).arg(stop)<<endl;
1971 updateLines(start,stop); 1973 updateLines(start,stop);
1972// buffer->startLoadTimer(); 1974// buffer->startLoadTimer();
1973} 1975}
1974 1976
1975void KateDocument::updateViews(KateView *exclude) { 1977void KateDocument::updateViews(KateView *exclude) {
1976 KateView *view; 1978 KateView *view;
1977 int flags; 1979 int flags;
1978 bool markState = hasMarkedText(); 1980 bool markState = hasMarkedText();
1979 1981
1980 flags = (newDocGeometry) ? KateView::ufDocGeometry : 0; 1982 flags = (newDocGeometry) ? KateView::ufDocGeometry : 0;
1981 for (view = views.first(); view != 0L; view = views.next() ) { 1983 for (view = views.first(); view != 0L; view = views.next() ) {
1982 if (view != exclude) view->updateView(flags); 1984 if (view != exclude) view->updateView(flags);
1983 1985
1984 // notify every view about the changed mark state.... 1986 // notify every view about the changed mark state....
1985 if (oldMarkState != markState) emit view->newMarkStatus(); 1987 if (oldMarkState != markState) emit view->newMarkStatus();
1986 } 1988 }
1987 oldMarkState = markState; 1989 oldMarkState = markState;
1988 newDocGeometry = false; 1990 newDocGeometry = false;
1989} 1991}
1990 1992
1991QColor &KateDocument::cursorCol(int x, int y) { 1993QColor &KateDocument::cursorCol(int x, int y) {
1992 int attr; 1994 int attr;
1993 Attribute *a; 1995 Attribute *a;
1994 1996
1995 TextLine::Ptr textLine = getTextLine(y); 1997 TextLine::Ptr textLine = getTextLine(y);
1996 attr = textLine->getRawAttr(x); 1998 attr = textLine->getRawAttr(x);
1997 a = &m_attribs[attr & taAttrMask]; 1999 a = &m_attribs[attr & taAttrMask];
1998 if (attr & taSelected) return a->selCol; else return a->col; 2000 if (attr & taSelected) return a->selCol; else return a->col;
1999} 2001}
2000 2002
2001void KateDocument::paintTextLine(QPainter &paint, int line, int xStart, int xEnd, bool showTabs) 2003void KateDocument::paintTextLine(QPainter &paint, int line, int xStart, int xEnd, bool showTabs)
2002{ 2004{
2003 paintTextLine (paint, line, 0, xStart, xEnd, showTabs); 2005 paintTextLine (paint, line, 0, xStart, xEnd, showTabs);
2004} 2006}
2005 2007
2006void KateDocument::paintTextLine(QPainter &paint, int line, int y, int xStart, int xEnd, bool showTabs) 2008void KateDocument::paintTextLine(QPainter &paint, int line, int y, int xStart, int xEnd, bool showTabs)
2007{ 2009{
2008 TextLine::Ptr textLine; 2010 TextLine::Ptr textLine;
2009 int len; 2011 int len;
2010 const QChar *s; 2012 const QChar *s;
2011 int z, x; 2013 int z, x;
2012 QChar ch; 2014 QChar ch;
2013 Attribute *a = 0L; 2015 Attribute *a = 0L;
2014 int attr, nextAttr; 2016 int attr, nextAttr;
2015 int xs; 2017 int xs;
2016 int xc, zc; 2018 int xc, zc;
2017 2019
2018 if (line > lastLine()) { 2020 if (line > lastLine()) {
2019 paint.fillRect(0, y, xEnd - xStart,fontHeight, colors[0]); 2021 paint.fillRect(0, y, xEnd - xStart,fontHeight, colors[0]);
2020 return; 2022 return;
2021 } 2023 }
2022 2024
2023 textLine = getTextLine(line); 2025 textLine = getTextLine(line);
2024 len = textLine->length(); 2026 len = textLine->length();
2025 s = textLine->getText(); 2027 s = textLine->getText();
2026 2028
2027 // skip to first visible character 2029 // skip to first visible character
2028 x = 0; 2030 x = 0;
2029 z = 0; 2031 z = 0;
2030 do { 2032 do {
2031 xc = x; 2033 xc = x;
2032 zc = z; 2034 zc = z;
2033 if (z == len) break; 2035 if (z == len) break;
2034 ch = s[z];//textLine->getChar(z); 2036 ch = s[z];//textLine->getChar(z);
2035 if (ch == '\t') { 2037 if (ch == '\t') {
2036 x += m_tabWidth - (x % m_tabWidth); 2038 x += m_tabWidth - (x % m_tabWidth);
2037 } else { 2039 } else {
2038 a = &m_attribs[textLine->getAttr(z)]; 2040 a = &m_attribs[textLine->getAttr(z)];
2039 2041
2040 if (a->bold && a->italic) 2042 if (a->bold && a->italic)
2041 x += myFontMetricsBI.width(ch); 2043 x += myFontMetricsBI.width(ch);
2042 else if (a->bold) 2044 else if (a->bold)
2043 x += myFontMetricsBold.width(ch); 2045 x += myFontMetricsBold.width(ch);
2044 else if (a->italic) 2046 else if (a->italic)
2045 x += myFontMetricsItalic.width(ch); 2047 x += myFontMetricsItalic.width(ch);
2046 else 2048 else
2047 x += myFontMetrics.width(ch); 2049 x += myFontMetrics.width(ch);
2048 } 2050 }
2049 z++; 2051 z++;
2050 } while (x <= xStart); 2052 } while (x <= xStart);
2051 2053
2052 // draw background 2054 // draw background
2053 xs = xStart; 2055 xs = xStart;
2054 attr = textLine->getRawAttr(zc); 2056 attr = textLine->getRawAttr(zc);
2055 while (x < xEnd) 2057 while (x < xEnd)
2056 { 2058 {
2057 nextAttr = textLine->getRawAttr(z); 2059 nextAttr = textLine->getRawAttr(z);
2058 if ((nextAttr ^ attr) & taSelected) 2060 if ((nextAttr ^ attr) & taSelected)
2059 { 2061 {
2060 if (attr & taSelected) 2062 if (attr & taSelected)
2061 paint.fillRect(xs - xStart, y, x - xs, fontHeight, colors[1]); 2063 paint.fillRect(xs - xStart, y, x - xs, fontHeight, colors[1]);
2062 else 2064 else
2063 paint.fillRect(xs - xStart, y, x - xs, fontHeight, colors[0]); 2065 paint.fillRect(xs - xStart, y, x - xs, fontHeight, colors[0]);
2064 2066
2065 xs = x; 2067 xs = x;
2066 attr = nextAttr; 2068 attr = nextAttr;
2067 } 2069 }
2068 2070
2069 if (z == len) break; 2071 if (z == len) break;
2070 2072
2071 ch = s[z];//textLine->getChar(z); 2073 ch = s[z];//textLine->getChar(z);
2072 2074
2073 if (ch == '\t') 2075 if (ch == '\t')
2074 x += m_tabWidth - (x % m_tabWidth); 2076 x += m_tabWidth - (x % m_tabWidth);
2075 else 2077 else
2076 { 2078 {
2077 a = &m_attribs[textLine->getAttr(z)]; 2079 a = &m_attribs[textLine->getAttr(z)];
2078 2080
2079 if (a->bold && a->italic) 2081 if (a->bold && a->italic)
2080 x += myFontMetricsBI.width(ch); 2082 x += myFontMetricsBI.width(ch);
2081 else if (a->bold) 2083 else if (a->bold)
2082 x += myFontMetricsBold.width(ch); 2084 x += myFontMetricsBold.width(ch);
2083 else if (a->italic) 2085 else if (a->italic)
2084 x += myFontMetricsItalic.width(ch); 2086 x += myFontMetricsItalic.width(ch);
2085 else 2087 else
2086 x += myFontMetrics.width(ch); 2088 x += myFontMetrics.width(ch);
2087 } 2089 }
2088 z++; 2090 z++;
2089 } 2091 }
2090 2092
2091 if (attr & taSelected) 2093 if (attr & taSelected)
2092 paint.fillRect(xs - xStart, y, xEnd - xs, fontHeight, colors[1]); 2094 paint.fillRect(xs - xStart, y, xEnd - xs, fontHeight, colors[1]);
2093 else 2095 else
2094 paint.fillRect(xs - xStart, y, xEnd - xs, fontHeight, colors[0]); 2096 paint.fillRect(xs - xStart, y, xEnd - xs, fontHeight, colors[0]);
2095 2097
2096 len = z; //reduce length to visible length 2098 len = z; //reduce length to visible length
2097 2099
2098 // draw text 2100 // draw text
2099 x = xc; 2101 x = xc;
2100 z = zc; 2102 z = zc;
2101 y += fontAscent;// -1; 2103 y += fontAscent;// -1;
2102 attr = -1; 2104 attr = -1;
2103 while (z < len) { 2105 while (z < len) {
2104 ch = s[z];//textLine->getChar(z); 2106 ch = s[z];//textLine->getChar(z);
2105 if (ch == '\t') { 2107 if (ch == '\t') {
2106 if (z > zc) { 2108 if (z > zc) {
2107 //this should cause no copy at all 2109 //this should cause no copy at all
2108 QConstString str((QChar *) &s[zc], z - zc /*+1*/); 2110 QConstString str((QChar *) &s[zc], z - zc /*+1*/);
2109 QString s = str.string(); 2111 QString s = str.string();
2110 paint.drawText(x - xStart, y, s); 2112 paint.drawText(x - xStart, y, s);
2111 2113
2112 if (a->bold && a->italic) 2114 if (a->bold && a->italic)
2113 x += myFontMetricsBI.width(s); 2115 x += myFontMetricsBI.width(s);
2114 else if (a->bold) 2116 else if (a->bold)
2115 x += myFontMetricsBold.width(s); 2117 x += myFontMetricsBold.width(s);
2116 else if (a->italic) 2118 else if (a->italic)
2117 x += myFontMetricsItalic.width(s); 2119 x += myFontMetricsItalic.width(s);
2118 else 2120 else
2119 x += myFontMetrics.width(s); 2121 x += myFontMetrics.width(s);
2120 } 2122 }
2121 zc = z +1; 2123 zc = z +1;
2122 2124
2123 if (showTabs) { 2125 if (showTabs) {
2124 nextAttr = textLine->getRawAttr(z); 2126 nextAttr = textLine->getRawAttr(z);
2125 if (nextAttr != attr) { 2127 if (nextAttr != attr) {
2126 attr = nextAttr; 2128 attr = nextAttr;
2127 a = &m_attribs[attr & taAttrMask]; 2129 a = &m_attribs[attr & taAttrMask];
2128 2130
2129 if (attr & taSelected) paint.setPen(a->selCol); 2131 if (attr & taSelected) paint.setPen(a->selCol);
2130 else paint.setPen(a->col); 2132 else paint.setPen(a->col);
2131 2133
2132 if (a->bold && a->italic) 2134 if (a->bold && a->italic)
2133 paint.setFont(myFontBI); 2135 paint.setFont(myFontBI);
2134 else if (a->bold) 2136 else if (a->bold)
2135 paint.setFont(myFontBold); 2137 paint.setFont(myFontBold);
2136 else if (a->italic) 2138 else if (a->italic)
2137 paint.setFont(myFontItalic); 2139 paint.setFont(myFontItalic);
2138 else 2140 else
2139 paint.setFont(myFont); 2141 paint.setFont(myFont);
2140 } 2142 }
2141 2143
2142// paint.drawLine(x - xStart, y -2, x - xStart, y); 2144// paint.drawLine(x - xStart, y -2, x - xStart, y);
2143// paint.drawLine(x - xStart, y, x - xStart + 2, y); 2145// paint.drawLine(x - xStart, y, x - xStart + 2, y);
2144 paint.drawPoint(x - xStart, y); 2146 paint.drawPoint(x - xStart, y);
2145 paint.drawPoint(x - xStart +1, y); 2147 paint.drawPoint(x - xStart +1, y);
2146 paint.drawPoint(x - xStart, y -1); 2148 paint.drawPoint(x - xStart, y -1);
2147 } 2149 }
2148 x += m_tabWidth - (x % m_tabWidth); 2150 x += m_tabWidth - (x % m_tabWidth);
2149 } else { 2151 } else {
2150 nextAttr = textLine->getRawAttr(z); 2152 nextAttr = textLine->getRawAttr(z);
2151 if (nextAttr != attr) { 2153 if (nextAttr != attr) {
2152 if (z > zc) { 2154 if (z > zc) {
2153 QConstString str((QChar *) &s[zc], z - zc /*+1*/); 2155 QConstString str((QChar *) &s[zc], z - zc /*+1*/);
2154 QString s = str.string(); 2156 QString s = str.string();
2155 paint.drawText(x - xStart, y, s); 2157 paint.drawText(x - xStart, y, s);
2156 2158
2157 if (a->bold && a->italic) 2159 if (a->bold && a->italic)
2158 x += myFontMetricsBI.width(s); 2160 x += myFontMetricsBI.width(s);
2159 else if (a->bold) 2161 else if (a->bold)
2160 x += myFontMetricsBold.width(s); 2162 x += myFontMetricsBold.width(s);
2161 else if (a->italic) 2163 else if (a->italic)
2162 x += myFontMetricsItalic.width(s); 2164 x += myFontMetricsItalic.width(s);
2163 else 2165 else
2164 x += myFontMetrics.width(s); 2166 x += myFontMetrics.width(s);
2165 zc = z; 2167 zc = z;
2166 } 2168 }
2167 attr = nextAttr; 2169 attr = nextAttr;
2168 a = &m_attribs[attr & taAttrMask]; 2170 a = &m_attribs[attr & taAttrMask];
2169 2171
2170 if (attr & taSelected) paint.setPen(a->selCol); 2172 if (attr & taSelected) paint.setPen(a->selCol);
2171 else paint.setPen(a->col); 2173 else paint.setPen(a->col);
2172 2174
2173 if (a->bold && a->italic) 2175 if (a->bold && a->italic)
2174 paint.setFont(myFontBI); 2176 paint.setFont(myFontBI);
2175 else if (a->bold) 2177 else if (a->bold)
2176 paint.setFont(myFontBold); 2178 paint.setFont(myFontBold);
2177 else if (a->italic) 2179 else if (a->italic)
2178 paint.setFont(myFontItalic); 2180 paint.setFont(myFontItalic);
2179 else 2181 else
2180 paint.setFont(myFont); 2182 paint.setFont(myFont);
2181 } 2183 }
2182 } 2184 }
2183 z++; 2185 z++;
2184 } 2186 }
2185 if (z > zc) { 2187 if (z > zc) {
2186 QConstString str((QChar *) &s[zc], z - zc /*+1*/); 2188 QConstString str((QChar *) &s[zc], z - zc /*+1*/);
2187 paint.drawText(x - xStart, y, str.string()); 2189 paint.drawText(x - xStart, y, str.string());
2188 } 2190 }
2189} 2191}
2190 2192
2191// Applies the search context, and returns whether a match was found. If one is, 2193// Applies the search context, and returns whether a match was found. If one is,
2192// the length of the string matched is also returned. 2194// the length of the string matched is also returned.
2193bool KateDocument::doSearch(SConfig &sc, const QString &searchFor) { 2195bool KateDocument::doSearch(SConfig &sc, const QString &searchFor) {
2194 int line, col; 2196 int line, col;
2195 int searchEnd; 2197 int searchEnd;
2196 int bufLen, tlen; 2198 int bufLen, tlen;
2197 QChar *t; 2199 QChar *t;
2198 TextLine::Ptr textLine; 2200 TextLine::Ptr textLine;
2199 int pos, newPos; 2201 int pos, newPos;
2200 2202
2201 if (searchFor.isEmpty()) return false; 2203 if (searchFor.isEmpty()) return false;
2202 2204
2203 bufLen = 0; 2205 bufLen = 0;
2204 t = 0L; 2206 t = 0L;
2205 2207
2206 line = sc.cursor.y; 2208 line = sc.cursor.y;
2207 col = sc.cursor.x; 2209 col = sc.cursor.x;
2208 if (!(sc.flags & KateView::sfBackward)) { 2210 if (!(sc.flags & KateView::sfBackward)) {
2209 //forward search 2211 //forward search
2210 if (sc.flags & KateView::sfSelected) { 2212 if (sc.flags & KateView::sfSelected) {
2211 if (line < selectStart) { 2213 if (line < selectStart) {
2212 line = selectStart; 2214 line = selectStart;
2213 col = 0; 2215 col = 0;
2214 } 2216 }
2215 searchEnd = selectEnd; 2217 searchEnd = selectEnd;
2216 } else searchEnd = lastLine(); 2218 } else searchEnd = lastLine();
2217 2219
2218 while (line <= searchEnd) { 2220 while (line <= searchEnd) {
2219 textLine = getTextLine(line); 2221 textLine = getTextLine(line);
2220 tlen = textLine->length(); 2222 tlen = textLine->length();
2221 if (tlen > bufLen) { 2223 if (tlen > bufLen) {
2222 delete t; 2224 delete t;
2223 bufLen = (tlen + 255) & (~255); 2225 bufLen = (tlen + 255) & (~255);
2224 t = new QChar[bufLen]; 2226 t = new QChar[bufLen];
2225 } 2227 }
2226 memcpy(t, textLine->getText(), tlen*sizeof(QChar)); 2228 memcpy(t, textLine->getText(), tlen*sizeof(QChar));
2227 if (sc.flags & KateView::sfSelected) { 2229 if (sc.flags & KateView::sfSelected) {
2228 pos = 0; 2230 pos = 0;
2229 do { 2231 do {
2230 pos = textLine->findSelected(pos); 2232 pos = textLine->findSelected(pos);
2231 newPos = textLine->findUnselected(pos); 2233 newPos = textLine->findUnselected(pos);
2232 memset(&t[pos], 0, (newPos - pos)*sizeof(QChar)); 2234 memset(&t[pos], 0, (newPos - pos)*sizeof(QChar));
2233 pos = newPos; 2235 pos = newPos;
2234 } while (pos < tlen); 2236 } while (pos < tlen);
2235 } 2237 }
2236 2238
2237 QString text(t, tlen); 2239 QString text(t, tlen);
2238 if (sc.flags & KateView::sfWholeWords) { 2240 if (sc.flags & KateView::sfWholeWords) {
2239 // Until the end of the line... 2241 // Until the end of the line...
2240 while (col < tlen) { 2242 while (col < tlen) {
2241 // ...find the next match. 2243 // ...find the next match.
2242 col = sc.search(text, col); 2244 col = sc.search(text, col);
2243 if (col != -1) { 2245 if (col != -1) {
2244 // Is the match delimited correctly? 2246 // Is the match delimited correctly?
2245 if (((col == 0) || (!m_highlight->isInWord(t[col]))) && 2247 if (((col == 0) || (!m_highlight->isInWord(t[col]))) &&
2246 ((col + sc.matchedLength == tlen) || (!m_highlight->isInWord(t[col + sc.matchedLength])))) { 2248 ((col + sc.matchedLength == tlen) || (!m_highlight->isInWord(t[col + sc.matchedLength])))) {
2247 goto found; 2249 goto found;
2248 } 2250 }
2249 else { 2251 else {
2250 // Start again from the next character. 2252 // Start again from the next character.
2251 col++; 2253 col++;
2252 } 2254 }
2253 } 2255 }
2254 else { 2256 else {
2255 // No match. 2257 // No match.
2256 break; 2258 break;
2257 } 2259 }
2258 } 2260 }
2259 } 2261 }
2260 else { 2262 else {
2261 // Non-whole-word search. 2263 // Non-whole-word search.
2262 col = sc.search(text, col); 2264 col = sc.search(text, col);
2263 if (col != -1) 2265 if (col != -1)
2264 goto found; 2266 goto found;
2265 } 2267 }
2266 col = 0; 2268 col = 0;
2267 line++; 2269 line++;
2268 } 2270 }
2269 } else { 2271 } else {
2270 // backward search 2272 // backward search
2271 if (sc.flags & KateView::sfSelected) { 2273 if (sc.flags & KateView::sfSelected) {
2272 if (line > selectEnd) { 2274 if (line > selectEnd) {
2273 line = selectEnd; 2275 line = selectEnd;
2274 col = -1; 2276 col = -1;
2275 } 2277 }
2276 searchEnd = selectStart; 2278 searchEnd = selectStart;
2277 } else searchEnd = 0; 2279 } else searchEnd = 0;
2278 2280
2279 while (line >= searchEnd) { 2281 while (line >= searchEnd) {
2280 textLine = getTextLine(line); 2282 textLine = getTextLine(line);
2281 tlen = textLine->length(); 2283 tlen = textLine->length();
2282 if (tlen > bufLen) { 2284 if (tlen > bufLen) {
2283 delete t; 2285 delete t;
2284 bufLen = (tlen + 255) & (~255); 2286 bufLen = (tlen + 255) & (~255);
2285 t = new QChar[bufLen]; 2287 t = new QChar[bufLen];
2286 } 2288 }
2287 memcpy(t, textLine->getText(), tlen*sizeof(QChar)); 2289 memcpy(t, textLine->getText(), tlen*sizeof(QChar));
2288 if (sc.flags & KateView::sfSelected) { 2290 if (sc.flags & KateView::sfSelected) {
2289 pos = 0; 2291 pos = 0;
2290 do { 2292 do {
2291 pos = textLine->findSelected(pos); 2293 pos = textLine->findSelected(pos);
2292 newPos = textLine->findUnselected(pos); 2294 newPos = textLine->findUnselected(pos);
2293 memset(&t[pos], 0, (newPos - pos)*sizeof(QChar)); 2295 memset(&t[pos], 0, (newPos - pos)*sizeof(QChar));
2294 pos = newPos; 2296 pos = newPos;
2295 } while (pos < tlen); 2297 } while (pos < tlen);
2296 } 2298 }
2297 2299
2298 if (col < 0 || col > tlen) col = tlen; 2300 if (col < 0 || col > tlen) col = tlen;
2299 2301
2300 QString text(t, tlen); 2302 QString text(t, tlen);
2301 if (sc.flags & KateView::sfWholeWords) { 2303 if (sc.flags & KateView::sfWholeWords) {
2302 // Until the beginning of the line... 2304 // Until the beginning of the line...
2303 while (col >= 0) { 2305 while (col >= 0) {
2304 // ...find the next match. 2306 // ...find the next match.
2305 col = sc.search(text, col); 2307 col = sc.search(text, col);
2306 if (col != -1) { 2308 if (col != -1) {
2307 // Is the match delimited correctly? 2309 // Is the match delimited correctly?
2308 if (((col == 0) || (!m_highlight->isInWord(t[col]))) && 2310 if (((col == 0) || (!m_highlight->isInWord(t[col]))) &&
2309 ((col + sc.matchedLength == tlen) || (!m_highlight->isInWord(t[col + sc.matchedLength])))) { 2311 ((col + sc.matchedLength == tlen) || (!m_highlight->isInWord(t[col + sc.matchedLength])))) {
2310 goto found; 2312 goto found;
2311 } 2313 }
2312 else { 2314 else {
2313 // Start again from the previous character. 2315 // Start again from the previous character.
2314 col--; 2316 col--;
2315 } 2317 }
2316 } 2318 }
2317 else { 2319 else {
2318 // No match. 2320 // No match.
2319 break; 2321 break;
2320 } 2322 }
2321 } 2323 }
2322 } 2324 }
2323 else { 2325 else {
2324 // Non-whole-word search. 2326 // Non-whole-word search.
2325 col = sc.search(text, col); 2327 col = sc.search(text, col);
2326 if (col != -1) 2328 if (col != -1)
2327 goto found; 2329 goto found;
2328 } 2330 }
2329 col = -1; 2331 col = -1;
2330 line--; 2332 line--;
2331 } 2333 }
2332 } 2334 }
2333 sc.flags |= KateView::sfWrapped; 2335 sc.flags |= KateView::sfWrapped;
2334 return false; 2336 return false;
2335found: 2337found:
2336 if (sc.flags & KateView::sfWrapped) { 2338 if (sc.flags & KateView::sfWrapped) {
2337 if ((line > sc.startCursor.y || (line == sc.startCursor.y && col >= sc.startCursor.x)) 2339 if ((line > sc.startCursor.y || (line == sc.startCursor.y && col >= sc.startCursor.x))
2338 ^ ((sc.flags & KateView::sfBackward) != 0)) return false; 2340 ^ ((sc.flags & KateView::sfBackward) != 0)) return false;
2339 } 2341 }
2340 sc.cursor.x = col; 2342 sc.cursor.x = col;
2341 sc.cursor.y = line; 2343 sc.cursor.y = line;
2342 return true; 2344 return true;
2343} 2345}
2344 2346
2345void KateDocument::tagLine(int line) { 2347void KateDocument::tagLine(int line) {
2346 2348
2347 if (tagStart > line) tagStart = line; 2349 if (tagStart > line) tagStart = line;
2348 if (tagEnd < line) tagEnd = line; 2350 if (tagEnd < line) tagEnd = line;
2349} 2351}
2350 2352
2351void KateDocument::insLine(int line) { 2353void KateDocument::insLine(int line) {
2352 KateView *view; 2354 KateView *view;
2353 2355
2354 if (selectStart >= line) selectStart++; 2356 if (selectStart >= line) selectStart++;
2355 if (selectEnd >= line) selectEnd++; 2357 if (selectEnd >= line) selectEnd++;
2356 if (tagStart >= line) tagStart++; 2358 if (tagStart >= line) tagStart++;
2357 if (tagEnd >= line) tagEnd++; 2359 if (tagEnd >= line) tagEnd++;
2358 2360
2359 newDocGeometry = true; 2361 newDocGeometry = true;
2360 for (view = views.first(); view != 0L; view = views.next() ) { 2362 for (view = views.first(); view != 0L; view = views.next() ) {
2361 view->insLine(line); 2363 view->insLine(line);
2362 } 2364 }
2363} 2365}
2364 2366
2365void KateDocument::delLine(int line) { 2367void KateDocument::delLine(int line) {
2366 KateView *view; 2368 KateView *view;
2367 2369
2368 if (selectStart >= line && selectStart > 0) selectStart--; 2370 if (selectStart >= line && selectStart > 0) selectStart--;
2369 if (selectEnd >= line) selectEnd--; 2371 if (selectEnd >= line) selectEnd--;
2370 if (tagStart >= line && tagStart > 0) tagStart--; 2372 if (tagStart >= line && tagStart > 0) tagStart--;
2371 if (tagEnd >= line) tagEnd--; 2373 if (tagEnd >= line) tagEnd--;
2372 2374
2373 newDocGeometry = true; 2375 newDocGeometry = true;
2374 for (view = views.first(); view != 0L; view = views.next() ) { 2376 for (view = views.first(); view != 0L; view = views.next() ) {
2375 view->delLine(line); 2377 view->delLine(line);
2376 } 2378 }
2377} 2379}
2378 2380
2379void KateDocument::optimizeSelection() { 2381void KateDocument::optimizeSelection() {
2380 TextLine::Ptr textLine; 2382 TextLine::Ptr textLine;
2381 2383
2382 while (selectStart <= selectEnd) { 2384 while (selectStart <= selectEnd) {
2383 textLine = getTextLine(selectStart); 2385 textLine = getTextLine(selectStart);
2384 if (textLine->isSelected() || textLine->numSelected() > 0) break; 2386 if (textLine->isSelected() || textLine->numSelected() > 0) break;
2385 selectStart++; 2387 selectStart++;
2386 } 2388 }
2387 while (selectEnd >= selectStart) { 2389 while (selectEnd >= selectStart) {
2388 textLine = getTextLine(selectEnd); 2390 textLine = getTextLine(selectEnd);
2389 if (textLine->isSelected() || textLine->numSelected() > 0) break; 2391 if (textLine->isSelected() || textLine->numSelected() > 0) break;
2390 selectEnd--; 2392 selectEnd--;
2391 } 2393 }
2392 if (selectStart > selectEnd) { 2394 if (selectStart > selectEnd) {
2393 selectStart = 0xffffff; 2395 selectStart = 0xffffff;
2394 selectEnd = 0; 2396 selectEnd = 0;
2395 } 2397 }
2396} 2398}
2397 2399
2398void KateDocument::doAction(KateAction *a) { 2400void KateDocument::doAction(KateAction *a) {
2399 2401
2400 switch (a->action) { 2402 switch (a->action) {
2401 case KateAction::replace: 2403 case KateAction::replace:
2402 doReplace(a); 2404 doReplace(a);
2403 break; 2405 break;
2404 case KateAction::wordWrap: 2406 case KateAction::wordWrap:
2405 doWordWrap(a); 2407 doWordWrap(a);
2406 break; 2408 break;
2407 case KateAction::wordUnWrap: 2409 case KateAction::wordUnWrap:
2408 doWordUnWrap(a); 2410 doWordUnWrap(a);
2409 break; 2411 break;
2410 case KateAction::newLine: 2412 case KateAction::newLine:
2411 doNewLine(a); 2413 doNewLine(a);
2412 break; 2414 break;
2413 case KateAction::delLine: 2415 case KateAction::delLine:
2414 doDelLine(a); 2416 doDelLine(a);
2415 break; 2417 break;
2416 case KateAction::insLine: 2418 case KateAction::insLine:
2417 doInsLine(a); 2419 doInsLine(a);
2418 break; 2420 break;
2419 case KateAction::killLine: 2421 case KateAction::killLine:
2420 doKillLine(a); 2422 doKillLine(a);
2421 break; 2423 break;
2422/* case KateAction::doubleLine: 2424/* case KateAction::doubleLine:
2423 break; 2425 break;
2424 case KateAction::removeLine: 2426 case KateAction::removeLine:
2425 break;*/ 2427 break;*/
2426 } 2428 }
2427} 2429}
2428 2430
2429void KateDocument::doReplace(KateAction *a) { 2431void KateDocument::doReplace(KateAction *a) {
2430 TextLine::Ptr textLine; 2432 TextLine::Ptr textLine;
2431 int l; 2433 int l;
2432 2434
2433 //exchange current text with stored text in KateAction *a 2435 //exchange current text with stored text in KateAction *a
2434 2436
2435 textLine = getTextLine(a->cursor.y); 2437 textLine = getTextLine(a->cursor.y);
2436 l = textLine->length() - a->cursor.x; 2438 l = textLine->length() - a->cursor.x;
2437 if (l > a->len) l = a->len; 2439 if (l > a->len) l = a->len;
2438 2440
2439 QString oldText(&textLine->getText()[a->cursor.x], (l < 0) ? 0 : l); 2441 QString oldText(&textLine->getText()[a->cursor.x], (l < 0) ? 0 : l);
2440 textLine->replace(a->cursor.x, a->len, a->text.unicode(), a->text.length()); 2442 textLine->replace(a->cursor.x, a->len, a->text.unicode(), a->text.length());
2441 2443
2442 a->len = a->text.length(); 2444 a->len = a->text.length();
2443 a->text = oldText; 2445 a->text = oldText;
2444 2446
2445 buffer->changeLine(a->cursor.y); 2447 buffer->changeLine(a->cursor.y);
2446 2448
2447 tagLine(a->cursor.y); 2449 tagLine(a->cursor.y);
2448} 2450}
2449 2451
2450void KateDocument::doWordWrap(KateAction *a) { 2452void KateDocument::doWordWrap(KateAction *a) {
2451 TextLine::Ptr textLine; 2453 TextLine::Ptr textLine;
2452 2454
2453 textLine = getTextLine(a->cursor.y - 1); 2455 textLine = getTextLine(a->cursor.y - 1);
2454 a->len = textLine->length() - a->cursor.x; 2456 a->len = textLine->length() - a->cursor.x;
2455 textLine->wrap(getTextLine(a->cursor.y),a->len); 2457 textLine->wrap(getTextLine(a->cursor.y),a->len);
2456 2458
2457 buffer->changeLine(a->cursor.y - 1); 2459 buffer->changeLine(a->cursor.y - 1);
2458 buffer->changeLine(a->cursor.y); 2460 buffer->changeLine(a->cursor.y);
2459 2461
2460 tagLine(a->cursor.y - 1); 2462 tagLine(a->cursor.y - 1);
2461 tagLine(a->cursor.y); 2463 tagLine(a->cursor.y);
2462 if (selectEnd == a->cursor.y - 1) selectEnd++; 2464 if (selectEnd == a->cursor.y - 1) selectEnd++;
2463 2465
2464 a->action = KateAction::wordUnWrap; 2466 a->action = KateAction::wordUnWrap;
2465} 2467}
2466 2468
2467void KateDocument::doWordUnWrap(KateAction *a) { 2469void KateDocument::doWordUnWrap(KateAction *a) {
2468 TextLine::Ptr textLine; 2470 TextLine::Ptr textLine;
2469 2471
2470 textLine = getTextLine(a->cursor.y - 1); 2472 textLine = getTextLine(a->cursor.y - 1);
2471// textLine->setLength(a->len); 2473// textLine->setLength(a->len);
2472 textLine->unWrap(a->len, getTextLine(a->cursor.y),a->cursor.x); 2474 textLine->unWrap(a->len, getTextLine(a->cursor.y),a->cursor.x);
2473 2475
2474 buffer->changeLine(a->cursor.y - 1); 2476 buffer->changeLine(a->cursor.y - 1);
2475 buffer->changeLine(a->cursor.y); 2477 buffer->changeLine(a->cursor.y);
2476 2478
2477 tagLine(a->cursor.y - 1); 2479 tagLine(a->cursor.y - 1);
2478 tagLine(a->cursor.y); 2480 tagLine(a->cursor.y);
2479 2481
2480 a->action = KateAction::wordWrap; 2482 a->action = KateAction::wordWrap;
2481} 2483}
2482 2484
2483void KateDocument::doNewLine(KateAction *a) { 2485void KateDocument::doNewLine(KateAction *a) {
2484 TextLine::Ptr textLine, newLine; 2486 TextLine::Ptr textLine, newLine;
2485 2487
2486 textLine = getTextLine(a->cursor.y); 2488 textLine = getTextLine(a->cursor.y);
2487 newLine = new TextLine(textLine->getRawAttr(), textLine->getContext()); 2489 newLine = new TextLine(textLine->getRawAttr(), textLine->getContext());
2488 textLine->wrap(newLine,a->cursor.x); 2490 textLine->wrap(newLine,a->cursor.x);
2489 2491
2490 buffer->insertLine(a->cursor.y + 1, newLine); 2492 buffer->insertLine(a->cursor.y + 1, newLine);
2491 buffer->changeLine(a->cursor.y); 2493 buffer->changeLine(a->cursor.y);
2492 2494
2493 insLine(a->cursor.y + 1); 2495 insLine(a->cursor.y + 1);
2494 tagLine(a->cursor.y); 2496 tagLine(a->cursor.y);
2495 tagLine(a->cursor.y + 1); 2497 tagLine(a->cursor.y + 1);
2496 if (selectEnd == a->cursor.y) selectEnd++;//addSelection(a->cursor.y + 1); 2498 if (selectEnd == a->cursor.y) selectEnd++;//addSelection(a->cursor.y + 1);
2497 2499
2498 a->action = KateAction::delLine; 2500 a->action = KateAction::delLine;
2499} 2501}
2500 2502
2501void KateDocument::doDelLine(KateAction *a) { 2503void KateDocument::doDelLine(KateAction *a) {
2502 TextLine::Ptr textLine, nextLine; 2504 TextLine::Ptr textLine, nextLine;
2503 2505
2504 textLine = getTextLine(a->cursor.y); 2506 textLine = getTextLine(a->cursor.y);
2505 nextLine = getTextLine(a->cursor.y+1); 2507 nextLine = getTextLine(a->cursor.y+1);
2506// textLine->setLength(a->cursor.x); 2508// textLine->setLength(a->cursor.x);
2507 textLine->unWrap(a->cursor.x, nextLine,nextLine->length()); 2509 textLine->unWrap(a->cursor.x, nextLine,nextLine->length());
2508 textLine->setContext(nextLine->getContext()); 2510 textLine->setContext(nextLine->getContext());
2509 if (longestLine == nextLine) longestLine = 0L; 2511 if (longestLine == nextLine) longestLine = 0L;
2510 2512
2511 buffer->changeLine(a->cursor.y); 2513 buffer->changeLine(a->cursor.y);
2512 buffer->removeLine(a->cursor.y+1); 2514 buffer->removeLine(a->cursor.y+1);
2513 2515
2514 tagLine(a->cursor.y); 2516 tagLine(a->cursor.y);
2515 delLine(a->cursor.y + 1); 2517 delLine(a->cursor.y + 1);
2516 2518
2517 a->action = KateAction::newLine; 2519 a->action = KateAction::newLine;
2518} 2520}
2519 2521
2520void KateDocument::doInsLine(KateAction *a) { 2522void KateDocument::doInsLine(KateAction *a) {
2521 2523
2522 buffer->insertLine(a->cursor.y, new TextLine()); 2524 buffer->insertLine(a->cursor.y, new TextLine());
2523 2525
2524 insLine(a->cursor.y); 2526 insLine(a->cursor.y);
2525 2527
2526 a->action = KateAction::killLine; 2528 a->action = KateAction::killLine;
2527} 2529}
2528 2530
2529void KateDocument::doKillLine(KateAction *a) { 2531void KateDocument::doKillLine(KateAction *a) {
2530 TextLine::Ptr textLine = getTextLine(a->cursor.y); 2532 TextLine::Ptr textLine = getTextLine(a->cursor.y);
2531 if (longestLine == textLine) longestLine = 0L; 2533 if (longestLine == textLine) longestLine = 0L;
2532 2534
2533 buffer->removeLine(a->cursor.y); 2535 buffer->removeLine(a->cursor.y);
2534 2536
2535 delLine(a->cursor.y); 2537 delLine(a->cursor.y);
2536 tagLine(a->cursor.y); 2538 tagLine(a->cursor.y);
2537 2539
2538 a->action = KateAction::insLine; 2540 a->action = KateAction::insLine;
2539} 2541}
2540 2542
2541void KateDocument::newUndo() { 2543void KateDocument::newUndo() {
2542 KTextEditor::View *view; 2544 KTextEditor::View *view;
2543 int state; 2545 int state;
2544 2546
2545 state = 0; 2547 state = 0;
2546 if (currentUndo > 0) state |= 1; 2548 if (currentUndo > 0) state |= 1;
2547 if (currentUndo < (int) undoList.count()) state |= 2; 2549 if (currentUndo < (int) undoList.count()) state |= 2;
2548 undoState = state; 2550 undoState = state;
2549 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 2551 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
2550 emit static_cast<KateView *>( view )->newUndo(); 2552 emit static_cast<KateView *>( view )->newUndo();
2551 } 2553 }
2552} 2554}
2553 2555
2554void KateDocument::recordStart(VConfig &c, int newUndoType) { 2556void KateDocument::recordStart(VConfig &c, int newUndoType) {
2555 recordStart(c.view, c.cursor, c.flags, newUndoType); 2557 recordStart(c.view, c.cursor, c.flags, newUndoType);
2556} 2558}
2557 2559
2558void KateDocument::recordStart(KateView *, PointStruc &cursor, int flags, 2560void KateDocument::recordStart(KateView *, PointStruc &cursor, int flags,
2559 int newUndoType, bool keepModal, bool mergeUndo) { 2561 int newUndoType, bool keepModal, bool mergeUndo) {
2560 2562
2561 KateActionGroup *g; 2563 KateActionGroup *g;
2562 2564
2563// if (newUndoType == KateActionGroup::ugNone) { 2565// if (newUndoType == KateActionGroup::ugNone) {
2564 // only a bug would cause this 2566 // only a bug would cause this
2565//why should someone do this? we can't prevent all programming errors :) (jochen whilhelmy) 2567//why should someone do this? we can't prevent all programming errors :) (jochen whilhelmy)
2566// debug("KateDocument::recordStart() called with no undo group type!"); 2568// debug("KateDocument::recordStart() called with no undo group type!");
2567// return; 2569// return;
2568// } 2570// }
2569 2571
2570 if (!keepModal) setPseudoModal(0L); 2572 if (!keepModal) setPseudoModal(0L);
2571 2573
2572 //i optimized the group undo stuff a bit (jochen wilhelmy) 2574 //i optimized the group undo stuff a bit (jochen wilhelmy)
2573 // recordReset() is not needed any more 2575 // recordReset() is not needed any more
2574 g = undoList.getLast(); 2576 g = undoList.getLast();
2575 if (g != 0L && ((undoCount < 1024 && flags & KateView::cfGroupUndo 2577 if (g != 0L && ((undoCount < 1024 && flags & KateView::cfGroupUndo
2576 && g->end.x == cursor.x && g->end.y == cursor.y) || mergeUndo)) { 2578 && g->end.x == cursor.x && g->end.y == cursor.y) || mergeUndo)) {
2577 2579
2578 //undo grouping : same actions are put into one undo step 2580 //undo grouping : same actions are put into one undo step
2579 //precondition : new action starts where old stops or mergeUndo flag 2581 //precondition : new action starts where old stops or mergeUndo flag
2580 if (g->undoType == newUndoType 2582 if (g->undoType == newUndoType
2581 || (g->undoType == KateActionGroup::ugInsChar 2583 || (g->undoType == KateActionGroup::ugInsChar
2582 && newUndoType == KateActionGroup::ugInsLine) 2584 && newUndoType == KateActionGroup::ugInsLine)
2583 || (g->undoType == KateActionGroup::ugDelChar 2585 || (g->undoType == KateActionGroup::ugDelChar
2584 && newUndoType == KateActionGroup::ugDelLine)) { 2586 && newUndoType == KateActionGroup::ugDelLine)) {
2585 2587
2586 undoCount++; 2588 undoCount++;
2587 if (g->undoType != newUndoType) undoCount = 0xffffff; 2589 if (g->undoType != newUndoType) undoCount = 0xffffff;
2588 return; 2590 return;
2589 } 2591 }
2590 } 2592 }
2591 undoCount = 0; 2593 undoCount = 0;
2592/* 2594/*
2593 if (undoView != view) { 2595 if (undoView != view) {
2594 // always kill the current undo group if the editing view changes 2596 // always kill the current undo group if the editing view changes
2595 recordReset(); 2597 recordReset();
2596 undoType = newUndoType; 2598 undoType = newUndoType;
2597 } else if (newUndoType == undoType) { 2599 } else if (newUndoType == undoType) {
2598printf("bla!!!\n"); 2600printf("bla!!!\n");
2599 // same as current type, keep using it 2601 // same as current type, keep using it
2600 return; 2602 return;
2601 } else if ( (undoType == KateActionGroup::ugInsChar && newUndoType == KateActionGroup::ugInsLine) || 2603 } else if ( (undoType == KateActionGroup::ugInsChar && newUndoType == KateActionGroup::ugInsLine) ||
2602 (undoType == KateActionGroup::ugDelChar && newUndoType == KateActionGroup::ugDelLine) ) { 2604 (undoType == KateActionGroup::ugDelChar && newUndoType == KateActionGroup::ugDelLine) ) {
2603 // some type combinations can run together... 2605 // some type combinations can run together...
2604 undoType += 1000; 2606 undoType += 1000;
2605 return; 2607 return;
2606 } else { 2608 } else {
2607 recordReset(); 2609 recordReset();
2608 undoType = newUndoType; 2610 undoType = newUndoType;
2609 } 2611 }
2610 2612
2611 undoView = view; 2613 undoView = view;
2612*/ 2614*/
2613 while ((int) undoList.count() > currentUndo) undoList.removeLast(); 2615 while ((int) undoList.count() > currentUndo) undoList.removeLast();
2614 while ((int) undoList.count() > undoSteps) { 2616 while ((int) undoList.count() > undoSteps) {
2615 undoList.removeFirst(); 2617 undoList.removeFirst();
2616 currentUndo--; 2618 currentUndo--;
2617 } 2619 }
2618 2620
2619 g = new KateActionGroup(cursor, newUndoType); 2621 g = new KateActionGroup(cursor, newUndoType);
2620 undoList.append(g); 2622 undoList.append(g);
2621// currentUndo++; 2623// currentUndo++;
2622 2624
2623 tagEnd = 0; 2625 tagEnd = 0;
2624 tagStart = 0xffffff; 2626 tagStart = 0xffffff;
2625} 2627}
2626 2628
2627void KateDocument::recordAction(KateAction::Action action, PointStruc &cursor) { 2629void KateDocument::recordAction(KateAction::Action action, PointStruc &cursor) {
2628 KateAction *a; 2630 KateAction *a;
2629 2631
2630 a = new KateAction(action, cursor); 2632 a = new KateAction(action, cursor);
2631 doAction(a); 2633 doAction(a);
2632 undoList.getLast()->insertAction(a); 2634 undoList.getLast()->insertAction(a);
2633} 2635}
2634 2636
2635void KateDocument::recordInsert(VConfig &c, const QString &text) { 2637void KateDocument::recordInsert(VConfig &c, const QString &text) {
2636 recordReplace(c, 0, text); 2638 recordReplace(c, 0, text);
2637} 2639}
2638 2640
2639void KateDocument::recordReplace(VConfig &c, int len, const QString &text) { 2641void KateDocument::recordReplace(VConfig &c, int len, const QString &text) {
2640 if (c.cursor.x > 0 && !(c.flags & KateView::cfSpaceIndent)) { 2642 if (c.cursor.x > 0 && !(c.flags & KateView::cfSpaceIndent)) {
2641 TextLine::Ptr textLine = getTextLine(c.cursor.y); 2643 TextLine::Ptr textLine = getTextLine(c.cursor.y);
2642 if (textLine->length() == 0) { 2644 if (textLine->length() == 0) {
2643 QString s = tabString(c.cursor.x, tabChars); 2645 QString s = tabString(c.cursor.x, tabChars);
2644 int len = s.length(); 2646 int len = s.length();
2645 s += text; 2647 s += text;
2646 c.cursor.x = 0; 2648 c.cursor.x = 0;
2647 recordReplace(c.cursor, len, s); 2649 recordReplace(c.cursor, len, s);
2648 c.cursor.x = len; 2650 c.cursor.x = len;
2649 return; 2651 return;
2650 } 2652 }
2651 } 2653 }
2652 recordReplace(c.cursor, len, text); 2654 recordReplace(c.cursor, len, text);
2653} 2655}
2654 2656
2655void KateDocument::recordInsert(PointStruc &cursor, const QString &text) { 2657void KateDocument::recordInsert(PointStruc &cursor, const QString &text) {
2656 recordReplace(cursor, 0, text); 2658 recordReplace(cursor, 0, text);
2657} 2659}
2658 2660
2659void KateDocument::recordDelete(PointStruc &cursor, int len) { 2661void KateDocument::recordDelete(PointStruc &cursor, int len) {
2660 recordReplace(cursor, len, QString::null); 2662 recordReplace(cursor, len, QString::null);
2661} 2663}
2662 2664
2663void KateDocument::recordReplace(PointStruc &cursor, int len, const QString &text) { 2665void KateDocument::recordReplace(PointStruc &cursor, int len, const QString &text) {
2664 KateAction *a; 2666 KateAction *a;
2665 TextLine::Ptr textLine; 2667 TextLine::Ptr textLine;
2666 int l; 2668 int l;
2667 2669
2668 if (len == 0 && text.isEmpty()) return; 2670 if (len == 0 && text.isEmpty()) return;
2669 2671
2670 //try to append to last replace action 2672 //try to append to last replace action
2671 a = undoList.getLast()->action; 2673 a = undoList.getLast()->action;
2672 if (a == 0L || a->action != KateAction::replace 2674 if (a == 0L || a->action != KateAction::replace
2673 || a->cursor.x + a->len != cursor.x || a->cursor.y != cursor.y) { 2675 || a->cursor.x + a->len != cursor.x || a->cursor.y != cursor.y) {
2674 2676
2675//if (a != 0L) printf("new %d %d\n", a->cursor.x + a->len, cursor.x); 2677//if (a != 0L) printf("new %d %d\n", a->cursor.x + a->len, cursor.x);
2676 a = new KateAction(KateAction::replace, cursor); 2678 a = new KateAction(KateAction::replace, cursor);
2677 undoList.getLast()->insertAction(a); 2679 undoList.getLast()->insertAction(a);
2678 } 2680 }
2679 2681
2680 //replace 2682 //replace
2681 textLine = getTextLine(cursor.y); 2683 textLine = getTextLine(cursor.y);
2682 l = textLine->length() - cursor.x; 2684 l = textLine->length() - cursor.x;
2683 if (l > len) l = len; 2685 if (l > len) l = len;
2684 a->text.insert(a->text.length(), &textLine->getText()[cursor.x], (l < 0) ? 0 : l); 2686 a->text.insert(a->text.length(), &textLine->getText()[cursor.x], (l < 0) ? 0 : l);
2685 textLine->replace(cursor.x, len, text.unicode(), text.length()); 2687 textLine->replace(cursor.x, len, text.unicode(), text.length());
2686 a->len += text.length(); 2688 a->len += text.length();
2687 2689
2688 buffer->changeLine(a->cursor.y); 2690 buffer->changeLine(a->cursor.y);
2689 updateMaxLength(textLine); 2691 updateMaxLength(textLine);
2690 tagLine(a->cursor.y); 2692 tagLine(a->cursor.y);
2691} 2693}
2692 2694
2693void KateDocument::recordEnd(VConfig &c) { 2695void KateDocument::recordEnd(VConfig &c) {
2694 recordEnd(c.view, c.cursor, c.flags); 2696 recordEnd(c.view, c.cursor, c.flags);
2695} 2697}
2696 2698
2697void KateDocument::recordEnd(KateView *view, PointStruc &cursor, int flags) { 2699void KateDocument::recordEnd(KateView *view, PointStruc &cursor, int flags) {
2698 KateActionGroup *g; 2700 KateActionGroup *g;
2699 2701
2700 // clear selection if option "persistent selections" is off 2702 // clear selection if option "persistent selections" is off
2701// if (!(flags & cfPersistent)) deselectAll(); 2703// if (!(flags & cfPersistent)) deselectAll();
2702 2704
2703 g = undoList.getLast(); 2705 g = undoList.getLast();
2704 if (g->action == 0L) { 2706 if (g->action == 0L) {
2705 // no action has been done: remove empty undo record 2707 // no action has been done: remove empty undo record
2706 undoList.removeLast(); 2708 undoList.removeLast();
2707 return; 2709 return;
2708 } 2710 }
2709 // store end cursor position for redo 2711 // store end cursor position for redo
2710 g->end = cursor; 2712 g->end = cursor;
2711 currentUndo = undoList.count(); 2713 currentUndo = undoList.count();
2712 2714
2713 if (tagStart <= tagEnd) { 2715 if (tagStart <= tagEnd) {
2714 optimizeSelection(); 2716 optimizeSelection();
2715 updateLines(tagStart, tagEnd, flags, cursor.y); 2717 updateLines(tagStart, tagEnd, flags, cursor.y);
2716 setModified(true); 2718 setModified(true);
2717 } 2719 }
2718 2720
2719 view->updateCursor(cursor, flags); 2721 view->updateCursor(cursor, flags);
2720 2722
2721// newUndo(); 2723// newUndo();
2722/* 2724/*
2723 undoCount++; 2725 undoCount++;
2724 // we limit the number of individual undo operations for sanity - is 1K reasonable? 2726 // we limit the number of individual undo operations for sanity - is 1K reasonable?
2725 // this is also where we handle non-group undo preference 2727 // this is also where we handle non-group undo preference
2726 // if the undo type is singlular, we always finish it now 2728 // if the undo type is singlular, we always finish it now
2727 if ( undoType == KateActionGroup::ugPaste || 2729 if ( undoType == KateActionGroup::ugPaste ||
2728 undoType == KateActionGroup::ugDelBlock || 2730 undoType == KateActionGroup::ugDelBlock ||
2729 undoType > 1000 || 2731 undoType > 1000 ||
2730 undoCount > 1024 || !(flags & cfGroupUndo) ) { 2732 undoCount > 1024 || !(flags & cfGroupUndo) ) {
2731printf("recordend %d %d\n", undoType, undoCount); 2733printf("recordend %d %d\n", undoType, undoCount);
2732 recordReset(); 2734 recordReset();
2733 } 2735 }
2734*/ 2736*/
2735 2737
2736 // this should keep the flood of signals down a little... 2738 // this should keep the flood of signals down a little...
2737 if (undoCount == 0) newUndo(); 2739 if (undoCount == 0) newUndo();
2738 emit textChanged(); 2740 emit textChanged();
2739} 2741}
2740/* 2742/*
2741void KateDocument::recordReset() 2743void KateDocument::recordReset()
2742{ 2744{
2743 if (pseudoModal) 2745 if (pseudoModal)
2744 return; 2746 return;
2745 2747
2746 // forces the next call of recordStart() to begin a new undo group 2748 // forces the next call of recordStart() to begin a new undo group
2747 // not used in normal editing, but used by markFound(), etc. 2749 // not used in normal editing, but used by markFound(), etc.
2748 undoType = KateActionGroup::ugNone; 2750 undoType = KateActionGroup::ugNone;
2749 undoCount = 0; 2751 undoCount = 0;
2750 undoView = NULL; 2752 undoView = NULL;
2751 undoReported = false; 2753 undoReported = false;
2752printf("recordreset\n"); 2754printf("recordreset\n");
2753} 2755}
2754*/ 2756*/
2755 2757
2756/* 2758/*
2757void KateDocument::recordDel(PointStruc &cursor, TextLine::Ptr &textLine, int l) { 2759void KateDocument::recordDel(PointStruc &cursor, TextLine::Ptr &textLine, int l) {
2758 int len; 2760 int len;
2759 2761
2760 len = textLine->length() - cursor.x; 2762 len = textLine->length() - cursor.x;
2761 if (len > l) len = l; 2763 if (len > l) len = l;
2762 if (len > 0) { 2764 if (len > 0) {
2763 insertUndo(new KateAction(KateAction::replace,cursor,&textLine->getText()[cursor.x],len)); 2765 insertUndo(new KateAction(KateAction::replace,cursor,&textLine->getText()[cursor.x],len));
2764 } 2766 }
2765} 2767}
2766*/ 2768*/
2767 2769
2768 2770
2769void KateDocument::doActionGroup(KateActionGroup *g, int flags, bool undo) { 2771void KateDocument::doActionGroup(KateActionGroup *g, int flags, bool undo) {
2770 KateAction *a, *next; 2772 KateAction *a, *next;
2771 2773
2772 setPseudoModal(0L); 2774 setPseudoModal(0L);
2773 if (!(flags & KateView::cfPersistent)) deselectAll(); 2775 if (!(flags & KateView::cfPersistent)) deselectAll();
2774 tagEnd = 0; 2776 tagEnd = 0;
2775 tagStart = 0xffffff; 2777 tagStart = 0xffffff;
2776 2778
2777 a = g->action; 2779 a = g->action;
2778 g->action = 0L; 2780 g->action = 0L;
2779 while (a) { 2781 while (a) {
2780 doAction(a); 2782 doAction(a);
2781 next = a->next; 2783 next = a->next;
2782 g->insertAction(a); 2784 g->insertAction(a);
2783 a = next; 2785 a = next;
2784 } 2786 }
2785 optimizeSelection(); 2787 optimizeSelection();
2786 if (tagStart <= tagEnd) updateLines(tagStart, tagEnd, flags); 2788 if (tagStart <= tagEnd) updateLines(tagStart, tagEnd, flags);
2787 2789
2788 // the undo/redo functions set undo to true, all others should leave it 2790 // the undo/redo functions set undo to true, all others should leave it
2789 // alone (default) 2791 // alone (default)
2790 if (!undo) { 2792 if (!undo) {
2791 setModified(true); 2793 setModified(true);
2792 newUndo(); 2794 newUndo();
2793 } 2795 }
2794} 2796}
2795 2797
2796int KateDocument::nextUndoType() 2798int KateDocument::nextUndoType()
2797{ 2799{
2798 KateActionGroup *g; 2800 KateActionGroup *g;
2799 2801
2800 if (currentUndo <= 0) return KateActionGroup::ugNone; 2802 if (currentUndo <= 0) return KateActionGroup::ugNone;
2801 g = undoList.at(currentUndo - 1); 2803 g = undoList.at(currentUndo - 1);
2802 return g->undoType; 2804 return g->undoType;
2803} 2805}
2804 2806
2805int KateDocument::nextRedoType() 2807int KateDocument::nextRedoType()
2806{ 2808{
2807 KateActionGroup *g; 2809 KateActionGroup *g;
2808 2810
2809 if (currentUndo >= (int) undoList.count()) return KateActionGroup::ugNone; 2811 if (currentUndo >= (int) undoList.count()) return KateActionGroup::ugNone;
2810 g = undoList.at(currentUndo); 2812 g = undoList.at(currentUndo);
2811// if (!g) return KateActionGroup::ugNone; 2813// if (!g) return KateActionGroup::ugNone;
2812 return g->undoType; 2814 return g->undoType;
2813} 2815}
2814 2816
2815void KateDocument::undoTypeList(QValueList<int> &lst) 2817void KateDocument::undoTypeList(QValueList<int> &lst)
2816{ 2818{
2817 lst.clear(); 2819 lst.clear();
2818 for (int i = currentUndo-1; i>=0 ;i--) 2820 for (int i = currentUndo-1; i>=0 ;i--)
2819 lst.append(undoList.at(i)->undoType); 2821 lst.append(undoList.at(i)->undoType);
2820} 2822}
2821 2823
2822void KateDocument::redoTypeList(QValueList<int> &lst) 2824void KateDocument::redoTypeList(QValueList<int> &lst)
2823{ 2825{
2824 lst.clear(); 2826 lst.clear();
2825 for (int i = currentUndo+1; i<(int)undoList.count(); i++) 2827 for (int i = currentUndo+1; i<(int)undoList.count(); i++)
2826 lst.append(undoList.at(i)->undoType); 2828 lst.append(undoList.at(i)->undoType);
2827} 2829}
2828 2830
2829void KateDocument::undo(VConfig &c, int count) { 2831void KateDocument::undo(VConfig &c, int count) {
2830 KateActionGroup *g = 0L; 2832 KateActionGroup *g = 0L;
2831 int num; 2833 int num;
2832 bool needUpdate = false; // don't update the cursor until completely done 2834 bool needUpdate = false; // don't update the cursor until completely done
2833 2835
2834 if (count <= 0) return; 2836 if (count <= 0) return;
2835 2837
2836 for (num = 0 ; num < count ; num++) { 2838 for (num = 0 ; num < count ; num++) {
2837 if (currentUndo <= 0) break; 2839 if (currentUndo <= 0) break;
2838 currentUndo--; 2840 currentUndo--;
2839 g = undoList.at(currentUndo); 2841 g = undoList.at(currentUndo);
2840 doActionGroup(g, c.flags, true); // do not setModified() or newUndo() 2842 doActionGroup(g, c.flags, true); // do not setModified() or newUndo()
2841 needUpdate = true; 2843 needUpdate = true;
2842 2844
2843// if (num == 0) recordReset(); 2845// if (num == 0) recordReset();
2844 } 2846 }
2845 2847
2846 if (needUpdate) { 2848 if (needUpdate) {
2847 // since we told doActionGroup() not to do this stuff, we need to do it now 2849 // since we told doActionGroup() not to do this stuff, we need to do it now
2848 c.view->updateCursor(g->start); 2850 c.view->updateCursor(g->start);
2849 setModified(true); 2851 setModified(true);
2850 newUndo(); 2852 newUndo();
2851 } 2853 }
2852} 2854}
2853 2855
2854void KateDocument::redo(VConfig &c, int count) { 2856void KateDocument::redo(VConfig &c, int count) {
2855 KateActionGroup *g = 0L; 2857 KateActionGroup *g = 0L;
2856 int num; 2858 int num;
2857 bool needUpdate = false; // don't update the cursor until completely done 2859 bool needUpdate = false; // don't update the cursor until completely done
2858 2860
2859 if (count <= 0) return; 2861 if (count <= 0) return;
2860 2862
2861 for (num = 0 ; num < count ; num++) { 2863 for (num = 0 ; num < count ; num++) {
2862 if (currentUndo+1 > (int)undoList.count()) break; 2864 if (currentUndo+1 > (int)undoList.count()) break;
2863 g = undoList.at(currentUndo); 2865 g = undoList.at(currentUndo);
2864 currentUndo++; 2866 currentUndo++;
2865 doActionGroup(g, c.flags, true); // do not setModified() or newUndo() 2867 doActionGroup(g, c.flags, true); // do not setModified() or newUndo()
2866 needUpdate = true; 2868 needUpdate = true;
2867 2869
2868// if (num == 0) recordReset(); 2870// if (num == 0) recordReset();
2869 } 2871 }
2870 2872
2871 if (needUpdate) { 2873 if (needUpdate) {
2872 // since we told doActionGroup() not to do this stuff, we need to do it now 2874 // since we told doActionGroup() not to do this stuff, we need to do it now
2873 c.view->updateCursor(g->end); 2875 c.view->updateCursor(g->end);
2874 setModified(true); 2876 setModified(true);
2875 newUndo(); 2877 newUndo();
2876 } 2878 }
2877} 2879}
2878 2880
2879void KateDocument::clearRedo() { 2881void KateDocument::clearRedo() {
2880 // disable redos 2882 // disable redos
2881 // this was added as an assist to the spell checker 2883 // this was added as an assist to the spell checker
2882 bool deleted = false; 2884 bool deleted = false;
2883 2885
2884 while ((int) undoList.count() > currentUndo) { 2886 while ((int) undoList.count() > currentUndo) {
2885 deleted = true; 2887 deleted = true;
2886 undoList.removeLast(); 2888 undoList.removeLast();
2887 } 2889 }
2888 2890
2889 if (deleted) newUndo(); 2891 if (deleted) newUndo();
2890} 2892}
2891 2893
2892void KateDocument::setUndoSteps(int steps) { 2894void KateDocument::setUndoSteps(int steps) {
2893 if (steps < 5) steps = 5; 2895 if (steps < 5) steps = 5;
2894 undoSteps = steps; 2896 undoSteps = steps;
2895} 2897}
2896 2898
2897void KateDocument::setPseudoModal(QWidget *w) { 2899void KateDocument::setPseudoModal(QWidget *w) {
2898// QWidget *old = pseudoModal; 2900// QWidget *old = pseudoModal;
2899 2901
2900 // (glenebob) 2902 // (glenebob)
2901 // this is a temporary hack to make the spell checker work a little 2903 // this is a temporary hack to make the spell checker work a little
2902 // better - as kspell progresses, this sort of thing should become 2904 // better - as kspell progresses, this sort of thing should become
2903 // obsolete or worked around more cleanly 2905 // obsolete or worked around more cleanly
2904 // this is relied upon *only* by the spell-check code 2906 // this is relied upon *only* by the spell-check code
2905 if (pseudoModal && pseudoModal != (QWidget*)1L) 2907 if (pseudoModal && pseudoModal != (QWidget*)1L)
2906 delete pseudoModal; 2908 delete pseudoModal;
2907 2909
2908// pseudoModal = 0L; 2910// pseudoModal = 0L;
2909// if (old || w) recordReset(); 2911// if (old || w) recordReset();
2910 2912
2911 pseudoModal = w; 2913 pseudoModal = w;
2912} 2914}
2913 2915
2914 2916
2915void KateDocument::newBracketMark(PointStruc &cursor, BracketMark &bm) 2917void KateDocument::newBracketMark(PointStruc &cursor, BracketMark &bm)
2916{ 2918{
2917 TextLine::Ptr textLine; 2919 TextLine::Ptr textLine;
2918 int x, line, count, attr; 2920 int x, line, count, attr;
2919 QChar bracket, opposite, ch; 2921 QChar bracket, opposite, ch;
2920 Attribute *a; 2922 Attribute *a;
2921 2923
2922 bm.eXPos = -1; //mark bracked mark as invalid 2924 bm.eXPos = -1; //mark bracked mark as invalid
2923 x = cursor.x -1; // -1 to look at left side of cursor 2925 x = cursor.x -1; // -1 to look at left side of cursor
2924 if (x < 0) return; 2926 if (x < 0) return;
2925 line = cursor.y; //current line 2927 line = cursor.y; //current line
2926 count = 0; //bracket counter for nested brackets 2928 count = 0; //bracket counter for nested brackets
2927 2929
2928 textLine = getTextLine(line); 2930 textLine = getTextLine(line);
2929 if (!textLine) return; 2931 if (!textLine) return;
2930 2932
2931 bracket = textLine->getChar(x); 2933 bracket = textLine->getChar(x);
2932 attr = textLine->getAttr(x); 2934 attr = textLine->getAttr(x);
2933 2935
2934 if (bracket == '(' || bracket == '[' || bracket == '{') 2936 if (bracket == '(' || bracket == '[' || bracket == '{')
2935 { 2937 {
2936 //get opposite bracket 2938 //get opposite bracket
2937 opposite = ')'; 2939 opposite = ')';
2938 if (bracket == '[') opposite = ']'; 2940 if (bracket == '[') opposite = ']';
2939 if (bracket == '{') opposite = '}'; 2941 if (bracket == '{') opposite = '}';
2940 //get attribute of bracket (opposite bracket must have the same attribute) 2942 //get attribute of bracket (opposite bracket must have the same attribute)
2941 x++; 2943 x++;
2942 while (line - cursor.y < 40) { 2944 while (line - cursor.y < 40) {
2943 //go to next line on end of line 2945 //go to next line on end of line
2944 while (x >= (int) textLine->length()) { 2946 while (x >= (int) textLine->length()) {
2945 line++; 2947 line++;
2946 if (line > lastLine()) return; 2948 if (line > lastLine()) return;
2947 textLine = getTextLine(line); 2949 textLine = getTextLine(line);
2948 x = 0; 2950 x = 0;
2949 } 2951 }
2950 if (textLine->getAttr(x) == attr) { 2952 if (textLine->getAttr(x) == attr) {
2951 //try to find opposite bracked 2953 //try to find opposite bracked
2952 ch = textLine->getChar(x); 2954 ch = textLine->getChar(x);
2953 if (ch == bracket) count++; //same bracket : increase counter 2955 if (ch == bracket) count++; //same bracket : increase counter
2954 if (ch == opposite) { 2956 if (ch == opposite) {
2955 count--; 2957 count--;
2956 if (count < 0) goto found; 2958 if (count < 0) goto found;
2957 } 2959 }
2958 } 2960 }
2959 x++; 2961 x++;
2960 } 2962 }
2961 } 2963 }
2962 else if (bracket == ')' || bracket == ']' || bracket == '}') 2964 else if (bracket == ')' || bracket == ']' || bracket == '}')
2963 { 2965 {
2964 opposite = '('; 2966 opposite = '(';
2965 if (bracket == ']') opposite = '['; 2967 if (bracket == ']') opposite = '[';
2966 if (bracket == '}') opposite = '{'; 2968 if (bracket == '}') opposite = '{';
2967 x--; 2969 x--;
2968 while (cursor.y - line < 20) { 2970 while (cursor.y - line < 20) {
2969 2971
2970 while (x < 0) { 2972 while (x < 0) {
2971 line--; 2973 line--;
2972 if (line < 0) return; 2974 if (line < 0) return;
2973 textLine = getTextLine(line); 2975 textLine = getTextLine(line);
2974 x = textLine->length() -1; 2976 x = textLine->length() -1;
2975 } 2977 }
2976 if (textLine->getAttr(x) == attr) { 2978 if (textLine->getAttr(x) == attr) {
2977 ch = textLine->getChar(x); 2979 ch = textLine->getChar(x);
2978 if (ch == bracket) count++; 2980 if (ch == bracket) count++;
2979 if (ch == opposite) { 2981 if (ch == opposite) {
2980 count--; 2982 count--;
2981 if (count < 0) goto found; 2983 if (count < 0) goto found;
2982 } 2984 }
2983 } 2985 }
2984 x--; 2986 x--;
2985 } 2987 }
2986 } 2988 }
2987 return; 2989 return;
2988 2990
2989found: 2991found:
2990 //cursor position of opposite bracket 2992 //cursor position of opposite bracket
2991 bm.cursor.x = x; 2993 bm.cursor.x = x;
2992 bm.cursor.y = line; 2994 bm.cursor.y = line;
2993 //x position (start and end) of related bracket 2995 //x position (start and end) of related bracket
2994 bm.sXPos = textWidth(textLine, x); 2996 bm.sXPos = textWidth(textLine, x);
2995 a = &m_attribs[attr]; 2997 a = &m_attribs[attr];
2996 2998
2997 if (a->bold && a->italic) 2999 if (a->bold && a->italic)
2998 bm.eXPos = bm.sXPos + myFontMetricsBI.width(bracket); 3000 bm.eXPos = bm.sXPos + myFontMetricsBI.width(bracket);
2999 else if (a->bold) 3001 else if (a->bold)
3000 bm.eXPos = bm.sXPos + myFontMetricsBold.width(bracket); 3002 bm.eXPos = bm.sXPos + myFontMetricsBold.width(bracket);
3001 else if (a->italic) 3003 else if (a->italic)
3002 bm.eXPos = bm.sXPos + myFontMetricsItalic.width(bracket); 3004 bm.eXPos = bm.sXPos + myFontMetricsItalic.width(bracket);
3003 else 3005 else
3004 bm.eXPos = bm.sXPos + myFontMetrics.width(bracket); 3006 bm.eXPos = bm.sXPos + myFontMetrics.width(bracket);
3005} 3007}
3006 3008
3007void KateDocument::clipboardChanged() { //slot 3009void KateDocument::clipboardChanged() { //slot
3008//#if defined(_WS_X11_) 3010//#if defined(_WS_X11_)
3009 if (m_singleSelection) { 3011 if (m_singleSelection) {
3010 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()), 3012 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()),
3011 this, SLOT(clipboardChanged())); 3013 this, SLOT(clipboardChanged()));
3012 deselectAll(); 3014 deselectAll();
3013 updateViews(); 3015 updateViews();
3014 } 3016 }
3015//#endif 3017//#endif
3016} 3018}
3017 3019
3018#if 0 3020#if 0
3019void KateDocument::guiActivateEvent( KParts::GUIActivateEvent *ev ) 3021void KateDocument::guiActivateEvent( KParts::GUIActivateEvent *ev )
3020{ 3022{
3021 KParts::ReadWritePart::guiActivateEvent( ev ); 3023 KParts::ReadWritePart::guiActivateEvent( ev );
3022 if ( ev->activated() ) 3024 if ( ev->activated() )
3023 emit selectionChanged(); 3025 emit selectionChanged();
3024} 3026}
3025#endif 3027#endif
3026 3028
3027void KateDocument::setDocName (QString docName) 3029void KateDocument::setDocName (QString docName)
3028{ 3030{
3029 myDocName = docName; 3031 myDocName = docName;
3030 emit nameChanged (this); 3032 emit nameChanged (this);
3031} 3033}
3032 3034
3035void KateDocument::setDocFile (QString docFile)
3036{
3037 m_file = docFile;
3038 emit fileNameChanged ();
3039}
3040
3033void KateDocument::setMTime() 3041void KateDocument::setMTime()
3034{ 3042{
3035 if (fileInfo && !fileInfo->fileName().isEmpty()) { 3043 if (fileInfo && !fileInfo->fileName().isEmpty()) {
3036 fileInfo->refresh(); 3044 fileInfo->refresh();
3037 mTime = fileInfo->lastModified(); 3045 mTime = fileInfo->lastModified();
3038 } 3046 }
3039} 3047}
3040 3048
3041void KateDocument::isModOnHD(bool forceReload) 3049void KateDocument::isModOnHD(bool forceReload)
3042{ 3050{
3043 if (fileInfo && !fileInfo->fileName().isEmpty()) { 3051 if (fileInfo && !fileInfo->fileName().isEmpty()) {
3044 fileInfo->refresh(); 3052 fileInfo->refresh();
3045 if (fileInfo->lastModified() > mTime) { 3053 if (fileInfo->lastModified() > mTime) {
3046 if ( forceReload || 3054 if ( forceReload ||
3047 (KMessageBox::warningContinueCancel(0, 3055 (KMessageBox::warningContinueCancel(0,
3048 (i18n("The file %1 has changed on disk.\nDo you want to reload it?\n\nIf you cancel you will lose these changes next time you save this file")).arg(m_url), 3056 (i18n("The file %1 has changed on disk.\nDo you want to reload it?\n\nIf you cancel you will lose these changes next time you save this file")).arg(m_url),
3049 i18n("File has changed on Disk"), 3057 i18n("File has changed on Disk"),
3050 i18n("Yes") ) == KMessageBox::Continue) 3058 i18n("Yes") ) == KMessageBox::Continue)
3051 ) 3059 )
3052 reloadFile(); 3060 reloadFile();
3053 else 3061 else
3054 setMTime(); 3062 setMTime();
3055 } 3063 }
3056 } 3064 }
3057} 3065}
3058 3066
3059void KateDocument::reloadFile() 3067void KateDocument::reloadFile()
3060{ 3068{
3061#warning fixme 3069#warning fixme
3062#if 0 3070#if 0
3063 if (fileInfo && !fileInfo->fileName().isEmpty()) { 3071 if (fileInfo && !fileInfo->fileName().isEmpty()) {
3064 KateDocument::openFile(); 3072 KateDocument::openFile();
3065 setMTime(); 3073 setMTime();
3066 } 3074 }
3067#endif 3075#endif
3068} 3076}
3069 3077
3070void KateDocument::slotModChanged() 3078void KateDocument::slotModChanged()
3071{ 3079{
3072 emit modStateChanged (this); 3080 emit modStateChanged (this);
3073} 3081}
3074 3082
3075QList<Kate::Mark> KateDocument::marks () 3083QList<Kate::Mark> KateDocument::marks ()
3076{ 3084{
3077 QList<Kate::Mark> list; 3085 QList<Kate::Mark> list;
3078 TextLine::Ptr line; 3086 TextLine::Ptr line;
3079 3087
3080 for (int i=0; i < numLines(); i++) 3088 for (int i=0; i < numLines(); i++)
3081 { 3089 {
3082 line = getTextLine(i); 3090 line = getTextLine(i);
3083 if (line->mark() != 0) 3091 if (line->mark() != 0)
3084 { 3092 {
3085 Kate::Mark *mark=new Kate::Mark; 3093 Kate::Mark *mark=new Kate::Mark;
3086 mark->line = i; 3094 mark->line = i;
3087 mark->type = line->mark(); 3095 mark->type = line->mark();
3088 list.append (mark); 3096 list.append (mark);
3089 } 3097 }
3090 } 3098 }
3091 3099
3092 return list; 3100 return list;
3093} 3101}
3094 3102
3095void KateDocument::flush () 3103void KateDocument::flush ()
3096{ 3104{
3097 if (isReadOnly()) 3105 if (isReadOnly())
3098 return; 3106 return;
3099 3107
3100 m_url = QString::null; 3108 m_url = QString::null;
3101 fileInfo->setFile (QString()); 3109 fileInfo->setFile (QString());
3102 setMTime(); 3110 setMTime();
3103 3111
3104 clear(); 3112 clear();
3105 updateViews(); 3113 updateViews();
3106 3114
3107 emit fileNameChanged (); 3115 emit fileNameChanged ();
3108} 3116}
3109 3117
3110void KateDocument::open (const QString &name) 3118void KateDocument::open (const QString &name)
3111{ 3119{
3112 openURL (name); 3120 openURL (name);
3113} 3121}
3114 3122
3115void KateDocument::wrapText (uint col) 3123void KateDocument::wrapText (uint col)
3116{ 3124{
3117 int line = 0; 3125 int line = 0;
3118 int z = 0; 3126 int z = 0;
3119 3127
3120 while(true) 3128 while(true)
3121 { 3129 {
3122 TextLine::Ptr l = getTextLine(line); 3130 TextLine::Ptr l = getTextLine(line);
3123 3131
3124 if (l->length() > col) 3132 if (l->length() > col)
3125 { 3133 {
3126 TextLine::Ptr tl = new TextLine(); 3134 TextLine::Ptr tl = new TextLine();
3127 buffer->insertLine(line+1,tl); 3135 buffer->insertLine(line+1,tl);
3128 const QChar *text = l->getText(); 3136 const QChar *text = l->getText();
3129 3137
3130 for (z=col; z>0; z--) 3138 for (z=col; z>0; z--)
3131 { 3139 {
3132 if (z < 1) break; 3140 if (z < 1) break;
3133 if (text[z].isSpace()) break; 3141 if (text[z].isSpace()) break;
3134 } 3142 }
3135 3143
3136 if (z < 1) z=col; 3144 if (z < 1) z=col;
3137 3145
3138 l->wrap (tl, z); 3146 l->wrap (tl, z);
3139 } 3147 }
3140 3148
3141 line++; 3149 line++;
3142 if (line >= numLines()) break; 3150 if (line >= numLines()) break;
3143 }; 3151 };
3144 3152
3145 newDocGeometry=true; 3153 newDocGeometry=true;
3146 updateLines(); 3154 updateLines();
3147 updateViews(); 3155 updateViews();
3148} 3156}
3149 3157
3150void KateDocument::setWordWrap (bool on) 3158void KateDocument::setWordWrap (bool on)
3151{ 3159{
3152 if (on != myWordWrap && on) 3160 if (on != myWordWrap && on)
3153 wrapText (myWordWrapAt); 3161 wrapText (myWordWrapAt);
3154 3162
3155 myWordWrap = on; 3163 myWordWrap = on;
3156} 3164}
3157 3165
3158void KateDocument::setWordWrapAt (uint col) 3166void KateDocument::setWordWrapAt (uint col)
3159{ 3167{
3160 if (myWordWrapAt != col && myWordWrap) 3168 if (myWordWrapAt != col && myWordWrap)
3161 wrapText (myWordWrapAt); 3169 wrapText (myWordWrapAt);
3162 3170
3163 myWordWrapAt = col; 3171 myWordWrapAt = col;
3164} 3172}
3165 3173
3166void KateDocument::applyWordWrap () 3174void KateDocument::applyWordWrap ()
3167{ 3175{
3168 wrapText (myWordWrapAt); 3176 wrapText (myWordWrapAt);
3169} 3177}
diff --git a/noncore/apps/tinykate/libkate/document/katedocument.h b/noncore/apps/tinykate/libkate/document/katedocument.h
index 220d188..356541f 100644
--- a/noncore/apps/tinykate/libkate/document/katedocument.h
+++ b/noncore/apps/tinykate/libkate/document/katedocument.h
@@ -1,569 +1,570 @@
1/*************************************************************************** 1/***************************************************************************
2 katedocument.h - description 2 katedocument.h - description
3 ------------------- 3 -------------------
4 begin : Mon Jan 15 2001 4 begin : Mon Jan 15 2001
5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann 5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann
6 (C) 2002 by Joseph Wenninger 6 (C) 2002 by Joseph Wenninger
7 email : crossfire@babylon2k.de 7 email : crossfire@babylon2k.de
8 jowenn@kde.org 8 jowenn@kde.org
9 9
10***************************************************************************/ 10***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * * 13 * *
14 * This program is free software; you can redistribute it and/or modify * 14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by * 15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or * 16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. * 17 * (at your option) any later version. *
18 * * 18 * *
19 ***************************************************************************/ 19 ***************************************************************************/
20 20
21/* 21/*
22 Copyright (C) 1998, 1999 Jochen Wilhelmy 22 Copyright (C) 1998, 1999 Jochen Wilhelmy
23 digisnap@cs.tu-berlin.de 23 digisnap@cs.tu-berlin.de
24 24
25 This library is free software; you can redistribute it and/or 25 This library is free software; you can redistribute it and/or
26 modify it under the terms of the GNU Library General Public 26 modify it under the terms of the GNU Library General Public
27 License as published by the Free Software Foundation; either 27 License as published by the Free Software Foundation; either
28 version 2 of the License, or (at your option) any later version. 28 version 2 of the License, or (at your option) any later version.
29 29
30 This library is distributed in the hope that it will be useful, 30 This library is distributed in the hope that it will be useful,
31 but WITHOUT ANY WARRANTY; without even the implied warranty of 31 but WITHOUT ANY WARRANTY; without even the implied warranty of
32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 Library General Public License for more details. 33 Library General Public License for more details.
34 34
35 You should have received a copy of the GNU Library General Public License 35 You should have received a copy of the GNU Library General Public License
36 along with this library; see the file COPYING.LIB. If not, write to 36 along with this library; see the file COPYING.LIB. If not, write to
37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
38 Boston, MA 02111-1307, USA. 38 Boston, MA 02111-1307, USA.
39*/ 39*/
40 40
41#ifndef kate_document_h 41#ifndef kate_document_h
42#define kate_document_h 42#define kate_document_h
43 43
44 44
45#include <qobject.h> 45#include <qobject.h>
46#include <qlist.h> 46#include <qlist.h>
47#include <qcolor.h> 47#include <qcolor.h>
48#include <qfont.h> 48#include <qfont.h>
49#include <qfontmetrics.h> 49#include <qfontmetrics.h>
50#include <qdatetime.h> 50#include <qdatetime.h>
51#include <qfileinfo.h> 51#include <qfileinfo.h>
52 52
53#include "../view/kateview.h" 53#include "../view/kateview.h"
54#include "katehighlight.h" 54#include "katehighlight.h"
55#include "katebuffer.h" 55#include "katebuffer.h"
56#include "katetextline.h" 56#include "katetextline.h"
57 57
58 58
59#include <qptrdict.h> 59#include <qptrdict.h>
60 60
61class KateCmd; 61class KateCmd;
62 62
63class CachedFontMetrics : public QFontMetrics { 63class CachedFontMetrics : public QFontMetrics {
64private: 64private:
65 short *warray[256]; 65 short *warray[256];
66public: 66public:
67 CachedFontMetrics(const QFont& f) : QFontMetrics(f) { 67 CachedFontMetrics(const QFont& f) : QFontMetrics(f) {
68 for (int i=0; i<256; i++) warray[i]=0; 68 for (int i=0; i<256; i++) warray[i]=0;
69 } 69 }
70 ~CachedFontMetrics() { 70 ~CachedFontMetrics() {
71 for (int i=0; i<256; i++) 71 for (int i=0; i<256; i++)
72 if (warray[i]) delete[] warray[i]; 72 if (warray[i]) delete[] warray[i];
73 } 73 }
74 int width(QChar c) { 74 int width(QChar c) {
75 uchar cell=c.cell(); 75 uchar cell=c.cell();
76 uchar row=c.row(); 76 uchar row=c.row();
77 short *wa=warray[row]; 77 short *wa=warray[row];
78 if (!wa) { 78 if (!wa) {
79 // qDebug("create row: %d",row); 79 // qDebug("create row: %d",row);
80 wa=warray[row]=new short[256]; 80 wa=warray[row]=new short[256];
81 for (int i=0; i<256; i++) wa[i]=-1; 81 for (int i=0; i<256; i++) wa[i]=-1;
82 } 82 }
83 if (wa[cell]<0) wa[cell]=(short) QFontMetrics::width(c); 83 if (wa[cell]<0) wa[cell]=(short) QFontMetrics::width(c);
84 return (int)wa[cell]; 84 return (int)wa[cell];
85 } 85 }
86 int width(QString s) { return QFontMetrics::width(s); } 86 int width(QString s) { return QFontMetrics::width(s); }
87}; 87};
88 88
89class Attribute { 89class Attribute {
90 public: 90 public:
91 Attribute() { ; }; 91 Attribute() { ; };
92 92
93 QColor col; 93 QColor col;
94 QColor selCol; 94 QColor selCol;
95 bool bold; 95 bool bold;
96 bool italic; 96 bool italic;
97}; 97};
98 98
99class KateAction { 99class KateAction {
100 public: 100 public:
101 enum Action {replace, wordWrap, wordUnWrap, newLine, delLine, 101 enum Action {replace, wordWrap, wordUnWrap, newLine, delLine,
102 insLine, killLine};//, doubleLine, removeLine}; 102 insLine, killLine};//, doubleLine, removeLine};
103 103
104 KateAction(Action, PointStruc &cursor, int len = 0, 104 KateAction(Action, PointStruc &cursor, int len = 0,
105 const QString &text = QString::null); 105 const QString &text = QString::null);
106 106
107 Action action; 107 Action action;
108 PointStruc cursor; 108 PointStruc cursor;
109 int len; 109 int len;
110 QString text; 110 QString text;
111 KateAction *next; 111 KateAction *next;
112}; 112};
113 113
114class KateActionGroup { 114class KateActionGroup {
115 public: 115 public:
116 // the undo group types 116 // the undo group types
117 enum { ugNone, // 117 enum { ugNone, //
118 ugPaste, // paste 118 ugPaste, // paste
119 ugDelBlock, // delete/replace selected text 119 ugDelBlock, // delete/replace selected text
120 ugIndent, // indent 120 ugIndent, // indent
121 ugUnindent, // unindent 121 ugUnindent, // unindent
122 ugComment, // comment 122 ugComment, // comment
123 ugUncomment, // uncomment 123 ugUncomment, // uncomment
124 ugReplace, // text search/replace 124 ugReplace, // text search/replace
125 ugSpell, // spell check 125 ugSpell, // spell check
126 ugInsChar, // char type/deleting 126 ugInsChar, // char type/deleting
127 ugDelChar, // '' '' 127 ugDelChar, // '' ''
128 ugInsLine, // line insert/delete 128 ugInsLine, // line insert/delete
129 ugDelLine // '' '' 129 ugDelLine // '' ''
130 }; 130 };
131 131
132 KateActionGroup(PointStruc &aStart, int type = ugNone); 132 KateActionGroup(PointStruc &aStart, int type = ugNone);
133 ~KateActionGroup(); 133 ~KateActionGroup();
134 void insertAction(KateAction *); 134 void insertAction(KateAction *);
135 135
136 static const char * typeName(int type); 136 static const char * typeName(int type);
137 137
138 PointStruc start; 138 PointStruc start;
139 PointStruc end; 139 PointStruc end;
140 KateAction *action; 140 KateAction *action;
141 int undoType; 141 int undoType;
142}; 142};
143 143
144/** 144/**
145 The text document. It contains the textlines, controls the 145 The text document. It contains the textlines, controls the
146 document changing operations and does undo/redo. WARNING: do not change 146 document changing operations and does undo/redo. WARNING: do not change
147 the text contents directly in methods where this is not explicitly 147 the text contents directly in methods where this is not explicitly
148 permitted. All changes have to be made with some basic operations, 148 permitted. All changes have to be made with some basic operations,
149 which are recorded by the undo/redo system. 149 which are recorded by the undo/redo system.
150 @see TextLine 150 @see TextLine
151 @author Jochen Wilhelmy 151 @author Jochen Wilhelmy
152*/ 152*/
153class KateDocument: public Kate::Document 153class KateDocument: public Kate::Document
154{ 154{
155 Q_OBJECT 155 Q_OBJECT
156 friend class KateViewInternal; 156 friend class KateViewInternal;
157 friend class KateView; 157 friend class KateView;
158 friend class KateIconBorder; 158 friend class KateIconBorder;
159 159
160 public: 160 public:
161 KateDocument(bool bSingleViewMode=false, bool bBrowserView=false, QWidget *parentWidget = 0, const char *widgetName = 0, QObject * = 0, const char * = 0); 161 KateDocument(bool bSingleViewMode=false, bool bBrowserView=false, QWidget *parentWidget = 0, const char *widgetName = 0, QObject * = 0, const char * = 0);
162 ~KateDocument(); 162 ~KateDocument();
163 163
164 protected: 164 protected:
165 QFont myFont, myFontBold, myFontItalic, myFontBI; 165 QFont myFont, myFontBold, myFontItalic, myFontBI;
166 CachedFontMetrics myFontMetrics, myFontMetricsBold, myFontMetricsItalic, myFontMetricsBI; 166 CachedFontMetrics myFontMetrics, myFontMetricsBold, myFontMetricsItalic, myFontMetricsBI;
167 167
168 public: 168 public:
169 void setFont (QFont font); 169 void setFont (QFont font);
170 QFont getFont () { return myFont; }; 170 QFont getFont () { return myFont; };
171 CachedFontMetrics getFontMetrics () { return myFontMetrics; }; 171 CachedFontMetrics getFontMetrics () { return myFontMetrics; };
172 172
173 virtual bool saveFile(); 173 virtual bool saveFile();
174 174
175 virtual KTextEditor::View *createView( QWidget *parent, const char *name ); 175 virtual KTextEditor::View *createView( QWidget *parent, const char *name );
176 virtual QString textLine( int line ) const; 176 virtual QString textLine( int line ) const;
177 177
178 virtual void insertLine( const QString &s, int line = -1 ); 178 virtual void insertLine( const QString &s, int line = -1 );
179 179
180 void insert_Line(const QString& s,int line=-1, bool update=true); 180 void insert_Line(const QString& s,int line=-1, bool update=true);
181 void remove_Line(int line,bool update=true); 181 void remove_Line(int line,bool update=true);
182 void replaceLine(const QString& s,int line=-1); 182 void replaceLine(const QString& s,int line=-1);
183 virtual void insertAt( const QString &s, int line, int col, bool mark = FALSE ); 183 virtual void insertAt( const QString &s, int line, int col, bool mark = FALSE );
184 virtual void removeLine( int line ); 184 virtual void removeLine( int line );
185 virtual int length() const; 185 virtual int length() const;
186 186
187 virtual void setSelection( int row_from, int col_from, int row_to, int col_t ); 187 virtual void setSelection( int row_from, int col_from, int row_to, int col_t );
188 virtual bool hasSelection() const; 188 virtual bool hasSelection() const;
189 virtual QString selection() const; 189 virtual QString selection() const;
190 190
191 // only to make part work, don't change it ! 191 // only to make part work, don't change it !
192 bool m_bSingleViewMode; 192 bool m_bSingleViewMode;
193 193
194// public interface 194// public interface
195 /** 195 /**
196 * gets the number of lines 196 * gets the number of lines
197 */ 197 */
198 virtual int numLines() const; 198 virtual int numLines() const;
199 199
200 /** 200 /**
201 * gets the last line number (numLines() -1) 201 * gets the last line number (numLines() -1)
202 */ 202 */
203 int lastLine() const {return numLines()-1;} 203 int lastLine() const {return numLines()-1;}
204 204
205 /** 205 /**
206 gets the given line 206 gets the given line
207 @return the TextLine object at the given line 207 @return the TextLine object at the given line
208 @see TextLine 208 @see TextLine
209 */ 209 */
210 TextLine::Ptr getTextLine(int line) const; 210 TextLine::Ptr getTextLine(int line) const;
211 211
212 /** 212 /**
213 get the length in pixels of the given line 213 get the length in pixels of the given line
214 */ 214 */
215 int textLength(int line); 215 int textLength(int line);
216 216
217 void setTabWidth(int); 217 void setTabWidth(int);
218 int tabWidth() {return tabChars;} 218 int tabWidth() {return tabChars;}
219 void setReadOnly(bool); 219 void setReadOnly(bool);
220 bool isReadOnly() const; 220 bool isReadOnly() const;
221 void setNewDoc( bool ); 221 void setNewDoc( bool );
222 bool isNewDoc() const; 222 bool isNewDoc() const;
223 virtual void setReadWrite( bool ){}; 223 virtual void setReadWrite( bool ){};
224 virtual bool isReadWrite() const {return true;} 224 virtual bool isReadWrite() const {return true;}
225 virtual void setModified(bool); 225 virtual void setModified(bool);
226 virtual bool isModified() const; 226 virtual bool isModified() const;
227 void setSingleSelection(bool ss) {m_singleSelection = ss;} 227 void setSingleSelection(bool ss) {m_singleSelection = ss;}
228 bool singleSelection() {return m_singleSelection;} 228 bool singleSelection() {return m_singleSelection;}
229 229
230 void readConfig(); 230 void readConfig();
231 void writeConfig(); 231 void writeConfig();
232 void readSessionConfig(KConfig *); 232 void readSessionConfig(KConfig *);
233 void writeSessionConfig(KConfig *); 233 void writeSessionConfig(KConfig *);
234 234
235 bool hasBrowserExtension() const { return m_bBrowserView; } 235 bool hasBrowserExtension() const { return m_bBrowserView; }
236 236
237 protected: 237 protected:
238 bool m_bBrowserView; 238 bool m_bBrowserView;
239 239
240 signals: 240 signals:
241 void selectionChanged(); 241 void selectionChanged();
242 void highlightChanged(); 242 void highlightChanged();
243 void modifiedChanged (); 243 void modifiedChanged ();
244 void preHighlightChanged(long); 244 void preHighlightChanged(long);
245 245
246 // search stuff 246 // search stuff
247 protected: 247 protected:
248 static QStringList searchForList; 248 static QStringList searchForList;
249 static QStringList replaceWithList; 249 static QStringList replaceWithList;
250 static uint uniqueID; 250 static uint uniqueID;
251 251
252 // highlight stuff 252 // highlight stuff
253 public: 253 public:
254 Highlight *highlight() {return m_highlight;} 254 Highlight *highlight() {return m_highlight;}
255 int highlightNum() {return hlManager->findHl(m_highlight);} 255 int highlightNum() {return hlManager->findHl(m_highlight);}
256 int numAttribs() {return m_numAttribs;} 256 int numAttribs() {return m_numAttribs;}
257 Attribute *attribs() {return m_attribs;} 257 Attribute *attribs() {return m_attribs;}
258 void setDontChangeHlOnSave(); 258 void setDontChangeHlOnSave();
259 259
260 protected: 260 protected:
261 void setHighlight(int n); 261 void setHighlight(int n);
262 void makeAttribs(); 262 void makeAttribs();
263 void updateFontData(); 263 void updateFontData();
264 264
265 protected slots: 265 protected slots:
266 void hlChanged(); 266 void hlChanged();
267 267
268// view interaction 268// view interaction
269 public: 269 public:
270 virtual void addView(KTextEditor::View *); 270 virtual void addView(KTextEditor::View *);
271 virtual void removeView(KTextEditor::View *); 271 virtual void removeView(KTextEditor::View *);
272 bool ownedView(KateView *); 272 bool ownedView(KateView *);
273 bool isLastView(int numViews); 273 bool isLastView(int numViews);
274 274
275 int getTextLineCount() {return numLines();} 275 int getTextLineCount() {return numLines();}
276 276
277 int textWidth(const TextLine::Ptr &, int cursorX); 277 int textWidth(const TextLine::Ptr &, int cursorX);
278 int textWidth(PointStruc &cursor); 278 int textWidth(PointStruc &cursor);
279 int textWidth(bool wrapCursor, PointStruc &cursor, int xPos); 279 int textWidth(bool wrapCursor, PointStruc &cursor, int xPos);
280 int textPos(const TextLine::Ptr &, int xPos); 280 int textPos(const TextLine::Ptr &, int xPos);
281// int textPos(TextLine::Ptr &, int xPos, int &newXPos); 281// int textPos(TextLine::Ptr &, int xPos, int &newXPos);
282 int textWidth(); 282 int textWidth();
283 int textHeight(); 283 int textHeight();
284 284
285 void insert(VConfig &, const QString &); 285 void insert(VConfig &, const QString &);
286 void insertFile(VConfig &, QIODevice &); 286 void insertFile(VConfig &, QIODevice &);
287 287
288 int currentColumn(PointStruc &cursor); 288 int currentColumn(PointStruc &cursor);
289 bool insertChars(VConfig &, const QString &chars); 289 bool insertChars(VConfig &, const QString &chars);
290 void newLine(VConfig &); 290 void newLine(VConfig &);
291 void killLine(VConfig &); 291 void killLine(VConfig &);
292 void backspace(VConfig &); 292 void backspace(VConfig &);
293 void del(VConfig &); 293 void del(VConfig &);
294 void clear(); 294 void clear();
295 void cut(VConfig &); 295 void cut(VConfig &);
296 void copy(int flags); 296 void copy(int flags);
297 void paste(VConfig &); 297 void paste(VConfig &);
298 298
299 void toggleRect(int, int, int, int); 299 void toggleRect(int, int, int, int);
300 void selectTo(VConfig &c, PointStruc &cursor, int cXPos); 300 void selectTo(VConfig &c, PointStruc &cursor, int cXPos);
301 void selectAll(); 301 void selectAll();
302 void deselectAll(); 302 void deselectAll();
303 void invertSelection(); 303 void invertSelection();
304 void selectWord(PointStruc &cursor, int flags); 304 void selectWord(PointStruc &cursor, int flags);
305 void selectLength(PointStruc &cursor, int length, int flags); 305 void selectLength(PointStruc &cursor, int length, int flags);
306 306
307 void indent(VConfig &c) {doIndent(c, 1);} 307 void indent(VConfig &c) {doIndent(c, 1);}
308 void unIndent(VConfig &c) {doIndent(c, -1);} 308 void unIndent(VConfig &c) {doIndent(c, -1);}
309 void cleanIndent(VConfig &c) {doIndent(c, 0);} 309 void cleanIndent(VConfig &c) {doIndent(c, 0);}
310 // called by indent/unIndent/cleanIndent 310 // called by indent/unIndent/cleanIndent
311 // just does some setup and then calls optimizeLeadingSpace() 311 // just does some setup and then calls optimizeLeadingSpace()
312 void doIndent(VConfig &, int change); 312 void doIndent(VConfig &, int change);
313 // optimize leading whitespace on a single line - see kwdoc.cpp for full description 313 // optimize leading whitespace on a single line - see kwdoc.cpp for full description
314 void optimizeLeadingSpace(int line, int flags, int change); 314 void optimizeLeadingSpace(int line, int flags, int change);
315 315
316 void comment(VConfig &c) {doComment(c, 1);} 316 void comment(VConfig &c) {doComment(c, 1);}
317 void unComment(VConfig &c) {doComment(c, -1);} 317 void unComment(VConfig &c) {doComment(c, -1);}
318 void doComment(VConfig &, int change); 318 void doComment(VConfig &, int change);
319 319
320 virtual QString text() const; 320 virtual QString text() const;
321 QString getWord(PointStruc &cursor); 321 QString getWord(PointStruc &cursor);
322 322
323 public slots: 323 public slots:
324 virtual void setText(const QString &); 324 virtual void setText(const QString &);
325 325
326 public: 326 public:
327 long needPreHighlight(long till); 327 long needPreHighlight(long till);
328 bool hasMarkedText() {return (selectEnd >= selectStart);} 328 bool hasMarkedText() {return (selectEnd >= selectStart);}
329 QString markedText(int flags); 329 QString markedText(int flags);
330 void delMarkedText(VConfig &/*, bool undo = true*/); 330 void delMarkedText(VConfig &/*, bool undo = true*/);
331 331
332 void tagLineRange(int line, int x1, int x2); 332 void tagLineRange(int line, int x1, int x2);
333 void tagLines(int start, int end); 333 void tagLines(int start, int end);
334 void tagAll(); 334 void tagAll();
335 void updateLines(int startLine = 0, int endLine = 0xffffff, int flags = 0, int cursorY = -1); 335 void updateLines(int startLine = 0, int endLine = 0xffffff, int flags = 0, int cursorY = -1);
336 void updateMaxLength(TextLine::Ptr &); 336 void updateMaxLength(TextLine::Ptr &);
337 void updateViews(KateView *exclude = 0L); 337 void updateViews(KateView *exclude = 0L);
338 338
339 QColor &cursorCol(int x, int y); 339 QColor &cursorCol(int x, int y);
340 void paintTextLine(QPainter &, int line, int xStart, int xEnd, bool showTabs); 340 void paintTextLine(QPainter &, int line, int xStart, int xEnd, bool showTabs);
341 void paintTextLine(QPainter &, int line, int y, int xStart, int xEnd, bool showTabs); 341 void paintTextLine(QPainter &, int line, int y, int xStart, int xEnd, bool showTabs);
342 342
343 bool doSearch(SConfig &s, const QString &searchFor); 343 bool doSearch(SConfig &s, const QString &searchFor);
344 344
345// internal 345// internal
346 void tagLine(int line); 346 void tagLine(int line);
347 void insLine(int line); 347 void insLine(int line);
348 void delLine(int line); 348 void delLine(int line);
349 void optimizeSelection(); 349 void optimizeSelection();
350 350
351 void doAction(KateAction *); 351 void doAction(KateAction *);
352 void doReplace(KateAction *); 352 void doReplace(KateAction *);
353 void doWordWrap(KateAction *); 353 void doWordWrap(KateAction *);
354 void doWordUnWrap(KateAction *); 354 void doWordUnWrap(KateAction *);
355 void doNewLine(KateAction *); 355 void doNewLine(KateAction *);
356 void doDelLine(KateAction *); 356 void doDelLine(KateAction *);
357 void doInsLine(KateAction *); 357 void doInsLine(KateAction *);
358 void doKillLine(KateAction *); 358 void doKillLine(KateAction *);
359 void newUndo(); 359 void newUndo();
360 360
361 void recordStart(VConfig &, int newUndoType); 361 void recordStart(VConfig &, int newUndoType);
362 void recordStart(KateView *, PointStruc &, int flags, int newUndoType, bool keepModal = false, bool mergeUndo = false); 362 void recordStart(KateView *, PointStruc &, int flags, int newUndoType, bool keepModal = false, bool mergeUndo = false);
363 void recordAction(KateAction::Action, PointStruc &); 363 void recordAction(KateAction::Action, PointStruc &);
364 void recordInsert(VConfig &, const QString &text); 364 void recordInsert(VConfig &, const QString &text);
365 void recordReplace(VConfig &, int len, const QString &text); 365 void recordReplace(VConfig &, int len, const QString &text);
366 void recordInsert(PointStruc &, const QString &text); 366 void recordInsert(PointStruc &, const QString &text);
367 void recordDelete(PointStruc &, int len); 367 void recordDelete(PointStruc &, int len);
368 void recordReplace(PointStruc &, int len, const QString &text); 368 void recordReplace(PointStruc &, int len, const QString &text);
369 void recordEnd(VConfig &); 369 void recordEnd(VConfig &);
370 void recordEnd(KateView *, PointStruc &, int flags); 370 void recordEnd(KateView *, PointStruc &, int flags);
371 void doActionGroup(KateActionGroup *, int flags, bool undo = false); 371 void doActionGroup(KateActionGroup *, int flags, bool undo = false);
372 372
373 int nextUndoType(); 373 int nextUndoType();
374 int nextRedoType(); 374 int nextRedoType();
375 void undoTypeList(QValueList<int> &lst); 375 void undoTypeList(QValueList<int> &lst);
376 void redoTypeList(QValueList<int> &lst); 376 void redoTypeList(QValueList<int> &lst);
377 void undo(VConfig &, int count = 1); 377 void undo(VConfig &, int count = 1);
378 void redo(VConfig &, int count = 1); 378 void redo(VConfig &, int count = 1);
379 void clearRedo(); 379 void clearRedo();
380 void setUndoSteps(int steps); 380 void setUndoSteps(int steps);
381 381
382 void setPseudoModal(QWidget *); 382 void setPseudoModal(QWidget *);
383 383
384 void newBracketMark(PointStruc &, BracketMark &); 384 void newBracketMark(PointStruc &, BracketMark &);
385 385
386 386
387 protected slots: 387 protected slots:
388 void clipboardChanged(); 388 void clipboardChanged();
389 void slotBufferChanged(); 389 void slotBufferChanged();
390 void slotBufferHighlight(long,long); 390 void slotBufferHighlight(long,long);
391 void doPreHighlight(); 391 void doPreHighlight();
392 392
393 private slots: 393 private slots:
394 void slotViewDestroyed(); 394 void slotViewDestroyed();
395 395
396// member variables 396// member variables
397 protected: 397 protected:
398 long PreHighlightedTill; 398 long PreHighlightedTill;
399 long RequestPreHighlightTill; 399 long RequestPreHighlightTill;
400 KWBuffer *buffer; 400 KWBuffer *buffer;
401 QColor colors[2]; 401 QColor colors[2];
402 HlManager *hlManager; 402 HlManager *hlManager;
403 Highlight *m_highlight; 403 Highlight *m_highlight;
404 int m_numAttribs; 404 int m_numAttribs;
405 static const int maxAttribs; 405 static const int maxAttribs;
406 Attribute *m_attribs; 406 Attribute *m_attribs;
407 407
408 int eolMode; 408 int eolMode;
409 409
410 int tabChars; 410 int tabChars;
411 int m_tabWidth; 411 int m_tabWidth;
412 int fontHeight; 412 int fontHeight;
413 int fontAscent; 413 int fontAscent;
414 414
415 QList<KateView> views; 415 QList<KateView> views;
416 bool newDocGeometry; 416 bool newDocGeometry;
417 417
418 TextLine::Ptr longestLine; 418 TextLine::Ptr longestLine;
419 float maxLength; 419 float maxLength;
420 420
421 PointStruc select; 421 PointStruc select;
422 PointStruc anchor; 422 PointStruc anchor;
423 int aXPos; 423 int aXPos;
424 int selectStart; 424 int selectStart;
425 int selectEnd; 425 int selectEnd;
426 bool oldMarkState; 426 bool oldMarkState;
427 bool m_singleSelection; // false: windows-like, true: X11-like 427 bool m_singleSelection; // false: windows-like, true: X11-like
428 428
429 bool readOnly; 429 bool readOnly;
430 bool newDoc; // True if the file is a new document (used to determine whether 430 bool newDoc; // True if the file is a new document (used to determine whether
431 // to check for overwriting files on save) 431 // to check for overwriting files on save)
432 bool modified; 432 bool modified;
433 433
434 bool myWordWrap; 434 bool myWordWrap;
435 uint myWordWrapAt; 435 uint myWordWrapAt;
436 436
437 QList<KateActionGroup> undoList; 437 QList<KateActionGroup> undoList;
438 int currentUndo; 438 int currentUndo;
439 int undoState; 439 int undoState;
440 int undoSteps; 440 int undoSteps;
441 int tagStart; 441 int tagStart;
442 int tagEnd; 442 int tagEnd;
443 int undoCount; //counts merged undo steps 443 int undoCount; //counts merged undo steps
444 444
445 QWidget *pseudoModal; //the replace prompt is pseudo modal 445 QWidget *pseudoModal; //the replace prompt is pseudo modal
446 446
447 public: 447 public:
448 /** Tjecks if the file on disk is newer than document contents. 448 /** Tjecks if the file on disk is newer than document contents.
449 If forceReload is true, the document is reloaded without asking the user, 449 If forceReload is true, the document is reloaded without asking the user,
450 otherwise [default] the user is asked what to do. */ 450 otherwise [default] the user is asked what to do. */
451 void isModOnHD(bool forceReload=false); 451 void isModOnHD(bool forceReload=false);
452 452
453 uint docID () {return myDocID;}; 453 uint docID () {return myDocID;};
454 QString docName () {return myDocName;}; 454 QString docName () {return myDocName;};
455 455
456 void setDocName (QString docName); 456 void setDocName (QString docName);
457 void setDocFile (QString docFile);
457 458
458 public slots: 459 public slots:
459 /** Reloads the current document from disk if possible */ 460 /** Reloads the current document from disk if possible */
460 void reloadFile(); 461 void reloadFile();
461 462
462 private slots: 463 private slots:
463 void slotModChanged (); 464 void slotModChanged ();
464 465
465 private: 466 private:
466 /** updates mTime to reflect file on fs. 467 /** updates mTime to reflect file on fs.
467 called from constructor and from saveFile. */ 468 called from constructor and from saveFile. */
468 void setMTime(); 469 void setMTime();
469 uint myDocID; 470 uint myDocID;
470 QFileInfo* fileInfo; 471 QFileInfo* fileInfo;
471 QDateTime mTime; 472 QDateTime mTime;
472 QString myDocName; 473 QString myDocName;
473 474
474 QString m_url; 475 QString m_url;
475 QString m_file; 476 QString m_file;
476 void openURL(const QString &filename); 477 void openURL(const QString &filename);
477 private: 478 private:
478 KateCmd *myCmd; 479 KateCmd *myCmd;
479 480
480 public: 481 public:
481 KateCmd *cmd () { return myCmd; }; 482 KateCmd *cmd () { return myCmd; };
482 483
483 private: 484 private:
484 QString myEncoding; 485 QString myEncoding;
485 486
486 public: 487 public:
487 void setEncoding (QString e) { myEncoding = e; }; 488 void setEncoding (QString e) { myEncoding = e; };
488 QString encoding() { return myEncoding; }; 489 QString encoding() { return myEncoding; };
489 490
490 void setWordWrap (bool on); 491 void setWordWrap (bool on);
491 bool wordWrap () { return myWordWrap; }; 492 bool wordWrap () { return myWordWrap; };
492 493
493 void setWordWrapAt (uint col); 494 void setWordWrapAt (uint col);
494 uint wordWrapAt () { return myWordWrapAt; }; 495 uint wordWrapAt () { return myWordWrapAt; };
495 496
496 signals: 497 signals:
497 void modStateChanged (KateDocument *doc); 498 void modStateChanged (KateDocument *doc);
498 void nameChanged (KateDocument *doc); 499 void nameChanged (KateDocument *doc);
499 500
500 public: 501 public:
501 QList<Kate::Mark> marks (); 502 QList<Kate::Mark> marks ();
502 503
503 public slots: 504 public slots:
504 // clear buffer/filename - update the views 505 // clear buffer/filename - update the views
505 void flush (); 506 void flush ();
506 507
507 signals: 508 signals:
508 /** 509 /**
509 The file has been saved (perhaps the name has changed). The main window 510 The file has been saved (perhaps the name has changed). The main window
510 can use this to change its caption 511 can use this to change its caption
511 */ 512 */
512 void fileNameChanged (); 513 void fileNameChanged ();
513 514
514 public: 515 public:
515 //end of line settings 516 //end of line settings
516 enum Eol_settings {eolUnix=0,eolDos=1,eolMacintosh=2}; 517 enum Eol_settings {eolUnix=0,eolDos=1,eolMacintosh=2};
517 518
518 // for the DCOP interface 519 // for the DCOP interface
519 public: 520 public:
520 void open (const QString &name=0); 521 void open (const QString &name=0);
521 522
522 public: 523 public:
523 // wrap the text of the document at the column col 524 // wrap the text of the document at the column col
524 void wrapText (uint col); 525 void wrapText (uint col);
525 526
526 public slots: 527 public slots:
527 void applyWordWrap (); 528 void applyWordWrap ();
528 529
529 private: 530 private:
530 531
531 class KateDocPrivate 532 class KateDocPrivate
532 { 533 {
533 public: 534 public:
534 bool hlSetByUser; 535 bool hlSetByUser;
535 }; 536 };
536 537
537 538
538// BCI: Add a real d-pointer in the next BIC release 539// BCI: Add a real d-pointer in the next BIC release
539static QPtrDict<KateDocPrivate>* d_ptr; 540static QPtrDict<KateDocPrivate>* d_ptr;
540static void cleanup_d_ptr() 541static void cleanup_d_ptr()
541 { 542 {
542 delete d_ptr; 543 delete d_ptr;
543 } 544 }
544 545
545KateDocPrivate* d( const KateDocument* foo ) 546KateDocPrivate* d( const KateDocument* foo )
546 { 547 {
547 if ( !d_ptr ) { 548 if ( !d_ptr ) {
548 d_ptr = new QPtrDict<KateDocPrivate>; 549 d_ptr = new QPtrDict<KateDocPrivate>;
549 //qAddPostRoutine( cleanup_d_ptr ); 550 //qAddPostRoutine( cleanup_d_ptr );
550 } 551 }
551 KateDocPrivate* ret = d_ptr->find( (void*) foo ); 552 KateDocPrivate* ret = d_ptr->find( (void*) foo );
552 if ( ! ret ) { 553 if ( ! ret ) {
553 ret = new KateDocPrivate; 554 ret = new KateDocPrivate;
554 d_ptr->replace( (void*) foo, ret ); 555 d_ptr->replace( (void*) foo, ret );
555 } 556 }
556 return ret; 557 return ret;
557 } 558 }
558 559
559void delete_d( const KateDocument* foo ) 560void delete_d( const KateDocument* foo )
560 { 561 {
561 if ( d_ptr ) 562 if ( d_ptr )
562 d_ptr->remove( (void*) foo ); 563 d_ptr->remove( (void*) foo );
563 } 564 }
564 565
565}; 566};
566 567
567#endif 568#endif
568 569
569 570