xref: /AOO41X/main/sw/source/ui/shells/tabsh.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #include <hintids.hxx>
27 
28 #ifndef _ZFORLIST_HXX
29 #define _ZFORLIST_DECLARE_TABLE
30 #include <svl/zforlist.hxx>
31 #endif
32 #include <svl/stritem.hxx>
33 #include <svl/whiter.hxx>
34 #include <unotools/moduleoptions.hxx>
35 #include <svx/rulritem.hxx>
36 #include <svl/srchitem.hxx>
37 #include <editeng/lrspitem.hxx>
38 #include <editeng/ulspitem.hxx>
39 #include <editeng/brshitem.hxx>
40 #include <editeng/boxitem.hxx>
41 #include <editeng/shaditem.hxx>
42 #include <editeng/spltitem.hxx>
43 #include <editeng/langitem.hxx>
44 #include <editeng/keepitem.hxx>
45 #include <editeng/bolnitem.hxx>
46 #include <editeng/colritem.hxx>
47 #include <editeng/frmdiritem.hxx>
48 #include <svx/numinf.hxx>
49 #include <svx/svddef.hxx>
50 #include <svx/svxdlg.hxx>
51 #include <svl/zformat.hxx>
52 #include <sfx2/bindings.hxx>
53 #include <vcl/msgbox.hxx>
54 #include <sfx2/request.hxx>
55 #include <sfx2/dispatch.hxx>
56 #include <sfx2/objface.hxx>
57 
58 
59 #include <fmtornt.hxx>
60 #include <fmtclds.hxx>
61 #include <fmtlsplt.hxx>
62 #include <fmtrowsplt.hxx>
63 #include <fmtfsize.hxx>
64 #include <swmodule.hxx>
65 #include <wrtsh.hxx>
66 #include <wview.hxx>
67 #include <frmatr.hxx>
68 #include <uitool.hxx>
69 #include <inputwin.hxx>
70 #include <uiitems.hxx>
71 #include <usrpref.hxx>
72 #include <tabsh.hxx>
73 #include "swtablerep.hxx"
74 #include <tablemgr.hxx>
75 #include <cellatr.hxx>
76 #include <frmfmt.hxx>
77 #include <swundo.hxx>
78 #include <swtable.hxx>
79 #include <docsh.hxx>
80 #include <tblsel.hxx>
81 
82 #include <dialog.hrc>
83 
84 
85 
86 //!!! new: insert table
87 /*
88 #include <svx/htmlmode.hxx>
89 #include <modcfg.hxx>
90 #include <tblafmt.hxx>
91 #include <instable.hxx>
92 */
93 //!!!
94 
95 #ifndef _POPUP_HRC
96 #include <popup.hrc>
97 #endif
98 #ifndef _SHELLS_HRC
99 #include <shells.hrc>
100 #endif
101 #ifndef _TABLE_HRC
102 #include <table.hrc>
103 #endif
104 #include <cmdid.h>
105 #ifndef _GLOBALS_HRC
106 #include <globals.hrc>
107 #endif
108 #include <helpid.h>
109 #include <unobaseclass.hxx>
110 
111 #define SwTableShell
112 #include <sfx2/msg.hxx>
113 #include <swslots.hxx>
114 
115 #include "swabstdlg.hxx"
116 #include <table.hrc>
117 
118 using namespace ::com::sun::star;
119 
120 //-----------------------------------------------------------------------------
121 
122 SFX_IMPL_INTERFACE(SwTableShell, SwBaseShell, SW_RES(STR_SHELLNAME_TABLE))
123 {
124     SFX_POPUPMENU_REGISTRATION(SW_RES(MN_TAB_POPUPMENU));
125     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TABLE_TOOLBOX));
126 }
127 
128 
129 TYPEINIT1(SwTableShell,SwBaseShell)
130 
131 /************************************************************************/
132 
133 const sal_uInt16 __FAR_DATA aUITableAttrRange[] =
134 {
135     FN_PARAM_TABLE_NAME,            FN_PARAM_TABLE_NAME,
136     FN_PARAM_TABLE_HEADLINE,        FN_PARAM_TABLE_HEADLINE,
137     FN_PARAM_TABLE_SPACE,           FN_PARAM_TABLE_SPACE,
138     FN_TABLE_REP,                   FN_TABLE_REP,
139     SID_RULER_BORDERS,              SID_RULER_BORDERS,
140     RES_LR_SPACE,                   RES_UL_SPACE,
141     SID_ATTR_BORDER_INNER,          SID_ATTR_BORDER_SHADOW,
142     RES_BOX,                        RES_SHADOW,
143     RES_BACKGROUND,                 RES_BACKGROUND,
144     SID_BACKGRND_DESTINATION,       SID_BACKGRND_DESTINATION,
145     SID_HTML_MODE,                  SID_HTML_MODE,
146     SID_ATTR_BRUSH_ROW,             SID_ATTR_BRUSH_TABLE,
147     RES_PAGEDESC,                   RES_BREAK,
148     RES_KEEP,                       RES_KEEP,
149     RES_LAYOUT_SPLIT,               RES_LAYOUT_SPLIT,
150     FN_TABLE_SET_VERT_ALIGN,        FN_TABLE_SET_VERT_ALIGN,
151     RES_FRAMEDIR,                   RES_FRAMEDIR,
152     RES_ROW_SPLIT,                  RES_ROW_SPLIT,
153     FN_TABLE_BOX_TEXTDIRECTION,     FN_TABLE_BOX_TEXTDIRECTION,
154 // --> collapsing borders FME 2005-05-27 #i29550#
155     RES_COLLAPSING_BORDERS,         RES_COLLAPSING_BORDERS,
156 // <-- collapsing borders
157     0
158 };
159 
160 const sal_uInt16* SwuiGetUITableAttrRange()
161 {
162     return aUITableAttrRange;
163 }
164 
165 static void lcl_SetAttr( SwWrtShell &rSh, const SfxPoolItem &rItem )
166 {
167     SfxItemSet aSet( rSh.GetView().GetPool(), rItem.Which(), rItem.Which(), 0);
168     aSet.Put( rItem );
169     rSh.SetTblAttr( aSet );
170 }
171 
172 /************************************************************************/
173 
174 
175 static SwTableRep*  lcl_TableParamToItemSet( SfxItemSet& rSet, SwWrtShell &rSh )
176 {
177     SwFrmFmt *pFmt = rSh.GetTableFmt();
178     SwTabCols aCols;
179     rSh.GetTabCols( aCols );
180 
181     //Ersteinmal die einfachen Attribute besorgen.
182     rSet.Put( SfxStringItem( FN_PARAM_TABLE_NAME, pFmt->GetName()));
183     rSet.Put( SfxUInt16Item( FN_PARAM_TABLE_HEADLINE, rSh.GetRowsToRepeat() ) );
184     rSet.Put( pFmt->GetShadow() );
185     rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, rSh.GetBoxAlign()));
186     rSet.Put( pFmt->GetFrmDir() );
187 
188     SvxULSpaceItem aULSpace( pFmt->GetULSpace() );
189     rSet.Put( aULSpace );
190 
191     sal_uInt16  nBackgroundDestination = rSh.GetViewOptions()->GetTblDest();
192     rSet.Put(SwBackgroundDestinationItem(SID_BACKGRND_DESTINATION, nBackgroundDestination ));
193     SvxBrushItem aBrush( RES_BACKGROUND );
194 //      rSh.GetBoxBackground(aBrush);
195 //  rSet.Put( aBrush );
196     if(rSh.GetRowBackground(aBrush))
197         rSet.Put( aBrush, SID_ATTR_BRUSH_ROW );
198     else
199         rSet.InvalidateItem(SID_ATTR_BRUSH_ROW);
200     rSh.GetTabBackground(aBrush);
201     rSet.Put( aBrush, SID_ATTR_BRUSH_TABLE );
202 
203     // text direction in boxes
204     SvxFrameDirectionItem aBoxDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
205     if(rSh.GetBoxDirection( aBoxDirection ))
206         rSet.Put(aBoxDirection, FN_TABLE_BOX_TEXTDIRECTION);
207 
208     sal_Bool bTableSel = rSh.IsTableMode();
209     if(!bTableSel)
210     {
211         rSh.StartAllAction();
212         rSh.Push();
213         rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_TABLE_SELECT_ALL, sal_False );
214     }
215     SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
216 
217         // Tabellenvariante, wenn mehrere Tabellenzellen selektiert
218     rSh.GetCrsr();                  //Damit GetCrsrCnt() auch das Richtige liefert
219     aBoxInfo.SetTable          ((rSh.IsTableMode() && rSh.GetCrsrCnt() > 1) ||
220                                     !bTableSel);
221         // Abstandsfeld immer anzeigen
222     aBoxInfo.SetDist           ((sal_Bool) sal_True);
223         // Minimalgroesse in Tabellen und Absaetzen setzen
224     aBoxInfo.SetMinDist( !bTableSel || rSh.IsTableMode() ||
225                             rSh.GetSelectionType() &
226                             (nsSelectionType::SEL_TXT | nsSelectionType::SEL_TBL));
227         // Default-Abstand immer setzen
228     aBoxInfo.SetDefDist        (MIN_BORDER_DIST);
229         // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
230     aBoxInfo.SetValid( VALID_DISABLE, !bTableSel || !rSh.IsTableMode() );
231 
232     rSet.Put(aBoxInfo);
233     rSh.GetTabBorders( rSet );
234 
235     //row split
236     SwFmtRowSplit* pSplit = 0;
237     rSh.GetRowSplit(pSplit);
238     if(pSplit)
239     {
240         rSet.Put(*pSplit);
241         delete pSplit;
242     }
243 
244     if(!bTableSel)
245     {
246         rSh.ClearMark();
247         rSh.Pop(sal_False);
248         rSh.EndAllAction();
249     }
250 
251     SwTabCols aTabCols;
252     rSh.GetTabCols( aTabCols );
253     SvxColumnItem aColItem;
254 
255 
256     // Pointer wird nach der Dialogausfuehrung geloescht
257     SwTableRep* pRep = new SwTableRep( aTabCols, rSh.IsTblComplex());
258     pRep->SetSpace(aCols.GetRightMax());
259 
260     sal_uInt16 nPercent = 0;
261     long nWidth = ::GetTableWidth(pFmt, aCols, &nPercent, &rSh );
262     // Die Tabellenbreite ist fuer relative Angaben nicht korrekt
263     if(nPercent)
264         nWidth = pRep->GetSpace() * nPercent / 100;
265     sal_uInt16 nAlign = pFmt->GetHoriOrient().GetHoriOrient();
266     pRep->SetAlign(nAlign);
267     SvxLRSpaceItem aLRSpace( pFmt->GetLRSpace() );
268     SwTwips nLeft = aLRSpace.GetLeft();
269     SwTwips nRight = aLRSpace.GetRight();
270     SwTwips nDiff = pRep->GetSpace() - nRight - nLeft - nWidth;
271     if(nAlign != text::HoriOrientation::FULL && Abs(nDiff) > 2)
272     {
273         SwTwips nLR = pRep->GetSpace() - nWidth;
274         switch ( nAlign )
275         {
276             case text::HoriOrientation::CENTER: nLeft = nRight = nLR / 2;
277             break;
278             case text::HoriOrientation::LEFT: nRight = nLR; nLeft = 0;
279             break;
280             case text::HoriOrientation::RIGHT: nLeft = nLR, nRight = 0;
281             break;
282             case text::HoriOrientation::LEFT_AND_WIDTH:
283                 nRight = nLR - nLeft;
284             break;
285             case text::HoriOrientation::NONE:
286                 if(!nPercent)
287                     nWidth = pRep->GetSpace() - nLeft - nRight;
288             break;
289         }
290     }
291     pRep->SetLeftSpace(nLeft);
292     pRep->SetRightSpace(nRight);
293 
294     pRep->SetWidth(nWidth);
295     pRep->SetWidthPercent(nPercent);
296     // sind einzelne Zeilen/Zellen selektiert, wird die Spaltenbearbeitung veraendert
297     pRep->SetLineSelected(bTableSel && ! rSh.HasWholeTabSelection());
298     rSet.Put(SwPtrItem(FN_TABLE_REP, pRep));
299     return pRep;
300 }
301 
302 /************************************************************************/
303 
304 
305 void ItemSetToTableParam( const SfxItemSet& rSet,
306                                 SwWrtShell &rSh )
307 {
308     rSh.StartAllAction();
309     rSh.StartUndo( UNDO_TABLE_ATTR );
310     const SfxPoolItem* pItem = 0;
311 
312     SwViewOption aUsrPref( *rSh.GetViewOptions() );
313     sal_uInt16 nBackgroundDestination = aUsrPref.GetTblDest();
314     if(SFX_ITEM_SET == rSet.GetItemState(SID_BACKGRND_DESTINATION, sal_False, &pItem))
315     {
316         nBackgroundDestination = ((SfxUInt16Item*)pItem)->GetValue();
317         aUsrPref.SetTblDest((sal_uInt8)nBackgroundDestination);
318         SW_MOD()->ApplyUsrPref(aUsrPref, &rSh.GetView());
319     }
320     sal_Bool bBorder = ( SFX_ITEM_SET == rSet.GetItemState( RES_BOX ) ||
321             SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER ) );
322     pItem = 0;
323     sal_Bool bBackground = SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND, sal_False, &pItem );
324     const SfxPoolItem* pRowItem = 0, *pTableItem = 0;
325     bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_ROW, sal_False, &pRowItem );
326     bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_TABLE, sal_False, &pTableItem );
327     const SfxPoolItem* pSplit = 0;
328     sal_Bool bRowSplit = SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pSplit );
329     const SfxPoolItem* pBoxDirection = 0;
330     sal_Bool bBoxDirection = SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_BOX_TEXTDIRECTION, sal_False, &pBoxDirection );
331     if( bBackground || bBorder || bRowSplit || bBoxDirection)
332     {
333         /*
334          Die Umrandung wird auf die vorliegende Selektion angewendet
335          Liegt keine Selektion vor, wird die Tabelle vollstaendig selektiert.
336          Der Hintergrund wird immer auf den aktuellen Zustand angewendet.
337          */
338 
339         sal_Bool bTableSel = rSh.IsTableMode();
340         rSh.StartAllAction();
341 
342         if(bBackground)
343         {
344             if(pItem)
345                 rSh.SetBoxBackground( *(const SvxBrushItem*)pItem );
346             if(pRowItem)
347             {
348                 SvxBrushItem aBrush(*(const SvxBrushItem*)pRowItem);
349                 aBrush.SetWhich(RES_BACKGROUND);
350                 rSh.SetRowBackground(aBrush);
351             }
352             if(pTableItem)
353             {
354                 SvxBrushItem aBrush(*(const SvxBrushItem*)pTableItem);
355                 aBrush.SetWhich(RES_BACKGROUND);
356                 rSh.SetTabBackground( aBrush );
357             }
358         }
359 
360         if(bBoxDirection)
361         {
362             SvxFrameDirectionItem aDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
363             aDirection.SetValue(static_cast< const SvxFrameDirectionItem* >(pBoxDirection)->GetValue());
364             rSh.SetBoxDirection(aDirection);
365         }
366 
367         if(bBorder || bRowSplit)
368         {
369             rSh.Push();
370             if(!bTableSel)
371             {
372                 rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_TABLE_SELECT_ALL );
373             }
374             if(bBorder)
375                 rSh.SetTabBorders( rSet );
376 
377             if(bRowSplit)
378             {
379                 rSh.SetRowSplit(*static_cast<const SwFmtRowSplit*>(pSplit));
380             }
381 
382             if(!bTableSel)
383             {
384                 rSh.ClearMark();
385             }
386             rSh.Pop(sal_False);
387         }
388 
389         rSh.EndAllAction();
390     }
391 
392     SwTabCols aTabCols;
393     sal_Bool bTabCols = sal_False;
394     sal_Bool bSingleLine = sal_False;
395     SwTableRep* pRep = 0;
396     SwFrmFmt *pFmt = rSh.GetTableFmt();
397     SfxItemSet aSet( rSh.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
398     if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, sal_False, &pItem ))
399     {
400         pRep = (SwTableRep*)((const SwPtrItem*)pItem)->GetValue();
401 
402         const SwTwips nWidth = pRep->GetWidth();
403         if ( text::HoriOrientation::FULL == pRep->GetAlign() )
404         {
405             SwFmtHoriOrient aAttr( pFmt->GetHoriOrient() );
406             aAttr.SetHoriOrient( text::HoriOrientation::FULL );
407             aSet.Put( aAttr );
408         }
409         else
410         {
411             SwFmtFrmSize aSz( ATT_VAR_SIZE, nWidth );
412             if(pRep->GetWidthPercent())
413             {
414                 aSz.SetWidthPercent( (sal_uInt8)pRep->GetWidthPercent() );
415             }
416             aSet.Put(aSz);
417         }
418 
419         SvxLRSpaceItem aLRSpace( RES_LR_SPACE );
420         aLRSpace.SetLeft(pRep->GetLeftSpace());
421         aLRSpace.SetRight(pRep->GetRightSpace());
422         aSet.Put( aLRSpace );
423 
424         sal_Int16 eOrient = pRep->GetAlign();
425         SwFmtHoriOrient aAttr( 0, eOrient );
426         aSet.Put( aAttr );
427     // Damit beim recording die Ausrichtung nicht durch die Abstaende ueberschrieben
428     // wird, darf das Item nur bei manueller Ausrichtung aufgez. werden
429         if(eOrient != text::HoriOrientation::NONE)
430             ((SfxItemSet&)rSet).ClearItem( SID_ATTR_LRSPACE );
431 
432 
433         if(pRep->HasColsChanged())
434         {
435             bTabCols = sal_True;
436         }
437     }
438 
439 
440     if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem))
441         rSh.SetRowsToRepeat( ((SfxUInt16Item*)pItem)->GetValue() );
442 
443     if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_SET_VERT_ALIGN, sal_False, &pItem))
444         rSh.SetBoxAlign(((SfxUInt16Item*)(pItem))->GetValue());
445 
446     if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, sal_False, &pItem ))
447         rSh.SetTableName( *pFmt, ((const SfxStringItem*)pItem)->GetValue() );
448 
449     // kopiere die ausgesuchten Attribute in den ItemSet
450     static sal_uInt16 __READONLY_DATA aIds[] =
451         {
452             RES_PAGEDESC,
453             RES_BREAK,
454             RES_KEEP,
455             RES_LAYOUT_SPLIT,
456             RES_UL_SPACE,
457             RES_SHADOW,
458             RES_FRAMEDIR,
459             // --> collapsing borders FME 2005-05-27 #i29550#
460             RES_COLLAPSING_BORDERS,
461             // <-- collapsing borders
462             0
463         };
464     for( const sal_uInt16* pIds = aIds; *pIds; ++pIds )
465         if( SFX_ITEM_SET == rSet.GetItemState( *pIds, sal_False, &pItem))
466             aSet.Put( *pItem );
467 
468     if( aSet.Count() )
469         rSh.SetTblAttr( aSet );
470 
471     if(bTabCols)
472     {
473         rSh.GetTabCols( aTabCols );
474         bSingleLine = pRep->FillTabCols( aTabCols );
475         rSh.SetTabCols( aTabCols, bSingleLine );
476     }
477 
478     rSh.EndUndo( UNDO_TABLE_ATTR );
479     rSh.EndAllAction();
480 }
481 
482 /************************************************************************/
483 
484 
485 static void lcl_TabGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine)
486 {
487     if(pBorderLine->GetInWidth() > rBorderLine.GetInWidth())
488         rBorderLine.SetInWidth(pBorderLine->GetInWidth());
489 
490     if(pBorderLine->GetOutWidth() > rBorderLine.GetOutWidth())
491         rBorderLine.SetOutWidth(pBorderLine->GetOutWidth());
492 
493     if(pBorderLine->GetDistance() > rBorderLine.GetDistance())
494         rBorderLine.SetDistance(pBorderLine->GetDistance());
495 
496     rBorderLine.SetColor(pBorderLine->GetColor());
497 }
498 
499 
500 void SwTableShell::Execute(SfxRequest &rReq)
501 {
502     sal_Bool bUseDialog = sal_True;
503     const SfxItemSet* pArgs = rReq.GetArgs();
504     SwWrtShell &rSh = GetShell();
505 
506     //Erstmal die Slots, die keinen FrmMgr benoetigen.
507     sal_Bool bMore = sal_False;
508     const SfxPoolItem* pItem = 0;
509     sal_uInt16 nSlot = rReq.GetSlot();
510     if(pArgs)
511         pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
512     sal_Bool bCallDone = sal_False;
513     switch ( nSlot )
514     {
515         case SID_ATTR_BORDER:
516         {
517 /*          sal_Bool bPopCrsr = sal_False;
518             if ( !rReq.IsAPI() )
519             {
520                 //Keine Tabellenselektion -> Aenderung wird auf die gesamte
521                 //Tabelle.
522                 if ( !rSh.IsTableMode() )
523                 {
524                     rSh.StartAction();
525                     bPopCrsr = sal_True;
526                     rSh.Push();
527                     rSh.EnterStdMode();
528                     rSh.MoveTable( fnTableCurr, fnTableStart );
529                     rSh.SttSelect();
530                     rSh.MoveTable( fnTableCurr, fnTableEnd );
531                     rSh.EndSelect();
532                 }
533             }*/
534             if(!pArgs)
535                 break;
536             //Items erzeugen, weil wir sowieso nacharbeiten muessen
537             SvxBoxItem     aBox( RES_BOX );
538             SfxItemSet aCoreSet( GetPool(),
539                             RES_BOX, RES_BOX,
540                             SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
541                             0);
542             SvxBoxInfoItem aCoreInfo( SID_ATTR_BORDER_INNER );
543             aCoreSet.Put(aCoreInfo);
544             rSh.GetTabBorders( aCoreSet );
545             const SvxBoxItem& rCoreBox = (const SvxBoxItem&)
546                                                     aCoreSet.Get(RES_BOX);
547             const SfxPoolItem *pBoxItem = 0;
548             if ( pArgs->GetItemState(RES_BOX, sal_True, &pBoxItem) == SFX_ITEM_SET )
549             {
550                 aBox = *(SvxBoxItem*)pBoxItem;
551                 if ( !rReq.IsAPI() )
552                     aBox.SetDistance( Max(rCoreBox.GetDistance(),sal_uInt16(55)) );
553                 else if ( aBox.GetDistance() < MIN_BORDER_DIST )
554                     aBox.SetDistance( Max(rCoreBox.GetDistance(),(sal_uInt16)MIN_BORDER_DIST)  );
555             }
556             else
557                 {ASSERT( !this, "Wo ist das Box-Item?" )}
558 
559             //since the drawing layer also supports borders the which id might be a different one
560             SvxBoxInfoItem aInfo( SID_ATTR_BORDER_INNER );
561             if (pArgs->GetItemState(SID_ATTR_BORDER_INNER, sal_True, &pBoxItem) == SFX_ITEM_SET)
562                 aInfo = *(SvxBoxInfoItem*)pBoxItem;
563             else if( pArgs->GetItemState(SDRATTR_TABLE_BORDER_INNER, sal_True, &pBoxItem) == SFX_ITEM_SET )
564             {
565                 aInfo = *(SvxBoxInfoItem*)pBoxItem;
566                 aInfo.SetWhich(SID_ATTR_BORDER_INNER);
567             }
568 
569             aInfo.SetTable( sal_True );
570             aInfo.SetValid( VALID_DISABLE, sal_False );
571 
572 
573 // Die Attribute aller Linien werden gelesen und das staerkste gewinnt
574             const SvxBorderLine* pBorderLine;
575             SvxBorderLine aBorderLine;
576             if ((pBorderLine = rCoreBox.GetTop()) != NULL)
577                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
578             if ((pBorderLine = rCoreBox.GetBottom()) != NULL)
579                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
580             if ((pBorderLine = rCoreBox.GetLeft()) != NULL)
581                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
582             if ((pBorderLine = rCoreBox.GetRight()) != NULL)
583                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
584             if ((pBorderLine = aCoreInfo.GetHori()) != NULL)
585                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
586             if ((pBorderLine = aCoreInfo.GetVert()) != NULL)
587                 lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
588 
589             if(aBorderLine.GetOutWidth() == 0)
590             {
591                 aBorderLine.SetInWidth(0);
592                 aBorderLine.SetOutWidth(DEF_LINE_WIDTH_0);
593             }
594 
595             sal_Bool bLine = sal_False;
596             if ( (pBorderLine = aBox.GetTop()) != NULL)
597                 aBox.SetLine(&aBorderLine, BOX_LINE_TOP), bLine |= sal_True;
598             if ((pBorderLine = aBox.GetBottom()) != NULL)
599                 aBox.SetLine(&aBorderLine, BOX_LINE_BOTTOM), bLine |= sal_True;
600             if ((pBorderLine = aBox.GetLeft()) != NULL)
601                 aBox.SetLine(&aBorderLine, BOX_LINE_LEFT), bLine |= sal_True;
602             if ((pBorderLine = aBox.GetRight()) != NULL)
603                 aBox.SetLine(&aBorderLine, BOX_LINE_RIGHT), bLine |= sal_True;
604             if ((pBorderLine = aInfo.GetHori()) != NULL)
605                 aInfo.SetLine(&aBorderLine, BOXINFO_LINE_HORI), bLine |= sal_True;
606             if ((pBorderLine = aInfo.GetVert()) != NULL)
607                 aInfo.SetLine(&aBorderLine, BOXINFO_LINE_VERT), bLine |= sal_True;
608 
609 //          if ( bPopCrsr && !bLine )
610 //              aBox.SetDistance( 0 );
611 
612             aCoreSet.Put( aBox  );
613             aCoreSet.Put( aInfo );
614             rSh.SetTabBorders( aCoreSet );
615 
616             // we must record the "real" values because otherwise the lines can't be reconstructed on playtime
617             // the coding style of the controller (setting lines with width 0) is not transportable via Query/PutValue in
618             // the SvxBoxItem
619             rReq.AppendItem( aBox );
620             rReq.AppendItem( aInfo );
621             bCallDone = sal_True;
622 
623 /*          if ( bPopCrsr )
624             {
625                 rSh.KillPams();
626                 rSh.Pop(sal_False);
627                 rSh.EndAction();
628             }*/
629         }
630         break;
631         case FN_INSERT_TABLE:
632             InsertTable( rReq );
633         break;
634         case FN_FORMAT_TABLE_DLG:
635         {
636             //#127012# get the bindings before the dialog is called
637             // it might happen that this shell is removed after closing the dialog
638             SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
639             SfxItemSet aCoreSet( GetPool(), aUITableAttrRange);
640 
641             FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rSh.GetView()));
642             SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
643             SwTableRep* pTblRep = ::lcl_TableParamToItemSet( aCoreSet, rSh );
644             SfxAbstractTabDialog * pDlg = NULL;
645             if ( bUseDialog )
646             {
647                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
648                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
649 
650                 pDlg = pFact->CreateSwTableTabDlg( GetView().GetWindow(), GetPool(), &aCoreSet, &rSh, DLG_FORMAT_TABLE );
651                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
652             }
653             aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
654             rSh.GetTblAttr(aCoreSet);
655             // GetTblAttr buegelt den Background ueber!
656             SvxBrushItem aBrush( RES_BACKGROUND );
657             if(rSh.GetBoxBackground(aBrush))
658                 aCoreSet.Put( aBrush );
659             else
660                 aCoreSet.InvalidateItem( RES_BACKGROUND );
661 
662             if ( (!pDlg && rReq.GetArgs()) || pDlg->Execute() == RET_OK )
663             {
664                 const SfxItemSet* pOutSet = pDlg ? pDlg->GetOutputItemSet() : rReq.GetArgs();
665                 if ( pDlg )
666                 {
667                     //to record FN_INSERT_TABLE correctly
668                     rReq.SetSlot(FN_FORMAT_TABLE_DLG);
669                     rReq.Done( *pOutSet );
670                 }
671                 ItemSetToTableParam( *pOutSet, rSh );
672             }
673 
674             delete pDlg;
675             delete pTblRep;
676             rBindings.Update(SID_RULER_BORDERS);
677             rBindings.Update(SID_ATTR_TABSTOP);
678             rBindings.Update(SID_RULER_BORDERS_VERTICAL);
679             rBindings.Update(SID_ATTR_TABSTOP_VERTICAL);
680         }
681         break;
682         case SID_ATTR_BRUSH:
683         case SID_ATTR_BRUSH_ROW :
684         case SID_ATTR_BRUSH_TABLE :
685             if(rReq.GetArgs())
686                 ItemSetToTableParam(*rReq.GetArgs(), rSh);
687         break;
688         case FN_NUM_FORMAT_TABLE_DLG:
689         {
690             SwView* pView = GetActiveView();
691             if(pView)
692             {
693                 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
694                 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
695                 SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
696                 SfxItemSet aCoreSet( GetPool(),
697                                  SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
698                                  SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
699                                  0 );
700 
701                 SfxItemSet aBoxSet( *aCoreSet.GetPool(),
702                                     RES_BOXATR_FORMAT, RES_BOXATR_FORMAT,
703                                     RES_BOXATR_VALUE, RES_BOXATR_VALUE,
704                                     0 );
705                 rSh.GetTblBoxFormulaAttrs( aBoxSet );
706 
707                 SfxItemState eState = aBoxSet.GetItemState(RES_BOXATR_FORMAT);
708                 if(eState == SFX_ITEM_DEFAULT)
709                 {
710                     aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE,
711                     pFormatter->GetFormatIndex(NF_TEXT, LANGUAGE_SYSTEM)));
712                 }
713                 else
714                     aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE,
715                                     ((SwTblBoxNumFormat&)aBoxSet.Get(
716                                     RES_BOXATR_FORMAT )).GetValue() ));
717 
718                 String sCurText( rSh.GetTableBoxText() );
719                 aCoreSet.Put( SvxNumberInfoItem( pFormatter,
720                                     ((SwTblBoxValue&)aBoxSet.Get(
721                                         RES_BOXATR_VALUE)).GetValue(),
722                                     sCurText, SID_ATTR_NUMBERFORMAT_INFO ));
723 
724                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
725                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
726 
727                 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(),aCoreSet,
728                     pView->GetViewFrame()->GetFrame().GetFrameInterface(),
729                     RC_DLG_SWNUMFMTDLG );
730                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
731 
732                 if (RET_OK == pDlg->Execute())
733                 {
734                     const SfxPoolItem* pNumberFormatItem = GetView().GetDocShell()->
735                                     GetItem( SID_ATTR_NUMBERFORMAT_INFO );
736 
737                     if( pNumberFormatItem && 0 != ((SvxNumberInfoItem*)pNumberFormatItem)->GetDelCount() )
738                     {
739                         const sal_uInt32* pDelArr = ((SvxNumberInfoItem*)
740                                                         pNumberFormatItem)->GetDelArray();
741 
742                         for ( sal_uInt16 i = 0; i < ((SvxNumberInfoItem*)pNumberFormatItem)->GetDelCount(); i++ )
743                             ((SvxNumberInfoItem*)pNumberFormatItem)->
744                             GetNumberFormatter()->DeleteEntry( pDelArr[i] );
745                     }
746 
747                     if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState(
748                         SID_ATTR_NUMBERFORMAT_VALUE, sal_False, &pNumberFormatItem ))
749                     {
750                         SfxItemSet aBoxFormatSet( *aCoreSet.GetPool(),
751                                     RES_BOXATR_FORMAT, RES_BOXATR_FORMAT );
752                         aBoxFormatSet.Put( SwTblBoxNumFormat(
753                                 ((SfxUInt32Item*)pNumberFormatItem)->GetValue() ));
754                         rSh.SetTblBoxFormulaAttrs( aBoxFormatSet );
755 
756                     }
757                 }
758                 delete pDlg;
759             }
760         }
761         break;
762         case FN_CALC_TABLE:
763             rSh.UpdateTable();
764             bCallDone = sal_True;
765         break;
766         case FN_TABLE_OPTIMAL_HEIGHT:
767         {
768             const SwFmtFrmSize aSz;
769             rSh.SetRowHeight( aSz );
770             bCallDone = sal_True;
771         }
772         break;
773         case FN_TABLE_DELETE_COL:
774             if ( rSh.DeleteCol() && rSh.HasSelection() )
775                 rSh.EnterStdMode();
776             bCallDone = sal_True;
777         break;
778         case FN_END_TABLE:
779             rSh.MoveTable( fnTableCurr, fnTableEnd );
780             bCallDone = sal_True;
781         break;
782         case FN_START_TABLE:
783             rSh.MoveTable( fnTableCurr, fnTableStart );
784             bCallDone = sal_True;
785         break;
786         case FN_GOTO_NEXT_CELL:
787         {
788             sal_Bool bAppendLine = sal_True;
789             if( pItem )
790                 bAppendLine = ((SfxBoolItem*)pItem)->GetValue();
791             rReq.SetReturnValue( SfxBoolItem( nSlot,
792                                     rSh.GoNextCell( bAppendLine ) ) );
793             bCallDone = sal_True;
794         }
795         break;
796         case FN_GOTO_PREV_CELL:
797             rReq.SetReturnValue( SfxBoolItem( nSlot, rSh.GoPrevCell() ) );
798             bCallDone = sal_True;
799         break;
800         case FN_TABLE_DELETE_ROW:
801             if ( rSh.DeleteRow() && rSh.HasSelection() )
802                 rSh.EnterStdMode();
803             bCallDone = sal_True;
804         break;
805         case FN_TABLE_MERGE_CELLS:
806             if ( rSh.IsTableMode() )
807                 switch ( rSh.MergeTab() )
808                 {
809                     case TBLMERGE_OK:
810                          bCallDone = sal_True;
811                     //no break;
812                     case TBLMERGE_NOSELECTION:  break;
813                     case TBLMERGE_TOOCOMPLEX:
814                     {
815                         InfoBox aInfoBox( GetView().GetWindow(),
816                                     SW_RES( MSG_ERR_TABLE_MERGE ) );
817                         aInfoBox.Execute();
818                         break;
819                     }
820                     default: ASSERT( !this, "unbekannter Returnwert MergeTab.");
821                 }
822         break;
823         case FN_TABLE_ADJUST_CELLS:
824         case FN_TABLE_BALANCE_CELLS:
825         {
826             sal_Bool bBalance = (FN_TABLE_BALANCE_CELLS == nSlot);
827             if ( rSh.IsAdjustCellWidthAllowed(bBalance) )
828             {
829                 {
830                     // remove actions to make a valid table selection
831                     UnoActionRemoveContext aRemoveContext(rSh.GetDoc());
832                 }
833                 rSh.AdjustCellWidth(bBalance);
834             }
835             bCallDone = sal_True;
836         }
837         break;
838         case FN_TABLE_BALANCE_ROWS:
839             if ( rSh.BalanceRowHeight(sal_True) )
840                 rSh.BalanceRowHeight(sal_False);
841             bCallDone = sal_True;
842         break;
843         case FN_TABLE_SELECT_ALL:
844             rSh.EnterStdMode();
845             rSh.MoveTable( fnTableCurr, fnTableStart );
846             rSh.SttSelect();
847             rSh.MoveTable( fnTableCurr, fnTableEnd );
848             rSh.EndSelect();
849             bCallDone = sal_True;
850         break;
851         case FN_TABLE_SELECT_COL:
852             rSh.EnterStdMode();
853             rSh.SelectTableCol();
854             bCallDone = sal_True;
855         break;
856         case FN_TABLE_SELECT_ROW:
857             rSh.EnterStdMode();
858             rSh.SelectTableRow();
859             bCallDone = sal_True;
860         break;
861         case FN_TABLE_SET_READ_ONLY_CELLS:
862             rSh.ProtectCells();
863             rSh.ResetSelect( 0, sal_False );
864             bCallDone = sal_True;
865         break;
866         case FN_TABLE_UNSET_READ_ONLY_CELLS:
867             rSh.UnProtectCells();
868             bCallDone = sal_True;
869         break;
870         case SID_AUTOFORMAT:
871         {
872             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
873             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
874 
875             AbstractSwAutoFormatDlg* pDlg = pFact->CreateSwAutoFormatDlg(&GetView().GetViewFrame()->GetWindow(), &rSh , DLG_AUTOFMT_TABLE );
876             DBG_ASSERT(pDlg, "Dialogdiet fail!");
877             pDlg->Execute();
878             delete pDlg;
879         }
880         break;
881         case FN_TABLE_SET_ROW_HEIGHT:
882         {
883             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
884             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
885 
886             VclAbstractDialog* pDlg = pFact->CreateVclAbstractDialog( GetView().GetWindow(), rSh, DLG_ROW_HEIGHT );
887             DBG_ASSERT(pDlg, "Dialogdiet fail!");
888             pDlg->Execute();
889             delete pDlg;
890         }
891         break;
892         case FN_NUMBER_BULLETS:
893         case FN_NUM_BULLET_ON:
894             ASSERT( !this, "Funktion darf zur Zeit nicht gerufen werden." );
895         break;
896 
897         case FN_TABLE_INSERT_COL:
898         case FN_TABLE_INSERT_ROW:
899         {
900             sal_Bool bColumn = rReq.GetSlot() == FN_TABLE_INSERT_COL;
901             sal_uInt16 nCount = 0;
902             sal_Bool bAfter = sal_True;
903             if (pItem)
904             {
905                 nCount = ((const SfxInt16Item* )pItem)->GetValue();
906                 if(SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_INSERT_AFTER, sal_True, &pItem))
907                     bAfter = ((const SfxBoolItem* )pItem)->GetValue();
908             }
909             else if( !rReq.IsAPI() )
910                 ++nCount;
911 
912             if( nCount )
913             {
914                 // i74180: Table border patch submitted by chensuchun:
915                 // -->get the SvxBoxInfoItem of the table before insert
916                 SfxItemSet aCoreSet( GetPool(), aUITableAttrRange);
917                 ::lcl_TableParamToItemSet( aCoreSet, rSh );
918                 bool bSetInnerBorders = false;
919                 SwUndoId nUndoId = UNDO_EMPTY;
920                 // <--End
921 
922                 if( bColumn )
923                 {
924                     rSh.StartUndo( UNDO_TABLE_INSCOL );
925                     rSh.InsertCol( nCount, bAfter );
926                     bSetInnerBorders = true;
927                     nUndoId = UNDO_TABLE_INSCOL;
928                 }
929                 else if ( !rSh.IsInRepeatedHeadline() )
930                 {
931                     rSh.StartUndo( UNDO_TABLE_INSROW );
932                     rSh.InsertRow( nCount, bAfter );
933                     bSetInnerBorders = true;
934                     nUndoId = UNDO_TABLE_INSROW;
935                 }
936 
937                 // -->after inserting,reset the inner table borders
938                 if ( bSetInnerBorders )
939                 {
940                     const SvxBoxInfoItem aBoxInfo((const SvxBoxInfoItem&)
941                         aCoreSet.Get(SID_ATTR_BORDER_INNER));
942                     SfxItemSet aSet( GetPool(), SID_ATTR_BORDER_INNER,
943                                                 SID_ATTR_BORDER_INNER, 0);
944                     aSet.Put( aBoxInfo );
945                     ItemSetToTableParam( aSet, rSh );
946                     rSh.EndUndo( nUndoId );
947                 }
948                 // <--
949 
950                 bCallDone = sal_True;
951                 break;
952             }
953 
954             nSlot = bColumn ? FN_TABLE_INSERT_COL_DLG : FN_TABLE_INSERT_ROW_DLG;
955         }
956         // kein break;  bei Count = 0 kommt der Dialog
957         case FN_TABLE_INSERT_COL_DLG:
958         case FN_TABLE_INSERT_ROW_DLG:
959         {
960             const SfxSlot* pSlot = GetStaticInterface()->GetSlot(nSlot);
961             if ( FN_TABLE_INSERT_ROW_DLG != nSlot || !rSh.IsInRepeatedHeadline())
962             {
963                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
964                 ::std::auto_ptr<SvxAbstractInsRowColDlg> pDlg( pFact ? pFact->CreateSvxInsRowColDlg( GetView().GetWindow(), nSlot == FN_TABLE_INSERT_COL_DLG, pSlot->GetCommand() ) : 0);
965 
966                 if( pDlg.get() && (pDlg->Execute() == 1) )
967                 {
968                     sal_uInt16 nDispatchSlot = (nSlot == FN_TABLE_INSERT_COL_DLG) ? FN_TABLE_INSERT_COL : FN_TABLE_INSERT_ROW;
969                     SfxUInt16Item aCountItem( nDispatchSlot, static_cast< sal_uInt16 >(pDlg->getInsertCount()) );
970                     SfxBoolItem  aAfter( FN_PARAM_INSERT_AFTER, !pDlg->isInsertBefore() );
971                     SfxViewFrame* pVFrame = GetView().GetViewFrame();
972                     if( pVFrame )
973                         pVFrame->GetDispatcher()->Execute( nDispatchSlot, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, &aCountItem, &aAfter, 0L);
974                 }
975             }
976         }
977         break;
978         case FN_TABLE_SPLIT_CELLS:
979         {
980             long nCount=0;
981             sal_Bool bHorizontal=sal_True;
982             sal_Bool bProportional = sal_False;
983             SFX_REQUEST_ARG( rReq, pSplit, SfxInt32Item, FN_TABLE_SPLIT_CELLS, sal_False );
984             SFX_REQUEST_ARG( rReq, pHor, SfxBoolItem, FN_PARAM_1, sal_False );
985             SFX_REQUEST_ARG( rReq, pProp, SfxBoolItem, FN_PARAM_2, sal_False );
986             if ( pSplit )
987             {
988                 nCount = pSplit->GetValue();
989                 if ( pHor )
990                     bHorizontal = pHor->GetValue();
991                 if ( pProp )
992                     bProportional = pProp->GetValue();
993             }
994             else
995             {
996                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
997                 if( pFact )
998                 {
999                     const long nMaxVert = rSh.GetAnyCurRect( RECT_FRM ).Width() / MINLAY;
1000                     SvxAbstractSplittTableDialog* pDlg = pFact->CreateSvxSplittTableDialog( GetView().GetWindow(), rSh.IsTableVertical(), nMaxVert, 99 );
1001                     if( pDlg && (pDlg->Execute() == RET_OK) )
1002                     {
1003                         nCount = pDlg->GetCount();
1004                         bHorizontal = pDlg->IsHorizontal();
1005                         bProportional = pDlg->IsProportional();
1006                         rReq.AppendItem( SfxInt32Item( FN_TABLE_SPLIT_CELLS, nCount ) );
1007                         rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bHorizontal ) );
1008                         rReq.AppendItem( SfxBoolItem( FN_PARAM_2, bProportional ) );
1009                     }
1010                     delete pDlg;
1011                 }
1012             }
1013 
1014             if ( nCount>1 )
1015             {
1016                 rSh.SplitTab(!bHorizontal, static_cast< sal_uInt16 >( nCount-1 ), bProportional );
1017                 bCallDone = sal_True;
1018             }
1019             else
1020                 rReq.Ignore();
1021         }
1022         break;
1023 
1024         case FN_TABLE_SPLIT_TABLE:
1025         {
1026             SFX_REQUEST_ARG( rReq, pType, SfxUInt16Item, FN_PARAM_1, sal_False );
1027             if( pType )
1028             {
1029                 switch( pType->GetValue() )
1030                 {
1031                     case HEADLINE_NONE    :
1032                     case HEADLINE_BORDERCOPY:
1033                     case HEADLINE_CNTNTCOPY:
1034                     case HEADLINE_BOXATTRCOPY:
1035                     case HEADLINE_BOXATRCOLLCOPY:
1036                         rSh.SplitTable(pType->GetValue()) ;
1037                     default: ;//wrong parameter, do nothing
1038                 }
1039             }
1040             else
1041             {
1042                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
1043                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
1044 
1045                 AbstractSplitTableDialog* pDlg = pFact->CreateSplitTblDialog( GetView().GetWindow(), rSh );
1046                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
1047                 pDlg->Execute();
1048                 rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, pDlg->GetSplitMode() ) );
1049                 delete pDlg;
1050                 bCallDone = sal_True;
1051             }
1052         }
1053         break;
1054 
1055         case FN_TABLE_MERGE_TABLE:
1056         {
1057             sal_Bool bPrev = rSh.CanMergeTable( sal_True );
1058             sal_Bool bNext = rSh.CanMergeTable( sal_False );
1059 
1060             if( bPrev && bNext )
1061             {
1062                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
1063                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
1064                 VclAbstractDialog* pDlg = pFact->CreateSwVclDialog( DLG_MERGE_TABLE, GetView().GetWindow(), bPrev );
1065                 DBG_ASSERT(pDlg, "dialogdiet pDlg fail!");
1066                 if( RET_OK != pDlg->Execute())
1067                     bPrev = bNext = sal_False;
1068                 delete pDlg;
1069             }
1070 
1071             if( bPrev || bNext )
1072                 rSh.MergeTable( bPrev );
1073         }
1074         break;
1075 
1076         case FN_TABLE_MODE_FIX       :
1077         case FN_TABLE_MODE_FIX_PROP  :
1078         case FN_TABLE_MODE_VARIABLE  :
1079         {
1080             rSh.SetTblChgMode( ( FN_TABLE_MODE_FIX == nSlot ? TBLFIX_CHGABS
1081                                     : FN_TABLE_MODE_FIX_PROP == nSlot
1082                                         ? TBLFIX_CHGPROP
1083                                         : TBLVAR_CHGABS ) );
1084 
1085             SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
1086             static sal_uInt16 __READONLY_DATA aInva[] =
1087                             {   FN_TABLE_MODE_FIX,
1088                                 FN_TABLE_MODE_FIX_PROP,
1089                                 FN_TABLE_MODE_VARIABLE,
1090                                 0
1091                             };
1092             rBind.Invalidate( aInva );
1093             bCallDone = sal_True;
1094         }
1095         break;
1096         case FN_TABLE_AUTOSUM:
1097         {
1098             SfxViewFrame* pVFrame = GetView().GetViewFrame();
1099             pVFrame->GetDispatcher()->Execute(FN_EDIT_FORMULA, SFX_CALLMODE_SYNCHRON);
1100             const sal_uInt16 nId = SwInputChild::GetChildWindowId();
1101             SwInputChild* pChildWin = (SwInputChild*)pVFrame->
1102                                                 GetChildWindow( nId );
1103             String sSum;
1104             GetShell().GetAutoSum(sSum);
1105             if( pChildWin )
1106                 pChildWin->SetFormula( sSum );
1107 
1108         }
1109         break;
1110         case FN_TABLE_HEADLINE_REPEAT:
1111             if(0 != rSh.GetRowsToRepeat())
1112                 rSh.SetRowsToRepeat( 0 );
1113             else
1114                 rSh.SetRowsToRepeat(rSh.GetRowSelectionFromTop());
1115         break;
1116         case FN_TABLE_SELECT_CELL   :
1117             rSh.SelectTableCell();
1118         break;
1119         case FN_TABLE_DELETE_TABLE  :
1120         {
1121             rSh.StartAction();
1122             rSh.StartUndo();
1123             rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_TABLE_SELECT_ALL);
1124             rSh.DeleteRow();
1125             rSh.EndUndo();
1126             rSh.EndAction();
1127         }
1128         //'this' is already destroyed
1129         return;
1130         //break;
1131         default:
1132             bMore = sal_True;
1133     }
1134 
1135     if ( !bMore )
1136     {
1137         if(bCallDone)
1138             rReq.Done();
1139         return;
1140     }
1141     else
1142         bMore = sal_False;
1143     //Jetzt die Slots, die direkt auf dem TableFmt arbeiten.
1144     SwFrmFmt *pFmt = rSh.GetTableFmt();
1145     switch ( nSlot )
1146     {
1147         case SID_ATTR_ULSPACE:
1148         {
1149             if(pItem)
1150             {
1151                 SvxULSpaceItem aULSpace( *(const SvxULSpaceItem*)pItem );
1152                 aULSpace.SetWhich( RES_UL_SPACE );
1153                 ::lcl_SetAttr( rSh, aULSpace );
1154             }
1155         }
1156             break;
1157 
1158         case SID_ATTR_LRSPACE:
1159         {
1160             if(pItem)
1161             {
1162                 SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE,
1163                                             RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
1164                 SvxLRSpaceItem aLRSpace( *(const SvxLRSpaceItem*)pItem );
1165                 aLRSpace.SetWhich( RES_LR_SPACE );
1166                 aSet.Put( aLRSpace );
1167                 SwFmtHoriOrient aHori( pFmt->GetHoriOrient() );
1168                 aHori.SetHoriOrient( text::HoriOrientation::NONE );
1169                 aSet.Put( aLRSpace );
1170                 rSh.SetTblAttr( aSet );
1171             }
1172         }
1173         break;
1174 // der letzte case-Zweig der noch einen TabellenManager braucht!!
1175         case FN_TABLE_SET_COL_WIDTH:
1176         {
1177             SwTableFUNC aMgr( &rSh, sal_False);
1178             aMgr.ColWidthDlg(GetView().GetWindow());
1179         }
1180         break;
1181         case FN_TABLE_VERT_NONE:
1182         case FN_TABLE_VERT_CENTER:
1183         case FN_TABLE_VERT_BOTTOM:
1184         {
1185             sal_uInt16 nAlign = nSlot == FN_TABLE_VERT_NONE ?
1186                                 text::VertOrientation::NONE :
1187                                     nSlot == FN_TABLE_VERT_CENTER ?
1188                                         text::VertOrientation::CENTER : text::VertOrientation::BOTTOM;
1189             rSh.SetBoxAlign(nAlign);
1190             bCallDone = sal_True;
1191         }
1192         break;
1193 
1194         case SID_ATTR_PARA_SPLIT:
1195             if ( pItem )
1196             {
1197                 SwFmtLayoutSplit aSplit( ((const SvxFmtSplitItem*)pItem)->GetValue());
1198                 SfxItemSet aSet(GetPool(),  RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT, 0 );
1199                 aSet.Put(aSplit);
1200                 rSh.SetTblAttr(aSet);
1201             }
1202         break;
1203 
1204         case SID_ATTR_PARA_KEEP:
1205             if ( pItem )
1206             {
1207                 SvxFmtKeepItem aKeep( *(const SvxFmtKeepItem*)pItem );
1208                 aKeep.SetWhich( RES_KEEP );
1209                 SfxItemSet aSet(GetPool(),  RES_KEEP, RES_KEEP, 0 );
1210                 aSet.Put(aKeep);
1211                 rSh.SetTblAttr(aSet);
1212             }
1213         break;
1214         case FN_TABLE_ROW_SPLIT :
1215         {
1216             const SfxBoolItem* pBool = static_cast<const SfxBoolItem*>(pItem);
1217             SwFmtRowSplit* pSplit = 0;
1218             if(!pBool)
1219             {
1220                 rSh.GetRowSplit(pSplit);
1221                 if(pSplit)
1222                     pSplit->SetValue(!pSplit->GetValue());
1223                 else
1224                    pSplit = new SwFmtRowSplit(sal_True);
1225             }
1226             else
1227             {
1228                 pSplit = new SwFmtRowSplit(pBool->GetValue());
1229             }
1230             rSh.SetRowSplit( *pSplit );
1231             delete pSplit;
1232         }
1233         break;
1234 
1235         default:
1236             ASSERT( !this, "falscher Dispatcher" );
1237             return;
1238     }
1239     if(bCallDone)
1240         rReq.Done();
1241 }
1242 /*--------------------------------------------------------------------
1243     Beschreibung:
1244  --------------------------------------------------------------------*/
1245 
1246 void SwTableShell::GetState(SfxItemSet &rSet)
1247 {
1248     SfxWhichIter aIter( rSet );
1249     SwWrtShell &rSh = GetShell();
1250     SwFrmFmt *pFmt = rSh.GetTableFmt();
1251     // os #124829# crash report: in case of an invalid shell selection return immediately
1252     if(!pFmt)
1253         return;
1254     sal_uInt16 nSlot = aIter.FirstWhich();
1255     while ( nSlot )
1256     {
1257         switch ( nSlot )
1258         {
1259             case FN_TABLE_MERGE_CELLS:
1260                 if ( !rSh.IsTableMode() )
1261                     rSet.DisableItem(FN_TABLE_MERGE_CELLS);
1262             break;
1263             case FN_TABLE_ADJUST_CELLS:
1264                 if ( !rSh.IsAdjustCellWidthAllowed() )
1265                     rSet.DisableItem(FN_TABLE_ADJUST_CELLS);
1266             break;
1267 
1268             case FN_TABLE_BALANCE_CELLS:
1269                 if ( !rSh.IsAdjustCellWidthAllowed(sal_True) )
1270                     rSet.DisableItem(FN_TABLE_BALANCE_CELLS);
1271             break;
1272 
1273             case FN_TABLE_BALANCE_ROWS:
1274                 if ( !rSh.BalanceRowHeight(sal_True) )
1275                     rSet.DisableItem(FN_TABLE_BALANCE_ROWS);
1276             break;
1277             case FN_OPTIMIZE_TABLE:
1278                 if ( !rSh.IsTableMode() &&
1279                         !rSh.IsAdjustCellWidthAllowed() &&
1280                         !rSh.IsAdjustCellWidthAllowed(sal_True) &&
1281                         !rSh.BalanceRowHeight(sal_True) )
1282                     rSet.DisableItem(FN_OPTIMIZE_TABLE);
1283             break;
1284             case SID_INSERT_DIAGRAM:
1285                 {
1286                     SvtModuleOptions aMOpt;
1287                     if ( !aMOpt.IsMath() || rSh.IsTblComplexForChart() )
1288                         rSet.DisableItem(nSlot);
1289                 }
1290                 break;
1291 
1292             case FN_INSERT_TABLE:
1293                 // Irgendeinen Wert "putten", damit Controller enabled bleibt.
1294                 // Statt "Insert:Table" erscheint dann "Format:Table".
1295 //              rSet.Put(SfxUInt16Item(nSlot, 1));
1296                 break;
1297 
1298             case FN_TABLE_OPTIMAL_HEIGHT:
1299             {
1300                 //Disablen wenn bereits auto-Hoehe eingestellt ist.
1301                 SwFmtFrmSize *pSz;
1302                 rSh.GetRowHeight( pSz );
1303                 if ( pSz )
1304                 {
1305                     if ( ATT_VAR_SIZE == pSz->GetHeightSizeType() )
1306                         rSet.DisableItem( nSlot );
1307                     delete pSz;
1308                 }
1309             }
1310             break;
1311             case FN_TABLE_INSERT_ROW:
1312             case FN_TABLE_INSERT_ROW_DLG:
1313             {
1314                 if ( rSh.IsInRepeatedHeadline() )
1315                     rSet.DisableItem( nSlot );
1316             }
1317             break;
1318             case RES_LR_SPACE:
1319                 rSet.Put(pFmt->GetLRSpace());
1320             break;
1321             case RES_UL_SPACE:
1322                 rSet.Put(pFmt->GetULSpace());
1323             break;
1324             case FN_TABLE_VERT_NONE:
1325             case FN_TABLE_VERT_CENTER:
1326             case FN_TABLE_VERT_BOTTOM:
1327             {
1328                 sal_uInt16 nAlign = rSh.GetBoxAlign();
1329                 sal_Bool bSet = (nSlot == FN_TABLE_VERT_NONE && nAlign == text::VertOrientation::NONE) ||
1330                             (nSlot == FN_TABLE_VERT_CENTER && nAlign == text::VertOrientation::CENTER) ||
1331                             (nSlot == FN_TABLE_VERT_BOTTOM && nAlign == text::VertOrientation::BOTTOM);
1332                 rSet.Put(SfxBoolItem(nSlot, bSet));
1333             }
1334             break;
1335 
1336             case FN_TABLE_MODE_FIX       :
1337             case FN_TABLE_MODE_FIX_PROP  :
1338             case FN_TABLE_MODE_VARIABLE  :
1339                 {
1340                     TblChgMode nMode = rSh.GetTblChgMode();
1341                     sal_Bool bSet = (nSlot == FN_TABLE_MODE_FIX && nMode == TBLFIX_CHGABS) ||
1342                             (nSlot == FN_TABLE_MODE_FIX_PROP && nMode == TBLFIX_CHGPROP) ||
1343                             (nSlot == FN_TABLE_MODE_VARIABLE && nMode == TBLVAR_CHGABS);
1344                     rSet.Put(SfxBoolItem(nSlot, bSet));
1345                 }
1346             break;
1347 
1348             case SID_ATTR_PARA_SPLIT:
1349                 rSet.Put( pFmt->GetKeep() );
1350             break;
1351 
1352             case SID_ATTR_PARA_KEEP:
1353                 rSet.Put( pFmt->GetLayoutSplit() );
1354             break;
1355             case FN_TABLE_SPLIT_TABLE:
1356             {
1357                 if ( rSh.IsInHeadline() )
1358                     rSet.DisableItem( nSlot );
1359             }
1360             break;
1361             case FN_TABLE_MERGE_TABLE:
1362             {
1363                 sal_Bool bAsk;
1364                 if( !rSh.CanMergeTable( sal_True, &bAsk ))
1365                     rSet.DisableItem( nSlot );
1366             }
1367             break;
1368 
1369             case FN_TABLE_DELETE_ROW:
1370                 {
1371                     SwSelBoxes aBoxes;
1372                     ::GetTblSel( rSh, aBoxes, nsSwTblSearchType::TBLSEARCH_ROW );
1373                     if( ::HasProtectedCells( aBoxes ))
1374                         rSet.DisableItem( nSlot );
1375                 }
1376                 break;
1377             case FN_TABLE_DELETE_COL:
1378                 {
1379                     SwSelBoxes aBoxes;
1380                     ::GetTblSel( rSh, aBoxes, nsSwTblSearchType::TBLSEARCH_COL );
1381                     if( ::HasProtectedCells( aBoxes ))
1382                         rSet.DisableItem( nSlot );
1383                 }
1384                 break;
1385 
1386             case FN_TABLE_UNSET_READ_ONLY_CELLS:
1387                 // disable in readonly sections, but enable in protected cells
1388                 if( !rSh.CanUnProtectCells() )
1389                     rSet.DisableItem( nSlot );
1390                 break;
1391             case RES_ROW_SPLIT:
1392             {
1393                 const SwFmtLayoutSplit& rTabSplit = pFmt->GetLayoutSplit();
1394                 if ( 0 == rTabSplit.GetValue() )
1395                 {
1396                     rSet.DisableItem( nSlot );
1397                 }
1398                 else
1399                 {
1400                     SwFmtRowSplit* pSplit = 0;
1401                     rSh.GetRowSplit(pSplit);
1402                     if(pSplit)
1403                         rSet.Put(*pSplit);
1404                     else
1405                         rSet.InvalidateItem( nSlot );
1406                     delete pSplit;
1407                 }
1408             }
1409             break;
1410             case FN_TABLE_HEADLINE_REPEAT:
1411                 if(0 != rSh.GetRowsToRepeat())
1412                     rSet.Put(SfxBoolItem(nSlot, sal_True));
1413                 else if(!rSh.GetRowSelectionFromTop())
1414                     rSet.DisableItem( nSlot );
1415                 else
1416                     rSet.Put(SfxBoolItem(nSlot, sal_False));
1417             break;
1418             case FN_TABLE_SELECT_CELL   :
1419                 if(rSh.HasBoxSelection())
1420                     rSet.DisableItem( nSlot );
1421             break;
1422         }
1423     nSlot = aIter.NextWhich();
1424     }
1425 }
1426 
1427 /*--------------------------------------------------------------------
1428     Beschreibung:
1429  --------------------------------------------------------------------*/
1430 
1431 SwTableShell::SwTableShell(SwView &_rView) :
1432     SwBaseShell(_rView)
1433 {
1434     SetName(String::CreateFromAscii("Table"));
1435     SetHelpId(SW_TABSHELL);
1436 }
1437 
1438 /*--------------------------------------------------------------------
1439     Beschreibung:
1440  --------------------------------------------------------------------*/
1441 
1442 void SwTableShell::GetFrmBorderState(SfxItemSet &rSet)
1443 {
1444     SfxItemSet aCoreSet( GetPool(),
1445                          RES_BOX, RES_BOX,
1446                          SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
1447     SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
1448     aCoreSet.Put( aBoxInfo );
1449     GetShell().GetTabBorders( aCoreSet );
1450     rSet.Put( aCoreSet );
1451 }
1452 
1453 /*--------------------------------------------------------------------
1454     Beschreibung:
1455  --------------------------------------------------------------------*/
1456 
1457 void SwTableShell::ExecTableStyle(SfxRequest& rReq)
1458 {
1459     SwWrtShell &rSh = GetShell();
1460     const SfxItemSet *pArgs = rReq.GetArgs();
1461     if(pArgs)
1462         switch ( rReq.GetSlot() )
1463         {
1464             case SID_FRAME_LINESTYLE:
1465             case SID_FRAME_LINECOLOR:
1466             {
1467 /*  Tabellenselektion ist abgeschafft
1468                 sal_Bool bPopCrsr = sal_False;
1469                 if ( !rReq.IsAPI() )
1470                 {
1471                     //Keine Tabellenselektion -> Aenderung wird auf die gesamte
1472                     //Tabelle.
1473                     if ( !rSh.IsTableMode() )
1474                     {
1475                         bPopCrsr = sal_True;
1476                         rSh.Push();
1477                         rSh.StartAction();
1478                         rSh.EnterStdMode();
1479                         rSh.MoveTable( fnTableCurr, fnTableStart );
1480                         rSh.SttSelect();
1481                         rSh.MoveTable( fnTableCurr, fnTableEnd );
1482                         rSh.EndSelect();
1483                     }
1484                 }*/
1485                 if ( rReq.GetSlot() == SID_FRAME_LINESTYLE )
1486                 {
1487                     const SvxLineItem &rLineItem = (const SvxLineItem&)pArgs->
1488                                                             Get( SID_FRAME_LINESTYLE );
1489                     const SvxBorderLine* pBorderLine = rLineItem.GetLine();
1490                     rSh.SetTabLineStyle( 0, sal_True, pBorderLine);
1491                 }
1492                 else
1493                 {
1494                     const SvxColorItem &rNewColorItem = (const SvxColorItem&)pArgs->
1495                                                             Get( SID_FRAME_LINECOLOR );
1496                     rSh.SetTabLineStyle( &rNewColorItem.GetValue() );
1497                 }
1498 
1499                 rReq.Done();
1500 /*              if ( bPopCrsr )
1501                 {
1502                     rSh.KillPams();
1503                     rSh.Pop(sal_False);
1504                     rSh.EndAction();
1505                 }*/
1506                 break;
1507             }
1508         }
1509 }
1510 
1511 
1512 void SwTableShell::GetLineStyleState(SfxItemSet &rSet)
1513 {
1514     SfxItemSet aCoreSet( GetPool(),
1515                             RES_BOX, RES_BOX,
1516                             SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0);
1517     SvxBoxInfoItem aCoreInfo( SID_ATTR_BORDER_INNER );
1518     aCoreSet.Put(aCoreInfo);
1519     GetShell().GetTabBorders( aCoreSet );
1520 
1521     const SvxBoxItem& rBoxItem = (const SvxBoxItem&)aCoreSet.Get( RES_BOX );
1522     const SvxBorderLine* pLine = rBoxItem.GetTop();
1523 
1524     rSet.Put( SvxColorItem( pLine ? pLine->GetColor() : Color(), SID_FRAME_LINECOLOR ) );
1525     SvxLineItem aLine( SID_FRAME_LINESTYLE );
1526     aLine.SetLine(pLine);
1527     rSet.Put( aLine );
1528 }
1529 
1530 void SwTableShell::ExecNumberFormat(SfxRequest& rReq)
1531 {
1532     const SfxItemSet* pArgs = rReq.GetArgs();
1533     SwWrtShell &rSh = GetShell();
1534 
1535     //Erstmal die Slots, die keinen FrmMgr benoetigen.
1536     const SfxPoolItem* pItem = 0;
1537     sal_uInt16 nSlot = rReq.GetSlot();
1538     if(pArgs)
1539         pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
1540 
1541     //  Sprache immer von Cursorposition besorgen
1542     LanguageType eLang = rSh.GetCurLang();
1543     SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
1544     sal_uInt32 nNumberFormat = NUMBERFORMAT_ENTRY_NOT_FOUND;
1545     sal_uInt16 nFmtType = 0, nOffset = 0;
1546 
1547     switch ( nSlot )
1548     {
1549     case FN_NUMBER_FORMAT:
1550         if( pItem )
1551         {
1552             //  Index fuer String bestimmen
1553             String aCode( ((const SfxStringItem*)pItem)->GetValue() );
1554             nNumberFormat = pFormatter->GetEntryKey( aCode, eLang );
1555             if( NUMBERFORMAT_ENTRY_NOT_FOUND == nNumberFormat )
1556             {
1557                 //  neu eintragen
1558                 xub_StrLen nErrPos;
1559                 short nType;
1560                 if( !pFormatter->PutEntry( aCode, nErrPos, nType,
1561                                             nNumberFormat, eLang ))
1562                     nNumberFormat = NUMBERFORMAT_ENTRY_NOT_FOUND;
1563             }
1564         }
1565         break;
1566     case FN_NUMBER_STANDARD:        nFmtType = NUMBERFORMAT_NUMBER; break;
1567     case FN_NUMBER_SCIENTIFIC:      nFmtType = NUMBERFORMAT_SCIENTIFIC; break;
1568     case FN_NUMBER_DATE:            nFmtType = NUMBERFORMAT_DATE; break;
1569     case FN_NUMBER_TIME:            nFmtType = NUMBERFORMAT_TIME; break;
1570     case FN_NUMBER_CURRENCY:        nFmtType = NUMBERFORMAT_CURRENCY; break;
1571     case FN_NUMBER_PERCENT:         nFmtType = NUMBERFORMAT_PERCENT; break;
1572 
1573     case FN_NUMBER_TWODEC:          // #.##0,00
1574         nFmtType = NUMBERFORMAT_NUMBER;
1575         nOffset = NF_NUMBER_1000DEC2;
1576         break;
1577 
1578     default:
1579         ASSERT(sal_False, falscher Dispatcher);
1580         return;
1581     }
1582 
1583     if( nFmtType )
1584         nNumberFormat = pFormatter->GetStandardFormat( nFmtType, eLang ) + nOffset;
1585 
1586     if( NUMBERFORMAT_ENTRY_NOT_FOUND != nNumberFormat )
1587     {
1588         SfxItemSet aBoxSet( GetPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMAT );
1589         aBoxSet.Put( SwTblBoxNumFormat( nNumberFormat ));
1590         rSh.SetTblBoxFormulaAttrs( aBoxSet );
1591     }
1592 
1593 }
1594 
1595