summaryrefslogtreecommitdiff
path: root/sw/source/core/edit/edtab.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/edit/edtab.cxx')
-rw-r--r--sw/source/core/edit/edtab.cxx713
1 files changed, 713 insertions, 0 deletions
diff --git a/sw/source/core/edit/edtab.cxx b/sw/source/core/edit/edtab.cxx
new file mode 100644
index 000000000000..5d5178dfcccd
--- /dev/null
+++ b/sw/source/core/edit/edtab.cxx
@@ -0,0 +1,713 @@
+/*************************************************************************
+ *
+ * $RCSfile: edtab.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-19 00:08:18 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifdef PRECOMPILED
+#include "core_pch.hxx"
+#endif
+
+#pragma hdrstop
+
+#define ITEMID_BOXINFO SID_ATTR_BORDER_INNER
+#ifndef _HINTIDS_HXX
+#include <hintids.hxx>
+#endif
+
+#define _SVSTDARR_ULONGS
+#include <svtools/svstdarr.hxx>
+
+#ifndef _APP_HXX //autogen
+#include <vcl/svapp.hxx>
+#endif
+#ifndef _WINDOW_HXX //autogen
+#include <vcl/window.hxx>
+#endif
+#ifndef _SVX_BOXITEM_HXX //autogen
+#include <svx/boxitem.hxx>
+#endif
+
+#ifndef _SWWAIT_HXX
+#include <swwait.hxx>
+#endif
+#ifndef _FMTFSIZE_HXX //autogen
+#include <fmtfsize.hxx>
+#endif
+#ifndef _FRMATR_HXX
+#include <frmatr.hxx>
+#endif
+#ifndef _EDITSH_HXX
+#include <editsh.hxx>
+#endif
+#ifndef _DOC_HXX
+#include <doc.hxx>
+#endif
+#ifndef _CNTFRM_HXX
+#include <cntfrm.hxx>
+#endif
+#ifndef _LAYFRM_HXX
+#include <layfrm.hxx>
+#endif
+#ifndef _PAM_HXX
+#include <pam.hxx>
+#endif
+#ifndef _NDTXT_HXX
+#include <ndtxt.hxx>
+#endif
+#ifndef _HINTS_HXX
+#include <hints.hxx>
+#endif
+#ifndef _FLDBAS_HXX
+#include <fldbas.hxx>
+#endif
+#ifndef _NODE_HXX
+#include <node.hxx>
+#endif
+#ifndef _SWTABLE_HXX
+#include <swtable.hxx>
+#endif
+#ifndef _SWUNDO_HXX
+#include <swundo.hxx>
+#endif
+#ifndef _TBLSEL_HXX
+#include <tblsel.hxx>
+#endif
+#ifndef _EDIMP_HXX
+#include <edimp.hxx>
+#endif
+#ifndef _TABFRM_HXX
+#include <tabfrm.hxx>
+#endif
+#ifndef _CELLFRM_HXX
+#include <cellfrm.hxx>
+#endif
+#ifndef _CELLATR_HXX
+#include <cellatr.hxx>
+#endif
+#ifndef _SWTBLFMT_HXX
+#include <swtblfmt.hxx>
+#endif
+#ifndef _SWDDETBL_HXX
+#include <swddetbl.hxx>
+#endif
+#ifndef _MDIEXP_HXX
+#include <mdiexp.hxx>
+#endif
+
+extern void ClearFEShellTabCols();
+
+const SwTable& SwEditShell::InsertTable( USHORT nRows, USHORT nCols,
+ SwHoriOrient eAdj,
+ USHORT nInsTblFlags,
+ const SwTableAutoFmt* pTAFmt )
+{
+ StartAllAction();
+ SwPosition* pPos = GetCrsr()->GetPoint();
+
+ BOOL bEndUndo = 0 != pPos->nContent.GetIndex();
+ if( bEndUndo )
+ {
+ StartUndo( UNDO_START );
+ GetDoc()->SplitNode( *pPos );
+ }
+ const SwTable *pTable = GetDoc()->InsertTable( *pPos, nRows, nCols,
+ eAdj, nInsTblFlags, pTAFmt );
+ if( bEndUndo )
+ EndUndo( UNDO_END );
+
+ EndAllAction();
+ return *pTable;
+}
+
+BOOL SwEditShell::TextToTable( sal_Unicode cCh, SwHoriOrient eAdj,
+ USHORT nInsTblFlags,
+ const SwTableAutoFmt* pTAFmt )
+{
+ SwWait aWait( *GetDoc()->GetDocShell(), TRUE );
+ BOOL bRet = FALSE;
+ StartAllAction();
+ FOREACHPAM_START(this)
+ if( PCURCRSR->HasMark() )
+ bRet |= 0 != GetDoc()->TextToTable( *PCURCRSR, cCh, eAdj,
+ nInsTblFlags, pTAFmt );
+ FOREACHPAM_END()
+ EndAllAction();
+ return bRet;
+}
+
+BOOL SwEditShell::TableToText( sal_Unicode cCh )
+{
+ SwWait aWait( *GetDoc()->GetDocShell(), TRUE );
+ BOOL bRet = FALSE;
+ SwPaM* pCrsr = GetCrsr();
+ const SwTableNode* pTblNd =
+ GetDoc()->IsIdxInTbl( pCrsr->GetPoint()->nNode );
+ if( IsTableMode() )
+ {
+ ClearMark();
+ pCrsr = GetCrsr();
+ }
+ else if( !pTblNd || pCrsr->GetNext() != pCrsr )
+ return bRet;
+
+ StartAllAction();
+
+ // verschiebe den akt. Cursor aus dem Tabellen Bereich
+ // angemeldet ist
+#ifdef USED
+ SwNodeIndex aTabIdx( pCrsr->GetPoint()->nNode );
+#else
+ SwNodeIndex aTabIdx( *pTblNd );
+#endif
+ pCrsr->DeleteMark();
+ pCrsr->GetPoint()->nNode = *pTblNd->EndOfSectionNode();
+ pCrsr->GetPoint()->nContent.Assign( 0, 0 );
+ // SPoint und Mark aus dem Bereich verschieben !!!
+ pCrsr->SetMark();
+ pCrsr->DeleteMark();
+
+ bRet = GetDoc()->TableToText( pTblNd, cCh );
+ pCrsr->GetPoint()->nNode = aTabIdx;
+#ifdef USED
+ pCrsr->Move( fnMoveBackward, fnGoNode );
+#else
+ SwCntntNode* pCNd = pCrsr->GetCntntNode();
+ if( !pCNd )
+ pCrsr->Move( fnMoveForward, fnGoCntnt );
+ else
+ pCrsr->GetPoint()->nContent.Assign( pCNd, 0 );
+#endif
+
+ EndAllAction();
+ return bRet;
+}
+
+FASTBOOL SwEditShell::IsTextToTableAvailable() const
+{
+ FASTBOOL bOnlyText = FALSE;
+ FOREACHPAM_START(this)
+ if( PCURCRSR->HasMark() )
+ {
+ bOnlyText = TRUE;
+
+ // pruefe ob in der Selection eine Tabelle liegt
+ ULONG nStt = PCURCRSR->GetMark()->nNode.GetIndex(),
+ nEnd = PCURCRSR->GetPoint()->nNode.GetIndex();
+ if( nStt > nEnd ) { ULONG n = nStt; nStt = nEnd; nEnd = n; }
+
+ for( ; nStt <= nEnd; ++nStt )
+ if( !GetDoc()->GetNodes()[ nStt ]->IsTxtNode() )
+ {
+ bOnlyText = FALSE;
+ break;
+ }
+
+ if( !bOnlyText )
+ break;
+ }
+ FOREACHPAM_END()
+
+ return bOnlyText;
+}
+
+
+void SwEditShell::InsertDDETable( SwDDEFieldType* pDDEType,
+ USHORT nRows, USHORT nCols,
+ SwHoriOrient eAdj,
+ USHORT nInsTblFlags )
+{
+ SwPosition* pPos = GetCrsr()->GetPoint();
+
+ ASSERT( !GetDoc()->IsIdxInTbl( pPos->nNode ),
+ "Tabelle in Tabelle nicht erlaubt" );
+
+ StartAllAction();
+
+ BOOL bEndUndo = 0 != pPos->nContent.GetIndex();
+ if( bEndUndo )
+ {
+ StartUndo( UNDO_START );
+ GetDoc()->SplitNode( *pPos );
+ }
+
+ SwTable* pTbl = (SwTable*)GetDoc()->InsertTable( *pPos, nRows, nCols, eAdj,
+ nInsTblFlags|DEFAULT_BORDER );
+ SwTableNode* pTblNode = (SwTableNode*)pTbl->GetTabSortBoxes()[ 0 ]->
+ GetSttNd()->FindTableNode();
+ SwDDETable* pDDETbl = new SwDDETable( *pTbl, pDDEType );
+ pTblNode->SetNewTable( pDDETbl ); // setze die DDE-Tabelle
+
+ if( bEndUndo )
+ EndUndo( UNDO_END );
+
+ EndAllAction();
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Tabellenfelder einer Tabelle updaten
+ --------------------------------------------------------------------*/
+void SwEditShell::UpdateTable()
+{
+ const SwTableNode* pTblNd = IsCrsrInTbl();
+
+ // Keine Arme keine Kekse
+ if( pTblNd )
+ {
+ StartAllAction();
+ StartUndo();
+ EndAllTblBoxEdit();
+ SwTableFmlUpdate aTblUpdate( (SwTable*)&pTblNd->GetTable() );
+ GetDoc()->UpdateTblFlds( &aTblUpdate );
+ EndUndo();
+ EndAllAction();
+ }
+}
+
+ // Change Modus erfragen/setzen
+USHORT SwEditShell::GetTblChgMode() const
+{
+ USHORT nMode;
+ const SwTableNode* pTblNd = IsCrsrInTbl();
+ if( pTblNd )
+ nMode = pTblNd->GetTable().GetTblChgMode();
+ else
+ nMode = GetTblChgDefaultMode();
+ return nMode;
+}
+
+void SwEditShell::SetTblChgMode( USHORT eMode )
+{
+ const SwTableNode* pTblNd = IsCrsrInTbl();
+
+ // Keine Arme keine Kekse
+ if( pTblNd )
+ {
+ ((SwTable&)pTblNd->GetTable()).SetTblChgMode( (TblChgMode)eMode );
+ if( !GetDoc()->IsModified() ) // Bug 57028
+ GetDoc()->SetUndoNoResetModified();
+ GetDoc()->SetModified();
+ }
+}
+
+BOOL SwEditShell::GetTblBoxFormulaAttrs( SfxItemSet& rSet ) const
+{
+ SwSelBoxes aBoxes;
+ if( IsTableMode() )
+ ::GetTblSelCrs( *this, aBoxes );
+ else
+ {
+ SwPaM *pCrsr = GetCrsr();
+ do {
+ SwFrm *pFrm = GetCurrFrm();
+ do {
+ pFrm = pFrm->GetUpper();
+ } while ( pFrm && !pFrm->IsCellFrm() );
+ if ( pFrm )
+ {
+ SwTableBox *pBox = (SwTableBox*)((SwCellFrm*)pFrm)->GetTabBox();
+ aBoxes.Insert( pBox );
+ }
+ } while( FALSE
+ // JP 24.01.97: dann nur die akt. Zelle!!
+ /*((SwEditShell*)this)->GoNextCrsr() && pCrsr != GetCrsr()*/ );
+ }
+
+ for( USHORT n = 0; n < aBoxes.Count(); ++n )
+ {
+ const SwTableBox* pSelBox = aBoxes[ n ];
+ const SwTableBoxFmt* pTblFmt = (SwTableBoxFmt*)pSelBox->GetFrmFmt();
+ if( !n )
+ {
+ // Formeln in die externe Darstellung bringen!
+ const SwTable& rTbl = pSelBox->GetSttNd()->FindTableNode()->GetTable();
+
+ SwTableFmlUpdate aTblUpdate( (SwTable*)&rTbl );
+ aTblUpdate.eFlags = TBL_BOXNAME;
+ ((SwDoc*)GetDoc())->UpdateTblFlds( &aTblUpdate );
+
+ rSet.Put( pTblFmt->GetAttrSet() );
+ }
+ else
+ rSet.MergeValues( pTblFmt->GetAttrSet() );
+ }
+ return 0 != rSet.Count();
+}
+
+void SwEditShell::SetTblBoxFormulaAttrs( const SfxItemSet& rSet )
+{
+ SET_CURR_SHELL( this );
+ SwSelBoxes aBoxes;
+ if( IsTableMode() )
+ ::GetTblSelCrs( *this, aBoxes );
+ else
+ {
+ SwPaM *pCrsr = GetCrsr();
+ do {
+ SwFrm *pFrm = GetCurrFrm();
+ do {
+ pFrm = pFrm->GetUpper();
+ } while ( pFrm && !pFrm->IsCellFrm() );
+ if ( pFrm )
+ {
+ SwTableBox *pBox = (SwTableBox*)((SwCellFrm*)pFrm)->GetTabBox();
+ aBoxes.Insert( pBox );
+ }
+ } while( FALSE
+ // JP 24.01.97: dann nur die akt. Zelle!!
+ /*GoNextCrsr() && pCrsr != GetCrsr()*/ );
+ }
+
+ // beim setzen einer Formel keine Ueberpruefung mehr vornehmen!
+ if( SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMULA ))
+ ClearTblBoxCntnt();
+
+ StartAllAction();
+ GetDoc()->StartUndo( UNDO_START );
+ for( USHORT n = 0; n < aBoxes.Count(); ++n )
+ GetDoc()->SetTblBoxFormulaAttrs( *aBoxes[ n ], rSet );
+ GetDoc()->EndUndo( UNDO_END );
+ EndAllAction();
+}
+
+ // Zellenbreiten ueber Min/Max Berechnung an Tabellenbreite anpassen
+void SwEditShell::OptimizeTblBoxWidthMinMax()
+{
+ SET_CURR_SHELL( this );
+
+ SwPaM *pCrsr = GetCrsr();
+ SwTableNode* pTblNd = pCrsr->GetNode()->FindTableNode();
+ if( pTblNd && !pTblNd->GetTable().IsTblComplex() )
+ {
+ SwTabFrm* pTabFrm = 0;
+ SvULongs aMinArr( 16, 16 ), aMaxArr( 16, 16 );
+
+ // ueber alle Spalten aller Zeilen und die Min/Max Breiten einsammeln
+ SwTableLines& rTblLns = pTblNd->GetTable().GetTabLines();
+ for( USHORT n = rTblLns.Count(); n; )
+ {
+ SwTableBoxes& rTblBxs = rTblLns[ --n ]->GetTabBoxes();
+ for( USHORT i = 0; i < rTblBxs.Count(); ++i )
+ {
+ SwTableBox* pBox = rTblBxs[ i ];
+
+ ULONG nMinCell = 0;
+ ULONG nMaxCell = 0;
+
+ // ueber alle Absaetze und die Min/Maxbreiten berechnen
+ const SwStartNode* pSttNd = pBox->GetSttNd();
+ SwNodeIndex aIdx( *pSttNd, 1 );
+ SwNodeIndex aEnd( *pSttNd->EndOfSectionNode() );
+ while( aIdx < aEnd )
+ {
+ SwTxtNode *pTxtNd = aIdx.GetNode().GetTxtNode();
+ if( pTxtNd )
+ {
+ ULONG nMinCnts;
+ ULONG nMaxCnts;
+ ULONG nAbsMinCnts;
+ pTxtNd->GetMinMaxSize( aIdx.GetIndex(), nMinCnts,
+ nMaxCnts, nAbsMinCnts );
+
+ if( nMinCnts > nMinCell )
+ nMinCell = nMinCnts;
+ if( nMaxCnts > nMaxCell )
+ nMaxCell = nMaxCnts;
+
+ if( !pTabFrm )
+ {
+ SwCntntFrm* pCFrm = pTxtNd->GetFrm( 0, 0, FALSE );
+ if( pCFrm )
+ pTabFrm = pCFrm->FindTabFrm();
+ }
+ }
+ aIdx++;
+ }
+
+ // Mindestbreite fuer Inhalt einhalten
+ if( nMinCell < MINLAY )
+ nMinCell = MINLAY;
+ if( nMaxCell < MINLAY )
+ nMaxCell = MINLAY;
+
+ // Umrandung und Abstand zum Inhalt beachten
+ const SvxBoxItem& rBoxItem = pBox->GetFrmFmt()->GetBox();
+ USHORT nBrdDist = 0;
+ if( rBoxItem.GetLeft() )
+ {
+ USHORT nWidth = rBoxItem.GetLeft()->GetOutWidth() +
+ rBoxItem.GetLeft()->GetInWidth();
+ if( !nBrdDist )
+ nBrdDist = rBoxItem.GetLeft()->GetDistance();
+
+ nMinCell += nWidth;
+ nMaxCell += nWidth;
+ }
+ if( rBoxItem.GetRight() )
+ {
+ USHORT nWidth = rBoxItem.GetRight()->GetOutWidth() +
+ rBoxItem.GetRight()->GetInWidth();
+ if( !nBrdDist )
+ nBrdDist = rBoxItem.GetRight()->GetDistance();
+
+ nMinCell += nWidth;
+ nMaxCell += nWidth;
+ }
+ if( !nBrdDist )
+ nBrdDist = MIN_BORDER_DIST;
+ nMinCell += 2 * nBrdDist;
+ nMaxCell += 2 * nBrdDist;
+
+ // Max/Min-Werte in den Arrays merken
+ if( i >= aMinArr.Count() )
+ aMinArr.Insert( nMinCell, i );
+ else if( nMinCell > aMinArr[ i ] )
+ aMinArr.Replace( nMinCell, i );
+
+ if( i >= aMaxArr.Count() )
+ aMaxArr.Insert( nMaxCell, i );
+ else if( nMaxCell > aMaxArr[ i ] )
+ aMaxArr.Replace( nMaxCell, i );
+ }
+ }
+
+ ASSERT( pTabFrm, "ohne TabFrm kann nichts berechnet werden" );
+ if( pTabFrm )
+ {
+ // 2. Teil die Zellen an die Breiten anpassen
+ ULONG nTableMin = 0;
+ ULONG nTableMax = 0;
+ for( n = aMinArr.Count(); n; )
+ {
+ nTableMin += aMinArr[ --n ];
+ nTableMax += aMaxArr[ n ];
+ }
+
+ // Dann errechne mal die Breiten fuer die Spalten. Die Werte
+ // werden im MinArray gesammelt!
+
+ // die MinBreite ist schon groesser als der vorgesehene Platz
+ ULONG nAbsTabWidth = pTabFrm->Prt().Width();
+ if( nTableMin > nAbsTabWidth )
+ {
+ for( n = aMinArr.Count(); n; )
+ {
+ ULONG nColMin = aMinArr[ --n ];
+ nColMin *= nAbsTabWidth;
+ nColMin /= nTableMin;
+ aMinArr.Replace( nColMin, n );
+ }
+ }
+ // die MaxBreite ist kleiner als der vorgesehene Platz
+ else if( nTableMax < nAbsTabWidth )
+ {
+ for( n = aMinArr.Count(); n; )
+ {
+ ULONG nColMax = aMaxArr[ --n ];
+ nColMax *= nAbsTabWidth;
+ nColMax /= nTableMax;
+ aMinArr.Replace( nColMax, n );
+ }
+ }
+ else
+ {
+ double nW = nAbsTabWidth - nTableMin;
+ double nD = nTableMax == nTableMin ? 1 : nTableMax - nTableMin;
+ for( n = 0; n < aMinArr.Count(); ++n )
+ {
+ double nd = aMaxArr[ n ] - aMinArr[ n ];
+ ULONG nAbsColWidth = aMinArr[ n ] + (ULONG)(( nd * nW ) / nD );
+ aMinArr.Replace( nAbsColWidth, n );
+ }
+ }
+
+ StartAllAction();
+ GetDoc()->AppendUndoForAttrTable( pTblNd->GetTable() );
+
+ for( n = 0; n < rTblLns.Count(); ++n )
+ {
+ SwTableBoxes& rTblBxs = rTblLns[ n ]->GetTabBoxes();
+ for( USHORT i = rTblBxs.Count(); i; )
+ {
+ SwTableBox* pBox = rTblBxs[ --i ];
+ pBox->ClaimFrmFmt()->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE,
+ aMinArr[ i ] ));
+ }
+ }
+
+ SwTableFmt* pFmt = (SwTableFmt*)pTblNd->GetTable().GetFrmFmt();
+ pFmt->LockModify();
+ pFmt->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, nAbsTabWidth ));
+ pFmt->UnlockModify();
+
+ EndAllAction();
+ }
+ }
+}
+
+BOOL SwEditShell::IsTableBoxTextFormat() const
+{
+ if( IsTableMode() )
+ return FALSE;
+
+ SwTableBox *pBox = 0;
+ SwPaM *pCrsr = GetCrsr();
+ {
+ SwFrm *pFrm = GetCurrFrm();
+ do {
+ pFrm = pFrm->GetUpper();
+ } while ( pFrm && !pFrm->IsCellFrm() );
+ if ( pFrm )
+ pBox = (SwTableBox*)((SwCellFrm*)pFrm)->GetTabBox();
+ }
+
+ if( !pBox )
+ return FALSE;
+
+ ULONG nFmt;
+ const SfxPoolItem* pItem;
+ if( SFX_ITEM_SET == pBox->GetFrmFmt()->GetAttrSet().GetItemState(
+ RES_BOXATR_FORMAT, TRUE, &pItem ))
+ {
+ nFmt = ((SwTblBoxNumFormat*)pItem)->GetValue();
+ return GetDoc()->GetNumberFormatter()->IsTextFormat( nFmt ) ||
+ NUMBERFORMAT_TEXT == nFmt;
+ }
+
+ ULONG nNd = pBox->IsValidNumTxtNd();
+ if( ULONG_MAX == nNd )
+ return TRUE;
+
+ const String& rTxt = GetDoc()->GetNodes()[ nNd ]->GetTxtNode()->GetTxt();
+ if( !rTxt.Len() )
+ return FALSE;
+
+ double fVal;
+ return !GetDoc()->GetNumberFormatter()->IsNumberFormat( rTxt, nFmt, fVal );
+}
+
+
+BOOL SwEditShell::SplitTable( USHORT eMode )
+{
+ BOOL bRet = FALSE;
+ SwPaM *pCrsr = GetCrsr();
+ if( pCrsr->GetNode()->FindTableNode() )
+ {
+ StartAllAction();
+ GetDoc()->StartUndo();
+
+ bRet = GetDoc()->SplitTable( *pCrsr->GetPoint(), eMode, TRUE );
+
+ GetDoc()->EndUndo();
+ ClearFEShellTabCols();
+ EndAllAction();
+ }
+ return bRet;
+}
+
+BOOL SwEditShell::MergeTable( BOOL bWithPrev, USHORT nMode )
+{
+ BOOL bRet = FALSE;
+ SwPaM *pCrsr = GetCrsr();
+ if( pCrsr->GetNode()->FindTableNode() )
+ {
+ StartAllAction();
+ GetDoc()->StartUndo();
+
+ bRet = GetDoc()->MergeTable( *pCrsr->GetPoint(), bWithPrev, nMode );
+
+ GetDoc()->EndUndo();
+ ClearFEShellTabCols();
+ EndAllAction();
+ }
+ return bRet;
+}
+
+BOOL SwEditShell::CanMergeTable( BOOL bWithPrev, BOOL* pChkNxtPrv ) const
+{
+ BOOL bRet = FALSE;
+ const SwPaM *pCrsr = GetCrsr();
+ const SwTableNode* pTblNd = pCrsr->GetNode()->FindTableNode();
+ if( pTblNd && !pTblNd->GetTable().ISA( SwDDETable ))
+ {
+ const SwNodes& rNds = GetDoc()->GetNodes();
+ if( pChkNxtPrv )
+ {
+ const SwTableNode* pChkNd = rNds[ pTblNd->GetIndex() - 1 ]->FindTableNode();
+ if( pChkNd && !pChkNd->GetTable().ISA( SwDDETable ) )
+ *pChkNxtPrv = TRUE, bRet = TRUE; // mit Prev ist moeglich
+ else
+ {
+ pChkNd = rNds[ pTblNd->EndOfSectionIndex() + 1 ]->GetTableNode();
+ if( pChkNd && !pChkNd->GetTable().ISA( SwDDETable ) )
+ *pChkNxtPrv = FALSE, bRet = TRUE; // mit Next ist moeglich
+ }
+ }
+ else
+ {
+ if( bWithPrev )
+ pTblNd = rNds[ pTblNd->GetIndex() - 1 ]->FindTableNode();
+ else
+ pTblNd = rNds[ pTblNd->EndOfSectionIndex() + 1 ]->GetTableNode();
+
+ bRet = pTblNd && !pTblNd->GetTable().ISA( SwDDETable );
+ }
+ }
+ return bRet;
+}
+