You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kword/KWCommand.cpp

2095 lines
66 KiB

/* This file is part of the KDE project
Copyright (C) 2001 David Faure <faure@kde.org>
Copyright (C) 2005 Thomas Zander <zander@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KWCommand.h"
#include "KWDocument.h"
#include "KWTextFrameSet.h"
#include "KWTableStyle.h"
#include "KWTableTemplate.h"
#include "KWTableFrameSet.h"
#include "KWPartFrameSet.h"
#include "KWTextDocument.h"
#include "KWTextParag.h"
#include "KWAnchor.h"
#include "KWVariable.h"
#include "KWOasisLoader.h"
#include "KWFrameList.h"
#include "KWFrameSet.h"
#include "KWPictureFrameSet.h"
#include "KWPageManager.h"
#include "KWPage.h"
#include <KoTextObject.h>
#include <KoOasisStyles.h>
#include <KoOasisContext.h>
#include <KoXmlNS.h>
#include <KoDom.h>
#include <KoStore.h>
#include <KoOasisStore.h>
#include <klocale.h>
#include <kdebug.h>
#include <qxml.h>
#include <qbuffer.h>
#include <algorithm>
// Helper class for deleting all custom items
// (KWTextFrameset::removeSelectedText and readFormats do that already,
// but with undo/redo, and copying all formatting etc.)
class KWDeleteCustomItemVisitor : public KoParagVisitor // see kotextdocument.h
{
public:
KWDeleteCustomItemVisitor() : KoParagVisitor() { }
virtual bool visit( KoTextParag *parag, int start, int end )
{
kdDebug(32001) << "KWPasteTextCommand::execute " << parag->paragId() << " " << start << " " << end << endl;
for ( int i = start ; i < end ; ++i )
{
KoTextStringChar * ch = parag->at( i );
if ( ch->isCustom() ) {
KoTextCustomItem* item = ch->customItem();
item->setDeleted( true );
parag->removeCustomItem(i);
KCommand* itemCmd = item->deleteCommand();
if ( itemCmd )
itemCmd->execute();
}
}
return true;
}
};
#if 0 // kept for comparison with KWOasisPasteCommand
KWPasteTextCommand::KWPasteTextCommand( KoTextDocument *d, int parag, int idx,
const QCString & data )
: KoTextDocCommand( d ), m_parag( parag ), m_idx( idx ), m_data( data ), m_oldParagLayout( 0 )
{
}
KoTextCursor * KWPasteTextCommand::execute( KoTextCursor *c )
{
KoTextParag *firstParag = doc->paragAt( m_parag );
if ( !firstParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_parag, doc->lastParag()->paragId() );
return 0;
}
//kdDebug() << "KWPasteTextCommand::execute m_parag=" << m_parag << " m_idx=" << m_idx
// << " firstParag=" << firstParag << " " << firstParag->paragId() << endl;
cursor.setParag( firstParag );
cursor.setIndex( m_idx );
c->setParag( firstParag );
c->setIndex( m_idx );
QDomDocument domDoc;
domDoc.setContent( m_data );
QDomElement elem = domDoc.documentElement();
KWTextDocument * textdoc = static_cast<KWTextDocument *>(doc);
KWTextFrameSet * textFs = textdoc->textFrameSet();
// We iterate twice over the list of paragraphs.
// First time to gather the text,
// second time to apply the character & paragraph formatting
QString text;
QValueList<QDomElement> listParagraphs;
QDomElement paragraph = elem.firstChild().toElement();
for ( ; !paragraph.isNull() ; paragraph = paragraph.nextSibling().toElement() )
{
if ( paragraph.tagName() == "PARAGRAPH" )
{
QString s = paragraph.namedItem( "TEXT" ).toElement().text();
//kdDebug() << "KWPasteTextCommand::execute Inserting text: '" << s << "'" << endl;
c->insert( s, false /*newline=linebreak, not new parag*/ );
if ( !paragraph.nextSibling().isNull() ) // Not for last parag
{
// Create new parag
// Lowlevel method:
c->splitAndInsertEmptyParag( FALSE, TRUE );
// Highlevel method:
//c->insert( "\n", true );
}
listParagraphs.append( paragraph );
}
}
// Redo the parag lookup because if firstParag was empty, insert() has
// shifted it down (side effect of splitAndInsertEmptyParag)
firstParag = doc->paragAt( m_parag );
KWTextParag * parag = static_cast<KWTextParag *>(firstParag);
//kdDebug() << "KWPasteTextCommand::execute starting at parag " << parag << " " << parag->paragId() << endl;
uint count = listParagraphs.count();
QValueList<QDomElement>::Iterator it = listParagraphs.begin();
QValueList<QDomElement>::Iterator end = listParagraphs.end();
for ( uint item = 0 ; it != end ; ++it, ++item )
{
if (!parag)
{
kdWarning() << "KWPasteTextCommand: parag==0L ! KWord bug, please report." << endl;
break;
}
QDomElement paragElem = *it;
// First line (if appending to non-empty line) : apply offset to formatting, don't apply parag layout
if ( item == 0 && m_idx > 0 )
{
// First load the default format, but only apply it to our new chars
QDomElement layout = paragElem.namedItem( "LAYOUT" ).toElement();
if ( !layout.isNull() )
{
QDomElement formatElem = layout.namedItem( "FORMAT" ).toElement();
if ( !formatElem.isNull() )
{
KoTextFormat f = parag->loadFormat( formatElem, 0L, QFont(), KGlobal::locale()->language(),false );
KoTextFormat * defaultFormat = doc->formatCollection()->format( &f );
// Last paragraph (i.e. only one in all) : some of the text might be from before the paste
int endIndex = (item == count-1) ? c->index() : parag->string()->length() - 1;
parag->setFormat( m_idx, endIndex - m_idx, defaultFormat, TRUE );
}
}
parag->loadFormatting( paragElem, m_idx, (textFs->isMainFrameset()));
}
else
{
if ( item == 0 ) // This paragraph existed, store its parag layout
{
delete m_oldParagLayout;
m_oldParagLayout = new KoParagLayout( parag->paragLayout() );
}
parag->loadLayout( paragElem );
// Last paragraph: some of the text might be from before the paste
int len = (item == count-1) ? c->index() : parag->string()->length();
// Apply default format
parag->setFormat( 0, len, parag->paragFormat(), TRUE );
parag->loadFormatting( paragElem, 0, (textFs->isMainFrameset()) );
}
parag->invalidate(0); // the formatting will be done by caller (either KWTextFrameSet::pasteOasis or KoTextObject::undo/redo)
parag->setChanged( TRUE );
parag = static_cast<KWTextParag *>(parag->next());
//kdDebug() << "KWPasteTextCommand::execute going to next parag: " << parag << endl;
}
textFs->textObject()->setNeedSpellCheck( true );
// In case loadFormatting queued any image request
KWDocument * doc = textFs->kWordDocument();
doc->processPictureRequests();
//kdDebug() << "KWPasteTextCommand::execute calling doc->pasteFrames" << endl;
// In case of any inline frameset
doc->pasteFrames( elem, 0,
true /*don't change footnote attribute*/ ,
(textFs->isMainFrameset()) /*load footnotes if mainframeset*/,
false /*don't select frames*/ );
doc->completePasting();
m_lastParag = c->parag()->paragId();
m_lastIndex = c->index();
return c;
}
KoTextCursor * KWPasteTextCommand::unexecute( KoTextCursor *c )
{
KoTextParag *firstParag = doc->paragAt( m_parag );
if ( !firstParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_parag, doc->lastParag()->paragId() );
return 0;
}
cursor.setParag( firstParag );
cursor.setIndex( m_idx );
doc->setSelectionStart( KoTextDocument::Temp, &cursor );
KoTextParag *lastParag = doc->paragAt( m_lastParag );
if ( !lastParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_lastParag, doc->lastParag()->paragId() );
return 0;
}
Q_ASSERT( lastParag->document() );
KWTextDocument * textdoc = static_cast<KWTextDocument *>(doc);
//kdDebug() << "Undoing paste: deleting from (" << firstParag->paragId() << "," << m_idx << ")"
// << " to (" << lastParag->paragId() << "," << m_lastIndex << ")" << endl;
cursor.setParag( lastParag );
cursor.setIndex( m_lastIndex );
doc->setSelectionEnd( KoTextDocument::Temp, &cursor );
// Delete all custom items
KWDeleteCustomItemVisitor visitor;
doc->visitSelection( KoTextDocument::Temp, &visitor );
doc->removeSelectedText( KoTextDocument::Temp, c /* sets c to the correct position */ );
KWTextFrameSet * textFs = textdoc->textFrameSet();
textFs->renumberFootNotes();
if ( m_idx == 0 ) {
Q_ASSERT( m_oldParagLayout );
if ( m_oldParagLayout )
firstParag->setParagLayout( *m_oldParagLayout );
}
return c;
}
#endif
KWOasisPasteCommand::KWOasisPasteCommand( KoTextDocument *d, int parag, int idx,
const QByteArray& data )
: KoTextDocCommand( d ), m_parag( parag ), m_idx( idx ), m_data( data ), m_oldParagLayout( 0 )
{
}
KoTextCursor * KWOasisPasteCommand::execute( KoTextCursor *c )
{
KoTextParag *firstParag = doc->paragAt( m_parag );
if ( !firstParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_parag, doc->lastParag()->paragId() );
return c;
}
//kdDebug() << "KWOasisPasteCommand::execute m_parag=" << m_parag << " m_idx=" << m_idx
// << " firstParag=" << firstParag << " " << firstParag->paragId() << endl;
cursor.setParag( firstParag );
cursor.setIndex( m_idx );
c->setParag( firstParag );
c->setIndex( m_idx );
KWTextDocument * textdoc = static_cast<KWTextDocument *>(doc);
QBuffer buffer( m_data );
KoStore * store = KoStore::createStore( &buffer, KoStore::Read );
KWDocument* kwdoc = textdoc->textFrameSet()->kWordDocument();
KWOasisLoader loader( kwdoc );
loader.insertOasisData( store, c );
delete store;
m_lastParag = c->parag()->paragId();
m_lastIndex = c->index();
return c;
}
KoTextCursor * KWOasisPasteCommand::unexecute( KoTextCursor *c )
{
KoTextParag *firstParag = doc->paragAt( m_parag );
if ( !firstParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_parag, doc->lastParag()->paragId() );
return 0;
}
cursor.setParag( firstParag );
cursor.setIndex( m_idx );
doc->setSelectionStart( KoTextDocument::Temp, &cursor );
KoTextParag *lastParag = doc->paragAt( m_lastParag );
if ( !lastParag ) {
qWarning( "can't locate parag at %d, last parag: %d", m_lastParag, doc->lastParag()->paragId() );
return 0;
}
Q_ASSERT( lastParag->document() );
// Get hold of the document before deleting the parag
KWTextDocument * textdoc = static_cast<KWTextDocument *>(doc);
//kdDebug() << "Undoing paste: deleting from (" << firstParag->paragId() << "," << m_idx << ")"
// << " to (" << lastParag->paragId() << "," << m_lastIndex << ")" << endl;
cursor.setParag( lastParag );
cursor.setIndex( m_lastIndex );
doc->setSelectionEnd( KoTextDocument::Temp, &cursor );
// Delete all custom items
KWDeleteCustomItemVisitor visitor;
doc->visitSelection( KoTextDocument::Temp, &visitor );
doc->removeSelectedText( KoTextDocument::Temp, c /* sets c to the correct position */ );
KWTextFrameSet * textFs = textdoc->textFrameSet();
textFs->renumberFootNotes();
#if 0
if ( m_idx == 0 ) {
Q_ASSERT( m_oldParagLayout );
if ( m_oldParagLayout )
firstParag->setParagLayout( *m_oldParagLayout );
}
#endif
return c;
}
KWTextDeleteCommand::KWTextDeleteCommand( KoTextDocument *d, int i, int idx, const QMemArray<KoTextStringChar> &str,
const CustomItemsMap & customItemsMap,
const QValueList<KoParagLayout> & oldParagLayouts )
:KoTextDeleteCommand(d, i, idx, str, customItemsMap, oldParagLayouts)
{
//createBookmarkList();
}
void KWTextDeleteCommand::createBookmarkList()
{
#if 0
KoTextParag *s = doc ? doc->paragAt( id ) : parag;
if ( !s ) {
qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParag()->paragId() );
return;
}
// Now restore the parag layouts (i.e. libkotext specific stuff)
QValueList<KoParagLayout>::Iterator lit = m_oldParagLayouts.begin();
kdDebug(32500) << "KWTextDeleteCommand::createBookmarkList " << m_oldParagLayouts.count() << " parag layouts. First parag=" << s->paragId() << endl;
Q_ASSERT( id == s->paragId() );
KoTextParag *p = s;
while ( p ) {
if ( lit != m_oldParagLayouts.end() )
{
kdDebug(32500) << "KWTextDeleteCommand::unexecute find bookmark in parag " << p->paragId() << endl;
//p->setParagLayout( *lit );
}
else
break;
p = p->next();
++lit;
}
#endif
}
KoTextCursor *KWTextDeleteCommand::execute( KoTextCursor *c )
{
return KoTextDeleteCommand::execute( c );
}
KoTextCursor *KWTextDeleteCommand::unexecute( KoTextCursor *c )
{
return KoTextDeleteCommand::unexecute( c );
}
////////////////////////// Frame commands ////////////////////////////////
FrameIndex::FrameIndex( KWFrame *frame )
{
m_pFrameSet=frame->frameSet();
m_iFrameIndex=m_pFrameSet->frameFromPtr(frame);
}
KWFrameBorderCommand::KWFrameBorderCommand( const QString &name, QPtrList<FrameIndex> &_listFrameIndex, QPtrList<FrameBorderTypeStruct> &_frameTypeBorder,const KoBorder & _newBorder):
KNamedCommand(name),
m_indexFrame(_listFrameIndex),
m_oldBorderFrameType(_frameTypeBorder),
m_newBorder( _newBorder)
{
}
KWFrameBorderCommand::~KWFrameBorderCommand()
{
m_indexFrame.setAutoDelete( true);
m_oldBorderFrameType.setAutoDelete( true);
}
void KWFrameBorderCommand::execute()
{
FrameIndex *tmp;
KWDocument *doc = 0L;
for ( tmp=m_indexFrame.first(); tmp != 0; tmp=m_indexFrame.next() )
{
KWFrameSet *frameSet =tmp->m_pFrameSet;
doc = frameSet->kWordDocument();
KWFrame *frame=frameSet->frame(tmp->m_iFrameIndex);
KWTableFrameSet::Cell *cell = dynamic_cast<KWTableFrameSet::Cell *>(frame->frameSet());
FrameBorderTypeStruct *tmpFrameStruct=m_oldBorderFrameType.at(m_indexFrame.find(tmp));
switch( tmpFrameStruct->m_EFrameType)
{
case KoBorder::LeftBorder:
if(cell) // is a table cell
cell->setLeftBorder(m_newBorder);
else
frame->setLeftBorder(m_newBorder);
break;
case KoBorder::RightBorder:
if(cell) // is a table cell
cell->setRightBorder(m_newBorder);
else
frame->setRightBorder(m_newBorder);
break;
case KoBorder::TopBorder:
if(cell) // is a table cell
cell->setTopBorder(m_newBorder);
else
frame->setTopBorder(m_newBorder);
break;
case KoBorder::BottomBorder:
if(cell) // is a table cell
cell->setBottomBorder(m_newBorder);
else
frame->setBottomBorder(m_newBorder);
break;
default:
break;
}
if (!cell) {
frame->frameBordersChanged();
//fixme frameBorderChanged for table cells here too ?
}
}
if ( doc )
{
doc->repaintAllViews();
}
}
void KWFrameBorderCommand::unexecute()
{
FrameIndex *tmp;
KWDocument *doc = 0L;
for ( tmp=m_indexFrame.first(); tmp != 0; tmp=m_indexFrame.next() )
{
KWFrameSet *frameSet =tmp->m_pFrameSet;
doc = frameSet->kWordDocument();
KWFrame *frame=frameSet->frame(tmp->m_iFrameIndex);
KWTableFrameSet::Cell *cell = dynamic_cast<KWTableFrameSet::Cell *>(frame->frameSet());
FrameBorderTypeStruct *tmpFrameStruct=m_oldBorderFrameType.at(m_indexFrame.find(tmp));
switch(tmpFrameStruct->m_EFrameType)
{
case KoBorder::LeftBorder:
if(cell) // is a table cell
cell->setLeftBorder(tmpFrameStruct->m_OldBorder);
else
frame->setLeftBorder(tmpFrameStruct->m_OldBorder);
break;
case KoBorder::RightBorder:
if(cell) // is a table cell
cell->setRightBorder(tmpFrameStruct->m_OldBorder);
else
frame->setRightBorder(tmpFrameStruct->m_OldBorder);
break;
case KoBorder::TopBorder:
if(cell) // is a table cell
cell->setTopBorder(tmpFrameStruct->m_OldBorder);
else
frame->setTopBorder(tmpFrameStruct->m_OldBorder);
break;
case KoBorder::BottomBorder:
if(cell) // is a table cell
cell->setBottomBorder(tmpFrameStruct->m_OldBorder);
else
frame->setBottomBorder(tmpFrameStruct->m_OldBorder);
break;
default:
break;
}
if (!cell) {
frame->frameBordersChanged();
//fixme frameBorderChanged for table cells here too ?
}
}
if ( doc )
{
//update frames
doc->repaintAllViews();
}
}
KWFrameBackGroundColorCommand::KWFrameBackGroundColorCommand( const QString &name, QPtrList<FrameIndex> &_listFrameIndex, QPtrList<QBrush> &_oldBrush,const QBrush & _newColor ):
KNamedCommand(name),
m_indexFrame(_listFrameIndex),
m_oldBackGroundColor(_oldBrush),
m_newColor( _newColor)
{
}
KWFrameBackGroundColorCommand::~KWFrameBackGroundColorCommand()
{
m_indexFrame.setAutoDelete(true);
m_oldBackGroundColor.setAutoDelete(true);
}
void KWFrameBackGroundColorCommand::execute()
{
FrameIndex *tmp;
KWDocument * doc = 0L;
for ( tmp=m_indexFrame.first(); tmp != 0; tmp=m_indexFrame.next() )
{
KWFrameSet *frameSet =tmp->m_pFrameSet;
if ( frameSet && (frameSet->type() != FT_PICTURE) && (frameSet->type() != FT_PART))
{
doc = frameSet->kWordDocument();
KWFrame *frame=frameSet->frame(tmp->m_iFrameIndex);
frame->setBackgroundColor(m_newColor);
}
}
//update frame
if ( doc )
doc->repaintAllViews();
}
void KWFrameBackGroundColorCommand::unexecute()
{
FrameIndex *tmp;
KWDocument * doc = 0L;
for ( tmp=m_indexFrame.first(); tmp != 0; tmp=m_indexFrame.next() )
{
KWFrameSet *frameSet =tmp->m_pFrameSet;
if ( frameSet && (frameSet->type() != FT_PICTURE) && (frameSet->type() != FT_PART) )
{
doc = frameSet->kWordDocument();
KWFrame *frame=frameSet->frame(tmp->m_iFrameIndex);
QBrush *tmpFrameStruct=m_oldBackGroundColor.at(m_indexFrame.find(tmp));
frame->setBackgroundColor(*tmpFrameStruct);
}
}
//update frames
if ( doc )
doc->repaintAllViews();
}
KWFrameStyleCommand::KWFrameStyleCommand( const QString &name, KWFrame *_frame, KWFrameStyle *_fs, bool _repaintViews ) :
KNamedCommand( name )
{
m_frame = _frame;
m_fs = _fs;
repaintViews = _repaintViews;
m_oldValues = new KWFrameStyle( "Old", m_frame );
}
void KWFrameStyleCommand::execute()
{
applyFrameStyle( m_fs);
}
void KWFrameStyleCommand::unexecute()
{
applyFrameStyle( m_oldValues);
}
void KWFrameStyleCommand::applyFrameStyle( KWFrameStyle * _sty )
{
if ( m_frame->frameSet() && (m_frame->frameSet()->type() != FT_PICTURE)&& (m_frame->frameSet()->type() != FT_PART))
m_frame->setBackgroundColor( _sty->backgroundColor() );
m_frame->setLeftBorder( _sty->leftBorder() );
m_frame->setRightBorder( _sty->rightBorder() );
m_frame->setTopBorder( _sty->topBorder() );
m_frame->setBottomBorder( _sty->bottomBorder() );
m_frame->frameBordersChanged();
if ( repaintViews )
m_frame->frameSet()->kWordDocument()->repaintAllViews();
}
KWTableStyleCommand::KWTableStyleCommand( const QString &name, KWFrame *_frame, KWTableStyle *_ts, bool _repaintViews ) :
KNamedCommand( name )
{
m_frame = _frame;
m_ts = _ts;
repaintViews = _repaintViews;
// No need for i18n because it will never be displayed.
m_fsc = new KWFrameStyleCommand( "Apply Framestyle to Frame", m_frame, m_ts->frameStyle(), repaintViews );
m_sc = 0L;
}
KWTableStyleCommand::~KWTableStyleCommand()
{
delete m_fsc;
delete m_sc;
}
void KWTableStyleCommand::execute()
{
if (m_fsc)
m_fsc->execute();
if ( (m_ts) && ( m_frame->frameSet()->type() == FT_TEXT ) && ( m_ts->paragraphStyle() ) )
{
KoTextObject *textObject = ((KWTextFrameSet*)m_frame->frameSet())->textObject();
textObject->textDocument()->selectAll( KoTextDocument::Temp );
m_sc = textObject->applyStyleCommand( 0L, m_ts->paragraphStyle(), KoTextDocument::Temp, KoParagLayout::All, KoTextFormat::Format, true, false );
textObject->textDocument()->removeSelection( KoTextDocument::Temp );
}
m_frame->frameBordersChanged();
if ( repaintViews )
m_frame->frameSet()->kWordDocument()->repaintAllViews();
}
void KWTableStyleCommand::unexecute()
{
if (m_fsc)
m_fsc->unexecute();
if (m_sc)
m_sc->unexecute();
m_frame->frameBordersChanged();
if ( repaintViews )
m_frame->frameSet()->kWordDocument()->repaintAllViews();
}
KWTableTemplateCommand::KWTableTemplateCommand( const QString &name, KWTableFrameSet *_table, KWTableTemplate *_tt ) :
KNamedCommand( name )
{
m_table = _table;
m_tt = _tt;
// No need for i18n because it will never be displayed.
m_tableCommands = new KMacroCommand( "Apply Tablestyles to Table" );
KWTableStyle *cell = 0L;
unsigned int rows = m_table->getRows();
unsigned int cols = m_table->getColumns();
for ( unsigned int i = 0; i < rows; i++ )
{
for ( unsigned int j = 0; j < cols; j++ )
{
if ( (i==0) && (j==0) ) // TOP LEFT CORNER
cell = m_tt->pTopLeftCorner();
else
if ( (i==0) && ( j==(cols-1) ) ) // TOP RIGHT CORNER
cell = m_tt->pTopRightCorner();
else
if ( ( i==(rows-1) ) && (j==0) ) // BOTTOM LEFT CORNER
cell = m_tt->pBottomLeftCorner();
else
if ( ( i==(rows-1) ) && ( j==(cols-1) ) ) // BOTTOM RIGHT CORNER
cell = m_tt->pBottomRightCorner();
else
if ( ( i==0 ) && ( j>0 ) && ( j<(cols-1) ) ) // FIRST ROW
cell = m_tt->pFirstRow();
else
if ( ( j==0 ) && ( i>0 ) && ( i<(rows-1) ) ) // FIRST COL
cell = m_tt->pFirstCol();
else
if ( ( i==(rows-1) ) && ( j>0 ) && ( j<(cols-1) ) ) // LAST ROW
cell = m_tt->pLastRow();
else
if ( ( j==(cols-1) ) && ( i>0 ) && ( i<(rows-1) ) ) // LAST COL
cell = m_tt->pLastCol();
else
if ( (i>0) && (j>0) && (i<(rows-1)) && (j<(cols-1)) ) // BODY
cell = m_tt->pBodyCell();
m_tableCommands->addCommand( new KWTableStyleCommand( "Apply tablestyle to cell", m_table->cell(i,j)->frame(0),cell, false ) );
}
}
}
KWTableTemplateCommand::~KWTableTemplateCommand()
{
delete m_tableCommands;
}
void KWTableTemplateCommand::execute()
{
m_tableCommands->execute();
m_table->kWordDocument()->repaintAllViews();
}
void KWTableTemplateCommand::unexecute()
{
m_tableCommands->unexecute();
m_table->kWordDocument()->repaintAllViews();
}
KWFrameResizeCommand::KWFrameResizeCommand(const QString &name, const QValueList<FrameIndex> &frameIndex, const QValueList<FrameResizeStruct> &frameResize )
: KNamedCommand(name), m_indexFrame(frameIndex), m_frameResize(frameResize) {
Q_ASSERT(m_indexFrame.count() == m_frameResize.count());
}
KWFrameResizeCommand::KWFrameResizeCommand(const QString &name, FrameIndex frameIndex, const FrameResizeStruct &frameResize )
: KNamedCommand(name) {
m_indexFrame.append(frameIndex);
m_frameResize.append(frameResize);
}
void KWFrameResizeCommand::execute()
{
QValueList<FrameResizeStruct>::Iterator resizeIter = m_frameResize.begin();
QValueList<FrameIndex>::Iterator iter = m_indexFrame.begin();
for(; iter != m_indexFrame.end() && resizeIter != m_frameResize.end(); ++resizeIter, ++iter ) {
FrameIndex index = *iter;
FrameResizeStruct frs = *resizeIter;
KWFrameSet *frameSet = index.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame(index.m_iFrameIndex);
Q_ASSERT( frame );
frame->setCoords(frs.newRect.left(),frs.newRect.top(),frs.newRect.right(),frs.newRect.bottom());
frame->setMinimumFrameHeight(frs.newMinHeight);
KWTableFrameSet *table = frameSet->groupmanager();
if (table) {
KWTableFrameSet::Cell *cell=dynamic_cast<KWTableFrameSet::Cell *>(frameSet);
if(cell) {
table->recalcCols(cell->firstColumn(), cell->firstRow());
table->recalcRows(cell->firstColumn(), cell->firstRow());
}
else {
table->recalcCols(0, 0);
table->recalcRows(0, 0);
}
}
KWDocument * doc = frameSet->kWordDocument();
if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY ) // header/footer/footnote
doc->recalcFrames();
//update frames
doc->frameChanged( frame );
}
}
void KWFrameResizeCommand::unexecute()
{
QValueList<FrameResizeStruct>::Iterator resizeIter = m_frameResize.begin();
QValueList<FrameIndex>::Iterator iter = m_indexFrame.begin();
for(; iter != m_indexFrame.end() && resizeIter != m_frameResize.end(); ++resizeIter, ++iter ) {
FrameIndex index = *iter;
FrameResizeStruct frs = *resizeIter;
KWFrameSet *frameSet =index.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame=frameSet->frame(index.m_iFrameIndex);
Q_ASSERT( frame );
frame->setCoords(frs.oldRect.left(),frs.oldRect.top(),frs.oldRect.right(),frs.oldRect.bottom());
frame->setMinimumFrameHeight(frs.oldMinHeight);
KWTableFrameSet *table = frameSet->groupmanager();
if (table) {
KWTableFrameSet::Cell *cell=dynamic_cast<KWTableFrameSet::Cell *>(frameSet);
if(cell) {
table->recalcCols(cell->firstColumn(), cell->firstRow());
table->recalcRows(cell->firstColumn(), cell->firstRow());
}
else {
table->recalcCols(0, 0);
table->recalcRows(0, 0);
}
}
KWDocument * doc = frameSet->kWordDocument();
if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY ) // header/footer/footnote
doc->recalcFrames();
frame->updateRulerHandles();
//update frames
doc->frameChanged( frame );
}
}
KWFrameChangePictureCommand::KWFrameChangePictureCommand( const QString &name, FrameIndex _frameIndex, const KoPictureKey & _oldKey, const KoPictureKey & _newKey ) :
KNamedCommand(name),
m_indexFrame(_frameIndex),
m_oldKey(_oldKey),
m_newKey(_newKey)
{
}
void KWFrameChangePictureCommand::execute()
{
KWFrameSet *frameSet = m_indexFrame.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame(m_indexFrame.m_iFrameIndex);
Q_ASSERT( frame );
KWDocument * doc = frameSet->kWordDocument();
KWPictureFrameSet *frameset = static_cast<KWPictureFrameSet *>(frame->frameSet());
frameset->reloadPicture( m_newKey );
frameSet->kWordDocument()->refreshDocStructure( frameSet->type() );
doc->frameChanged( frame );
}
void KWFrameChangePictureCommand::unexecute()
{
KWFrameSet *frameSet =m_indexFrame.m_pFrameSet;
KWFrame *frame=frameSet->frame(m_indexFrame.m_iFrameIndex);
KWDocument * doc = frameSet->kWordDocument();
KWPictureFrameSet *frameset = static_cast<KWPictureFrameSet *>(frame->frameSet());
frameset->reloadPicture( m_oldKey );
frameSet->kWordDocument()->refreshDocStructure( frameSet->type() );
doc->frameChanged( frame );
}
KWFramePartMoveCommand::KWFramePartMoveCommand( const QString &name, FrameIndex _frameIndex, FrameResizeStruct _frameMove ) :
KNamedCommand(name),
m_indexFrame(_frameIndex),
m_frameMove(_frameMove)
{
}
void KWFramePartMoveCommand::execute()
{
KWFrameSet *frameSet = m_indexFrame.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame(m_indexFrame.m_iFrameIndex);
Q_ASSERT( frame );
frame->setCoords(m_frameMove.newRect.left(),m_frameMove.newRect.top(),m_frameMove.newRect.right(),m_frameMove.newRect.bottom());
KWDocument * doc = frameSet->kWordDocument();
frame->updateRulerHandles();
doc->frameChanged( frame );
}
void KWFramePartMoveCommand::unexecute()
{
KWFrameSet *frameSet =m_indexFrame.m_pFrameSet;
KWFrame *frame=frameSet->frame(m_indexFrame.m_iFrameIndex);
frame->setCoords(m_frameMove.oldRect.left(),m_frameMove.oldRect.top(),m_frameMove.oldRect.right(),m_frameMove.oldRect.bottom());
KWDocument * doc = frameSet->kWordDocument();
frame->updateRulerHandles();
//update frames
doc->frameChanged( frame );
}
bool KWFramePartMoveCommand::frameMoved()
{
return (m_frameMove.oldRect!=m_frameMove.newRect);
}
KWFramePartInternalCommand::KWFramePartInternalCommand( const QString &name, KWPartFrameSet *part ) :
KNamedCommand(name),
m_part(part)
{
m_url = m_part->getChild()->document()->url();
}
void KWFramePartInternalCommand::execute()
{
m_part->getChild()->document()->setStoreInternal(true);
}
void KWFramePartInternalCommand::unexecute()
{
m_part->getChild()->document()->setStoreInternal(false);
m_part->getChild()->document()->setURL( m_url );
}
KWFramePartExternalCommand::KWFramePartExternalCommand( const QString &name, KWPartFrameSet *part ) :
KNamedCommand(name),
m_part(part)
{
}
void KWFramePartExternalCommand::execute()
{
m_part->getChild()->document()->setStoreInternal(false);
}
void KWFramePartExternalCommand::unexecute()
{
m_part->getChild()->document()->setStoreInternal(true);
}
KWFrameMoveCommand::KWFrameMoveCommand( const QString &name,
const QValueList<FrameIndex> & _frameIndex,
const QValueList<FrameMoveStruct> & _frameMove ) :
KNamedCommand(name),
m_indexFrame(_frameIndex),
m_frameMove(_frameMove)
{
}
void KWFrameMoveCommand::execute()
{
bool needRelayout = false;
KWDocument * doc = 0L;
QValueList<FrameMoveStruct>::Iterator moveIt = m_frameMove.begin();
QValueList<FrameIndex>::Iterator tmp = m_indexFrame.begin();
for( ; tmp != m_indexFrame.end() && moveIt != m_frameMove.end(); ++tmp, ++moveIt )
{
KWFrameSet *frameSet = (*tmp).m_pFrameSet;
doc = frameSet->kWordDocument();
KWFrame *frame = frameSet->frame((*tmp).m_iFrameIndex);
frame->moveTopLeft( (*moveIt).newPos );
frame->updateRulerHandles();
needRelayout = needRelayout || ( frame->runAround() != KWFrame::RA_NO );
}
if ( doc )
{
doc->updateAllFrames();
if ( needRelayout )
doc->layout();
doc->updateRulerFrameStartEnd();
doc->repaintAllViews();
}
}
void KWFrameMoveCommand::unexecute()
{
bool needRelayout = false;
KWDocument * doc = 0L;
QValueList<FrameMoveStruct>::Iterator moveIt = m_frameMove.begin();
QValueList<FrameIndex>::Iterator tmp = m_indexFrame.begin();
for( ; tmp != m_indexFrame.end() && moveIt != m_frameMove.end(); ++tmp, ++moveIt )
{
KWFrameSet *frameSet = (*tmp).m_pFrameSet;
doc = frameSet->kWordDocument();
KWFrame *frame = frameSet->frame((*tmp).m_iFrameIndex);
frame->moveTopLeft( (*moveIt).oldPos );
frame->updateRulerHandles();
needRelayout = needRelayout || ( frame->runAround() != KWFrame::RA_NO );
}
if ( doc )
{
doc->updateAllFrames();
if ( needRelayout )
doc->layout();
doc->updateRulerFrameStartEnd();
doc->repaintAllViews();
}
}
KWFramePropertiesCommand::KWFramePropertiesCommand( const QString &name, KWFrame *_frameBefore, KWFrame *_frameAfter ) :
KNamedCommand(name),
m_frameIndex( _frameAfter ),
m_frameBefore(_frameBefore),
m_frameAfter(_frameAfter->getCopy())
{
}
KWFramePropertiesCommand::~KWFramePropertiesCommand()
{
delete m_frameBefore;
delete m_frameAfter;
}
void KWFramePropertiesCommand::execute()
{
kdDebug(32001) << "KWFrameChangeParamCommand::execute" << endl;
KWFrameSet *frameSet = m_frameIndex.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame( m_frameIndex.m_iFrameIndex );
Q_ASSERT( frame );
frame->copySettings(m_frameAfter);
frame->frameStack()->update();
KWDocument * doc = frameSet->kWordDocument();
if(doc)
{
doc->frameChanged( frame );
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
doc->updateRulerFrameStartEnd();
}
}
void KWFramePropertiesCommand::unexecute()
{
kdDebug(32001) << "KWFrameChangeParamCommand::unexecute" << endl;
KWFrameSet *frameSet = m_frameIndex.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame( m_frameIndex.m_iFrameIndex );
Q_ASSERT( frame );
frame->copySettings(m_frameBefore);
frame->frameStack()->update();
KWDocument * doc = frameSet->kWordDocument();
if(doc)
{
doc->frameChanged( frame );
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
doc->updateRulerFrameStartEnd();
}
}
KWFrameSetInlineCommand::KWFrameSetInlineCommand( const QString &name, KWFrameSet *frameset, bool value ) :
KNamedCommand(name),
m_pFrameSet( frameset ),
m_value( value )
{
m_oldValue = m_pFrameSet->isFloating();
}
void KWFrameSetInlineCommand::setValue( bool value )
{
kdDebug(32001) << "KWFrameSetInlineCommand::execute" << endl;
if ( value )
{
// Make frame(set) floating
m_pFrameSet->setFloating();
// ## We might want to store a list of anchors in the command, and reuse them
// in execute/unexecute. Currently setFixed forgets the anchors and setFloating recreates new ones...
}
else
{
// Make frame(set) non-floating
m_pFrameSet->setFixed();
}
m_pFrameSet->kWordDocument()->updateAllFrames();
}
void KWFrameSetInlineCommand::execute()
{
setValue( m_value );
}
void KWFrameSetInlineCommand::unexecute()
{
setValue( m_oldValue );
}
KWPageLayoutCommand::KWPageLayoutCommand( const QString &name,KWDocument *_doc,KWPageLayoutStruct &_oldLayout, KWPageLayoutStruct &_newLayout ) :
KNamedCommand(name),
m_pDoc(_doc),
m_oldLayout(_oldLayout),
m_newLayout(_newLayout)
{
}
void KWPageLayoutCommand::execute()
{
m_pDoc->setPageLayout( m_newLayout._pgLayout, m_newLayout._cl, m_newLayout._hf );
}
void KWPageLayoutCommand::unexecute()
{
m_pDoc->setPageLayout( m_oldLayout._pgLayout, m_oldLayout._cl, m_oldLayout._hf);
}
KWDeleteFrameCommand::KWDeleteFrameCommand( const QString &name, KWFrame * frame ):
KNamedCommand(name),
m_frameIndex( frame ),
m_copyFrame( frame->getCopy() )
{
}
KWDeleteFrameCommand::KWDeleteFrameCommand( const FrameIndex &frameIndex) :
KNamedCommand("")
{
m_frameIndex = frameIndex;
m_copyFrame = m_frameIndex.m_pFrameSet->frame(m_frameIndex.m_iFrameIndex)->getCopy();
}
KWDeleteFrameCommand::~KWDeleteFrameCommand()
{
delete m_copyFrame;
}
void KWDeleteFrameCommand::execute()
{
KWFrameSet *frameSet = m_frameIndex.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame( m_frameIndex.m_iFrameIndex );
Q_ASSERT( frame );
kdDebug() << "delete frame " << m_frameIndex.m_iFrameIndex << " of " << frameSet->name() << endl;
KWDocument* doc = frameSet->kWordDocument();
doc->terminateEditing( frameSet );
doc->frameChanged( frame );
frameSet->deleteFrame( m_frameIndex.m_iFrameIndex );
/* KWTextFrameSet * textfs = dynamic_cast<KWTextFrameSet *>(fs);
if(textfs) { TODO
// if content does not fit; change properties of previous frame to be 'do not show'
}
*/
doc->refreshDocStructure( frameSet->type() );
doc->updateTextFrameSetEdit();
}
void KWDeleteFrameCommand::unexecute()
{
KWFrameSet *frameSet = m_frameIndex.m_pFrameSet;
KWFrame * frame = m_copyFrame->getCopy();
frame->setFrameSet( frameSet );
frameSet->addFrame( frame );
KWPartFrameSet * partfs = dynamic_cast<KWPartFrameSet *>( frameSet );
if ( partfs )
partfs->setDeleted( false );
KWTextFrameSet * textfs = dynamic_cast<KWTextFrameSet *>( frameSet );
if ( textfs )
textfs->textObject()->formatMore( 2 );
KWDocument* doc = frameSet->kWordDocument();
doc->frameChanged( frame );
// could have been the last frame on a page, so undeleting it needs to recreate the page
doc->recalcFrames( frame->pageNumber() );
doc->refreshDocStructure(frameSet->type());
doc->updateRulerFrameStartEnd();
}
KWCreateFrameCommand::KWCreateFrameCommand( const QString &name, KWFrame * frame ) :
KWDeleteFrameCommand( name, frame )
{}
KWUngroupTableCommand::KWUngroupTableCommand( const QString &name, KWTableFrameSet * _table ):
KNamedCommand(name),
m_pTable(_table)
{
m_ListFrame.clear();
for ( KWTableFrameSet::TableIter i(m_pTable); i ; ++i ) {
m_ListFrame.append( i.current() );
}
}
void KWUngroupTableCommand::execute()
{
KWDocument * doc = m_pTable->kWordDocument();
for ( KWTableFrameSet::TableIter i(m_pTable) ; i ; ++i ) {
i->setGroupManager( 0L );
doc->addFrameSet( i.current() );
}
m_pTable->ungroup();
doc->removeFrameSet(m_pTable);
//when you ungroup a table
// you must remove table item in docstruct
// create items in text item in docstruct
int refresh=0;
refresh |=Tables;
refresh |=TextFrames;
doc->refreshDocStructure(refresh);
doc->updateAllFrames();
doc->repaintAllViews();
}
void KWUngroupTableCommand::unexecute()
{
Q_ASSERT(m_pTable);
m_pTable->group();
KWDocument * doc = m_pTable->kWordDocument();
KWFrameSet *tmp;
for ( tmp=m_ListFrame.first(); tmp != 0; tmp=m_ListFrame.next() )
{
tmp->setGroupManager(m_pTable);
doc->removeFrameSet(tmp);
KWTableFrameSet::Cell *cell=static_cast<KWTableFrameSet::Cell *>(tmp);
Q_ASSERT(cell);
m_pTable->addCell( cell );
}
doc->addFrameSet(m_pTable);
int refresh=0;
refresh |=Tables;
refresh |=TextFrames;
doc->refreshDocStructure(refresh);
doc->updateAllFrames();
doc->repaintAllViews();
}
KWDeleteTableCommand::KWDeleteTableCommand( const QString &name, KWTableFrameSet * _table ):
KNamedCommand(name),
m_pTable(_table)
{
Q_ASSERT(m_pTable);
}
void KWDeleteTableCommand::execute()
{
kdDebug(32001) << "KWDeleteTableCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->removeFrameSet(m_pTable);
m_pTable->setVisible( false );
doc->refreshDocStructure((int)Tables);
doc->updateAllFrames();
m_pTable->updateFrames(); // not in the doc list anymore, so the above call didn't do it!
doc->layout();
doc->repaintAllViews();
doc->updateRulerFrameStartEnd();
}
void KWDeleteTableCommand::unexecute()
{
kdDebug(32001) << "KWDeleteTableCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
m_pTable->setVisible( true );
doc->addFrameSet(m_pTable);
doc->refreshDocStructure((int)Tables);
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
doc->updateRulerFrameStartEnd();
}
KWInsertColumnCommand::KWInsertColumnCommand( const QString &name, KWTableFrameSet * _table, int _col, double _maxRight ):
KNamedCommand(name),
m_pTable(_table),
m_rc(new RemovedColumn()),
m_colPos(_col),
m_maxRight(_maxRight),
m_oldWidth(0)
{
Q_ASSERT(m_pTable);
}
KWInsertColumnCommand::~KWInsertColumnCommand()
{
delete m_rc;
}
void KWInsertColumnCommand::execute()
{
kdDebug(32001) << "KWInsertColumnCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
// a insert column = KWTableFrameSet::m_sDefaultColWidth, see kwtableframeset.cc
if (m_pTable->boundingRect().right() + KWTableFrameSet::m_sDefaultColWidth >= static_cast<int>(m_maxRight))
{ // must create space (resize the table)
m_oldWidth = m_pTable->boundingRect().width();
// here we calculate the new table size for a table that would take the
// entire width of the page, which what the user wants 99% of the time.
double newTableWidth =m_maxRight - m_pTable->boundingRect().left();
double newColSize = newTableWidth / (m_pTable->getColumns()+1);
double resizeTableWidth = m_maxRight - m_pTable->boundingRect().left();
m_pTable->resizeWidth(resizeTableWidth - newColSize);
m_pTable->insertNewColumn(m_colPos, newColSize);
}
else
{ // simply insert the column without asking for a specific size :
m_pTable->insertNewColumn(m_colPos);
}
Q_ASSERT(m_pTable->boundingRect().right() <= m_maxRight);
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
}
void KWInsertColumnCommand::unexecute()
{
kdDebug(32001) << "KWInsertColumnCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->deleteColumn(m_colPos, *m_rc);
// now undo the resize of the table if necessary:
if (m_oldWidth) {
// yes, the table was resized, let's undo that :
m_pTable->resizeWidth(m_oldWidth);
}
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
}
KWInsertRowCommand::KWInsertRowCommand( const QString &name, KWTableFrameSet * _table, int _row ):
KNamedCommand(name),
m_pTable(_table),
m_rr(new RemovedRow()),
m_rowPos(_row),
m_inserted(false)
{
Q_ASSERT(m_pTable);
}
KWInsertRowCommand::~KWInsertRowCommand()
{
delete m_rr;
}
void KWInsertRowCommand::execute()
{
kdDebug(32001) << "KWInsertRowCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
if(m_inserted)
m_pTable->reInsertRow(*m_rr);
else {
m_inserted = true;
m_pTable->insertNewRow(m_rowPos); //only happens the first time
}
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
}
void KWInsertRowCommand::unexecute()
{
kdDebug(32001) << "KWInsertRowCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->deleteRow( m_rowPos, *m_rr);
doc->updateAllFrames();
doc->layout();
}
KWRemoveRowCommand::KWRemoveRowCommand( const QString &name, KWTableFrameSet * _table, int _row ):
KNamedCommand(name),
m_pTable(_table),
m_rr(new RemovedRow()),
m_rowPos(_row)
{
Q_ASSERT(m_pTable);
}
KWRemoveRowCommand::~KWRemoveRowCommand()
{
delete m_rr;
}
void KWRemoveRowCommand::execute()
{
kdDebug(32001) << "KWRemoveRowCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->deleteRow( m_rowPos, *m_rr);
doc->updateAllFrames();
doc->layout();
}
void KWRemoveRowCommand::unexecute()
{
kdDebug(32001) << "KWRemoveRowCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
m_pTable->reInsertRow(*m_rr);
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
}
KWRemoveColumnCommand::KWRemoveColumnCommand( const QString &name, KWTableFrameSet * _table, int _col ):
KNamedCommand(name),
m_pTable(_table),
m_rc(new RemovedColumn()),
m_colPos(_col)
{
Q_ASSERT(m_pTable);
}
KWRemoveColumnCommand::~KWRemoveColumnCommand()
{
delete m_rc;
}
void KWRemoveColumnCommand::execute()
{
kdDebug(32001) << "KWRemoveColumnCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->deleteColumn( m_colPos, *m_rc);
doc->updateAllFrames();
doc->layout();
}
void KWRemoveColumnCommand::unexecute()
{
kdDebug(32001) << "KWRemoveColumnCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
m_pTable->reInsertColumn(*m_rc);
doc->updateAllFrames();
doc->layout();
doc->repaintAllViews();
}
KWSplitCellCommand::KWSplitCellCommand( const QString &name, KWTableFrameSet * _table,unsigned int colBegin,unsigned int rowBegin, unsigned int colEnd,unsigned int rowEnd ):
KNamedCommand(name),
m_pTable(_table),
m_colBegin(colBegin),
m_rowBegin(rowBegin),
m_colEnd(colEnd),
m_rowEnd(rowEnd)
{
Q_ASSERT(m_pTable);
}
void KWSplitCellCommand::execute()
{
kdDebug(32001) << "KWSplitCellCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
//kdDebug()<<"split Cell m_colBegin :"<<m_colBegin<<" m_colEnd :"<<m_colEnd<<" m_rowBegin :"<<m_rowBegin<<" m_colEnd :"<<m_colEnd<<endl;
m_pTable->splitCell(m_rowEnd, m_colEnd,m_colBegin,m_rowBegin,m_ListFrameSet);
doc->updateAllFrames();
doc->layout();
}
void KWSplitCellCommand::unexecute()
{
kdDebug(32001) << "KWSplitCellCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
//kdDebug()<<"Join Cell m_colBegin :"<<m_colBegin<<" m_colEnd :"<<m_colBegin+m_colEnd-1<<" m_rowBegin :"<<m_rowBegin<<" m_rowEnd :"<<m_rowBegin+m_rowEnd-1<<endl;
if(m_ListFrameSet.isEmpty())
{
for ( unsigned int i = 0; i < m_pTable->getColumns(); i++ )
{
for ( unsigned int j = 0; j < m_pTable->getRows(); j++ )
{
if(j>=m_rowBegin && j<=(m_rowBegin+m_rowEnd-1)
&& i>=m_colBegin && i<=(m_colEnd+m_colBegin-1))
{
//don't store first cell
if( !(j==m_rowBegin && i==m_colBegin))
{
kdDebug(32001)<<"store cell row :"<<j<<" col :"<<i<<endl;
KWTableFrameSet::Cell *cell=static_cast<KWTableFrameSet::Cell *>(m_pTable->cell( j,i ));
m_ListFrameSet.append(cell);
}
}
}
}
}
KWTableFrameSet::Cell *cell=static_cast<KWTableFrameSet::Cell *>(m_pTable->cell( m_rowBegin,m_colBegin ));
m_pTable->joinCells(m_colBegin, m_rowBegin, m_colEnd+m_colBegin-1+cell->columnSpan()-1,
m_rowBegin+m_rowEnd-1+cell->rowSpan()-1);
doc->updateAllFrames();
doc->layout();
}
KWJoinCellCommand::KWJoinCellCommand( const QString &name, KWTableFrameSet * _table,unsigned int colBegin,unsigned int rowBegin, unsigned int colEnd,unsigned int rowEnd, QPtrList<KWFrameSet> listFrameSet,QPtrList<KWFrame> listCopyFrame):
KNamedCommand(name),
m_pTable(_table),
m_colBegin(colBegin),
m_rowBegin(rowBegin),
m_colEnd(colEnd),
m_rowEnd(rowEnd),
m_ListFrameSet(listFrameSet),
m_copyFrame(listCopyFrame)
{
Q_ASSERT(m_pTable);
}
KWJoinCellCommand::~KWJoinCellCommand()
{
m_copyFrame.setAutoDelete( true );
}
void KWJoinCellCommand::execute()
{
kdDebug(32001) << "KWJoinCellCommand::execute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->joinCells(m_colBegin,m_rowBegin,m_colEnd,m_rowEnd);
doc->updateAllFrames();
doc->layout();
}
void KWJoinCellCommand::unexecute()
{
kdDebug(32001) << "KWJoinCellCommand::unexecute" << endl;
KWDocument * doc = m_pTable->kWordDocument();
doc->terminateEditing(m_pTable);
m_pTable->splitCell(m_rowEnd-m_rowBegin+1, m_colEnd-m_colBegin+1,m_colBegin,m_rowBegin,m_ListFrameSet,m_copyFrame);
doc->updateAllFrames();
doc->layout();
}
KWChangeStartingPageCommand::KWChangeStartingPageCommand( const QString &name, KWDocument *_doc, int _oldStartingPage, int _newStartingPage):
KNamedCommand(name),
m_doc(_doc),
oldStartingPage(_oldStartingPage),
newStartingPage(_newStartingPage)
{
}
void KWChangeStartingPageCommand::execute()
{
m_doc->variableCollection()->variableSetting()->setStartingPageNumber(newStartingPage);
m_doc->recalcVariables( VT_PGNUM );
}
void KWChangeStartingPageCommand::unexecute()
{
m_doc->variableCollection()->variableSetting()->setStartingPageNumber(oldStartingPage);
m_doc->recalcVariables( VT_PGNUM );
}
KWChangeVariableSettingsCommand::KWChangeVariableSettingsCommand( const QString &name, KWDocument *_doc, bool _oldValue, bool _newValue, VariableProperties _type):
KNamedCommand(name),
m_doc(_doc),
type(_type),
m_bOldValue(_oldValue),
m_bNewValue(_newValue)
{
}
void KWChangeVariableSettingsCommand::changeValue( bool b )
{
switch(type)
{
case VS_DISPLAYLINK:
m_doc->variableCollection()->variableSetting()->setDisplayLink(b);
m_doc->recalcVariables( VT_LINK );
break;
case VS_UNDERLINELINK:
m_doc->variableCollection()->variableSetting()->setUnderlineLink(b);
m_doc->recalcVariables( VT_LINK );
break;
case VS_DISPLAYCOMMENT:
m_doc->variableCollection()->variableSetting()->setDisplayComment(b);
m_doc->recalcVariables( VT_NOTE );
break;
case VS_DISPLAYFIELDCODE:
m_doc->variableCollection()->variableSetting()->setDisplayFieldCode(b);
//hack necessary otherwise footnote frameset is not refreshing
//and footnote is not resize.
m_doc->displayFootNoteFieldCode();
m_doc->recalcVariables( VT_ALL );
break;
}
}
void KWChangeVariableSettingsCommand::execute()
{
changeValue(m_bNewValue);
}
void KWChangeVariableSettingsCommand::unexecute()
{
changeValue(m_bOldValue);
}
KWChangeCustomVariableValue::KWChangeCustomVariableValue( const QString &name, KWDocument *_doc,const QString & _oldValue, const QString & _newValue,KoCustomVariable *var):
KNamedCommand(name),
m_doc(_doc),
newValue(_newValue),
oldValue(_oldValue),
m_var(var)
{
}
KWChangeCustomVariableValue::~KWChangeCustomVariableValue()
{
}
void KWChangeCustomVariableValue::execute()
{
Q_ASSERT(m_var);
m_var->setValue(newValue);
m_doc->recalcVariables( VT_CUSTOM );
}
void KWChangeCustomVariableValue::unexecute()
{
Q_ASSERT(m_var);
m_var->setValue(oldValue);
m_doc->recalcVariables( VT_CUSTOM );
}
KWChangeVariableNoteText::KWChangeVariableNoteText( const QString &name, KWDocument *_doc,
const QString &_oldValue,const QString &_newValue,
KoNoteVariable *var):
KNamedCommand(name),
m_doc(_doc),
newValue(_newValue),
oldValue(_oldValue),
m_var(var)
{
}
KWChangeVariableNoteText::~KWChangeVariableNoteText()
{
}
void KWChangeVariableNoteText::execute()
{
Q_ASSERT(m_var);
m_var->setNote(newValue);
}
void KWChangeVariableNoteText::unexecute()
{
Q_ASSERT(m_var);
m_var->setNote(oldValue);
}
// TODO: move to libkotext to remove code duplication with kpresenter
KWChangeLinkVariable::KWChangeLinkVariable( const QString &name, KWDocument *_doc,const QString & _oldHref, const QString & _newHref, const QString & _oldLink,const QString &_newLink, KoLinkVariable *var):
KNamedCommand(name),
m_doc(_doc),
oldHref(_oldHref),
newHref(_newHref),
oldLink(_oldLink),
newLink(_newLink),
m_var(var)
{
}
void KWChangeLinkVariable::execute()
{
m_var->setLink(newLink,newHref);
m_doc->recalcVariables(VT_LINK);
}
void KWChangeLinkVariable::unexecute()
{
m_var->setLink(oldLink,oldHref);
m_doc->recalcVariables(VT_LINK);
}
KWHideShowHeader::KWHideShowHeader( const QString &name, KWDocument *_doc, bool _newValue):
KNamedCommand(name),
m_doc(_doc),
newValue(_newValue)
{
}
void KWHideShowHeader::execute()
{
m_doc->setHeaderVisible(newValue );
m_doc->updateHeaderButton();
}
void KWHideShowHeader::unexecute()
{
m_doc->setHeaderVisible(!newValue );
m_doc->updateHeaderButton();
}
KWHideShowFooter::KWHideShowFooter( const QString &name, KWDocument *_doc, bool _newValue):
KNamedCommand(name),
m_doc(_doc),
newValue(_newValue)
{
}
void KWHideShowFooter::execute()
{
m_doc->setFooterVisible( newValue );
m_doc->updateFooterButton();
}
void KWHideShowFooter::unexecute()
{
m_doc->setFooterVisible( !newValue );
m_doc->updateFooterButton();
}
KWProtectContentCommand::KWProtectContentCommand( const QString &name, KWTextFrameSet*frameset, bool _protect):
KNamedCommand(name),
m_pFrameSet(frameset),
m_bProtect(_protect)
{
}
void KWProtectContentCommand::execute()
{
m_pFrameSet->setProtectContent(m_bProtect);
m_pFrameSet->kWordDocument()->updateTextFrameSetEdit();
m_pFrameSet->kWordDocument()->testAndCloseAllFrameSetProtectedContent();
m_pFrameSet->kWordDocument()->updateRulerInProtectContentMode();
}
void KWProtectContentCommand::unexecute()
{
m_pFrameSet->setProtectContent(!m_bProtect);
m_pFrameSet->kWordDocument()->updateTextFrameSetEdit();
m_pFrameSet->kWordDocument()->testAndCloseAllFrameSetProtectedContent();
m_pFrameSet->kWordDocument()->updateRulerInProtectContentMode();
}
KWInsertRemovePageCommand::KWInsertRemovePageCommand( KWDocument *_doc, Command cmd, int pgNum)
: KCommand(), m_doc(_doc), m_cmd(cmd), m_pgNum(pgNum)
{}
KWInsertRemovePageCommand::~KWInsertRemovePageCommand() {
QValueListIterator<KCommand*> cmdIter = childCommands.begin();
for(;cmdIter != childCommands.end(); ++ cmdIter)
delete (*cmdIter);
}
QString KWInsertRemovePageCommand::name() const
{
return m_cmd == Insert ? i18n("Insert Page") // problem with after/before page
: i18n("Delete Page %1").arg(m_pgNum);
}
void KWInsertRemovePageCommand::execute() {
if ( m_cmd == Insert )
doInsert(m_pgNum);
else
doRemove(m_pgNum);
}
void KWInsertRemovePageCommand::unexecute() {
if ( m_cmd == Insert )
// remove the page that was inserted
doRemove(m_pgNum+1);
else
// Re-insert the page that was deleted
doInsert(m_pgNum-1);
}
void KWInsertRemovePageCommand::doRemove(int pageNumber) {
bool firstRun = childCommands.count() == 0;
if(firstRun) {
QValueVector<FrameIndex> indexes;
QPtrList<KWFrame> frames = m_doc->framesInPage(pageNumber, false);
QPtrListIterator<KWFrame> framesIter(frames);
for(; framesIter.current(); ++framesIter)
indexes.append(FrameIndex(*framesIter));
// we sort them to make sure frames are deleted in order and indexes are not going
// to get mixed up when there is more then one frame of a frameset on the page
std::sort(indexes.begin(), indexes.end(), compareIndex);
QValueVector<FrameIndex>::iterator iter = indexes.begin();
for(; iter != indexes.end(); ++iter)
childCommands.append(new KWDeleteFrameCommand(*iter));
}
QValueListIterator<KCommand*> cmdIter = childCommands.begin();
for(;cmdIter != childCommands.end(); ++ cmdIter)
(*cmdIter)->execute();
// next move all frames up that are on higher pagenumbers
KWPage* page = m_doc->pageManager()->page(pageNumber);
Q_ASSERT(page);
if(! page) return; // hack to work around bug #125998
const double pageHeight = page->height();
const double topOfPage = m_doc->pageManager()->topOfPage(pageNumber);
m_doc->pageManager()->removePage( pageNumber );
if(firstRun && m_doc->lastPage() >= pageNumber) { // only walk frames when there was a page
// after the deleted one
QValueList<FrameIndex> indexes;
QValueList<FrameMoveStruct> moveStructs;
QPtrListIterator<KWFrameSet> fss = m_doc->framesetsIterator();
for(;fss.current(); ++fss) {
KWFrameSet *fs = *fss;
if(fs->isMainFrameset()) continue;
if(fs->isHeaderOrFooter()) continue;
if(fs->isFootEndNote()) continue;
if(! fs->isVisible()) continue;
QPtrList<KWFrame> frames = fs->frameIterator();
QPtrListIterator<KWFrame> framesIter(frames);
for(; framesIter.current(); ++framesIter) {
KWFrame *frame = *framesIter;
if(frame->top() > topOfPage) {
indexes.append(FrameIndex(frame));
KoPoint before = frame->topLeft();
frame->moveBy(0, -pageHeight);
moveStructs.append(FrameMoveStruct(before, frame->topLeft()));
}
}
}
KCommand *cmd = new KWFrameMoveCommand("", indexes, moveStructs);
childCommands.append(cmd);
}
m_doc->afterRemovePages();
}
bool KWInsertRemovePageCommand::compareIndex(const FrameIndex &index1, const FrameIndex &index2) {
if(index1.m_pFrameSet == index2.m_pFrameSet)
return index1.m_iFrameIndex >= index2.m_iFrameIndex;
return index1.m_pFrameSet >= index2.m_pFrameSet; // I don't care about frameset order,
// so just sort on pointers..
}
void KWInsertRemovePageCommand::doInsert(int pageNumber) {
m_doc->pageManager()->insertPage( pageNumber );
for(int i=childCommands.count()-1; i > 0; i--) // reverse order
childCommands[i]->unexecute();
m_doc->afterInsertPage( pageNumber );
}
FramePaddingStruct::FramePaddingStruct( KWFrame *frame )
{
topPadding = frame->paddingTop();
bottomPadding= frame->paddingBottom();
leftPadding = frame->paddingLeft();
rightPadding= frame->paddingRight();
}
FramePaddingStruct::FramePaddingStruct( double _left, double _top, double _right, double _bottom ):
topPadding(_top),
bottomPadding(_bottom),
leftPadding(_left),
rightPadding(_right)
{
}
KWFrameChangeFramePaddingCommand::KWFrameChangeFramePaddingCommand( const QString &name, FrameIndex _frameIndex, FramePaddingStruct _framePaddingBegin, FramePaddingStruct _framePaddingEnd ) :
KNamedCommand(name),
m_indexFrame(_frameIndex),
m_framePaddingBegin(_framePaddingBegin),
m_framePaddingEnd(_framePaddingEnd)
{
}
void KWFrameChangeFramePaddingCommand::execute()
{
KWFrameSet *frameSet = m_indexFrame.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame(m_indexFrame.m_iFrameIndex);
Q_ASSERT( frame );
frame->setFramePadding( m_framePaddingEnd.leftPadding,m_framePaddingEnd.topPadding , m_framePaddingEnd.rightPadding, m_framePaddingEnd.bottomPadding);
frameSet->kWordDocument()->frameChanged( frame );
}
void KWFrameChangeFramePaddingCommand::unexecute()
{
KWFrameSet *frameSet = m_indexFrame.m_pFrameSet;
Q_ASSERT( frameSet );
KWFrame *frame = frameSet->frame(m_indexFrame.m_iFrameIndex);
Q_ASSERT( frame );
frame->setFramePadding( m_framePaddingBegin.leftPadding,m_framePaddingBegin.topPadding , m_framePaddingBegin.rightPadding, m_framePaddingBegin.bottomPadding);
frameSet->kWordDocument()->frameChanged( frame );
}
KWChangeFootEndNoteSettingsCommand::KWChangeFootEndNoteSettingsCommand( const QString &name, KoParagCounter _oldCounter, KoParagCounter _newCounter ,bool _footNote ,KWDocument *_doc):
KNamedCommand(name),
m_oldCounter(_oldCounter),
m_newCounter(_newCounter),
m_footNote( _footNote ),
m_doc(_doc)
{
}
void KWChangeFootEndNoteSettingsCommand::execute()
{
changeCounter( m_newCounter);
}
void KWChangeFootEndNoteSettingsCommand::unexecute()
{
changeCounter( m_oldCounter);
}
void KWChangeFootEndNoteSettingsCommand::changeCounter( KoParagCounter counter)
{
if (m_footNote )
{
static_cast<KWVariableSettings*>(m_doc->variableCollection()->variableSetting())->changeFootNoteCounter(counter );
}
else
{
static_cast<KWVariableSettings*>(m_doc->variableCollection()->variableSetting())->changeEndNoteCounter(counter );
}
m_doc->changeFootNoteConfig();
}
KWChangeTabStopValueCommand::KWChangeTabStopValueCommand( const QString &name, double _oldValue, double _newValue, KWDocument *_doc):
KNamedCommand(name),
m_doc( _doc ),
m_oldValue(_oldValue),
m_newValue(_newValue)
{
}
void KWChangeTabStopValueCommand::execute()
{
m_doc->setTabStopValue ( m_newValue );
}
void KWChangeTabStopValueCommand::unexecute()
{
m_doc->setTabStopValue ( m_oldValue );
}
FootNoteParameter::FootNoteParameter( KWFootNoteVariable *_var )
{
noteType = _var->noteType();
numberingType = _var->numberingType();
manualString = _var->manualString();
}
FootNoteParameter::FootNoteParameter( NoteType _noteType, KWFootNoteVariable::Numbering _numberingType, const QString &_manualString)
{
noteType= _noteType;
numberingType = _numberingType;
manualString = _manualString;
}
KWChangeFootNoteParametersCommand::KWChangeFootNoteParametersCommand( const QString &name, KWFootNoteVariable * _var, FootNoteParameter _oldParameter, FootNoteParameter _newParameter, KWDocument *_doc):
KNamedCommand(name),
m_doc( _doc ),
m_var( _var ),
m_oldParameter( _oldParameter ),
m_newParameter( _newParameter)
{
}
void KWChangeFootNoteParametersCommand::execute()
{
changeVariableParameter( m_newParameter );
}
void KWChangeFootNoteParametersCommand::unexecute()
{
changeVariableParameter( m_oldParameter );
}
void KWChangeFootNoteParametersCommand::changeVariableParameter( FootNoteParameter _param )
{
m_var->setNoteType( _param.noteType );
m_var->setNumberingType( _param.numberingType );
m_var->setManualString( _param.manualString );
m_var->setNumDisplay( -1 ); // force renumberFootNotes to recalc
if ( m_var->numberingType()== KWFootNoteVariable::Manual)
{
m_var->resize();
m_var->paragraph()->invalidate(0);
m_var->paragraph()->setChanged( true );
}
KWTextFrameSet * frameset = dynamic_cast<KWTextFrameSet *>( m_doc->frameSet( 0 ));
Q_ASSERT( frameset );
if ( frameset)
frameset->renumberFootNotes();
// Re-layout the footnote/endnote frame
KWFrame* footNoteFrame = m_var->frameSet()->frame( 0 );
int framePage = footNoteFrame->pageNumber();
m_doc->recalcFrames( framePage, -1 );
// Repaint
m_doc->delayedRepaintAllViews();
}
KWChangeFootNoteLineSeparatorParametersCommand::KWChangeFootNoteLineSeparatorParametersCommand( const QString &name, SeparatorLinePos _oldValuePos, SeparatorLinePos _newValuePos, int _oldLength, int _newLength, double _oldWidth, double _newWidth, SeparatorLineLineType _oldLineType, SeparatorLineLineType _newLineType, KWDocument *_doc):
KNamedCommand(name),
m_doc( _doc ),
m_oldValuePos(_oldValuePos),
m_newValuePos(_newValuePos),
m_oldLength(_oldLength),
m_newLength(_newLength),
m_oldWidth(_oldWidth),
m_newWidth(_newWidth),
m_oldLineType(_oldLineType),
m_newLineType(_newLineType)
{
}
void KWChangeFootNoteLineSeparatorParametersCommand::execute()
{
changeLineSeparatorParameter( m_newValuePos, m_newLength, m_newWidth,m_newLineType );
}
void KWChangeFootNoteLineSeparatorParametersCommand::unexecute()
{
changeLineSeparatorParameter( m_oldValuePos, m_oldLength, m_oldWidth, m_oldLineType);
}
void KWChangeFootNoteLineSeparatorParametersCommand::changeLineSeparatorParameter( SeparatorLinePos _pos, int _length, double _width, SeparatorLineLineType _type)
{
m_doc->setFootNoteSeparatorLinePosition( _pos );
m_doc->setFootNoteSeparatorLineLength( _length);
m_doc->setFootNoteSeparatorLineWidth(_width );
m_doc->setFootNoteSeparatorLineType( _type );
m_doc->repaintAllViews();
}
KWRenameBookmarkCommand::KWRenameBookmarkCommand( const QString &name, const QString & _oldname, const QString & _newName, KWDocument *_doc):
KNamedCommand(name),
m_doc( _doc ),
m_oldName( _oldname),
m_newName( _newName)
{
}
void KWRenameBookmarkCommand::execute()
{
m_doc->renameBookmark( m_oldName, m_newName);
}
void KWRenameBookmarkCommand::unexecute()
{
m_doc->renameBookmark( m_newName, m_oldName);
}
KWResizeColumnCommand::KWResizeColumnCommand( KWTableFrameSet *table, int col, double oldSize, double newSize ):
KNamedCommand( i18n("Resize Column") ),
m_table( table ),
m_oldSize( oldSize ),
m_newSize( newSize ),
m_col( col )
{
}
void KWResizeColumnCommand::execute()
{
m_table->resizeColumn(m_col, m_newSize);
m_table->kWordDocument()->layout();
m_table->kWordDocument()->repaintAllViews();
}
void KWResizeColumnCommand::unexecute()
{
m_table->resizeColumn(m_col, m_oldSize);
m_table->kWordDocument()->layout();
m_table->kWordDocument()->repaintAllViews();
}
KWResizeRowCommand::KWResizeRowCommand( KWTableFrameSet *table, int row, double oldSize, double newSize ):
KNamedCommand( i18n("Resize Row") ),
m_table( table ),
m_oldSize( oldSize ),
m_newSize( newSize ),
m_row( row )
{
}
void KWResizeRowCommand::execute()
{
m_table->resizeRow( m_row, m_newSize );
m_table->kWordDocument()->repaintAllViews();
}
void KWResizeRowCommand::unexecute()
{
m_table->resizeRow( m_row, m_oldSize );
m_table->kWordDocument()->repaintAllViews();
}