00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kocommand.h"
00021
#include "kotextobject.h"
00022
#include "kovariable.h"
00023
#include <kdebug.h>
00024
#include <klocale.h>
00025
00026
00027
void KoTextCommand::execute()
00028 {
00029 m_textobj->
redo();
00030 }
00031
00032
00033
void KoTextCommand::unexecute()
00034 {
00035 m_textobj->
undo();
00036 }
00037
00038 KoTextDeleteCommand::KoTextDeleteCommand(
00039 KoTextDocument *d,
int i,
int idx,
const QMemArray<KoTextStringChar> &str,
00040
const CustomItemsMap & customItemsMap,
00041
const QValueList<KoParagLayout> &oldParagLayouts )
00042 : KoTextDocDeleteCommand( d, i, idx, str ),
00043 m_oldParagLayouts( oldParagLayouts ),
00044 m_customItemsMap( customItemsMap )
00045 {
00046 Q_ASSERT(
id >= 0 );
00047 }
00048
00049 KoTextCursor * KoTextDeleteCommand::execute( KoTextCursor *c )
00050 {
00051 KoTextParag *s = doc ? doc->paragAt(
id ) : parag;
00052
if ( !s ) {
00053 kdWarning() <<
"can't locate parag at " <<
id <<
", last parag: " << doc->lastParag()->paragId() << endl;
00054
return 0;
00055 }
00056 cursor.setParag( s );
00057 cursor.setIndex( index );
00058
int len = text.size();
00059
00060
00061
for (
int i = 0; i < len; ++i )
00062 {
00063 KoTextStringChar * ch = cursor.parag()->at( cursor.index() );
00064
if ( ch->isCustom() )
00065 {
00066 ch->customItem()->setDeleted(
true );
00067 cursor.parag()->removeCustomItem(cursor.index());
00068 }
00069 cursor.gotoRight();
00070 }
00071
00072
return KoTextDocDeleteCommand::execute(c);
00073 }
00074
00075 KoTextCursor * KoTextDeleteCommand::unexecute( KoTextCursor *c )
00076 {
00077
00078 KoTextCursor * cr = KoTextDocDeleteCommand::unexecute(c);
00079
00080 KoTextParag *s = doc ? doc->paragAt(
id ) : parag;
00081
if ( !s ) {
00082 kdWarning() <<
"can't locate parag at " <<
id <<
", last parag: " << doc->lastParag()->paragId() << endl;
00083
return 0;
00084 }
00085 cursor.setParag( s );
00086 cursor.setIndex( index );
00087
00088 m_customItemsMap.
insertItems( cursor, text.size() );
00089
00090
00091
QValueList<KoParagLayout>::Iterator lit = m_oldParagLayouts.begin();
00092 kdDebug(32500) <<
"KoTextDeleteCommand::unexecute " << m_oldParagLayouts.count() <<
" parag layouts. First parag=" << s->paragId() << endl;
00093 Q_ASSERT(
id == s->paragId() );
00094 KoTextParag *p = s;
00095
while ( p ) {
00096
if ( lit != m_oldParagLayouts.end() )
00097 {
00098 kdDebug(32500) <<
"KoTextDeleteCommand::unexecute applying paraglayout to parag " << p->paragId() << endl;
00099 p->setParagLayout( *lit );
00100 }
00101
else
00102
break;
00103
00104
00105 p = p->next();
00106 ++lit;
00107 }
00108
return cr;
00109 }
00110
00111 KoTextParagCommand::KoTextParagCommand( KoTextDocument *d,
int fParag,
int lParag,
00112
const QValueList<KoParagLayout> &oldParagLayouts,
00113
KoParagLayout newParagLayout,
00114
int flags,
00115 QStyleSheetItem::Margin margin,
bool borderOutline )
00116 : KoTextDocCommand( d ), firstParag( fParag ), lastParag( lParag ), m_oldParagLayouts( oldParagLayouts ),
00117 m_newParagLayout( newParagLayout ), m_flags( flags ), m_margin( margin ), m_borderOutline( borderOutline )
00118 {
00119 Q_ASSERT( fParag >= 0 );
00120 Q_ASSERT( lParag >= 0 );
00121 }
00122
00123 KoTextCursor * KoTextParagCommand::execute( KoTextCursor *c )
00124 {
00125
00126 KoTextParag *p = doc->paragAt( firstParag );
00127
if ( !p )
00128 {
00129 kdWarning() <<
"KoTextParagCommand::execute paragraph " << firstParag <<
"not found" << endl;
00130
return c;
00131 }
00132
while ( p ) {
00133
if ( ( m_flags & KoParagLayout::Margins ) && m_margin != (QStyleSheetItem::Margin)-1 )
00134 p->setMargin( static_cast<QStyleSheetItem::Margin>(m_margin), m_newParagLayout.
margins[m_margin] );
00135
else
00136 {
00137 p->setParagLayout( m_newParagLayout, m_flags );
00138
if ( (m_flags & KoParagLayout::Borders) && m_borderOutline)
00139 {
00140
KoBorder tmpBorder;
00141 tmpBorder.
setPenWidth(0);
00142 p->setTopBorder(tmpBorder);
00143 p->setBottomBorder(tmpBorder);
00144 }
00145 }
00146
if ( p->paragId() == lastParag )
00147
break;
00148 p = p->next();
00149 }
00150
if ( (m_flags & KoParagLayout::Borders) && m_borderOutline)
00151 {
00152 p->setBottomBorder( m_newParagLayout.
bottomBorder);
00153 doc->paragAt( firstParag )->setTopBorder( m_newParagLayout.
topBorder);
00154 }
00155
00156
00157
00158 c->setParag( p );
00159 c->setIndex( p->length()-1 );
00160
return c;
00161 }
00162
00163 KoTextCursor * KoTextParagCommand::unexecute( KoTextCursor *c )
00164 {
00165 kdDebug(32500) <<
"KoTextParagCommand::unexecute" << endl;
00166 KoTextParag *p = doc->paragAt( firstParag );
00167
if ( !p )
00168 {
00169 kdDebug(32500) <<
"KoTextParagCommand::unexecute paragraph " << firstParag <<
"not found" << endl;
00170
return c;
00171 }
00172
QValueList<KoParagLayout>::Iterator lit = m_oldParagLayouts.begin();
00173
while ( p ) {
00174
if ( lit == m_oldParagLayouts.end() )
00175 {
00176 kdDebug(32500) <<
"KoTextParagCommand::unexecute m_oldParagLayouts not big enough!" << endl;
00177
break;
00178 }
00179
if ( m_flags & KoParagLayout::Margins && m_margin != (QStyleSheetItem::Margin)-1 )
00180 p->setMargin( static_cast<QStyleSheetItem::Margin>(m_margin), (*lit).margins[m_margin] );
00181
else
00182 {
00183 p->setParagLayout( *lit, m_flags );
00184 }
00185
if ( p->paragId() == lastParag )
00186
break;
00187 p = p->next();
00188 ++lit;
00189 }
00190
00191 c->setParag( p );
00192 c->setIndex( p->length()-1 );
00193
return c;
00194 }
00195
00197
00198 KoParagFormatCommand::KoParagFormatCommand( KoTextDocument *d,
int fParag,
int lParag,
00199
const QValueList<KoTextFormat *> &oldFormats,
00200
KoTextFormat * newFormat )
00201 : KoTextDocCommand( d ), firstParag( fParag ), lastParag( lParag ), m_oldFormats( oldFormats ),
00202 m_newFormat( newFormat )
00203 {
00204
QValueList<KoTextFormat *>::Iterator lit = m_oldFormats.begin();
00205
for ( ; lit != m_oldFormats.end() ; ++lit )
00206 (*lit)->addRef();
00207 }
00208
00209 KoParagFormatCommand::~KoParagFormatCommand()
00210 {
00211
QValueList<KoTextFormat *>::Iterator lit = m_oldFormats.begin();
00212
for ( ; lit != m_oldFormats.end() ; ++lit )
00213 (*lit)->removeRef();
00214 }
00215
00216 KoTextCursor * KoParagFormatCommand::execute( KoTextCursor *c )
00217 {
00218 KoTextParag *p = doc->paragAt( firstParag );
00219
if ( !p )
00220 {
00221 kdDebug(32500) <<
"KoTextParagCommand::execute paragraph " << firstParag <<
"not found" << endl;
00222
return c;
00223 }
00224
while ( p ) {
00225 p->setFormat( m_newFormat );
00226 p->invalidate(0);
00227
if ( p->paragId() == lastParag )
00228
break;
00229 p = p->next();
00230 }
00231
return c;
00232 }
00233
00234 KoTextCursor * KoParagFormatCommand::unexecute( KoTextCursor *c )
00235 {
00236 kdDebug(32500) <<
"KoParagFormatCommand::unexecute" << endl;
00237 KoTextParag *p = doc->paragAt( firstParag );
00238
if ( !p )
00239 {
00240 kdDebug(32500) <<
"KoParagFormatCommand::unexecute paragraph " << firstParag <<
"not found" << endl;
00241
return c;
00242 }
00243
QValueList<KoTextFormat *>::Iterator lit = m_oldFormats.begin();
00244
while ( p ) {
00245
if ( lit == m_oldFormats.end() )
00246 {
00247 kdDebug(32500) <<
"KoParagFormatCommand::unexecute m_oldFormats not big enough!" << endl;
00248
break;
00249 }
00250 p->setFormat( (*lit) );
00251
if ( p->paragId() == lastParag )
00252
break;
00253 p = p->next();
00254 ++lit;
00255 }
00256
return c;
00257 }
00258
00259 KoTextFormatCommand::KoTextFormatCommand(KoTextDocument *d,
int sid,
int sidx,
int eid,
int eidx,
const QMemArray<KoTextStringChar> &old,
const KoTextFormat *f,
int fl )
00260 : KoTextDocFormatCommand(d, sid, sidx, eid, eidx, old, f, fl)
00261 {
00262 }
00263
00264
00265 KoTextFormatCommand::~KoTextFormatCommand()
00266 {
00267 }
00268
00269
void KoTextFormatCommand::resizeCustomItems()
00270 {
00271 KoTextParag *sp = doc->paragAt( startId );
00272 KoTextParag *ep = doc->paragAt( endId );
00273
if ( !sp || !ep )
00274
return;
00275
00276 KoTextCursor start( doc );
00277 start.setParag( sp );
00278 start.setIndex( startIndex );
00279 KoTextCursor end( doc );
00280 end.setParag( ep );
00281 end.setIndex( endIndex );
00282
00283 doc->setSelectionStart( KoTextDocument::Temp, &start );
00284 doc->setSelectionEnd( KoTextDocument::Temp, &end );
00285
00286
00287
00288
if ( start.parag() == end.parag() )
00289 {
00290
QString text = start.parag()->string()->toString().mid( start.index(), end.index() - start.index() );
00291
for (
int i = start.index(); i < end.index(); ++i )
00292 {
00293
if( start.parag()->at(i)->isCustom())
00294 {
00295 start.parag()->at(i)->customItem()->resize();
00296 }
00297 }
00298 }
00299
else
00300 {
00301
int i;
00302
QString text = start.parag()->string()->toString().mid( start.index(), start.parag()->length() - 1 - start.index() );
00303
for ( i = start.index(); i < start.parag()->length(); ++i )
00304
if( start.parag()->at(i)->isCustom())
00305 {
00306 start.parag()->at(i)->customItem()->resize();
00307 }
00308
00309 KoTextParag *p = start.parag()->next();
00310
while ( p && p != end.parag() )
00311 {
00312 text = p->string()->toString().left( p->length() - 1 );
00313
for ( i = 0; i < p->length(); ++i )
00314 {
00315
if( p->at(i)->isCustom())
00316 {
00317 p->at(i)->customItem()->resize();
00318 }
00319 }
00320 p = p->next();
00321 }
00322 text = end.parag()->string()->toString().left( end.index() );
00323
for ( i = 0; i < end.index(); ++i )
00324 {
00325
if( end.parag()->at(i)->isCustom())
00326 {
00327 end.parag()->at(i)->customItem()->resize();
00328 }
00329 }
00330 }
00331 }
00332
00333 KoTextCursor *KoTextFormatCommand::execute( KoTextCursor *c )
00334 {
00335 c = KoTextDocFormatCommand::execute( c );
00336 resizeCustomItems();
00337
return c;
00338 }
00339
00340 KoTextCursor *KoTextFormatCommand::unexecute( KoTextCursor *c )
00341 {
00342 kdDebug(32500) <<
"KoTextFormatCommand::unexecute c:" << c <<
" index:" << c->index() << endl;
00343 c = KoTextDocFormatCommand::unexecute( c );
00344 kdDebug(32500) <<
"KoTextFormatCommand::unexecute after KoTextFormatCommand c:" << c <<
" index:" << c->index() << endl;
00345 resizeCustomItems();
00346
return c;
00347 }
00348
00350
00351 KoChangeVariableSubType::KoChangeVariableSubType(
00352
short int _oldValue,
short int _newValue,
00353
KoVariable *var):
00354 KCommand(),
00355 m_newValue(_newValue),
00356 m_oldValue(_oldValue),
00357 m_var(var)
00358 {
00359 }
00360
00361
void KoChangeVariableSubType::execute()
00362 {
00363 Q_ASSERT(m_var);
00364 m_var->
setVariableSubType(m_newValue);
00365 m_var->
recalcAndRepaint();
00366 }
00367
00368
void KoChangeVariableSubType::unexecute()
00369 {
00370 Q_ASSERT(m_var);
00371 m_var->
setVariableSubType(m_oldValue);
00372 m_var->
recalcAndRepaint();
00373 }
00374
00375
QString KoChangeVariableSubType::name()
const
00376
{
00377
return i18n(
"Change Variable Subtype" );
00378 }
00379
00381
00382 KoChangeVariableFormatProperties::KoChangeVariableFormatProperties(
00383
const QString &_oldValue,
const QString &_newValue,
00384
KoVariable *var)
00385 : KCommand(),
00386 m_newValue(_newValue),
00387 m_oldValue(_oldValue),
00388 m_var(var)
00389 {
00390 }
00391
00392
void KoChangeVariableFormatProperties::execute()
00393 {
00394 Q_ASSERT(m_var);
00395
00396
KoVariableFormatCollection* coll = m_var->
variableColl()->formatCollection();
00397 m_var->
setVariableFormat( coll->
format( m_var->
variableFormat()->
getKey( m_newValue ) ) );
00398 m_var->
recalcAndRepaint();
00399 }
00400
00401
void KoChangeVariableFormatProperties::unexecute()
00402 {
00403 Q_ASSERT(m_var);
00404
00405
KoVariableFormatCollection* coll = m_var->
variableColl()->formatCollection();
00406 m_var->
setVariableFormat( coll->
format( m_var->
variableFormat()->
getKey( m_oldValue ) ) );
00407 m_var->
recalcAndRepaint();
00408 }
00409
00410
QString KoChangeVariableFormatProperties::name()
const
00411
{
00412
return i18n(
"Change Variable Format" );
00413 }