diff options
Diffstat (limited to 'sw/source/ui/table/swtablerep.cxx')
-rw-r--r-- | sw/source/ui/table/swtablerep.cxx | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/sw/source/ui/table/swtablerep.cxx b/sw/source/ui/table/swtablerep.cxx new file mode 100644 index 000000000000..a3ca467f4d1a --- /dev/null +++ b/sw/source/ui/table/swtablerep.cxx @@ -0,0 +1,201 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#include <hintids.hxx> +#include <vcl/msgbox.hxx> +#include <svl/stritem.hxx> +#include <svl/intitem.hxx> +#include <editeng/keepitem.hxx> +#include <editeng/brkitem.hxx> +#include <editeng/ulspitem.hxx> +#include <editeng/frmdiritem.hxx> +#include <svl/ctloptions.hxx> +#include <swmodule.hxx> +#include <fmtornt.hxx> +#include <fmtpdsc.hxx> +#include <fmtlsplt.hxx> + +#include <svtools/htmlcfg.hxx> +#include <fmtrowsplt.hxx> +#include <svx/htmlmode.hxx> + +#include <docsh.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <viewopt.hxx> +#include <uitool.hxx> +#include <frmatr.hxx> + +#include <tablepg.hxx> +#include <tablemgr.hxx> +#include <pagedesc.hxx> +#include <poolfmt.hxx> +#include <SwStyleNameMapper.hxx> + +#include <cmdid.h> +#include <tabledlg.hrc> +#include <table.hrc> +#include "swtablerep.hxx" + + +SwTableRep::SwTableRep( const SwTabCols& rTabCol, sal_Bool bCplx ) + : + nTblWidth(0), + nSpace(0), + nLeftSpace(0), + nRightSpace(0), + nAlign(0), + nWidthPercent(0), + bComplex(bCplx), + bLineSelected(sal_False), + bWidthChanged(sal_False), + bColsChanged(sal_False) +{ + nAllCols = nColCount = rTabCol.Count(); + pTColumns = new TColumn[ nColCount + 1 ]; + SwTwips nStart = 0, + nEnd; + for( sal_uInt16 i = 0; i < nAllCols; ++i ) + { + nEnd = rTabCol[ i ] - rTabCol.GetLeft(); + pTColumns[ i ].nWidth = nEnd - nStart; + pTColumns[ i ].bVisible = !rTabCol.IsHidden(i); + if(!pTColumns[ i ].bVisible) + nColCount --; + nStart = nEnd; + } + pTColumns[ nAllCols ].nWidth = rTabCol.GetRight() - rTabCol.GetLeft() - nStart; + pTColumns[ nAllCols ].bVisible = sal_True; + nColCount++; + nAllCols++; +} + +SwTableRep::~SwTableRep() +{ + delete[] pTColumns; +} + +sal_Bool SwTableRep::FillTabCols( SwTabCols& rTabCols ) const +{ + long nOldLeft = rTabCols.GetLeft(), + nOldRight = rTabCols.GetRight(); + + sal_Bool bSingleLine = sal_False; + sal_uInt16 i; + + for ( i = 0; i < rTabCols.Count(); ++i ) + if(!pTColumns[i].bVisible) + { + bSingleLine = sal_True; + break; + } + + SwTwips nPos = 0; + SwTwips nLeft = GetLeftSpace(); + rTabCols.SetLeft(nLeft); + if(bSingleLine) + { + // die unsichtbaren Trenner werden aus den alten TabCols genommen + // die sichtbaren kommen aus pTColumns + TColumn* pOldTColumns = new TColumn[nAllCols + 1]; + SwTwips nStart = 0, + nEnd; + for(i = 0; i < nAllCols - 1; i++) + { + nEnd = rTabCols[i] - rTabCols.GetLeft(); + pOldTColumns[i].nWidth = nEnd - nStart; + pOldTColumns[i].bVisible = !rTabCols.IsHidden(i); + nStart = nEnd; + } + pOldTColumns[nAllCols - 1].nWidth = rTabCols.GetRight() - rTabCols.GetLeft() - nStart; + pOldTColumns[nAllCols - 1].bVisible = sal_True; + + sal_uInt16 nOldPos = 0; + sal_uInt16 nNewPos = 0; + SwTwips nOld = 0; + SwTwips nNew = 0; + sal_Bool bOld = sal_False; + sal_Bool bFirst = sal_True; + i = 0; + + while ( i < nAllCols -1 ) + { + while((bFirst || bOld ) && nOldPos < nAllCols ) + { + nOld += pOldTColumns[nOldPos].nWidth; + nOldPos++; + if(!pOldTColumns[nOldPos - 1].bVisible) + break; + } + while((bFirst || !bOld ) && nNewPos < nAllCols ) + { + nNew += pTColumns[nNewPos].nWidth; + nNewPos++; + if(pOldTColumns[nNewPos - 1].bVisible) + break; + } + bFirst = sal_False; + // sie muessen sortiert eingefuegt werden + bOld = nOld < nNew; + nPos = sal_uInt16(bOld ? nOld : nNew); + rTabCols[i] = nPos + nLeft; + rTabCols.SetHidden( i, bOld ); + i++; + } + rTabCols.SetRight(nLeft + nTblWidth); + + delete[] pOldTColumns; + } + else + { + for ( i = 0; i < nAllCols - 1; ++i ) + { + nPos += pTColumns[i].nWidth; + rTabCols[i] = nPos + rTabCols.GetLeft(); + rTabCols.SetHidden( i, !pTColumns[i].bVisible ); + rTabCols.SetRight(nLeft + pTColumns[nAllCols - 1].nWidth + nPos); + } + } + +// Rundungsfehler abfangen + if(Abs((long)nOldLeft - (long)rTabCols.GetLeft()) < 3) + rTabCols.SetLeft(nOldLeft); + + if(Abs((long)nOldRight - (long)rTabCols.GetRight()) < 3) + rTabCols.SetRight(nOldRight); + + if(GetRightSpace() >= 0 && + rTabCols.GetRight() > rTabCols.GetRightMax()) + rTabCols.SetRight(rTabCols.GetRightMax()); + return bSingleLine; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |