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/kspread/kspread_undo.cc

3002 lines
75 KiB

/* This file is part of the KDE project
Copyright (C) 1998, 1999 Torben Weis <weis@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 "kspread_cell.h"
#include "kspread_doc.h"
#include "kspread_global.h"
#include "kspread_locale.h"
#include "kspread_map.h"
#include "kspread_sheet.h"
#include "kspread_sheetprint.h"
#include "kspread_style.h"
#include "kspread_style_manager.h"
#include "kspread_util.h"
#include "kspread_undo.h"
using namespace KSpread;
bool operator < (const QPoint& pointA , const QPoint& pointB)
{
if (pointA.y() == pointB.y())
return ( pointA.x() < pointB.x() );
else
return ( pointA.y() < pointB.y() );
}
/****************************************************************************
*
* Undo
*
***************************************************************************/
Undo::Undo( Doc *_doc )
{
m_pDoc = _doc;
m_stckUndo.setAutoDelete( false );
m_stckRedo.setAutoDelete( false );
}
Undo::~Undo()
{
clear();
}
void Undo::appendUndo( UndoAction *_action )
{
if ( isLocked() )
return;
m_stckRedo.setAutoDelete( true );
m_stckRedo.clear();
m_stckRedo.setAutoDelete( false );
m_stckUndo.push( _action );
if ( m_pDoc )
{
m_pDoc->enableUndo( hasUndoActions() );
m_pDoc->enableRedo( hasRedoActions() );
m_pDoc->setModified( true );
}
}
void Undo::clear()
{
if ( isLocked() )
return;
m_stckUndo.setAutoDelete( true );
m_stckRedo.setAutoDelete( true );
m_stckUndo.clear();
m_stckRedo.clear();
m_stckUndo.setAutoDelete( false );
m_stckRedo.setAutoDelete( false );
}
void Undo::undo()
{
if ( m_stckUndo.isEmpty() )
return;
//Don't show error dialogs on undo
bool origErrorMessages = true;
if ( m_pDoc )
{
origErrorMessages = m_pDoc->getShowMessageError();
m_pDoc->setShowMessageError( false );
}
UndoAction *a = m_stckUndo.pop();
a->undo();
m_stckRedo.push( a );
if ( m_pDoc )
{
m_pDoc->setShowMessageError( origErrorMessages );
m_pDoc->enableUndo( hasUndoActions() );
m_pDoc->enableRedo( hasRedoActions() );
}
}
void Undo::redo()
{
if ( m_stckRedo.isEmpty() )
return;
UndoAction *a = m_stckRedo.pop();
a->redo();
m_stckUndo.push( a );
if ( m_pDoc )
{
m_pDoc->enableUndo( hasUndoActions() );
m_pDoc->enableRedo( hasRedoActions() );
}
}
void Undo::lock()
{
m_pDoc->undoLock();
}
void Undo::unlock()
{
m_pDoc->undoUnlock();
}
bool Undo::isLocked() const
{
return m_pDoc->undoLocked();
}
QString Undo::getRedoName()
{
if ( m_stckRedo.isEmpty() )
return QString("");
return m_stckRedo.current()->getName();
}
QString Undo::getUndoName()
{
if ( m_stckUndo.isEmpty() )
return QString("");
return m_stckUndo.current()->getName();
}
/****************************************************************************
*
* MacroUndoAction
*
***************************************************************************/
MacroUndoAction::MacroUndoAction( Doc *_doc, const QString& _name ):
UndoAction( _doc )
{
name=_name;
}
MacroUndoAction::~MacroUndoAction()
{
m_commands.setAutoDelete( true );
}
void MacroUndoAction::addCommand(UndoAction *command)
{
m_commands.append(command);
}
void MacroUndoAction::undo()
{
QPtrListIterator<UndoAction> it(m_commands);
for ( ; it.current() ; ++it )
it.current()->undo();
}
void MacroUndoAction::redo()
{
QPtrListIterator<UndoAction> it(m_commands);
for ( ; it.current() ; ++it )
it.current()->redo();
}
/****************************************************************************
*
* UndoInsertRemoveAction
*
***************************************************************************/
UndoInsertRemoveAction::UndoInsertRemoveAction( Doc * _doc ) :
UndoAction( _doc )
{
}
UndoInsertRemoveAction::~UndoInsertRemoveAction()
{
}
void UndoInsertRemoveAction::saveFormulaReference( Sheet *_sheet,
int col, int row, QString & formula )
{
if ( _sheet == 0 )
return;
QString sheetName = _sheet->sheetName();
m_lstFormulaCells.append( FormulaOfCell( sheetName, col, row, formula ) );
}
void UndoInsertRemoveAction::undoFormulaReference()
{
QValueList<FormulaOfCell>::iterator it;
for ( it = m_lstFormulaCells.begin(); it != m_lstFormulaCells.end(); ++it )
{
Sheet* sheet = doc()->map()->findSheet( (*it).sheetName() );
if ( sheet )
{
Cell * cell = sheet->cellAt( (*it).col(), (*it).row() );
if ( cell && !cell->isDefault() )
{
cell->setCellText( (*it).formula() );
}
}
}
}
/****************************************************************************
*
* UndoRemoveColumn
*
***************************************************************************/
UndoRemoveColumn::UndoRemoveColumn( Doc *_doc, Sheet *_sheet, int _column,int _nbCol ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Remove Columns");
m_sheetName = _sheet->sheetName();
m_iColumn= _column;
m_iNbCol = _nbCol;
m_printRange = _sheet->print()->printRange();
m_printRepeatColumns = _sheet->print()->printRepeatColumns();
QRect selection;
selection.setCoords( _column, 1, _column+m_iNbCol, KS_rowMax );
QDomDocument doc = _sheet->saveCellRegion( selection );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
m_data = buffer.utf8();
int len = m_data.length();
char tmp = m_data[ len - 1 ];
m_data.resize( len );
*( m_data.data() + len - 1 ) = tmp;
}
UndoRemoveColumn::~UndoRemoveColumn()
{
}
void UndoRemoveColumn::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->insertColumn( m_iColumn,m_iNbCol);
QPoint pastePoint( m_iColumn, 1 );
sheet->paste( m_data, QRect( pastePoint, pastePoint ) );
if(sheet->getAutoCalc()) sheet->recalc();
sheet->print()->setPrintRange( m_printRange );
sheet->print()->setPrintRepeatColumns( m_printRepeatColumns );
doc()->undoUnlock();
undoFormulaReference();
}
void UndoRemoveColumn::redo()
{
doc()->undoLock();
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
sheet->removeColumn( m_iColumn,m_iNbCol );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoInsertColumn
*
***************************************************************************/
UndoInsertColumn::UndoInsertColumn( Doc *_doc, Sheet *_sheet, int _column, int _nbCol ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Insert Columns");
m_sheetName = _sheet->sheetName();
m_iColumn= _column;
m_iNbCol=_nbCol;
}
UndoInsertColumn::~UndoInsertColumn()
{
}
void UndoInsertColumn::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->removeColumn( m_iColumn,m_iNbCol );
doc()->undoUnlock();
undoFormulaReference();
}
void UndoInsertColumn::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->insertColumn( m_iColumn,m_iNbCol);
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoRemoveRow
*
***************************************************************************/
UndoRemoveRow::UndoRemoveRow( Doc *_doc, Sheet *_sheet, int _row,int _nbRow) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Remove Rows");
m_sheetName = _sheet->sheetName();
m_iRow = _row;
m_iNbRow= _nbRow;
m_printRange=_sheet->print()->printRange();
m_printRepeatRows = _sheet->print()->printRepeatRows();
QRect selection;
selection.setCoords( 1, _row, KS_colMax, _row+m_iNbRow );
QDomDocument doc = _sheet->saveCellRegion( selection );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
m_data = buffer.utf8();
int len = m_data.length();
char tmp = m_data[ len - 1 ];
m_data.resize( len );
*( m_data.data() + len - 1 ) = tmp;
// printf("UNDO {{{%s}}}\n", buffer.latin1() );
// printf("UNDO2 %i bytes, length %i {{{%s}}}\n", m_data.length(), m_data.size(), (const char*)m_data );
// printf("length=%i, size=%i", m_data.length(), m_data.size() );
// printf("Last characters are %i %i %i\n", (int)m_data[ m_data.size() - 3 ],
// (int)m_data[ m_data.size() - 2 ], (int)m_data[ m_data.size() - 1 ] );
}
UndoRemoveRow::~UndoRemoveRow()
{
}
void UndoRemoveRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->insertRow( m_iRow,m_iNbRow );
QPoint pastePoint( 1, m_iRow );
sheet->paste( m_data, QRect(pastePoint, pastePoint) );
sheet->print()->setPrintRange( m_printRange );
sheet->print()->setPrintRepeatRows( m_printRepeatRows );
if(sheet->getAutoCalc()) sheet->recalc();
doc()->undoUnlock();
undoFormulaReference();
}
void UndoRemoveRow::redo()
{
doc()->undoLock();
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
sheet->removeRow( m_iRow,m_iNbRow );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoInsertRow
*
***************************************************************************/
UndoInsertRow::UndoInsertRow( Doc *_doc, Sheet *_sheet, int _row,int _nbRow ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Insert Rows");
m_sheetName = _sheet->sheetName();
m_iRow = _row;
m_iNbRow=_nbRow;
}
UndoInsertRow::~UndoInsertRow()
{
}
void UndoInsertRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->removeRow( m_iRow,m_iNbRow );
doc()->undoUnlock();
undoFormulaReference();
}
void UndoInsertRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->insertRow( m_iRow,m_iNbRow );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoHideRow
*
***************************************************************************/
/*UndoHideRow::UndoHideRow( Doc *_doc, Sheet *_sheet, int _row, int _nbRow , QValueList<int>_listRow) :
UndoAction( _doc )
{
name=i18n("Hide Rows");
m_sheetName = _sheet->sheetName();
m_iRow= _row;
m_iNbRow=_nbRow;
if(m_iNbRow!=-1)
createList( listRow ,_sheet );
else
listRow=QValueList<int>(_listRow);
}
UndoHideRow::~UndoHideRow()
{
}
void UndoHideRow::createList( QValueList<int>&list,Sheet *tab )
{
RowFormat *rl;
for(int i=m_iRow;i<=(m_iRow+m_iNbRow);i++)
{
rl= tab->nonDefaultRowFormat( i );
if(!rl->isHide())
list.append(rl->row());
}
}
void UndoHideRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->showRow( 0,-1,listRow );
doc()->undoUnlock();
}
void UndoHideRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->hideRow(0,-1, listRow );
doc()->undoUnlock();
}*/
/****************************************************************************
*
* UndoHideColumn
*
***************************************************************************/
/*UndoHideColumn::UndoHideColumn( Doc *_doc, Sheet *_sheet, int _column, int _nbCol, QValueList<int>_listCol ) :
UndoAction( _doc )
{
name=i18n("Hide Columns");
m_sheetName = _sheet->sheetName();
m_iColumn= _column;
m_iNbCol=_nbCol;
if(m_iNbCol!=-1)
createList( listCol ,_sheet );
else
listCol=QValueList<int>(_listCol);
}
UndoHideColumn::~UndoHideColumn()
{
}
void UndoHideColumn::createList( QValueList<int>&list,Sheet *tab )
{
ColumnFormat *cl;
for(int i=m_iColumn;i<=(m_iColumn+m_iNbCol);i++)
{
cl= tab->nonDefaultColumnFormat( i );
if(!cl->isHide())
list.append(cl->column());
}
}
void UndoHideColumn::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->showColumn(0,-1,listCol);
doc()->undoUnlock();
}
void UndoHideColumn::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->hideColumn(0,-1,listCol);
doc()->undoUnlock();
}*/
/****************************************************************************
*
* UndoShowRow
*
***************************************************************************/
/*UndoShowRow::UndoShowRow( Doc *_doc, Sheet *_sheet, int _row, int _nbRow, QValueList<int>_listRow ) :
UndoAction( _doc )
{
name=i18n("Show Rows");
m_sheetName = _sheet->sheetName();
m_iRow= _row;
m_iNbRow=_nbRow;
if(m_iNbRow!=-1)
createList( listRow ,_sheet );
else
listRow=QValueList<int>(_listRow);
}
UndoShowRow::~UndoShowRow()
{
}
void UndoShowRow::createList( QValueList<int>&list,Sheet *tab )
{
RowFormat *rl;
for(int i=m_iRow;i<=(m_iRow+m_iNbRow);i++)
{
rl= tab->nonDefaultRowFormat( i );
if(rl->isHide())
list.append(rl->row());
}
}
void UndoShowRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->hideRow(0,-1,listRow);
doc()->undoUnlock();
}
void UndoShowRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->showRow(0,-1,listRow);
doc()->undoUnlock();
}*/
/****************************************************************************
*
* UndoShowColumn
*
***************************************************************************/
/*UndoShowColumn::UndoShowColumn( Doc *_doc, Sheet *_sheet, int _column, int _nbCol,QValueList<int>_listCol ) :
UndoAction( _doc )
{
name=i18n("Show Columns");
m_sheetName = _sheet->sheetName();
m_iColumn= _column;
m_iNbCol=_nbCol;
if(m_iNbCol!=-1)
createList( listCol ,_sheet );
else
listCol=QValueList<int>(_listCol);
}
UndoShowColumn::~UndoShowColumn()
{
}
void UndoShowColumn::createList( QValueList<int>&list,Sheet *tab )
{
ColumnFormat *cl;
for(int i=m_iColumn;i<=(m_iColumn+m_iNbCol);i++)
{
cl= tab->nonDefaultColumnFormat( i );
if(cl->isHide())
list.append(cl->column());
}
}
void UndoShowColumn::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->hideColumn( 0,-1,listCol );
doc()->undoUnlock();
}
void UndoShowColumn::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->showColumn(0,-1,listCol);
doc()->undoUnlock();
}*/
/****************************************************************************
*
* UndoPaperLayout
*
***************************************************************************/
UndoPaperLayout::UndoPaperLayout( Doc *_doc, Sheet *_sheet )
: UndoAction( _doc )
{
name=i18n("Set Page Layout");
m_sheetName = _sheet->sheetName();
m_pl = _sheet->print()->paperLayout();
m_hf = _sheet->print()->headFootLine();
m_unit = doc()->unit();
m_printGrid = _sheet->print()->printGrid();
m_printCommentIndicator = _sheet->print()->printCommentIndicator();
m_printFormulaIndicator = _sheet->print()->printFormulaIndicator();
m_printRange = _sheet->print()->printRange();
m_printRepeatColumns = _sheet->print()->printRepeatColumns();
m_printRepeatRows = _sheet->print()->printRepeatRows();
m_dZoom = _sheet->print()->zoom();
m_iPageLimitX = _sheet->print()->pageLimitX();
m_iPageLimitY = _sheet->print()->pageLimitY();
}
UndoPaperLayout::~UndoPaperLayout()
{
}
void UndoPaperLayout::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
SheetPrint* print = sheet->print();
doc()->undoLock();
m_plRedo = print->paperLayout();
print->setPaperLayout( m_pl.ptLeft, m_pl.ptTop,
m_pl.ptRight, m_pl.ptBottom,
m_pl.format, m_pl.orientation );
m_hfRedo = print->headFootLine();
print->setHeadFootLine( m_hf.headLeft, m_hf.headMid, m_hf.headRight,
m_hf.footLeft, m_hf.footMid, m_hf.footRight );
m_unitRedo = doc()->unit();
doc()->setUnit( m_unit );
m_printGridRedo = print->printGrid();
print->setPrintGrid( m_printGrid );
m_printCommentIndicatorRedo = print->printCommentIndicator();
print->setPrintCommentIndicator( m_printCommentIndicator );
m_printFormulaIndicatorRedo = print->printFormulaIndicator();
print->setPrintFormulaIndicator( m_printFormulaIndicator );
m_printRangeRedo = print->printRange();
print->setPrintRange( m_printRange );
m_printRepeatColumnsRedo = print->printRepeatColumns();
print->setPrintRepeatColumns( m_printRepeatColumns );
m_printRepeatRowsRedo = print->printRepeatRows();
print->setPrintRepeatRows( m_printRepeatRows );
m_dZoomRedo = print->zoom();
print->setZoom( m_dZoom );
m_iPageLimitXRedo = print->pageLimitX();
print->setPageLimitX( m_iPageLimitX );
m_iPageLimitYRedo = print->pageLimitY();
print->setPageLimitY( m_iPageLimitY );
doc()->undoUnlock();
}
void UndoPaperLayout::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
SheetPrint* print = sheet->print();
doc()->undoLock();
print->setPaperLayout( m_plRedo.ptLeft, m_plRedo.ptTop,
m_plRedo.ptRight, m_plRedo.ptBottom,
m_plRedo.format, m_plRedo.orientation );
print->setHeadFootLine( m_hfRedo.headLeft, m_hfRedo.headMid, m_hfRedo.headRight,
m_hfRedo.footLeft, m_hfRedo.footMid, m_hfRedo.footRight );
doc()->setUnit( m_unitRedo );
print->setPrintGrid( m_printGridRedo );
print->setPrintCommentIndicator( m_printCommentIndicatorRedo );
print->setPrintFormulaIndicator( m_printFormulaIndicatorRedo );
print->setPrintRange( m_printRangeRedo );
print->setPrintRepeatColumns( m_printRepeatColumnsRedo );
print->setPrintRepeatRows( m_printRepeatRowsRedo );
print->setZoom( m_dZoomRedo );
print->setPageLimitX( m_iPageLimitX );
print->setPageLimitY( m_iPageLimitY );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoSetText
*
***************************************************************************/
UndoSetText::UndoSetText( Doc *_doc, Sheet *_sheet, const QString& _text, int _column, int _row,FormatType _formatType ) :
UndoAction( _doc )
{
name=i18n("Change Text");
m_strText = _text;
m_iColumn= _column;
m_iRow = _row;
m_sheetName = _sheet->sheetName();
m_eFormatType=_formatType;
}
UndoSetText::~UndoSetText()
{
}
void UndoSetText::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
Cell *cell = sheet->nonDefaultCell( m_iColumn, m_iRow );
m_strRedoText = cell->text();
m_eFormatTypeRedo=cell->format()->getFormatType( m_iColumn, m_iRow );
cell->format()->setFormatType(m_eFormatType);
if ( m_strText.isNull() )
cell->setCellText( "" );
else
cell->setCellText( m_strText );
sheet->updateView( QRect( m_iColumn, m_iRow, 1, 1 ) );
doc()->undoUnlock();
}
void UndoSetText::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
Cell *cell = sheet->nonDefaultCell( m_iColumn, m_iRow );
m_strText = cell->text();
m_eFormatType=cell->format()->getFormatType( m_iColumn, m_iRow );
if ( m_strRedoText.isNull() )
cell->setCellText( "" );
else
cell->setCellText( m_strRedoText );
cell->format()->setFormatType(m_eFormatTypeRedo);
sheet->updateView( QRect( m_iColumn, m_iRow, 1, 1 ) );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoCellFormat
*
***************************************************************************/
UndoCellFormat::UndoCellFormat( Doc * _doc,
Sheet * _sheet,
const Region & _selection,
const QString & _name ) :
UndoAction( _doc )
{
if ( _name.isEmpty())
name = i18n("Change Format");
else
name = _name;
m_region = _selection;
m_sheetName = _sheet->sheetName();
copyFormat( m_lstFormats, m_lstColFormats, m_lstRowFormats, _sheet );
}
void UndoCellFormat::copyFormat(QValueList<layoutCell> & list,
QValueList<layoutColumn> & listCol,
QValueList<layoutRow> & listRow,
Sheet * sheet )
{
QValueList<layoutCell>::Iterator it2;
for ( it2 = list.begin(); it2 != list.end(); ++it2 )
{
delete (*it2).l;
}
list.clear();
Cell * cell;
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect range = (*it)->rect().normalize();
int bottom = range.bottom();
int right = range.right();
if ( util_isColumnSelected( range ) )
{
/* Don't need to go through the loop twice...
for (int i = range.left(); i <= right; ++i)
{
layoutColumn tmplayout;
tmplayout.col = i;
tmplayout.l = new ColumnFormat( sheet, i );
tmplayout.l->copy( *(sheet->columnFormat( i )) );
listCol.append(tmplayout);
}
*/
for ( int c = range.left(); c <= right; ++c )
{
layoutColumn tmplayout;
tmplayout.col = c;
tmplayout.l = new ColumnFormat( sheet, c );
tmplayout.l->copy( *(sheet->columnFormat( c )) );
listCol.append(tmplayout);
cell = sheet->getFirstCellColumn( c );
while ( cell )
{
if ( cell->isPartOfMerged() )
{
cell = sheet->getNextCellDown( c, cell->row() );
continue;
}
layoutCell tmplayout;
tmplayout.col = c;
tmplayout.row = cell->row();
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( tmplayout.col, tmplayout.row )->format()) );
list.append(tmplayout);
cell = sheet->getNextCellDown( c, cell->row() );
}
}
/*
Cell * c = sheet->firstCell();
for( ; c; c = c->nextCell() )
{
int col = c->column();
if ( range.left() <= col && right >= col
&& !c->isPartOfMerged())
{
layoutCell tmplayout;
tmplayout.col = c->column();
tmplayout.row = c->row();
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( tmplayout.col, tmplayout.row )) );
list.append(tmplayout);
}
}
*/
}
else if (util_isRowSelected( range ) )
{
for ( int row = range.top(); row <= bottom; ++row )
{
layoutRow tmplayout;
tmplayout.row = row;
tmplayout.l = new RowFormat( sheet, row );
tmplayout.l->copy( *(sheet->rowFormat( row )) );
listRow.append(tmplayout);
cell = sheet->getFirstCellRow( row );
while ( cell )
{
if ( cell->isPartOfMerged() )
{
cell = sheet->getNextCellRight( cell->column(), row );
continue;
}
layoutCell tmplayout;
tmplayout.col = cell->column();
tmplayout.row = row;
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( cell->column(), row )->format()) );
list.append(tmplayout);
cell = sheet->getNextCellRight( cell->column(), row );
}
}
/*
Cell * c = sheet->firstCell();
for( ; c; c = c->nextCell() )
{
int row = c->row();
if ( range.top() <= row && bottom >= row
&& !c->isPartOfMerged())
{
layoutCell tmplayout;
tmplayout.col = c->column();
tmplayout.row = c->row();
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( tmplayout.col, tmplayout.row )) );
list.append(tmplayout);
}
}
*/
}
else
{
for ( int y = range.top(); y <= bottom; ++y )
for ( int x = range.left(); x <= right; ++x )
{
Cell * cell = sheet->nonDefaultCell( x, y );
if ( !cell->isPartOfMerged() )
{
layoutCell tmplayout;
tmplayout.col = x;
tmplayout.row = y;
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( x, y )->format()) );
list.append(tmplayout);
}
}
}
}
}
UndoCellFormat::~UndoCellFormat()
{
QValueList<layoutCell>::Iterator it2;
for ( it2 = m_lstFormats.begin(); it2 != m_lstFormats.end(); ++it2 )
{
delete (*it2).l;
}
m_lstFormats.clear();
for ( it2 = m_lstRedoFormats.begin(); it2 != m_lstRedoFormats.end(); ++it2 )
{
delete (*it2).l;
}
m_lstRedoFormats.clear();
QValueList<layoutColumn>::Iterator it3;
for ( it3 = m_lstColFormats.begin(); it3 != m_lstColFormats.end(); ++it3 )
{
delete (*it3).l;
}
m_lstColFormats.clear();
for ( it3 = m_lstRedoColFormats.begin(); it3 != m_lstRedoColFormats.end(); ++it3 )
{
delete (*it3).l;
}
m_lstRedoColFormats.clear();
QValueList<layoutRow>::Iterator it4;
for ( it4 = m_lstRowFormats.begin(); it4 != m_lstRowFormats.end(); ++it4 )
{
delete (*it4).l;
}
m_lstRowFormats.clear();
for ( it4 = m_lstRedoRowFormats.begin(); it4 != m_lstRedoRowFormats.end(); ++it4 )
{
delete (*it4).l;
}
m_lstRedoRowFormats.clear();
}
void UndoCellFormat::undo()
{
Sheet * sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
copyFormat( m_lstRedoFormats, m_lstRedoColFormats, m_lstRedoRowFormats, sheet );
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect range = (*it)->rect().normalize();
if( util_isColumnSelected( range ) )
{
QValueList<layoutColumn>::Iterator it2;
for ( it2 = m_lstColFormats.begin(); it2 != m_lstColFormats.end(); ++it2 )
{
ColumnFormat * col = sheet->nonDefaultColumnFormat( (*it2).col );
col->copy( *(*it2).l );
}
}
else if( util_isRowSelected( range ) )
{
QValueList<layoutRow>::Iterator it2;
for ( it2 = m_lstRowFormats.begin(); it2 != m_lstRowFormats.end(); ++it2 )
{
RowFormat * row = sheet->nonDefaultRowFormat( (*it2).row );
row->copy( *(*it2).l );
}
}
QValueList<layoutCell>::Iterator it2;
for ( it2 = m_lstFormats.begin(); it2 != m_lstFormats.end(); ++it2 )
{
Cell *cell = sheet->nonDefaultCell( (*it2).col,(*it2).row );
cell->format()->copy( *(*it2).l );
cell->setLayoutDirtyFlag();
cell->setDisplayDirtyFlag();
sheet->updateCell( cell, (*it2).col, (*it2).row );
}
}
sheet->setRegionPaintDirty( m_region );
sheet->updateView( &m_region );
doc()->undoUnlock();
}
void UndoCellFormat::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect range = (*it)->rect().normalize();
if ( util_isColumnSelected( range ) )
{
QValueList<layoutColumn>::Iterator it2;
for ( it2 = m_lstRedoColFormats.begin(); it2 != m_lstRedoColFormats.end(); ++it2 )
{
ColumnFormat * col = sheet->nonDefaultColumnFormat( (*it2).col );
col->copy( *(*it2).l );
}
}
else if( util_isRowSelected( range ) )
{
QValueList<layoutRow>::Iterator it2;
for ( it2 = m_lstRedoRowFormats.begin(); it2 != m_lstRedoRowFormats.end(); ++it2 )
{
RowFormat * row = sheet->nonDefaultRowFormat( (*it2).row );
row->copy( *(*it2).l );
}
}
QValueList<layoutCell>::Iterator it2;
for ( it2 = m_lstRedoFormats.begin(); it2 != m_lstRedoFormats.end(); ++it2 )
{
Cell * cell = sheet->nonDefaultCell( (*it2).col,(*it2).row );
cell->format()->copy( *(*it2).l );
cell->setLayoutDirtyFlag();
cell->setDisplayDirtyFlag();
sheet->updateCell( cell, (*it2).col, (*it2).row );
}
}
sheet->setRegionPaintDirty( m_region );
sheet->updateView( &m_region );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoChangeAngle
*
***************************************************************************/
UndoChangeAngle::UndoChangeAngle( Doc * _doc,
Sheet * _sheet,
const Region & _selection ) :
UndoAction( _doc )
{
name = i18n("Change Angle");
m_layoutUndo = new UndoCellFormat( _doc, _sheet, _selection, QString::null );
m_resizeUndo = new UndoResizeColRow( _doc, _sheet, _selection );
}
UndoChangeAngle::~UndoChangeAngle()
{
delete m_resizeUndo;
delete m_layoutUndo;
}
void UndoChangeAngle::undo()
{
m_layoutUndo->undo();
m_resizeUndo->undo();
}
void UndoChangeAngle::redo()
{
m_layoutUndo->redo();
m_resizeUndo->redo();
}
/****************************************************************************
*
* UndoSort
*
***************************************************************************/
UndoSort::UndoSort( Doc * _doc, Sheet * _sheet, const QRect & _selection ) :
UndoAction( _doc )
{
name = i18n("Sort");
m_rctRect = _selection;
m_sheetName = _sheet->sheetName();
copyAll( m_lstFormats, m_lstColFormats, m_lstRowFormats, _sheet );
}
void UndoSort::copyAll(QValueList<layoutTextCell> & list, QValueList<layoutColumn> & listCol,
QValueList<layoutRow> & listRow, Sheet * sheet )
{
QValueList<layoutTextCell>::Iterator it2;
for ( it2 = list.begin(); it2 != list.end(); ++it2 )
{
delete (*it2).l;
}
list.clear();
if ( util_isColumnSelected( m_rctRect ) )
{
Cell * c;
for (int col = m_rctRect.left(); col <= m_rctRect.right(); ++col)
{
layoutColumn tmplayout;
tmplayout.col = col;
tmplayout.l = new ColumnFormat( sheet, col );
tmplayout.l->copy( *(sheet->columnFormat( col )) );
listCol.append(tmplayout);
c = sheet->getFirstCellColumn( col );
while ( c )
{
if ( !c->isPartOfMerged() )
{
layoutTextCell tmplayout;
tmplayout.col = col;
tmplayout.row = c->row();
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( tmplayout.col, tmplayout.row )->format()) );
tmplayout.text = c->text();
list.append(tmplayout);
}
c = sheet->getNextCellDown( col, c->row() );
}
}
}
else if ( util_isRowSelected( m_rctRect ) )
{
Cell * c;
for ( int row = m_rctRect.top(); row <= m_rctRect.bottom(); ++row)
{
layoutRow tmplayout;
tmplayout.row = row;
tmplayout.l = new RowFormat( sheet, row );
tmplayout.l->copy( *(sheet->rowFormat( row )) );
listRow.append(tmplayout);
c = sheet->getFirstCellRow( row );
while ( c )
{
if ( !c->isPartOfMerged() )
{
layoutTextCell tmplayout;
tmplayout.col = c->column();
tmplayout.row = row;
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( tmplayout.col, tmplayout.row )->format()) );
tmplayout.text = c->text();
list.append(tmplayout);
}
c = sheet->getNextCellRight( c->column(), row );
}
}
}
else
{
int bottom = m_rctRect.bottom();
int right = m_rctRect.right();
Cell * cell;
for ( int y = m_rctRect.top(); y <= bottom; ++y )
for ( int x = m_rctRect.left(); x <= right; ++x )
{
cell = sheet->nonDefaultCell( x, y );
if (!cell->isPartOfMerged())
{
layoutTextCell tmplayout;
tmplayout.col = x;
tmplayout.row = y;
tmplayout.l = new Format( sheet, 0 );
tmplayout.l->copy( *(sheet->cellAt( x, y )->format()) );
tmplayout.text = cell->text();
list.append(tmplayout);
}
}
}
}
UndoSort::~UndoSort()
{
QValueList<layoutTextCell>::Iterator it2;
for ( it2 = m_lstFormats.begin(); it2 != m_lstFormats.end(); ++it2 )
{
delete (*it2).l;
}
m_lstFormats.clear();
for ( it2 = m_lstRedoFormats.begin(); it2 != m_lstRedoFormats.end(); ++it2 )
{
delete (*it2).l;
}
m_lstRedoFormats.clear();
QValueList<layoutColumn>::Iterator it3;
for ( it3 = m_lstColFormats.begin(); it3 != m_lstColFormats.end(); ++it3 )
{
delete (*it3).l;
}
m_lstColFormats.clear();
for ( it3 = m_lstRedoColFormats.begin(); it3 != m_lstRedoColFormats.end(); ++it3 )
{
delete (*it3).l;
}
m_lstRedoColFormats.clear();
QValueList<layoutRow>::Iterator it4;
for ( it4 = m_lstRowFormats.begin(); it4 != m_lstRowFormats.end(); ++it4 )
{
delete (*it4).l;
}
m_lstRowFormats.clear();
for ( it4 = m_lstRedoRowFormats.begin(); it4 != m_lstRedoRowFormats.end(); ++it4 )
{
delete (*it4).l;
}
m_lstRedoRowFormats.clear();
}
void UndoSort::undo()
{
Sheet * sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
copyAll( m_lstRedoFormats, m_lstRedoColFormats,
m_lstRedoRowFormats, sheet );
if ( util_isColumnSelected( m_rctRect ) )
{
QValueList<layoutColumn>::Iterator it2;
for ( it2 = m_lstColFormats.begin(); it2 != m_lstColFormats.end(); ++it2 )
{
ColumnFormat * col = sheet->nonDefaultColumnFormat( (*it2).col );
col->copy( *(*it2).l );
}
}
else if( util_isRowSelected( m_rctRect ) )
{
QValueList<layoutRow>::Iterator it2;
for ( it2 = m_lstRowFormats.begin(); it2 != m_lstRowFormats.end(); ++it2 )
{
RowFormat *row= sheet->nonDefaultRowFormat( (*it2).row );
row->copy( *(*it2).l );
}
}
QValueList<layoutTextCell>::Iterator it2;
for ( it2 = m_lstFormats.begin(); it2 != m_lstFormats.end(); ++it2 )
{
Cell *cell = sheet->nonDefaultCell( (*it2).col,(*it2).row );
if ( (*it2).text.isEmpty() )
{
if(!cell->text().isEmpty())
cell->setCellText( "" );
}
else
cell->setCellText( (*it2).text );
cell->format()->copy( *(*it2).l );
cell->setLayoutDirtyFlag();
cell->setDisplayDirtyFlag();
sheet->updateCell( cell, (*it2).col, (*it2).row );
}
sheet->setRegionPaintDirty(m_rctRect);
sheet->updateView( m_rctRect );
doc()->undoUnlock();
}
void UndoSort::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
if( util_isColumnSelected( m_rctRect ) )
{
QValueList<layoutColumn>::Iterator it2;
for ( it2 = m_lstRedoColFormats.begin(); it2 != m_lstRedoColFormats.end(); ++it2 )
{
ColumnFormat *col= sheet->nonDefaultColumnFormat( (*it2).col );
col->copy( *(*it2).l );
}
}
else if( util_isRowSelected( m_rctRect ) )
{
QValueList<layoutRow>::Iterator it2;
for ( it2 = m_lstRedoRowFormats.begin(); it2 != m_lstRedoRowFormats.end(); ++it2 )
{
RowFormat *row= sheet->nonDefaultRowFormat( (*it2).row );
row->copy( *(*it2).l );
}
}
QValueList<layoutTextCell>::Iterator it2;
for ( it2 = m_lstRedoFormats.begin(); it2 != m_lstRedoFormats.end(); ++it2 )
{
Cell *cell = sheet->nonDefaultCell( (*it2).col,(*it2).row );
if ( (*it2).text.isEmpty() )
{
if(!cell->text().isEmpty())
cell->setCellText( "" );
}
else
cell->setCellText( (*it2).text );
cell->format()->copy( *(*it2).l );
cell->setLayoutDirtyFlag();
cell->setDisplayDirtyFlag();
sheet->updateCell( cell, (*it2).col, (*it2).row );
}
sheet->setRegionPaintDirty(m_rctRect);
sheet->updateView( m_rctRect );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoDelete
*
***************************************************************************/
UndoDelete::UndoDelete( Doc *_doc, Sheet* sheet, const Region& region)
: UndoAction( _doc )
{
name=i18n("Delete");
m_sheetName = sheet->sheetName();
m_region = region;
createListCell(m_data, m_lstColumn, m_lstRow, sheet);
}
UndoDelete::~UndoDelete()
{
}
void UndoDelete::createListCell( QCString &listCell,QValueList<columnSize> &listCol,QValueList<rowSize> &listRow, Sheet* sheet )
{
listRow.clear();
listCol.clear();
Region::ConstIterator endOfList = m_region.constEnd();
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect range = (*it)->rect().normalize();
// copy column(s)
if ((*it)->isColumn())
{
for( int y = range.left() ; y <= range.right() ; ++y )
{
ColumnFormat * cl = sheet->columnFormat( y );
if ( !cl->isDefault() )
{
columnSize tmpSize;
tmpSize.columnNumber=y;
tmpSize.columnWidth=cl->dblWidth();
listCol.append(tmpSize);
}
}
}
// copy row(s)
else if ((*it)->isRow())
{
//save size of row(s)
for( int y = range.top() ; y <= range.bottom() ; ++y )
{
RowFormat *rw=sheet->rowFormat(y);
if(!rw->isDefault())
{
rowSize tmpSize;
tmpSize.rowNumber=y;
tmpSize.rowHeight=rw->dblHeight();
listRow.append(tmpSize);
}
}
}
}
//save all cells in area
QDomDocument doc = sheet->saveCellRegion( m_region );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
listCell = buffer.utf8();
int len = listCell.length();
char tmp = listCell[ len - 1 ];
listCell.resize( len );
*( listCell.data() + len - 1 ) = tmp;
}
void UndoDelete::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
createListCell( m_dataRedo, m_lstRedoColumn, m_lstRedoRow, sheet );
doc()->undoLock();
doc()->emitBeginOperation();
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstColumn.begin(); it2 != m_lstColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->nonDefaultColumnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRow.begin(); it2 != m_lstRow.end(); ++it2 )
{
RowFormat *rw=sheet->nonDefaultRowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
sheet->deleteCells(m_region);
sheet->paste( m_data, m_region.boundingRect() );
sheet->updateView( );
if(sheet->getAutoCalc()) sheet->recalc();
doc()->undoUnlock();
}
void UndoDelete::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstRedoColumn.begin(); it2 != m_lstRedoColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->nonDefaultColumnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRedoRow.begin(); it2 != m_lstRedoRow.end(); ++it2 )
{
RowFormat *rw=sheet->nonDefaultRowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
//move next line to refreshView
//because I must know what is the real rect
//that I must refresh, when there is cell Merged
sheet->paste( m_dataRedo, m_region.boundingRect() );
//sheet->deleteCells( m_selection );
sheet->updateView();
sheet->refreshView( m_region ); // deletes the cells in region!
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoDragDrop
*
***************************************************************************/
UndoDragDrop::UndoDragDrop( Doc * _doc, Sheet * _sheet,
const Region& _source,
const Region& _target )
: UndoAction( _doc ),
m_selectionSource( _source ),
m_selectionTarget( _target )
{
name = i18n( "Drag & Drop" );
m_sheetName = _sheet->sheetName();
saveCellRect( m_dataTarget, _sheet, _target );
saveCellRect( m_dataSource, _sheet, _source );
}
UndoDragDrop::~UndoDragDrop()
{
}
void UndoDragDrop::saveCellRect( QCString & cells, Sheet * sheet,
const Region& region )
{
QDomDocument doc = sheet->saveCellRegion(region);
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
cells = buffer.utf8();
int len = cells.length();
char tmp = cells[ len - 1 ];
cells.resize( len );
*( cells.data() + len - 1 ) = tmp;
}
void UndoDragDrop::undo()
{
Sheet * sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
saveCellRect( m_dataRedoSource, sheet, m_selectionSource );
saveCellRect( m_dataRedoTarget, sheet, m_selectionTarget );
doc()->undoLock();
doc()->emitBeginOperation();
sheet->deleteCells( m_selectionTarget );
sheet->paste( m_dataTarget, m_selectionTarget.boundingRect() );
sheet->deleteCells( m_selectionSource );
sheet->paste( m_dataSource, m_selectionSource.boundingRect() );
sheet->updateView();
if ( sheet->getAutoCalc() )
sheet->recalc();
doc()->undoUnlock();
}
void UndoDragDrop::redo()
{
Sheet * sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
//move next line to refreshView
//because I must know what is the real rect
//that I must refresh, when there is cell Merged
sheet->deleteCells( m_selectionTarget );
sheet->paste( m_dataRedoTarget, m_selectionTarget.boundingRect() );
sheet->deleteCells( m_selectionSource );
sheet->paste( m_dataRedoSource, m_selectionSource.boundingRect() );
sheet->updateView();
if ( sheet->getAutoCalc() )
sheet->recalc();
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoResizeColRow
*
***************************************************************************/
UndoResizeColRow::UndoResizeColRow( Doc *_doc, Sheet *_sheet, const Region &_selection ) :
UndoAction( _doc )
{
name=i18n("Resize");
m_region = _selection;
m_sheetName = _sheet->sheetName();
createList( m_lstColumn,m_lstRow, _sheet );
}
void UndoResizeColRow::createList( QValueList<columnSize> &listCol,QValueList<rowSize> &listRow, Sheet* sheet )
{
listCol.clear();
listRow.clear();
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
if( util_isColumnSelected( m_rctRect ) ) // entire column(s)
{
for( int y = m_rctRect.left(); y <= m_rctRect.right(); y++ )
{
ColumnFormat *cl=sheet->columnFormat(y);
if(!cl->isHide())
{
columnSize tmpSize;
tmpSize.columnNumber=y;
tmpSize.columnWidth=cl->dblWidth();
listCol.append(tmpSize);
}
}
}
else if( util_isRowSelected( m_rctRect ) ) // entire row(s)
{
for( int y = m_rctRect.top(); y <= m_rctRect.bottom(); y++ )
{
RowFormat *rw=sheet->rowFormat(y);
if(!rw->isHide())
{
rowSize tmpSize;
tmpSize.rowNumber=y;
tmpSize.rowHeight=rw->dblHeight();
listRow.append(tmpSize);
}
}
}
else //row and column
{
for( int y = m_rctRect.left(); y <= m_rctRect.right(); y++ )
{
ColumnFormat *cl=sheet->columnFormat(y);
if(!cl->isHide())
{
columnSize tmpSize;
tmpSize.columnNumber=y;
tmpSize.columnWidth=cl->dblWidth();
listCol.append(tmpSize);
}
}
for( int y = m_rctRect.top(); y <= m_rctRect.bottom(); y++ )
{
RowFormat *rw=sheet->rowFormat(y);
if(!rw->isHide())
{
rowSize tmpSize;
tmpSize.rowNumber=y;
tmpSize.rowHeight=rw->dblHeight();
listRow.append(tmpSize);
}
}
}
}
}
UndoResizeColRow::~UndoResizeColRow()
{
}
void UndoResizeColRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
createList( m_lstRedoColumn,m_lstRedoRow, sheet );
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
if( util_isColumnSelected( m_rctRect ) ) // complete column(s)
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstColumn.begin(); it2 != m_lstColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->columnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
else if( util_isRowSelected( m_rctRect ) ) // complete row(s)
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRow.begin(); it2 != m_lstRow.end(); ++it2 )
{
RowFormat *rw=sheet->rowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
else // row and column
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstColumn.begin(); it2 != m_lstColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->columnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
QValueList<rowSize>::Iterator it1;
for ( it1 = m_lstRow.begin(); it1 != m_lstRow.end(); ++it1 )
{
RowFormat *rw=sheet->rowFormat((*it1).rowNumber);
rw->setDblHeight((*it1).rowHeight);
}
}
}
doc()->undoUnlock();
}
void UndoResizeColRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
if( util_isColumnSelected( m_rctRect ) ) // complete column(s)
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstRedoColumn.begin(); it2 != m_lstRedoColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->columnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
else if( util_isRowSelected( m_rctRect ) ) // complete row(s)
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRedoRow.begin(); it2 != m_lstRedoRow.end(); ++it2 )
{
RowFormat *rw=sheet->rowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
else // row and column
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstRedoColumn.begin(); it2 != m_lstRedoColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->columnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
QValueList<rowSize>::Iterator it1;
for ( it1 = m_lstRedoRow.begin(); it1 != m_lstRedoRow.end(); ++it1 )
{
RowFormat *rw=sheet->rowFormat((*it1).rowNumber);
rw->setDblHeight((*it1).rowHeight);
}
}
}
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoChangeAreaTextCell
*
***************************************************************************/
UndoChangeAreaTextCell::UndoChangeAreaTextCell( Doc *_doc, Sheet *_sheet, const Region &_selection ) :
UndoAction( _doc )
{
name=i18n("Change Text");
m_region = _selection;
m_sheetName = _sheet->sheetName();
createList( m_lstTextCell, _sheet );
}
void UndoChangeAreaTextCell::createList( QMap<QPoint,QString> &map, Sheet* sheet )
{
map.clear();
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
int bottom = m_rctRect.bottom();
int right = m_rctRect.right();
if( util_isColumnSelected( m_rctRect ) )
{
Cell * c;
for ( int col = m_rctRect.left(); col <= right; ++col )
{
c = sheet->getFirstCellColumn( col );
while ( c )
{
if ( !c->isPartOfMerged() )
{
//textOfCell tmpText;
//tmpText.col = col;
//tmpText.row = c->row();
//tmpText.text = c->text();
map.insert( QPoint(col,c->row()) , c->text() );
}
c = sheet->getNextCellDown( col, c->row() );
}
}
}
else if ( util_isRowSelected( m_rctRect ) )
{
Cell * c;
for ( int row = m_rctRect.top(); row <= bottom; ++row )
{
c = sheet->getFirstCellRow( row );
while ( c )
{
if ( !c->isPartOfMerged() )
{
//textOfCell tmpText;
//tmpText.col = c->column();
//tmpText.row = row;
//tmpText.text = c->text();
map.insert( QPoint(c->column(),row) , c->text() );
}
c = sheet->getNextCellRight( c->column(), row );
}
}
}
else
{
Cell * cell;
for ( int x = m_rctRect.left(); x <= right; ++x )
{
cell = sheet->getFirstCellColumn( x );
if ( !cell )
continue;
while ( cell && cell->row() <= bottom )
{
if ( !cell->isObscured() )
{
//textOfCell tmpText;
//tmpText.col = x;
//tmpText.row = cell->row();
//tmpText.text = cell->text();
map.insert( QPoint(x,cell->row()) , cell->text());
}
cell = sheet->getNextCellDown( x, cell->row() );
}
}
}
}
}
UndoChangeAreaTextCell::~UndoChangeAreaTextCell()
{
}
void UndoChangeAreaTextCell::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
sheet->setRegionPaintDirty(m_region);
kdDebug() << "creating redo list..." << endl;
createList( m_lstRedoTextCell, sheet );
kdDebug() << "created redo list..." << endl;
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
if ( !util_isRowSelected( m_rctRect )
&& !util_isColumnSelected( m_rctRect ) )
{
for ( int x = m_rctRect.left(); x <= m_rctRect.right(); ++x )
for ( int y = m_rctRect.top(); y <= m_rctRect.bottom(); ++y )
{
Cell* cell = sheet->nonDefaultCell( x, y );
const QPoint location(x,y);
if ( m_lstTextCell.contains(location) )
cell->setCellText( m_lstTextCell[location] );
else
cell->setCellText( "",true );
/*bool found = false;
QValueList<textOfCell>::Iterator it;
for( it = m_lstTextCell.begin(); it != m_lstTextCell.end(); ++it )
if ( (*it).col == x && (*it).row == y && !found )
{
cell->setCellText( (*it).text );
found = true;
}
if( !found )
cell->setCellText( "", true );*/
}
}
else
{
QMap<QPoint,QString>::Iterator it2;
for ( it2 = m_lstTextCell.begin(); it2 != m_lstTextCell.end(); ++it2 )
{
Cell *cell = sheet->nonDefaultCell( it2.key().x(), it2.key().y() );
if ( it2.data().isEmpty() )
{
if ( !cell->text().isEmpty() )
cell->setCellText( "" );
}
else
cell->setCellText( it2.data() );
}
}
}
//sheet->updateView();
doc()->emitEndOperation();
doc()->undoUnlock();
}
void UndoChangeAreaTextCell::redo()
{
Sheet * sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
sheet->setRegionPaintDirty(m_region);
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect m_rctRect = (*it)->rect().normalize();
if ( !util_isRowSelected( m_rctRect )
&& !util_isColumnSelected( m_rctRect ) )
{
for ( int x = m_rctRect.left(); x <= m_rctRect.right(); ++x )
for ( int y = m_rctRect.top(); y <= m_rctRect.bottom(); ++y )
{
Cell* cell = sheet->nonDefaultCell( x, y );
const QPoint location(x,y);
if (m_lstRedoTextCell.contains(location))
cell->setCellText( m_lstRedoTextCell[location] );
else
cell->setCellText( "" , true );
/*bool found = false;
QValueList<textOfCell>::Iterator it;
for( it = m_lstRedoTextCell.begin(); it != m_lstRedoTextCell.end(); ++it )
if ( (*it).col == x && (*it).row == y && !found )
{
cell->setCellText( (*it).text );
found = true;
}
if( !found )
cell->setCellText( "", true );*/
}
}
else
{
QMap<QPoint,QString>::Iterator it2;
for ( it2 = m_lstRedoTextCell.begin(); it2 != m_lstRedoTextCell.end(); ++it2 )
{
Cell *cell = sheet->nonDefaultCell( it2.key().x(), it2.key().y() );
if ( it2.data().isEmpty() )
{
if ( !cell->text().isEmpty() )
cell->setCellText( "" );
}
else
cell->setCellText( it2.data() );
}
}
}
//sheet->updateView();
doc()->emitEndOperation();
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoMergedCell
*
***************************************************************************/
UndoMergedCell::UndoMergedCell( Doc *_doc, Sheet *_sheet, int _column, int _row , int _extraX,int _extraY) :
UndoAction( _doc )
{
name=i18n("Merge Cells");
m_sheetName = _sheet->sheetName();
m_iRow=_row;
m_iCol=_column;
m_iExtraX=_extraX;
m_iExtraY=_extraY;
}
UndoMergedCell::~UndoMergedCell()
{
}
void UndoMergedCell::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
Cell *cell = sheet->nonDefaultCell( m_iCol, m_iRow );
m_iExtraRedoX=cell->extraXCells();
m_iExtraRedoY=cell->extraYCells();
sheet->changeMergedCell( m_iCol, m_iRow, m_iExtraX,m_iExtraY);
doc()->undoUnlock();
}
void UndoMergedCell::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->changeMergedCell( m_iCol, m_iRow, m_iExtraRedoX,m_iExtraRedoY);
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoAutofill
*
***************************************************************************/
UndoAutofill::UndoAutofill( Doc *_doc, Sheet* sheet, const QRect & _selection)
: UndoAction( _doc )
{
name=i18n("Autofill");
m_sheetName = sheet->sheetName();
m_selection = _selection;
createListCell( m_data, sheet );
}
UndoAutofill::~UndoAutofill()
{
}
void UndoAutofill::createListCell( QCString &list, Sheet* sheet )
{
QDomDocument doc = sheet->saveCellRegion( m_selection );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
list = buffer.utf8();
int len = list.length();
char tmp = list[ len - 1 ];
list.resize( len );
*( list.data() + len - 1 ) = tmp;
}
void UndoAutofill::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
createListCell( m_dataRedo, sheet );
doc()->undoLock();
doc()->emitBeginOperation();
sheet->deleteCells( m_selection );
sheet->paste( m_data, m_selection );
//if(sheet->getAutoCalc()) sheet->recalc();
doc()->emitEndOperation();
//sheet->updateView();
doc()->undoUnlock();
}
void UndoAutofill::redo()
{
doc()->undoLock();
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->emitBeginOperation();
sheet->deleteCells( m_selection );
doc()->undoLock();
sheet->paste( m_dataRedo, m_selection );
if ( sheet->getAutoCalc() )
sheet->recalc();
sheet->updateView();
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoInsertCellRow
*
***************************************************************************/
UndoInsertCellRow::UndoInsertCellRow( Doc *_doc, Sheet *_sheet, const QRect &_rect ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Insert Cell");
m_sheetName = _sheet->sheetName();
m_rect=_rect;
}
UndoInsertCellRow::~UndoInsertCellRow()
{
}
void UndoInsertCellRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->unshiftRow( m_rect);
doc()->undoUnlock();
undoFormulaReference();
}
void UndoInsertCellRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->shiftRow( m_rect);
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoInsertCellCol
*
***************************************************************************/
UndoInsertCellCol::UndoInsertCellCol( Doc *_doc, Sheet *_sheet, const QRect &_rect ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Insert Cell");
m_sheetName = _sheet->sheetName();
m_rect=_rect;
}
UndoInsertCellCol::~UndoInsertCellCol()
{
}
void UndoInsertCellCol::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->unshiftColumn( m_rect);
doc()->undoUnlock();
undoFormulaReference();
}
void UndoInsertCellCol::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->shiftColumn( m_rect );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoRemoveCellRow
*
***************************************************************************/
UndoRemoveCellRow::UndoRemoveCellRow( Doc *_doc, Sheet *_sheet, const QRect &rect ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Remove Cell");
m_sheetName = _sheet->sheetName();
m_rect=rect;
QDomDocument doc = _sheet->saveCellRegion( m_rect );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
m_data = buffer.utf8();
int len = m_data.length();
char tmp = m_data[ len - 1 ];
m_data.resize( len );
*( m_data.data() + len - 1 ) = tmp;
}
UndoRemoveCellRow::~UndoRemoveCellRow()
{
}
void UndoRemoveCellRow::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->shiftRow( m_rect );
sheet->paste( m_data, m_rect );
doc()->undoUnlock();
undoFormulaReference();
}
void UndoRemoveCellRow::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->unshiftRow( m_rect);
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoRemoveCellCol
*
***************************************************************************/
UndoRemoveCellCol::UndoRemoveCellCol( Doc *_doc, Sheet *_sheet, const QRect &_rect ) :
UndoInsertRemoveAction( _doc )
{
name=i18n("Remove Cell");
m_sheetName = _sheet->sheetName();
m_rect=_rect;
QDomDocument doc = _sheet->saveCellRegion( m_rect );
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
m_data = buffer.utf8();
int len = m_data.length();
char tmp = m_data[ len - 1 ];
m_data.resize( len );
*( m_data.data() + len - 1 ) = tmp;
}
UndoRemoveCellCol::~UndoRemoveCellCol()
{
}
void UndoRemoveCellCol::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->shiftColumn( m_rect );
sheet->paste( m_data, m_rect );
doc()->undoUnlock();
undoFormulaReference();
}
void UndoRemoveCellCol::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->unshiftColumn( m_rect );
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoConditional
*
***************************************************************************/
UndoConditional::UndoConditional( Doc *_doc, Sheet* sheet, const Region & _selection)
: UndoAction( _doc )
{
name=i18n("Conditional Cell Attribute");
m_sheetName = sheet->sheetName();
m_region = _selection;
createListCell( m_data, sheet );
}
UndoConditional::~UndoConditional()
{
}
void UndoConditional::createListCell( QCString &list, Sheet* sheet )
{
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
QDomDocument doc = sheet->saveCellRegion( m_region );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
list = buffer.utf8();
int len = list.length();
char tmp = list[ len - 1 ];
list.resize( len );
*( list.data() + len - 1 ) = tmp;
}
void UndoConditional::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
createListCell( m_dataRedo, sheet );
doc()->undoLock();
sheet->paste(m_data, m_region.boundingRect());
if (sheet->getAutoCalc())
{
sheet->recalc();
}
doc()->undoUnlock();
}
void UndoConditional::redo()
{
doc()->undoLock();
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
sheet->paste(m_dataRedo, m_region.boundingRect());
if (sheet->getAutoCalc())
{
sheet->recalc();
}
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoCellPaste
*
***************************************************************************/
UndoCellPaste::UndoCellPaste(Doc *_doc, Sheet* sheet,
int _xshift, int _yshift,
const Region& region, bool insert, int _insertTo)
: UndoAction( _doc )
{
if(!insert)
name=i18n("Paste");
else
name=i18n("Paste & Insert");
m_sheetName = sheet->sheetName();
m_region = region;
xshift=_xshift;
yshift=_yshift;
b_insert=insert;
m_iInsertTo=_insertTo;
if( !b_insert)
createListCell( m_data, m_lstColumn,m_lstRow,sheet );
}
UndoCellPaste::~UndoCellPaste()
{
}
void UndoCellPaste::createListCell(QCString& listCell,
QValueList<columnSize>& listCol,
QValueList<rowSize>& listRow,
Sheet* sheet)
{
listCol.clear();
listRow.clear();
Region::ConstIterator endOfList = m_region.constEnd();
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
int nbCol = 0;
int nbRow = 0;
QRect range = (*it)->rect().normalize();
if ((*it)->isColumn())
{
nbCol = range.width();
}
else if ((*it)->isRow())
{
nbRow = range.height();
}
// copy column(s)
if (nbCol != 0)
{
//save size of columns
for( int y = 1; y <=nbCol ; ++y )
{
ColumnFormat *cl=sheet->columnFormat(y);
if(!cl->isDefault())
{
columnSize tmpSize;
tmpSize.columnNumber=y;
tmpSize.columnWidth=cl->dblWidth();
listCol.append(tmpSize);
}
}
}
//copy a row(s)
else if (nbRow != 0)
{
//save size of columns
for ( int y = 1; y <=nbRow ; ++y )
{
RowFormat *rw=sheet->rowFormat(y);
if (!rw->isDefault())
{
rowSize tmpSize;
tmpSize.rowNumber=y;
tmpSize.rowHeight=rw->dblHeight();
listRow.append(tmpSize);
}
}
}
}
//save all cells in area
QDomDocument doc = sheet->saveCellRegion(m_region);
// Save to buffer
QString buffer;
QTextStream str( &buffer, IO_WriteOnly );
str << doc;
// This is a terrible hack to store unicode
// data in a QCString in a way that
// QCString::length() == QCString().size().
// This allows us to treat the QCString like a QByteArray later on.
listCell = buffer.utf8();
int len = listCell.length();
char tmp = listCell[ len - 1 ];
listCell.resize( len );
*( listCell.data() + len - 1 ) = tmp;
}
void UndoCellPaste::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
createListCell( m_dataRedo, m_lstRedoColumn, m_lstRedoRow, sheet );
doc()->undoLock();
doc()->emitBeginOperation();
uint numCols = 0;
uint numRows = 0;
Region::ConstIterator endOfList = m_region.constEnd();
for (Region::ConstIterator it = --m_region.constEnd(); it != endOfList; --it)
{
QRect range = (*it)->rect().normalize();
if ((*it)->isColumn())
{
if (!b_insert)
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstColumn.begin(); it2 != m_lstColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->nonDefaultColumnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
else
{
numCols += range.width();
}
}
else if ((*it)->isRow())
{
if (!b_insert)
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRow.begin(); it2 != m_lstRow.end(); ++it2 )
{
RowFormat *rw=sheet->nonDefaultRowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
else
{
numRows += range.height();
}
}
if (!b_insert)
{
sheet->deleteCells(range);
}
} // for (Region::...
if (b_insert) // with insertion
{
QRect rect = m_region.boundingRect();
if (m_iInsertTo == -1 && numCols == 0 && numRows == 0)
{
// substract already removed columns
rect.setWidth(rect.width());
sheet->unshiftRow(rect);
}
else if (m_iInsertTo == 1 && numCols == 0 && numRows == 0)
{
// substract already removed rows
rect.setHeight(rect.height());
sheet->unshiftColumn(rect);
}
// delete columns
else if (m_iInsertTo == 0 && numCols == 0 && numRows > 0)
{
sheet->removeRow(rect.top(), rect.height() - 1, false);
}
// delete rows
else if (m_iInsertTo == 0 && numCols > 0 && numRows == 0)
{
sheet->removeColumn(rect.left(), rect.width() - 1, false);
}
}
else // without insertion
{
sheet->paste(m_data, m_region.boundingRect());
}
if (sheet->getAutoCalc())
{
sheet->recalc();
}
sheet->updateView();
doc()->undoUnlock();
}
void UndoCellPaste::redo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
uint numCols = 0;
uint numRows = 0;
Region::ConstIterator endOfList(m_region.constEnd());
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
QRect range = (*it)->rect().normalize();
if ((*it)->isColumn())
{
numCols += range.width();
}
else if ((*it)->isRow())
{
numRows += range.height();
}
else
{
if (!b_insert)
{
sheet->deleteCells( range );
}
}
} // for (Region::...
if (b_insert)
{
QRect rect = m_region.boundingRect();
if (m_iInsertTo == -1 && numCols == 0 && numRows == 0)
{
rect.setWidth(rect.width());
sheet->shiftRow(rect);
}
else if (m_iInsertTo == 1 && numCols == 0 && numRows == 0)
{
rect.setHeight(rect.height());
sheet->shiftColumn(rect);
}
// insert columns
else if (m_iInsertTo == 0 && numCols == 0 && numRows > 0)
{
sheet->insertRow(rect.top(), rect.height() - 1, false);
}
// insert rows
else if (m_iInsertTo == 0 && numCols > 0 && numRows == 0)
{
sheet->insertColumn(rect.left(), rect.width() - 1, false);
}
}
for (Region::ConstIterator it = m_region.constBegin(); it != endOfList; ++it)
{
if ((*it)->isColumn())
{
QValueList<columnSize>::Iterator it2;
for ( it2 = m_lstRedoColumn.begin(); it2 != m_lstRedoColumn.end(); ++it2 )
{
ColumnFormat *cl=sheet->nonDefaultColumnFormat((*it2).columnNumber);
cl->setDblWidth((*it2).columnWidth);
}
}
else if ((*it)->isRow())
{
QValueList<rowSize>::Iterator it2;
for ( it2 = m_lstRedoRow.begin(); it2 != m_lstRedoRow.end(); ++it2 )
{
RowFormat *rw=sheet->nonDefaultRowFormat((*it2).rowNumber);
rw->setDblHeight((*it2).rowHeight);
}
}
} // for (Region::...
sheet->paste( m_dataRedo, m_region.boundingRect() );
if (sheet->getAutoCalc())
{
sheet->recalc();
}
sheet->updateView();
doc()->undoUnlock();
}
/****************************************************************************
*
* UndoStyleCell
*
***************************************************************************/
UndoStyleCell::UndoStyleCell( Doc *_doc, Sheet* sheet, const QRect & _selection)
: UndoAction( _doc )
{
name=i18n("Style of Cell");
m_sheetName = sheet->sheetName();
m_selection = _selection;
createListCell( m_lstStyleCell, sheet );
}
UndoStyleCell::~UndoStyleCell()
{
}
void UndoStyleCell::createListCell( QValueList<styleCell> &listCell, Sheet* sheet )
{
int bottom = m_selection.bottom();
int right = m_selection.right();
if ( util_isColumnSelected( m_selection ) )
{
Cell * c;
for ( int col = m_selection.left(); col <= right; ++ col )
{
c = sheet->getFirstCellColumn( col );
while ( c )
{
if ( !c->isPartOfMerged() )
{
styleCell tmpStyleCell;
tmpStyleCell.row = c->row();
tmpStyleCell.col = col;
listCell.append(tmpStyleCell);
}
c = sheet->getNextCellDown( col, c->row() );
}
}
}
else if ( util_isRowSelected( m_selection ) )
{
Cell * c;
for ( int row = m_selection.top(); row <= bottom; ++row )
{
c = sheet->getFirstCellRow( row );
while ( c )
{
if ( !c->isPartOfMerged() )
{
styleCell tmpStyleCell;
tmpStyleCell.row = row;
tmpStyleCell.col = c->column();
listCell.append(tmpStyleCell);
}
c = sheet->getNextCellRight( c->column(), row );
}
}
}
else
{
Cell * cell;
for ( int i = m_selection.top(); i <= bottom; ++i)
for ( int j = m_selection.left(); j <= right; ++j )
{
cell = sheet->nonDefaultCell( j, i);
styleCell tmpStyleCell;
tmpStyleCell.row = i;
tmpStyleCell.col = j;
listCell.append(tmpStyleCell);
}
}
}
void UndoStyleCell::undo()
{
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
createListCell( m_lstRedoStyleCell, sheet );
doc()->undoLock();
doc()->emitBeginOperation();
QValueList<styleCell>::Iterator it2;
for ( it2 = m_lstStyleCell.begin(); it2 != m_lstStyleCell.end(); ++it2 )
{
sheet->nonDefaultCell( (*it2).col, (*it2).row);
}
sheet->setRegionPaintDirty(m_selection);
sheet->updateView( m_selection );
doc()->undoUnlock();
}
void UndoStyleCell::redo()
{
doc()->undoLock();
Sheet* sheet = doc()->map()->findSheet( m_sheetName );
if ( !sheet )
return;
doc()->undoLock();
doc()->emitBeginOperation();
QValueList<styleCell>::Iterator it2;
for ( it2 = m_lstRedoStyleCell.begin(); it2 != m_lstRedoStyleCell.end(); ++it2 )
{
sheet->nonDefaultCell( (*it2).col, (*it2).row);
}
sheet->setRegionPaintDirty(m_selection);
sheet->updateView();
doc()->undoUnlock();
}
UndoInsertData::UndoInsertData( Doc * _doc, Sheet * _sheet, QRect & _selection )
: UndoChangeAreaTextCell( _doc, _sheet, _selection )
{
name = i18n("Insert Data From Database");
}