summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tinykate/libkate/document/katedocument.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/noncore/apps/tinykate/libkate/document/katedocument.cpp b/noncore/apps/tinykate/libkate/document/katedocument.cpp
index 0d84bcf..10bc976 100644
--- a/noncore/apps/tinykate/libkate/document/katedocument.cpp
+++ b/noncore/apps/tinykate/libkate/document/katedocument.cpp
@@ -1,908 +1,908 @@
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 false; 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 true; 326 return ;
327} 327}
328 328
329bool KateDocument::saveFile() 329bool KateDocument::saveFile()
330{ 330{
331 QFile f( m_file ); 331 QFile f( m_file );
332 if ( !f.open( IO_WriteOnly ) ) 332 if ( !f.open( IO_WriteOnly ) )
333 return false; // Error 333 return false; // Error
334 334
335 QTextStream stream(&f); 335 QTextStream stream(&f);
336 336
337 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers 337 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers
338#warning fixme 338#warning fixme
339// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding)); 339// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding));
340 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec 340 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec
341 341
342 int maxLine = numLines(); 342 int maxLine = numLines();
343 int line = 0; 343 int line = 0;
344 while(true) 344 while(true)
345 { 345 {
346 stream << getTextLine(line)->getString(); 346 stream << getTextLine(line)->getString();
347 line++; 347 line++;
348 if (line >= maxLine) break; 348 if (line >= maxLine) break;
349 349
350 if (eolMode == KateDocument::eolUnix) stream << "\n"; 350 if (eolMode == KateDocument::eolUnix) stream << "\n";
351 else if (eolMode == KateDocument::eolDos) stream << "\r\n"; 351 else if (eolMode == KateDocument::eolDos) stream << "\r\n";
352 else if (eolMode == KateDocument::eolMacintosh) stream << '\r'; 352 else if (eolMode == KateDocument::eolMacintosh) stream << '\r';
353 }; 353 };
354 f.close(); 354 f.close();
355 355
356 fileInfo->setFile (m_file); 356 fileInfo->setFile (m_file);
357 setMTime(); 357 setMTime();
358 358
359 if (!(d(this)->hlSetByUser)) 359 if (!(d(this)->hlSetByUser))
360 { 360 {
361 int hl = hlManager->wildcardFind( m_file ); 361 int hl = hlManager->wildcardFind( m_file );
362 362
363 setHighlight(hl); 363 setHighlight(hl);
364 } 364 }
365 emit fileNameChanged (); 365 emit fileNameChanged ();
366 366
367 return (f.status() == IO_Ok); 367 return (f.status() == IO_Ok);
368} 368}
369 369
370KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name ) 370KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name )
371{ 371{
372 return new KateView( this, parent, name); 372 return new KateView( this, parent, name);
373} 373}
374 374
375QString KateDocument::textLine( int line ) const 375QString KateDocument::textLine( int line ) const
376{ 376{
377 TextLine::Ptr l = getTextLine( line ); 377 TextLine::Ptr l = getTextLine( line );
378 if ( !l ) 378 if ( !l )
379 return QString(); 379 return QString();
380 380
381 return l->getString(); 381 return l->getString();
382} 382}
383 383
384void KateDocument::replaceLine(const QString& s,int line) 384void KateDocument::replaceLine(const QString& s,int line)
385{ 385{
386 remove_Line(line,false); 386 remove_Line(line,false);
387 insert_Line(s,line,true); 387 insert_Line(s,line,true);
388} 388}
389 389
390void KateDocument::insertLine( const QString &str, int l ) { 390void KateDocument::insertLine( const QString &str, int l ) {
391 insert_Line(str,l,true); 391 insert_Line(str,l,true);
392} 392}
393 393
394void KateDocument::insert_Line(const QString& s,int line, bool update) 394void KateDocument::insert_Line(const QString& s,int line, bool update)
395{ 395{
396 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString("%1").arg(line)<<endl; 396 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString(" %1").arg(line)<<endl;
397 TextLine::Ptr TL=new TextLine(); 397 TextLine::Ptr TL=new TextLine();
398 TL->append(s.unicode(),s.length()); 398 TL->append(s.unicode(),s.length());
399 buffer->insertLine(line,TL); 399 buffer->insertLine(line,TL);
400 if (update) 400 if (update)
401 { 401 {
402 newDocGeometry=true; 402 newDocGeometry=true;
403 updateLines(line); 403 updateLines(line);
404 updateViews(); 404 updateViews();
405 } 405 }
406} 406}
407 407
408void KateDocument::insertAt( const QString &s, int line, int col, bool ) 408void KateDocument::insertAt( const QString &s, int line, int col, bool )
409{ 409{
410 VConfig c; 410 VConfig c;
411 c.view = 0; // ### FIXME 411 c.view = 0; // ### FIXME
412 c.cursor.x = col; 412 c.cursor.x = col;
413 c.cursor.y = line; 413 c.cursor.y = line;
414 c.cXPos = 0; // ### FIXME 414 c.cXPos = 0; // ### FIXME
415 c.flags = 0; // ### FIXME 415 c.flags = 0; // ### FIXME
416 insert( c, s ); 416 insert( c, s );
417} 417}
418 418
419void KateDocument::removeLine( int line ) { 419void KateDocument::removeLine( int line ) {
420 remove_Line(line,true); 420 remove_Line(line,true);
421} 421}
422 422
423void KateDocument::remove_Line(int line,bool update) 423void KateDocument::remove_Line(int line,bool update)
424{ 424{
425 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl; 425 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl;
426 buffer->removeLine(line); 426 buffer->removeLine(line);
427// newDocGeometry=true; 427// newDocGeometry=true;
428// if line==0) 428// if line==0)
429 if (update) 429 if (update)
430 { 430 {
431 updateLines(line); 431 updateLines(line);
432 updateViews(); 432 updateViews();
433 } 433 }
434} 434}
435 435
436int KateDocument::length() const 436int KateDocument::length() const
437{ 437{
438 return text().length(); 438 return text().length();
439} 439}
440 440
441void KateDocument::setSelection( int , int , int , int ) 441void KateDocument::setSelection( int , int , int , int )
442{ 442{
443} 443}
444 444
445bool KateDocument::hasSelection() const 445bool KateDocument::hasSelection() const
446{ 446{
447 return (selectEnd >= selectStart); 447 return (selectEnd >= selectStart);
448} 448}
449 449
450QString KateDocument::selection() const 450QString KateDocument::selection() const
451{ 451{
452 uint flags = 0; 452 uint flags = 0;
453 TextLine::Ptr textLine; 453 TextLine::Ptr textLine;
454 int len, z, start, end, i; 454 int len, z, start, end, i;
455 455
456 len = 1; 456 len = 1;
457 if (!(flags & KateView::cfVerticalSelect)) { 457 if (!(flags & KateView::cfVerticalSelect)) {
458 for (z = selectStart; z <= selectEnd; z++) { 458 for (z = selectStart; z <= selectEnd; z++) {
459 textLine = getTextLine(z); 459 textLine = getTextLine(z);
460 len += textLine->numSelected(); 460 len += textLine->numSelected();
461 if (textLine->isSelected()) len++; 461 if (textLine->isSelected()) len++;
462 } 462 }
463 QString s; 463 QString s;
464 len = 0; 464 len = 0;
465 for (z = selectStart; z <= selectEnd; z++) { 465 for (z = selectStart; z <= selectEnd; z++) {
466 textLine = getTextLine(z); 466 textLine = getTextLine(z);
467 end = 0; 467 end = 0;
468 do { 468 do {
469 start = textLine->findUnselected(end); 469 start = textLine->findUnselected(end);
470 end = textLine->findSelected(start); 470 end = textLine->findSelected(start);
471 for (i = start; i < end; i++) { 471 for (i = start; i < end; i++) {
472 s[len] = textLine->getChar(i); 472 s[len] = textLine->getChar(i);
473 len++; 473 len++;
474 } 474 }
475 } while (start < end); 475 } while (start < end);
476 if (textLine->isSelected()) { 476 if (textLine->isSelected()) {
477 s[len] = '\n'; 477 s[len] = '\n';
478 len++; 478 len++;
479 } 479 }
480 } 480 }
481// s[len] = '\0'; 481// s[len] = '\0';
482 return s; 482 return s;
483 } else { 483 } else {
484 for (z = selectStart; z <= selectEnd; z++) { 484 for (z = selectStart; z <= selectEnd; z++) {
485 textLine = getTextLine(z); 485 textLine = getTextLine(z);
486 len += textLine->numSelected() + 1; 486 len += textLine->numSelected() + 1;
487 } 487 }
488 QString s; 488 QString s;
489 len = 0; 489 len = 0;
490 for (z = selectStart; z <= selectEnd; z++) { 490 for (z = selectStart; z <= selectEnd; z++) {
491 textLine = getTextLine(z); 491 textLine = getTextLine(z);
492 end = 0; 492 end = 0;
493 do { 493 do {
494 start = textLine->findUnselected(end); 494 start = textLine->findUnselected(end);
495 end = textLine->findSelected(start); 495 end = textLine->findSelected(start);
496 for (i = start; i < end; i++) { 496 for (i = start; i < end; i++) {
497 s[len] = textLine->getChar(i); 497 s[len] = textLine->getChar(i);
498 len++; 498 len++;
499 } 499 }
500 } while (start < end); 500 } while (start < end);
501 s[len] = '\n'; 501 s[len] = '\n';
502 len++; 502 len++;
503 } 503 }
504// s[len] = '\0'; // the final \0 is not counted in length() 504// s[len] = '\0'; // the final \0 is not counted in length()
505 return s; 505 return s;
506 } 506 }
507} 507}
508 508
509int KateDocument::numLines() const 509int KateDocument::numLines() const
510{ 510{
511 return buffer->count(); 511 return buffer->count();
512} 512}
513 513
514 514
515TextLine::Ptr KateDocument::getTextLine(int line) const 515TextLine::Ptr KateDocument::getTextLine(int line) const
516{ 516{
517 // This is a hack to get this stuff working. 517 // This is a hack to get this stuff working.
518 return buffer->line(line); 518 return buffer->line(line);
519} 519}
520 520
521int KateDocument::textLength(int line) { 521int KateDocument::textLength(int line) {
522 TextLine::Ptr textLine = getTextLine(line); 522 TextLine::Ptr textLine = getTextLine(line);
523 if (!textLine) return 0; 523 if (!textLine) return 0;
524 return textLine->length(); 524 return textLine->length();
525} 525}
526 526
527void KateDocument::setTabWidth(int chars) { 527void KateDocument::setTabWidth(int chars) {
528 if (tabChars == chars) return; 528 if (tabChars == chars) return;
529 if (chars < 1) chars = 1; 529 if (chars < 1) chars = 1;
530 if (chars > 16) chars = 16; 530 if (chars > 16) chars = 16;
531 tabChars = chars; 531 tabChars = chars;
532 updateFontData(); 532 updateFontData();
533 533
534 maxLength = -1; 534 maxLength = -1;
535 for (int i=0; i < buffer->count(); i++) 535 for (int i=0; i < buffer->count(); i++)
536 { 536 {
537 TextLine::Ptr textLine = buffer->line(i); 537 TextLine::Ptr textLine = buffer->line(i);
538 int len = textWidth(textLine,textLine->length()); 538 int len = textWidth(textLine,textLine->length());
539 if (len > maxLength) { 539 if (len > maxLength) {
540 maxLength = len; 540 maxLength = len;
541 longestLine = textLine; 541 longestLine = textLine;
542 } 542 }
543 } 543 }
544} 544}
545 545
546void KateDocument::setReadOnly(bool m) { 546void KateDocument::setReadOnly(bool m) {
547 KTextEditor::View *view; 547 KTextEditor::View *view;
548 548
549 if (m != readOnly) { 549 if (m != readOnly) {
550 readOnly = m; 550 readOnly = m;
551// if (readOnly) recordReset(); 551// if (readOnly) recordReset();
552 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 552 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
553 emit static_cast<KateView *>( view )->newStatus(); 553 emit static_cast<KateView *>( view )->newStatus();
554 } 554 }
555 } 555 }
556} 556}
557 557
558bool KateDocument::isReadOnly() const { 558bool KateDocument::isReadOnly() const {
559 return readOnly; 559 return readOnly;
560} 560}
561 561
562void KateDocument::setNewDoc( bool m ) 562void KateDocument::setNewDoc( bool m )
563{ 563{
564// KTextEditor::View *view; 564// KTextEditor::View *view;
565 565
566 if ( m != newDoc ) 566 if ( m != newDoc )
567 { 567 {
568 newDoc = m; 568 newDoc = m;
569//// if (readOnly) recordReset(); 569//// if (readOnly) recordReset();
570// for (view = m_views.first(); view != 0L; view = m_views.next() ) { 570// for (view = m_views.first(); view != 0L; view = m_views.next() ) {
571// emit static_cast<KateView *>( view )->newStatus(); 571// emit static_cast<KateView *>( view )->newStatus();
572// } 572// }
573 } 573 }
574} 574}
575 575
576bool KateDocument::isNewDoc() const { 576bool KateDocument::isNewDoc() const {
577 return newDoc; 577 return newDoc;
578} 578}
579 579
580void KateDocument::setModified(bool m) { 580void KateDocument::setModified(bool m) {
581 KTextEditor::View *view; 581 KTextEditor::View *view;
582 582
583 if (m != modified) { 583 if (m != modified) {
584 modified = m; 584 modified = m;
585 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 585 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
586 emit static_cast<KateView *>( view )->newStatus(); 586 emit static_cast<KateView *>( view )->newStatus();
587 } 587 }
588 emit modifiedChanged (); 588 emit modifiedChanged ();
589 } 589 }
590} 590}
591 591
592bool KateDocument::isModified() const { 592bool KateDocument::isModified() const {
593 return modified; 593 return modified;
594} 594}
595 595
596void KateDocument::readConfig() 596void KateDocument::readConfig()
597{ 597{
598 KConfig *config = KGlobal::config(); 598 KConfig *config = KGlobal::config();
599 config->setGroup("Kate Document"); 599 config->setGroup("Kate Document");
600 600
601 myWordWrap = config->readBoolEntry("Word Wrap On", false); 601 myWordWrap = config->readBoolEntry("Word Wrap On", false);
602 myWordWrapAt = config->readNumEntry("Word Wrap At", 80); 602 myWordWrapAt = config->readNumEntry("Word Wrap At", 80);
603 if (myWordWrap) 603 if (myWordWrap)
604 wrapText (myWordWrapAt); 604 wrapText (myWordWrapAt);
605 605
606 setTabWidth(config->readNumEntry("TabWidth", 8)); 606 setTabWidth(config->readNumEntry("TabWidth", 8));
607 setUndoSteps(config->readNumEntry("UndoSteps", 50)); 607 setUndoSteps(config->readNumEntry("UndoSteps", 50));
608 m_singleSelection = config->readBoolEntry("SingleSelection", false); 608 m_singleSelection = config->readBoolEntry("SingleSelection", false);
609 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name())); 609 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name()));
610 setFont (config->readFontEntry("Font", &myFont)); 610 setFont (config->readFontEntry("Font", &myFont));
611 611
612 colors[0] = config->readColorEntry("Color Background", &colors[0]); 612 colors[0] = config->readColorEntry("Color Background", &colors[0]);
613 colors[1] = config->readColorEntry("Color Selected", &colors[1]); 613 colors[1] = config->readColorEntry("Color Selected", &colors[1]);
614 614
615 config->sync(); 615 config->sync();
616} 616}
617 617
618void KateDocument::writeConfig() 618void KateDocument::writeConfig()
619{ 619{
620 KConfig *config = KGlobal::config(); 620 KConfig *config = KGlobal::config();
621 config->setGroup("Kate Document"); 621 config->setGroup("Kate Document");
622#if 0 622#if 0
623 cofig->writeEntry("Word Wrap On", myWordWrap); 623 cofig->writeEntry("Word Wrap On", myWordWrap);
624 config->writeEntry("Word Wrap At", myWordWrapAt); 624 config->writeEntry("Word Wrap At", myWordWrapAt);
625 config->writeEntry("TabWidth", tabChars); 625 config->writeEntry("TabWidth", tabChars);
626 config->writeEntry("UndoSteps", undoSteps); 626 config->writeEntry("UndoSteps", undoSteps);
627 config->writeEntry("SingleSelection", m_singleSelection); 627 config->writeEntry("SingleSelection", m_singleSelection);
628 config->writeEntry("Encoding", myEncoding); 628 config->writeEntry("Encoding", myEncoding);
629 config->writeEntry("Font", myFont); 629 config->writeEntry("Font", myFont);
630 config->writeEntry("Color Background", colors[0]); 630 config->writeEntry("Color Background", colors[0]);
631 config->writeEntry("Color Selected", colors[1]); 631 config->writeEntry("Color Selected", colors[1]);
632#endif 632#endif
633 config->sync(); 633 config->sync();
634} 634}
635 635
636void KateDocument::readSessionConfig(KConfig *config) 636void KateDocument::readSessionConfig(KConfig *config)
637{ 637{
638 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon) 638 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon)
639 setHighlight(hlManager->nameFind(config->readEntry("Highlight"))); 639 setHighlight(hlManager->nameFind(config->readEntry("Highlight")));
640 // anders: restore bookmarks if possible 640 // anders: restore bookmarks if possible
641 QValueList<int> l = config->readIntListEntry("Bookmarks"); 641 QValueList<int> l = config->readIntListEntry("Bookmarks");
642 if ( l.count() ) { 642 if ( l.count() ) {
643 for (uint i=0; i < l.count(); i++) { 643 for (uint i=0; i < l.count(); i++) {
644 if ( numLines() < l[i] ) break; 644 if ( numLines() < l[i] ) break;
645 getTextLine( l[i] )->addMark( Bookmark ); 645 getTextLine( l[i] )->addMark( Bookmark );
646 } 646 }
647 } 647 }
648} 648}
649 649
650void KateDocument::writeSessionConfig(KConfig *config) 650void KateDocument::writeSessionConfig(KConfig *config)
651{ 651{
652#if 0 652#if 0
653 config->writeEntry("URL", m_url); // ### encoding?? (Simon) 653 config->writeEntry("URL", m_url); // ### encoding?? (Simon)
654 config->writeEntry("Highlight", m_highlight->name()); 654 config->writeEntry("Highlight", m_highlight->name());
655 // anders: save bookmarks 655 // anders: save bookmarks
656 QList<Kate::Mark> l = marks(); 656 QList<Kate::Mark> l = marks();
657 QValueList<int> ml; 657 QValueList<int> ml;
658 for (uint i=0; i < l.count(); i++) { 658 for (uint i=0; i < l.count(); i++) {
659 if ( l.at(i)->type == 1) // only save bookmarks 659 if ( l.at(i)->type == 1) // only save bookmarks
660 ml << l.at(i)->line; 660 ml << l.at(i)->line;
661 } 661 }
662 if ( ml.count() ) 662 if ( ml.count() )
663 config->writeEntry("Bookmarks", ml); 663 config->writeEntry("Bookmarks", ml);
664#endif 664#endif
665} 665}
666 666
667 667
668void KateDocument::setHighlight(int n) { 668void KateDocument::setHighlight(int n) {
669 Highlight *h; 669 Highlight *h;
670 670
671// hlNumber = n; 671// hlNumber = n;
672 672
673 h = hlManager->getHl(n); 673 h = hlManager->getHl(n);
674 if (h == m_highlight) { 674 if (h == m_highlight) {
675 updateLines(); 675 updateLines();
676 } else { 676 } else {
677 if (m_highlight != 0L) m_highlight->release(); 677 if (m_highlight != 0L) m_highlight->release();
678 h->use(); 678 h->use();
679 m_highlight = h; 679 m_highlight = h;
680 makeAttribs(); 680 makeAttribs();
681 } 681 }
682 PreHighlightedTill=0; 682 PreHighlightedTill=0;
683 RequestPreHighlightTill=0; 683 RequestPreHighlightTill=0;
684 emit(highlightChanged()); 684 emit(highlightChanged());
685} 685}
686 686
687void KateDocument::makeAttribs() { 687void KateDocument::makeAttribs() {
688 qDebug("KateDocument::makeAttribs()"); 688 qDebug("KateDocument::makeAttribs()");
689 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs); 689 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs);
690 updateFontData(); 690 updateFontData();
691 updateLines(); 691 updateLines();
692} 692}
693 693
694void KateDocument::updateFontData() { 694void KateDocument::updateFontData() {
695 int maxAscent, maxDescent; 695 int maxAscent, maxDescent;
696 int tabWidth; 696 int tabWidth;
697 KateView *view; 697 KateView *view;
698 698
699 maxAscent = myFontMetrics.ascent(); 699 maxAscent = myFontMetrics.ascent();
700 maxDescent = myFontMetrics.descent(); 700 maxDescent = myFontMetrics.descent();
701 tabWidth = myFontMetrics.width(' '); 701 tabWidth = myFontMetrics.width(' ');
702 702
703 fontHeight = maxAscent + maxDescent + 1; 703 fontHeight = maxAscent + maxDescent + 1;
704 fontAscent = maxAscent; 704 fontAscent = maxAscent;
705 m_tabWidth = tabChars*tabWidth; 705 m_tabWidth = tabChars*tabWidth;
706 706
707 for (view = views.first(); view != 0L; view = views.next() ) { 707 for (view = views.first(); view != 0L; view = views.next() ) {
708 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight); 708 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight);
709 view->tagAll(); 709 view->tagAll();
710 view->updateCursor(); 710 view->updateCursor();
711 } 711 }
712} 712}
713 713
714void KateDocument::hlChanged() { //slot 714void KateDocument::hlChanged() { //slot
715 makeAttribs(); 715 makeAttribs();
716 updateViews(); 716 updateViews();
717} 717}
718 718
719 719
720void KateDocument::addView(KTextEditor::View *view) { 720void KateDocument::addView(KTextEditor::View *view) {
721 views.append( static_cast<KateView *>( view ) ); 721 views.append( static_cast<KateView *>( view ) );
722 KTextEditor::Document::addView( view ); 722 KTextEditor::Document::addView( view );
723 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 723 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
724} 724}
725 725
726void KateDocument::removeView(KTextEditor::View *view) { 726void KateDocument::removeView(KTextEditor::View *view) {
727// if (undoView == view) recordReset(); 727// if (undoView == view) recordReset();
728 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 728 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
729 views.removeRef( static_cast<KateView *>( view ) ); 729 views.removeRef( static_cast<KateView *>( view ) );
730 KTextEditor::Document::removeView( view ); 730 KTextEditor::Document::removeView( view );
731} 731}
732 732
733void KateDocument::slotViewDestroyed() 733void KateDocument::slotViewDestroyed()
734{ 734{
735 views.removeRef( static_cast<const KateView *>( sender() ) ); 735 views.removeRef( static_cast<const KateView *>( sender() ) );
736} 736}
737 737
738bool KateDocument::ownedView(KateView *view) { 738bool KateDocument::ownedView(KateView *view) {
739 // do we own the given view? 739 // do we own the given view?
740 return (views.containsRef(view) > 0); 740 return (views.containsRef(view) > 0);
741} 741}
742 742
743bool KateDocument::isLastView(int numViews) { 743bool KateDocument::isLastView(int numViews) {
744 return ((int) views.count() == numViews); 744 return ((int) views.count() == numViews);
745} 745}
746 746
747int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) { 747int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) {
748 int x; 748 int x;
749 int z; 749 int z;
750 QChar ch; 750 QChar ch;
751 Attribute *a; 751 Attribute *a;
752 752
753 x = 0; 753 x = 0;
754 for (z = 0; z < cursorX; z++) { 754 for (z = 0; z < cursorX; z++) {
755 ch = textLine->getChar(z); 755 ch = textLine->getChar(z);
756 a = &m_attribs[textLine->getAttr(z)]; 756 a = &m_attribs[textLine->getAttr(z)];
757 757
758 if (ch == '\t') 758 if (ch == '\t')
759 x += m_tabWidth - (x % m_tabWidth); 759 x += m_tabWidth - (x % m_tabWidth);
760 else if (a->bold && a->italic) 760 else if (a->bold && a->italic)
761 x += myFontMetricsBI.width(ch); 761 x += myFontMetricsBI.width(ch);
762 else if (a->bold) 762 else if (a->bold)
763 x += myFontMetricsBold.width(ch); 763 x += myFontMetricsBold.width(ch);
764 else if (a->italic) 764 else if (a->italic)
765 x += myFontMetricsItalic.width(ch); 765 x += myFontMetricsItalic.width(ch);
766 else 766 else
767 x += myFontMetrics.width(ch); 767 x += myFontMetrics.width(ch);
768 } 768 }
769 return x; 769 return x;
770} 770}
771 771
772int KateDocument::textWidth(PointStruc &cursor) { 772int KateDocument::textWidth(PointStruc &cursor) {
773 if (cursor.x < 0) 773 if (cursor.x < 0)
774 cursor.x = 0; 774 cursor.x = 0;
775 if (cursor.y < 0) 775 if (cursor.y < 0)
776 cursor.y = 0; 776 cursor.y = 0;
777 if (cursor.y >= numLines()) 777 if (cursor.y >= numLines())
778 cursor.y = lastLine(); 778 cursor.y = lastLine();
779 return textWidth(getTextLine(cursor.y),cursor.x); 779 return textWidth(getTextLine(cursor.y),cursor.x);
780} 780}
781 781
782int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) { 782int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) {
783 int len; 783 int len;
784 int x, oldX; 784 int x, oldX;
785 int z; 785 int z;
786 QChar ch; 786 QChar ch;
787 Attribute *a; 787 Attribute *a;
788 788
789 if (cursor.y < 0) cursor.y = 0; 789 if (cursor.y < 0) cursor.y = 0;
790 if (cursor.y > lastLine()) cursor.y = lastLine(); 790 if (cursor.y > lastLine()) cursor.y = lastLine();
791 TextLine::Ptr textLine = getTextLine(cursor.y); 791 TextLine::Ptr textLine = getTextLine(cursor.y);
792 len = textLine->length(); 792 len = textLine->length();
793 793
794 x = oldX = z = 0; 794 x = oldX = z = 0;
795 while (x < xPos && (!wrapCursor || z < len)) { 795 while (x < xPos && (!wrapCursor || z < len)) {
796 oldX = x; 796 oldX = x;
797 ch = textLine->getChar(z); 797 ch = textLine->getChar(z);
798 a = &m_attribs[textLine->getAttr(z)]; 798 a = &m_attribs[textLine->getAttr(z)];
799 799
800 if (ch == '\t') 800 if (ch == '\t')
801 x += m_tabWidth - (x % m_tabWidth); 801 x += m_tabWidth - (x % m_tabWidth);
802 else if (a->bold && a->italic) 802 else if (a->bold && a->italic)
803 x += myFontMetricsBI.width(ch); 803 x += myFontMetricsBI.width(ch);
804 else if (a->bold) 804 else if (a->bold)
805 x += myFontMetricsBold.width(ch); 805 x += myFontMetricsBold.width(ch);
806 else if (a->italic) 806 else if (a->italic)
807 x += myFontMetricsItalic.width(ch); 807 x += myFontMetricsItalic.width(ch);
808 else 808 else
809 x += myFontMetrics.width(ch); 809 x += myFontMetrics.width(ch);
810 810
811 z++; 811 z++;
812 } 812 }
813 if (xPos - oldX < x - xPos && z > 0) { 813 if (xPos - oldX < x - xPos && z > 0) {
814 z--; 814 z--;
815 x = oldX; 815 x = oldX;
816 } 816 }
817 cursor.x = z; 817 cursor.x = z;
818 return x; 818 return x;
819} 819}
820 820
821 821
822int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) { 822int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) {
823 int x, oldX; 823 int x, oldX;
824 int z; 824 int z;
825 QChar ch; 825 QChar ch;
826 Attribute *a; 826 Attribute *a;
827 827
828 x = oldX = z = 0; 828 x = oldX = z = 0;
829 while (x < xPos) { // && z < len) { 829 while (x < xPos) { // && z < len) {
830 oldX = x; 830 oldX = x;
831 ch = textLine->getChar(z); 831 ch = textLine->getChar(z);
832 a = &m_attribs[textLine->getAttr(z)]; 832 a = &m_attribs[textLine->getAttr(z)];
833 833
834 if (ch == '\t') 834 if (ch == '\t')
835 x += m_tabWidth - (x % m_tabWidth); 835 x += m_tabWidth - (x % m_tabWidth);
836 else if (a->bold && a->italic) 836 else if (a->bold && a->italic)
837 x += myFontMetricsBI.width(ch); 837 x += myFontMetricsBI.width(ch);
838 else if (a->bold) 838 else if (a->bold)
839 x += myFontMetricsBold.width(ch); 839 x += myFontMetricsBold.width(ch);
840 else if (a->italic) 840 else if (a->italic)
841 x += myFontMetricsItalic.width(ch); 841 x += myFontMetricsItalic.width(ch);
842 else 842 else
843 x += myFontMetrics.width(ch); 843 x += myFontMetrics.width(ch);
844 844
845 z++; 845 z++;
846 } 846 }
847 if (xPos - oldX < x - xPos && z > 0) { 847 if (xPos - oldX < x - xPos && z > 0) {
848 z--; 848 z--;
849 // newXPos = oldX; 849 // newXPos = oldX;
850 }// else newXPos = x; 850 }// else newXPos = x;
851 return z; 851 return z;
852} 852}
853 853
854int KateDocument::textWidth() { 854int KateDocument::textWidth() {
855 return int(maxLength + 8); 855 return int(maxLength + 8);
856} 856}
857 857
858int KateDocument::textHeight() { 858int KateDocument::textHeight() {
859 return numLines()*fontHeight; 859 return numLines()*fontHeight;
860} 860}
861 861
862void KateDocument::insert(VConfig &c, const QString &s) { 862void KateDocument::insert(VConfig &c, const QString &s) {
863 int pos; 863 int pos;
864 QChar ch; 864 QChar ch;
865 QString buf; 865 QString buf;
866 866
867 if (s.isEmpty()) return; 867 if (s.isEmpty()) return;
868 868
869 recordStart(c, KateActionGroup::ugPaste); 869 recordStart(c, KateActionGroup::ugPaste);
870 870
871 pos = 0; 871 pos = 0;
872 if (!(c.flags & KateView::cfVerticalSelect)) { 872 if (!(c.flags & KateView::cfVerticalSelect)) {
873 do { 873 do {
874 ch = s[pos]; 874 ch = s[pos];
875 if (ch.isPrint() || ch == '\t') { 875 if (ch.isPrint() || ch == '\t') {
876 buf += ch; // append char to buffer 876 buf += ch; // append char to buffer
877 } else if (ch == '\n') { 877 } else if (ch == '\n') {
878 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line 878 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line
879 recordInsert(c, buf); // append to old line 879 recordInsert(c, buf); // append to old line
880// c.cursor.x += buf.length(); 880// c.cursor.x += buf.length();
881 buf.truncate(0); // clear buffer 881 buf.truncate(0); // clear buffer
882 c.cursor.y++; 882 c.cursor.y++;
883 c.cursor.x = 0; 883 c.cursor.x = 0;
884 } 884 }
885 pos++; 885 pos++;
886 } while (pos < (int) s.length()); 886 } while (pos < (int) s.length());
887 } else { 887 } else {
888 int xPos; 888 int xPos;
889 889
890 xPos = textWidth(c.cursor); 890 xPos = textWidth(c.cursor);
891 do { 891 do {
892 ch = s[pos]; 892 ch = s[pos];
893 if (ch.isPrint() || ch == '\t') { 893 if (ch.isPrint() || ch == '\t') {
894 buf += ch; 894 buf += ch;
895 } else if (ch == '\n') { 895 } else if (ch == '\n') {
896 recordInsert(c, buf); 896 recordInsert(c, buf);
897 c.cursor.x += buf.length(); 897 c.cursor.x += buf.length();
898 buf.truncate(0); 898 buf.truncate(0);
899 c.cursor.y++; 899 c.cursor.y++;
900 if (c.cursor.y >= numLines()) 900 if (c.cursor.y >= numLines())
901 recordAction(KateAction::insLine, c.cursor); 901 recordAction(KateAction::insLine, c.cursor);
902 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos); 902 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos);
903 } 903 }
904 pos++; 904 pos++;
905 } while (pos < (int) s.length()); 905 } while (pos < (int) s.length());
906 } 906 }
907 recordInsert(c, buf); 907 recordInsert(c, buf);
908 c.cursor.x += buf.length(); 908 c.cursor.x += buf.length();