/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"

#include <sot/factory.hxx>
#include <hintids.hxx>
#include <svl/urihelper.hxx>
#include <svl/languageoptions.hxx>

#include <svx/svxids.hrc>
#include <sfx2/linkmgr.hxx>
#include <svx/htmlmode.hxx>
#include <svx/imapdlg.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/request.hxx>
#include <svl/whiter.hxx>
#include <svl/visitem.hxx>
#include <sfx2/objitem.hxx>
#include <svtools/filter.hxx>
#include <svx/gallery.hxx>
#include <editeng/langitem.hxx>
#include <svx/clipfmtitem.hxx>
#include <svx/contdlg.hxx>
#include <vcl/graph.hxx>
#include <svl/slstitm.hxx>
#include <vcl/msgbox.hxx>
#include <svl/ptitem.hxx>
#include <svl/itemiter.hxx>
#include <svl/stritem.hxx>
#include <editeng/colritem.hxx>
#include <editeng/shaditem.hxx>
#include <editeng/boxitem.hxx>
#include <svl/srchitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/brshitem.hxx>
#include <editeng/opaqitem.hxx>
#include <editeng/sizeitem.hxx>
#include <svx/flagsdef.hxx>
#include <editeng/scripttypeitem.hxx>
#include <sfx2/objface.hxx>
#include <fmturl.hxx>
#include <fmthdft.hxx>
#include <fmtclds.hxx>
#include <docsh.hxx>
#include <wrtsh.hxx>
#include <view.hxx>
#include <swmodule.hxx>
#include <swundo.hxx>
#include <fldbas.hxx>
#include <uitool.hxx>
#include <basesh.hxx>
#include <viewopt.hxx>
#include <fontcfg.hxx>
#include <docstat.hxx>
#include <usrfld.hxx>
#include <expfld.hxx>
#include <fldmgr.hxx>
#include <frmmgr.hxx>
#include <tablemgr.hxx>
#include <mdiexp.hxx>
#include <swdtflvr.hxx>
#include <pagedesc.hxx>
#include <convert.hxx>
#include <fmtcol.hxx>
#include <edtwin.hxx>
#include <tblafmt.hxx>
#include <caption.hxx>
#include <swwait.hxx>
#include <cmdid.h>
#include <globals.hrc>
#include <shells.hrc>
#include <statstr.hrc>
#include <globals.h>
#include <unotxdoc.hxx>
#include <crsskip.hxx>
#include <fmtinfmt.hxx>
#include <doc.hxx>

#include "swabstdlg.hxx"
#include "dialog.hrc"
#include "fldui.hrc"
#include "table.hrc"
#include <modcfg.hxx>
#include <instable.hxx>
#include <svx/fmshell.hxx> // for FN_XFORMS_DESIGN_MODE
#include <SwRewriter.hxx>
#include <comcore.hrc>

#include <unomid.h>
#include <svx/galleryitem.hxx>
#include <com/sun/star/gallery/GalleryItemType.hpp>

FlyMode SwBaseShell::eFrameMode = FLY_DRAG_END;


//Fuer die Erkennung der Id, die variable von Gallery mit SID_GALLERY_BG_BRUSH
//ankommt.
static sal_uInt8 nParagraphPos;
static sal_uInt8 nGraphicPos;
static sal_uInt8 nOlePos;
static sal_uInt8 nFramePos;
static sal_uInt8 nTablePos;
static sal_uInt8 nTableRowPos;
static sal_uInt8 nTableCellPos;
static sal_uInt8 nPagePos;
static sal_uInt8 nHeaderPos;
static sal_uInt8 nFooterPos;

#define SwBaseShell
#define Shadow
#include <sfx2/msg.hxx>
#include "swslots.hxx"

#define SWCONTOURDLG(rView) ( (SvxContourDlg*) ( rView.GetViewFrame()->GetChildWindow( 	\
						  SvxContourDlgChildWindow::GetChildWindowId() )-> 	\
						  GetWindow() ) )

#define SWIMAPDLG(rView) ( (SvxIMapDlg*) ( rView.GetViewFrame()->GetChildWindow( 		\
						SvxIMapDlgChildWindow::GetChildWindowId() )-> 	\
						GetWindow() ) )


using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::lang;


SFX_IMPL_INTERFACE(SwBaseShell, SfxShell, SW_RES(0))
{
	SFX_CHILDWINDOW_REGISTRATION(SvxIMapDlgChildWindow::GetChildWindowId());
	SFX_CHILDWINDOW_REGISTRATION(SvxContourDlgChildWindow::GetChildWindowId());
}

TYPEINIT1(SwBaseShell,SfxShell)

/*--------------------------------------------------------------------
	Beschreibung:	statics
 --------------------------------------------------------------------*/


void lcl_UpdateIMapDlg( SwWrtShell& rSh )
{
	Graphic aGrf( rSh.GetIMapGraphic() );
    GraphicType nGrfType = aGrf.GetType();
	void* pEditObj = GRAPHIC_NONE != nGrfType && GRAPHIC_DEFAULT != nGrfType
						? rSh.GetIMapInventor() : 0;
	TargetList* pList = new TargetList;
	rSh.GetView().GetViewFrame()->GetTopFrame().GetTargetList(*pList);

	SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
	rSh.GetFlyFrmAttr( aSet );
	const SwFmtURL &rURL = (SwFmtURL&)aSet.Get( RES_URL );
	SvxIMapDlgChildWindow::UpdateIMapDlg(
			aGrf, rURL.GetMap(), pList, pEditObj );

	sal_uInt16 nCount = (sal_uInt16)pList->Count();
	if(nCount)
		for( sal_uInt16 i = nCount; i; i--  )
		{
			delete pList->GetObject(i-1);
		}
	delete pList;
}


sal_Bool lcl_UpdateContourDlg( SwWrtShell &rSh, int nSel )
{
	Graphic aGraf( rSh.GetIMapGraphic() );
    GraphicType nGrfType = aGraf.GetType();
	sal_Bool bRet = GRAPHIC_NONE != nGrfType && GRAPHIC_DEFAULT != nGrfType;
	if( bRet )
	{
		String aGrfName;
		if ( nSel & nsSelectionType::SEL_GRF )
			rSh.GetGrfNms( &aGrfName, 0 );

		SvxContourDlg *pDlg = SWCONTOURDLG(rSh.GetView());
		pDlg->Update( aGraf, aGrfName.Len() > 0,
				  rSh.GetGraphicPolygon(), rSh.GetIMapInventor() );
	}
	return bRet;
}

/*--------------------------------------------------------------------
	Beschreibung:	loeschen
 --------------------------------------------------------------------*/

void SwBaseShell::ExecDelete(SfxRequest &rReq)
{
	SwWrtShell &rSh = GetShell();
    SwEditWin& rTmpEditWin = GetView().GetEditWin();
	switch(rReq.GetSlot())
	{
		case SID_DELETE:
			rSh.DelRight();
			break;

		case FN_BACKSPACE:

			if( rSh.IsNoNum() )
			{
				rSh.SttCrsrMove();
				sal_Bool bLeft = rSh.Left( CRSR_SKIP_CHARS, sal_True, 1, sal_False  );
				if( bLeft )
				{
					// JP 28.03.96: ein Backspace im Absatz ohne Nummer wird zum Delete
					//rSh.SwapPam();
					//rSh.DelRight( sal_False );

                    rSh.DelLeft();
				}
				else
					// JP 15.07.96: wenns nicht mehr nach vorne geht, die
					//				Numerierung aufheben. Z.B. am Doc-/
					//				Rahmen-/Tabellen-/Bereichs-Anfang
					rSh.DelNumRules();

				rSh.EndCrsrMove();
				break;
			}

			// ansonsten DelLeft rufen
		case FN_SHIFT_BACKSPACE:
			rSh.DelLeft();
			break;
		default:
			DBG_ERROR("falscher Dispatcher");
			return;
	}
    rReq.Done();

    //#i42732# - notify the edit window that from now on we do not use the input language
    rTmpEditWin.SetUseInputLanguage( sal_False );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecClpbrd(SfxRequest &rReq)
{
	//Achtung: Suizid gefaehrdet! Nach Paste, Paste special kann der die
	//Shell zerstoert sein.


	SwWrtShell &rSh = GetShell();
	sal_uInt16 nId = rReq.GetSlot();
    sal_Bool bIgnore = sal_False;
	switch( nId )
	{
		case SID_CUT:
		case SID_COPY:
            rView.GetEditWin().FlushInBuffer();
			if ( rSh.HasSelection() )
			{
				SwTransferable* pTransfer = new SwTransferable( rSh );
/*??*/          uno::Reference< datatransfer::XTransferable > xRef( pTransfer );

				if ( nId == SID_CUT && !rSh.IsSelObjProtected(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) )
					pTransfer->Cut();
				else
                {
                    const sal_Bool bLockedView = rSh.IsViewLocked();
                    rSh.LockView( sal_True );    //lock visible section
                    pTransfer->Copy();
                    rSh.LockView( bLockedView );
                }
				break;
			}
			return;

        case SID_PASTE:
            {
                TransferableDataHelper aDataHelper(
                    TransferableDataHelper::CreateFromSystemClipboard( &rSh.GetView().GetEditWin() ) );
                if( aDataHelper.GetXTransferable().is()
                    && SwTransferable::IsPaste( rSh, aDataHelper )
                    && !rSh.CrsrInsideInputFld() )
                {
                    // temp. Variablen, da die Shell nach dem Paste schon
                    // zerstoert sein kann
                    SwView* pView = &rView;
                    SwTransferable::Paste( rSh, aDataHelper );
                    if( rSh.IsFrmSelected() || rSh.IsObjSelected() )
                        rSh.EnterSelFrmMode();
                    pView->AttrChangedNotify( &rSh );
                }
                else
                    return;
            }
            break;

		case SID_CLIPBOARD_FORMAT_ITEMS:
			{
				const SfxItemSet* pArgs = rReq.GetArgs();
				const SfxPoolItem* pFmt;
                if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nId, sal_False, &pFmt ) )
				{
					TransferableDataHelper aDataHelper(
						TransferableDataHelper::CreateFromSystemClipboard(
											&rSh.GetView().GetEditWin()) );
					if( aDataHelper.GetXTransferable().is()
						/*&& SwTransferable::IsPaste( rSh, aDataHelper )*/ )
					{
						// temp. Variablen, da die Shell nach dem Paste schon
						// zerstoert sein kann
						SwView* pView = &rView;

						SwTransferable::PasteFormat( rSh, aDataHelper,
										((SfxUInt32Item*)pFmt)->GetValue() );

                        //Done() has to be called before the shell has been removed
                        rReq.Done();
                        bIgnore = sal_True;
                        if( rSh.IsFrmSelected() || rSh.IsObjSelected())
							rSh.EnterSelFrmMode();
						pView->AttrChangedNotify( &rSh );
                    }
				}
			}
			break;

        case SID_PASTE_UNFORMATTED:
            {
                TransferableDataHelper aDataHelper(
                    TransferableDataHelper::CreateFromSystemClipboard( &rSh.GetView().GetEditWin()) );
                if( aDataHelper.GetXTransferable().is()
                    && SwTransferable::IsPaste( rSh, aDataHelper ) )
                {
                    // temp. Variablen, da die Shell nach dem Paste schon
                    // zerstoert sein kann
                    SwView* pView = &rView;
                    rReq.Ignore();
                    bIgnore = sal_True;
                    int nRet = SwTransferable::PasteUnformatted( rSh, aDataHelper );
                    if(nRet)// && rReq.IsRecording() )
                    {
                        SfxViewFrame* pViewFrame = pView->GetViewFrame();
                        uno::Reference< frame::XDispatchRecorder > xRecorder =
                            pViewFrame->GetBindings().GetRecorder();
                        if(xRecorder.is()) {
                            SfxRequest aReq( pViewFrame, SID_CLIPBOARD_FORMAT_ITEMS );
                            aReq.AppendItem( SfxUInt32Item( SID_CLIPBOARD_FORMAT_ITEMS, SOT_FORMAT_STRING ) );
                            aReq.Done();
                        }
                    }

                    if (rSh.IsFrmSelected() || rSh.IsObjSelected())
                        rSh.EnterSelFrmMode();
                    pView->AttrChangedNotify( &rSh );
                }
                else
                    return;
            }
            break;

        case SID_PASTE_SPECIAL:
            {
                TransferableDataHelper aDataHelper(
                    TransferableDataHelper::CreateFromSystemClipboard( &rSh.GetView().GetEditWin()) );
                if( aDataHelper.GetXTransferable().is()
                    && SwTransferable::IsPaste( rSh, aDataHelper )
                    && !rSh.CrsrInsideInputFld() )
                {
                    // temp. Variablen, da die Shell nach dem Paste schon
                    // zerstoert sein kann
                    SwView* pView = &rView;
                    sal_uLong nFormatId = 0;
                    rReq.Ignore();
                    bIgnore = sal_True;
                    int nRet = SwTransferable::PasteSpecial( rSh, aDataHelper, nFormatId );
                    if(nRet)// && rReq.IsRecording() )
                    {
                        SfxViewFrame* pViewFrame = pView->GetViewFrame();
                        uno::Reference< frame::XDispatchRecorder > xRecorder =
                            pViewFrame->GetBindings().GetRecorder();
                        if(xRecorder.is()) {
                            SfxRequest aReq( pViewFrame, SID_CLIPBOARD_FORMAT_ITEMS );
                            aReq.AppendItem( SfxUInt32Item( SID_CLIPBOARD_FORMAT_ITEMS, nFormatId ) );
                            aReq.Done();
                        }
                    }

                    if (rSh.IsFrmSelected() || rSh.IsObjSelected())
                        rSh.EnterSelFrmMode();
                    pView->AttrChangedNotify( &rSh );
                }
                else
                    return;
            }
            break;

        default:
            DBG_ERROR("falscher Dispatcher");
            return;
    }
    if(!bIgnore)
        rReq.Done();
}

/*--------------------------------------------------------------------
	Beschreibung:	ClipBoard-Status
 --------------------------------------------------------------------*/

void SwBaseShell::StateClpbrd(SfxItemSet &rSet)
{
	SwWrtShell &rSh = GetShell();
	SfxWhichIter aIter(rSet);

	const sal_Bool bCopy = rSh.HasSelection();

	sal_uInt16 nWhich = aIter.FirstWhich();

	while(nWhich)
	{
		switch(nWhich)
		{
		case SID_CUT:
			if( 0 != rSh.IsSelObjProtected(FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) )
			{
				rSet.DisableItem( nWhich );
				break;
			}
		case SID_COPY:
			if( !bCopy )
				rSet.DisableItem( nWhich );
			break;

        case SID_PASTE:
            if( !GetView().IsPasteAllowed()
                || rSh.CrsrInsideInputFld() )
            {
                rSet.DisableItem( nWhich );
            }
            break;

        case SID_PASTE_SPECIAL:
            if( !GetView().IsPasteSpecialAllowed()
                || rSh.CrsrInsideInputFld() )
            {
                rSet.DisableItem( nWhich );
            }
            break;

        case SID_PASTE_UNFORMATTED:
            if( !GetView().IsPasteSpecialAllowed() )
            {
                rSet.DisableItem( nWhich );
            }
            break;

		case SID_CLIPBOARD_FORMAT_ITEMS:
			{
				TransferableDataHelper aDataHelper(
					TransferableDataHelper::CreateFromSystemClipboard(
											&rSh.GetView().GetEditWin()) );

				SvxClipboardFmtItem aFmtItem( nWhich );
				SwTransferable::FillClipFmtItem( rSh, aDataHelper, aFmtItem );
				rSet.Put( aFmtItem );
			}
			break;
		}
		nWhich = aIter.NextWhich();
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Undo ausfuehren
 --------------------------------------------------------------------*/

void SwBaseShell::ExecUndo(SfxRequest &rReq)
{
	SwWrtShell &rSh = GetShell();

	sal_uInt16 nId = rReq.GetSlot(), nCnt = 1;
	const SfxItemSet* pArgs = rReq.GetArgs();
	const SfxPoolItem* pItem;
	if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nId, sal_False, &pItem ))
		nCnt = ((SfxUInt16Item*)pItem)->GetValue();

    // #i106349#: save pointer: undo/redo may delete the shell, i.e., this!
    SfxViewFrame *const pViewFrame( GetView().GetViewFrame() );

	switch( nId )
	{
		case SID_UNDO:
            rSh.LockPaint();
			rSh.Do( SwWrtShell::UNDO, nCnt );
            rSh.UnlockPaint();
			break;

		case SID_REDO:
            rSh.LockPaint();
			rSh.Do( SwWrtShell::REDO, nCnt );
            rSh.UnlockPaint();
			break;

		case SID_REPEAT:
			rSh.Do( SwWrtShell::REPEAT );
			break;
		default:
			DBG_ERROR("falscher Dispatcher");
	}

    if (pViewFrame) { pViewFrame->GetBindings().InvalidateAll(sal_False); }
}

/*--------------------------------------------------------------------
	Beschreibung:	Zustand Undo
 --------------------------------------------------------------------*/

void SwBaseShell::StateUndo(SfxItemSet &rSet)
{
	SwWrtShell &rSh = GetShell();
	SfxWhichIter aIter(rSet);
	sal_uInt16 nWhich = aIter.FirstWhich();
	while(nWhich)
	{
		switch(nWhich)
		{
			case SID_UNDO:
			{
                if (rSh.GetLastUndoInfo(0, 0))
                {
					rSet.Put( SfxStringItem(nWhich,
						rSh.GetDoString(SwWrtShell::UNDO)));
                }
				else
					rSet.DisableItem(nWhich);
				break;
			}
			case SID_REDO:
			{
                if (rSh.GetFirstRedoInfo(0))
                {
					rSet.Put(SfxStringItem(nWhich,
						rSh.GetDoString(SwWrtShell::REDO)));
                }
				else
					rSet.DisableItem(nWhich);
				break;
			}
			case SID_REPEAT:
			{	// Repeat nur moeglich wenn kein REDO moeglich - UI-Restriktion
                if ((!rSh.GetFirstRedoInfo(0)) &&
					!rSh.IsSelFrmMode() &&
                    (UNDO_EMPTY != rSh.GetRepeatInfo(0)))
                {
					rSet.Put(SfxStringItem(nWhich, rSh.GetRepeatString()));
                }
				else
					rSet.DisableItem(nWhich);
				break;
			}

			case SID_GETUNDOSTRINGS:
                if (rSh.GetLastUndoInfo(0, 0))
				{
					SfxStringListItem aStrLst( nWhich );
					rSh.GetDoStrings( SwWrtShell::UNDO, aStrLst );
					rSet.Put( aStrLst );
				}
				else
					rSet.DisableItem( nWhich );
				break;

			case SID_GETREDOSTRINGS:
                if (rSh.GetFirstRedoInfo(0))
				{
					SfxStringListItem aStrLst( nWhich );
					rSh.GetDoStrings( SwWrtShell::REDO, aStrLst );
					rSet.Put( aStrLst );
				}
				else
					rSet.DisableItem( nWhich );
				break;
		}
		nWhich = aIter.NextWhich();
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Slot-Id auswerten bzw. Dispatchen
 --------------------------------------------------------------------*/

void SwBaseShell::Execute(SfxRequest &rReq)
{
	const SfxPoolItem *pItem;
	SwWrtShell &rSh = GetShell();
	const SfxItemSet* pArgs = rReq.GetArgs();
	sal_Bool bMore = sal_False;

	sal_uInt16 nSlot = rReq.GetSlot();
	switch(nSlot)
	{
		case FN_REPAGINATE:
			{
				Reference < XModel > xModel = GetView().GetDocShell()->GetModel();
				Reference < XUnoTunnel > xDocTunnel ( xModel, UNO_QUERY );
				SwXTextDocument *pDoc = reinterpret_cast < SwXTextDocument * > ( xDocTunnel->getSomething ( SwXTextDocument::getUnoTunnelId() ) );
				pDoc->notifyRefreshListeners();
				rSh.CalcLayout();
			}
			break;
		case FN_UPDATE_FIELDS:
			{
				SwDocStat aDocStat;
				rSh.UpdateDocStat(aDocStat);
				rSh.EndAllTblBoxEdit();
				rSh.ViewShell::UpdateFlds(sal_True);

				if( rSh.IsCrsrInTbl() )
				{
					if( !rSh.IsTblComplexForChart() )
						SwTableFUNC( &rSh, sal_False).UpdateChart();
					rSh.ClearTblBoxCntnt();
					rSh.SaveTblBoxCntnt();
				}
			}
			break;
		case FN_UPDATE_CHARTS:
			{
				SwWait aWait( *rView.GetDocShell(), true );
				rSh.UpdateAllCharts();
			}
			break;

		case FN_UPDATE_ALL:
			{
                SwView&  rTempView = GetView();
                rSh.EnterStdMode();
				if( rSh.GetLinkManager().GetLinks().Count() )
				{
					rSh.StartAllAction();
					rSh.GetLinkManager().UpdateAllLinks( sal_False, sal_True, sal_True );
					rSh.EndAllAction();
				}
                SfxDispatcher &rDis = *rTempView.GetViewFrame()->GetDispatcher();
				rDis.Execute( FN_UPDATE_FIELDS );
				rDis.Execute( FN_UPDATE_TOX );
				rDis.Execute( FN_UPDATE_CHARTS );
				rSh.CalcLayout();
			}
			break;

        case FN_UPDATE_INPUTFIELDS:
            rSh.UpdateInputFlds();
            break;

		case FN_PREV_BOOKMARK:
			rReq.SetReturnValue(SfxBoolItem( nSlot, rSh.GoPrevBookmark()));
			break;
		case FN_NEXT_BOOKMARK:
			rReq.SetReturnValue(SfxBoolItem( nSlot, rSh.GoNextBookmark()));
			break;

		case FN_GOTO_NEXT_MARK:
		case FN_GOTO_PREV_MARK:
		{
			SwFldMgr aFldMgr;
			SwFieldType* pFldType = aFldMgr.GetFldType(RES_JUMPEDITFLD);

			if (pFldType)
			{
				if (rSh.IsSelFrmMode())
				{
					rSh.UnSelectFrm();
					rSh.LeaveSelFrmMode();
				}

				if (rSh.HasMark())
				{
					MV_KONTEXT(&rSh);
					if (rSh.IsCrsrPtAtEnd())
						rSh.SwapPam();
					rSh.ClearMark();
					rSh.EndSelect();
				}
				sal_Bool bRet = rSh.MoveFldType( pFldType, nSlot == FN_GOTO_NEXT_MARK );
                SwField* pCurField = bRet ? rSh.GetCurFld() : 0;
                if (pCurField)
					rSh.ClickToField(*pCurField);
				rReq.SetReturnValue(SfxBoolItem( nSlot, bRet));
			}
		}
		break;

		case FN_START_DOC_DIRECT:
		case FN_END_DOC_DIRECT:
		{
			if (rSh.IsSelFrmMode())
			{
				rSh.UnSelectFrm();
				rSh.LeaveSelFrmMode();
			}
			rSh.EnterStdMode();
			nSlot == FN_START_DOC_DIRECT ?
				rSh.SttEndDoc(sal_True) :
					rSh.SttEndDoc(sal_False);
		}
		break;
		case FN_GOTO_PREV_OBJ:
		case FN_GOTO_NEXT_OBJ:
		{
				sal_Bool bSuccess = rSh.GotoObj(
							nSlot == FN_GOTO_NEXT_OBJ ? sal_True : sal_False);
				rReq.SetReturnValue(SfxBoolItem(nSlot, bSuccess));
				if (bSuccess && !rSh.IsSelFrmMode())
				{
					rSh.HideCrsr();
					rSh.EnterSelFrmMode();
					GetView().AttrChangedNotify( &rSh );
				}
		}
		break;
		case SID_GALLERY_FORMATS:
		{
            SFX_ITEMSET_ARG( pArgs, pGalleryItem, SvxGalleryItem, SID_GALLERY_FORMATS, sal_False );
            if ( !pGalleryItem )
                break;

            const int nSelType = rSh.GetSelectionType();
            sal_Int8 nGalleryItemType( pGalleryItem->GetType() );

            if ( (!rSh.IsSelFrmMode() || nSelType & nsSelectionType::SEL_GRF) &&
                nGalleryItemType == com::sun::star::gallery::GalleryItemType::GRAPHIC )
            {
                SwWait aWait( *rView.GetDocShell(), true );

                String aGrfName, aFltName;
                const Graphic aGrf( pGalleryItem->GetGraphic() );

                if( pGalleryItem->IsLink() )
                {
                    // Verknuepft
                    aGrfName = pGalleryItem->GetURL();
                    aFltName = pGalleryItem->GetFilterName();
                }

                if ( nSelType & nsSelectionType::SEL_GRF )
                    rSh.ReRead( aGrfName, aFltName, &aGrf );
                else
                    rSh.Insert( aGrfName, aFltName, aGrf );

                GetView().GetEditWin().GrabFocus();
            }
            else if(!rSh.IsSelFrmMode() &&
                nGalleryItemType == com::sun::star::gallery::GalleryItemType::MEDIA  )
            {
                const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, pGalleryItem->GetURL() );
                GetView().GetViewFrame()->GetDispatcher()->Execute( SID_INSERT_AVMEDIA, SFX_CALLMODE_SYNCHRON, &aMediaURLItem, 0L );
/*
                String sURL( pGalleryItem->GetURL().GetMainURL( INetURLObject::NO_DECODE ) );
                String sLabel( pGalleryItem->GetURL().getBase() );
                String sTarget; // empty string!

                bool bIsHTMLMode =
                    0 == ( HTMLMODE_ON &
                            ::GetHtmlMode( GetView().GetDocShell() ) );

                // in Writer, we insert a button which plays the
                // sound. In Writer/Web, we just insert a (text) link.
                if( bIsHTMLMode )
                    InsertURLButton( sURL, sTarget, sLabel );
                else
                    rSh.InsertURL( SwFmtINetFmt( sURL, sTarget ), sLabel );
*/
            }
		}
		break;
		case FN_PAGE_STYLE_SET_COLS:
		{
			if (pArgs)
			{
				// aktuellen PageDescriptor ermitteln und damit den Set fuellen
				const sal_uInt16 nCurIdx = rSh.GetCurPageDesc();
				SwPageDesc aPageDesc(rSh.GetPageDesc(nCurIdx));

				SwFrmFmt &rFmt = aPageDesc.GetMaster();

				SwFmtCol aFmtCol = rFmt.GetCol();

				sal_uInt16 nCount;
				if(SFX_ITEM_SET == pArgs->GetItemState(nSlot))
					nCount = ((SfxUInt16Item &)pArgs->Get(nSlot)).GetValue();
				else
					nCount = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_COLUMNS)).GetValue();
				sal_uInt16 nGutterWidth = DEF_GUTTER_WIDTH;

				aFmtCol.Init(nCount ? nCount : 1, nGutterWidth, USHRT_MAX);
				aFmtCol.SetWishWidth(USHRT_MAX);
				aFmtCol.SetGutterWidth(nGutterWidth, USHRT_MAX);

                rFmt.SetFmtAttr(aFmtCol);

				rSh.ChgPageDesc(nCurIdx, aPageDesc);
			}
			else
				GetView().GetViewFrame()->GetDispatcher()->Execute(FN_FORMAT_PAGE_COLUMN_DLG, sal_False);
		}
		break;
        case FN_CONVERT_TABLE_TO_TEXT:
        case FN_CONVERT_TEXT_TO_TABLE:
        case FN_CONVERT_TEXT_TABLE:
		{
            sal_Unicode cDelim = 0;
            bool bToTable = false;
            if( nSlot == FN_CONVERT_TEXT_TO_TABLE ||
                ( nSlot == FN_CONVERT_TEXT_TABLE && 0 == rSh.GetTableFmt() ))
                bToTable = true;
            SwInsertTableOptions aInsTblOpts( tabopts::ALL_TBL_INS_ATTR, 1 );
            SwTableAutoFmt* pTAFmt = 0;
            SwTableAutoFmtTbl* pAutoFmtTbl = 0;
            bool bDeleteFormat = true;
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem))
            {
                aInsTblOpts.mnInsMode = 0;
                //Delimiter
                String sDelim = static_cast< const SfxStringItem* >(pItem)->GetValue();
                if(sDelim.Len())
                    cDelim = sDelim.GetChar(0);
                //AutoFormat
                if(SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_2, sal_True, &pItem))
                {
                    String sAutoFmt = static_cast< const SfxStringItem* >(pItem)->GetValue();

                    pAutoFmtTbl = new SwTableAutoFmtTbl;
                    pAutoFmtTbl->Load();

                    for( sal_uInt16 i = 0, nCount = pAutoFmtTbl->Count(); i < nCount; i++ )
                    {
                        SwTableAutoFmt* pFmt = (*pAutoFmtTbl)[ i ];
                        if( pFmt->GetName() == sAutoFmt )
                        {
                            pTAFmt = pFmt;
                            bDeleteFormat = false;
                            break;
                        }
                    }
                }
                //WithHeader
                if(SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_3, sal_True, &pItem) &&
                            static_cast< const SfxBoolItem* >(pItem)->GetValue())
                    aInsTblOpts.mnInsMode |= tabopts::HEADLINE;
                // RepeatHeaderLines
                if(SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_4, sal_True, &pItem))
                   aInsTblOpts.mnRowsToRepeat =
                            (sal_uInt16)static_cast< const SfxInt16Item* >(pItem)->GetValue();
                //WithBorder
                if(SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_5, sal_True, &pItem) &&
                    static_cast< const SfxBoolItem* >(pItem)->GetValue())
                    aInsTblOpts.mnInsMode |= tabopts::DEFAULT_BORDER;
                //DontSplitTable
                if(SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_6, sal_True, &pItem) &&
                    !static_cast< const SfxBoolItem* >(pItem)->GetValue() )
                    aInsTblOpts.mnInsMode |= tabopts::SPLIT_LAYOUT;
            }
            else
            {
                SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
                DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");

                AbstractSwConvertTableDlg* pDlg = pFact->CreateSwConvertTableDlg(
                            GetView(),DLG_CONV_TEXT_TABLE , bToTable);
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
                if( RET_OK == pDlg->Execute() )
                {
                    pDlg->GetValues( cDelim, aInsTblOpts, pTAFmt );

                }
                delete pDlg;
            }

			if( cDelim )
			{
				//Shellwechsel!
				SwView& rSaveView = rView;
				sal_Bool bInserted = sal_False;
                //recording:

                SfxViewFrame* pViewFrame = GetView().GetViewFrame();
                if( SfxRequest::HasMacroRecorder(pViewFrame) )
                {
                    SfxRequest aReq( pViewFrame, nSlot);
                    aReq.AppendItem( SfxStringItem( FN_PARAM_1, String(cDelim) ));
                    if(bToTable)
                    {
                        if(pTAFmt)
                            aReq.AppendItem( SfxStringItem( FN_PARAM_2, pTAFmt->GetName()));
                        aReq.AppendItem( SfxBoolItem ( FN_PARAM_3, 0 != (aInsTblOpts.mnInsMode & tabopts::HEADLINE)));
                        aReq.AppendItem( SfxInt16Item( FN_PARAM_4, (short)aInsTblOpts.mnRowsToRepeat ));
                        aReq.AppendItem( SfxBoolItem ( FN_PARAM_5, 0 != (aInsTblOpts.mnInsMode & tabopts::DEFAULT_BORDER) ));
                        aReq.AppendItem( SfxBoolItem ( FN_PARAM_6, !(aInsTblOpts.mnInsMode & tabopts::SPLIT_LAYOUT)));
                    }
                    aReq.Done();
                }

                if( !bToTable )
					rSh.TableToText( cDelim );
				else
                {
                    bInserted = rSh.TextToTable( aInsTblOpts, cDelim, text::HoriOrientation::FULL, pTAFmt );
                }
                rSh.EnterStdMode();

				if( bInserted )
					rSaveView.AutoCaption( TABLE_CAP );
			}
            if(bDeleteFormat)
                delete pTAFmt;
            delete pAutoFmtTbl;
		}
		break;
		case SID_STYLE_WATERCAN:
		case SID_STYLE_UPDATE_BY_EXAMPLE:
		case SID_STYLE_NEW_BY_EXAMPLE:
		case SID_STYLE_APPLY:
		{
			ShellModes eMode = GetView().GetShellMode();
			if ( SHELL_MODE_DRAW != eMode &&
				 SHELL_MODE_DRAW_CTRL != eMode &&
				 SHELL_MODE_DRAW_FORM != eMode &&
				 SHELL_MODE_DRAWTEXT != eMode &&
				 SHELL_MODE_BEZIER != eMode )
			{
				// oj #107754#
				if ( SID_STYLE_WATERCAN == nSlot )
				{
					const sal_Bool bLockedView = rSh.IsViewLocked();
					rSh.LockView( sal_True );    //lock visible section

					GetView().GetDocShell()->ExecStyleSheet(rReq);

					rSh.LockView( bLockedView );
				}
				else
				// wird von der DocShell aufgezeichnet
					GetView().GetDocShell()->ExecStyleSheet(rReq);
			}
		}
		break;
		case FN_ESCAPE:
			GetView().ExecuteSlot(rReq);
		break;
		case SID_IMAP:
		{
			sal_uInt16		nId = SvxIMapDlgChildWindow::GetChildWindowId();

			SfxViewFrame* pVFrame = GetView().GetViewFrame();
			pVFrame->ToggleChildWindow( nId );
			pVFrame->GetBindings().Invalidate( SID_IMAP );

			if ( pVFrame->HasChildWindow( nId ) && rSh.IsFrmSelected() )
				lcl_UpdateIMapDlg( rSh );
		}
		break;
		case SID_IMAP_EXEC:
		{
			SvxIMapDlg*	pDlg = SWIMAPDLG(GetView());

			// Kontrolle, ob Zuweisung ueberhaupt sinnvoll/erlaubt
			if ( rSh.IsFrmSelected() &&
				 pDlg->GetEditingObject() == rSh.GetIMapInventor() )
			{
					SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
					rSh.GetFlyFrmAttr( aSet );
					SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
					aURL.SetMap( &pDlg->GetImageMap() );
					aSet.Put( aURL );
					rSh.SetFlyFrmAttr( aSet );
			}
		}
		break;
		case SID_CONTOUR_DLG:
		{
			sal_uInt16 nId = SvxContourDlgChildWindow::GetChildWindowId();

			SfxViewFrame* pVFrame = GetView().GetViewFrame();
			pVFrame->ToggleChildWindow( nId );
			pVFrame->GetBindings().Invalidate( SID_CONTOUR_DLG );

			int nSel = rSh.GetSelectionType();
			if ( pVFrame->HasChildWindow( nId ) &&
				 (nSel & (nsSelectionType::SEL_GRF|nsSelectionType::SEL_OLE)) )
			{
				lcl_UpdateContourDlg( rSh, nSel );
			}
		}
		break;
		case SID_CONTOUR_EXEC:
		{
			SvxContourDlg *pDlg = SWCONTOURDLG(GetView());

			// Kontrolle, ob Zuweisung ueberhaupt sinnvoll/erlaubt
			int nSel = rSh.GetSelectionType();
			if ( nSel & (nsSelectionType::SEL_GRF|nsSelectionType::SEL_OLE) )
			{
				if ( pDlg->GetEditingObject() == rSh.GetIMapInventor() )
				{
					rSh.StartAction();
					SfxItemSet aSet( rSh.GetAttrPool(), RES_SURROUND, RES_SURROUND);
					rSh.GetFlyFrmAttr( aSet );
					SwFmtSurround aSur( (SwFmtSurround&)aSet.Get( RES_SURROUND ) );
					if ( !aSur.IsContour() )
					{
						aSur.SetContour( sal_True );
						if ( aSur.GetSurround() == SURROUND_NONE )
							aSur.SetSurround( SURROUND_PARALLEL );
						aSet.Put( aSur );
						rSh.SetFlyFrmAttr( aSet );
					}
					const PolyPolygon aPoly( pDlg->GetPolyPolygon() );
					rSh.SetGraphicPolygon( &aPoly );
					if ( pDlg->IsGraphicChanged() )
						rSh.ReRead( aEmptyStr, aEmptyStr, &pDlg->GetGraphic());
					rSh.EndAction();
				}
			}
		}
		break;
		case FN_FRAME_TO_ANCHOR:
		{
			rSh.GotoFlyAnchor();
			rSh.EnterStdMode();
			rSh.CallChgLnk();
		}
		break;
		case FN_TOOL_ANKER:
			break;
		case FN_TOOL_ANKER_PAGE:
		case FN_TOOL_ANKER_PARAGRAPH:
		case FN_TOOL_ANKER_CHAR:
		case FN_TOOL_ANKER_AT_CHAR:
		case FN_TOOL_ANKER_FRAME:
		{
			RndStdIds eSet = nSlot == FN_TOOL_ANKER_PAGE
                                ? FLY_AT_PAGE
								: nSlot == FN_TOOL_ANKER_PARAGRAPH
                                    ? FLY_AT_PARA
									: nSlot == FN_TOOL_ANKER_FRAME
										? FLY_AT_FLY
										: nSlot == FN_TOOL_ANKER_CHAR
                                            ? FLY_AS_CHAR
                                            : FLY_AT_CHAR;
			rSh.StartUndo();
			if( rSh.IsObjSelected() )
				rSh.ChgAnchor( eSet );
			else if( rSh.IsFrmSelected() )
			{
				// Der Set beinhaltet auch VERT/HORI_ORIENT, da in FEShell::
				// SetFlyFrmAttr/SetFlyFrmAnchor ggf. als Folge des Umankerns
				// die Ausrichtungen veraendert werden sollen.
				SfxItemSet aSet( GetPool(), RES_VERT_ORIENT, RES_ANCHOR );
				SwFmtAnchor aAnc( eSet, rSh.GetPhyPageNum() );
				aSet.Put( aAnc );
				rSh.SetFlyFrmAttr(aSet);
			}

            // if new anchor is 'as char' and it is a Math object and the usual 
            // pre-conditions are met then align the formula to the baseline of the text
            const uno::Reference < embed::XEmbeddedObject > xObj( rSh.GetOleRef() );
            const bool bDoMathBaselineAlignment = xObj.is() && SotExchange::IsMath( xObj->getClassID() )
                    && FLY_AS_CHAR == eSet && rSh.GetDoc()->get( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT );
            if (bDoMathBaselineAlignment) 
                rSh.AlignFormulaToBaseline( xObj );

			sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
			if( nHtmlMode )
			{
				SfxItemSet aSet(GetPool(), RES_SURROUND, RES_HORI_ORIENT);
				rSh.GetFlyFrmAttr(aSet);

				const SwFmtSurround& rSurround = (const SwFmtSurround&)aSet.Get(RES_SURROUND);
				const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)aSet.Get(RES_VERT_ORIENT);
				const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)aSet.Get(RES_HORI_ORIENT);
                sal_Int16 eVOrient = rVert.GetVertOrient();
                sal_Int16 eHOrient = rHori.GetHoriOrient();
				SwSurround eSurround = rSurround.GetSurround();

				switch( eSet )
				{
				case FLY_AT_FLY:
                case FLY_AT_PAGE:

					//Durchlauf, links oder von links, oben, von oben
					if(eSurround != SURROUND_THROUGHT)
						aSet.Put(SwFmtSurround(SURROUND_THROUGHT));

                    if( eVOrient != text::VertOrientation::TOP && eVOrient != text::VertOrientation::NONE)
                        aSet.Put(SwFmtVertOrient(0, text::VertOrientation::TOP));

                    if(eHOrient != text::HoriOrientation::NONE || eHOrient != text::HoriOrientation::LEFT)
                        aSet.Put(SwFmtHoriOrient(0, text::HoriOrientation::LEFT));
					break;

                case FLY_AT_PARA:
					//links, von links, rechts, oben, kein Uml, li+re Umlauf,
					if(eSurround != SURROUND_LEFT || eSurround != SURROUND_RIGHT)
						aSet.Put(SwFmtSurround(SURROUND_LEFT));

                    if( eVOrient != text::VertOrientation::TOP)
                        aSet.Put(SwFmtVertOrient(0, text::VertOrientation::TOP));

                    if(eHOrient != text::HoriOrientation::NONE || eHOrient != text::HoriOrientation::LEFT || eHOrient != text::HoriOrientation::RIGHT)
                        aSet.Put(SwFmtHoriOrient(0, text::HoriOrientation::LEFT));
					break;

                case FLY_AT_CHAR:
					//links, von links, rechts, oben,  Durchlauf
					if(eSurround != SURROUND_THROUGHT)
						aSet.Put(SwFmtSurround(SURROUND_THROUGHT));

                    if( eVOrient != text::VertOrientation::TOP)
                        aSet.Put(SwFmtVertOrient(0, text::VertOrientation::TOP));

                    if(eHOrient != text::HoriOrientation::NONE || eHOrient != text::HoriOrientation::LEFT || eHOrient != text::HoriOrientation::RIGHT)
                        aSet.Put(SwFmtHoriOrient(0, text::HoriOrientation::LEFT));
					break;

				default:
					;
				}

				if( aSet.Count() )
					rSh.SetFlyFrmAttr( aSet );
			}
			rSh.EndUndo();

			GetView().GetViewFrame()->GetBindings().Invalidate( FN_TOOL_ANKER );
		}
		break;

		case FN_FRAME_NOWRAP:
		case FN_FRAME_WRAP:
		case FN_FRAME_WRAP_IDEAL:
		case FN_FRAME_WRAPTHRU:
		case FN_FRAME_WRAPTHRU_TRANSP:
		case FN_FRAME_WRAP_CONTOUR:
		case FN_WRAP_ANCHOR_ONLY:
		case FN_FRAME_WRAP_LEFT:
		case FN_FRAME_WRAP_RIGHT:
			SetWrapMode( nSlot );
			break;

		case FN_UPDATE_ALL_LINKS:
			{
				if( rSh.GetLinkManager().GetLinks().Count() )
				{
					sal_Bool bUpdateGrf = sal_False, bCallErrHdl = sal_False;
					rSh.EnterStdMode();
					rSh.StartAllAction();
					rSh.GetLinkManager().UpdateAllLinks( sal_False, bCallErrHdl, bUpdateGrf );
					rSh.EndAllAction();
				}
			}
			break;

        case FN_XFORMS_DESIGN_MODE:
            if( pArgs != NULL
                && pArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET
                && pItem != NULL
                && pItem->ISA( SfxBoolItem ) )
            {
                sal_Bool bDesignMode =
                    static_cast<const SfxBoolItem*>( pItem )->GetValue();

                // set form design mode
                DBG_ASSERT( GetView().GetFormShell() != NULL, "form shell?" );
                SfxRequest aReq( GetView().GetViewFrame(), SID_FM_DESIGN_MODE );
                aReq.AppendItem( SfxBoolItem( SID_FM_DESIGN_MODE, bDesignMode ) );
                GetView().GetFormShell()->Execute( aReq );
                aReq.Done();

                // also set suitable view options
                SwViewOption aViewOption = *rSh.GetViewOptions();
                aViewOption.SetFormView( ! bDesignMode );
                rSh.ApplyViewOptions( aViewOption );
            }
            break;

		default:
			bMore = sal_True;
	}
	if(bMore && pArgs)
	{
		pItem = 0;
		pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
		if(pItem)
		switch(nSlot)
		{
        case SID_ATTR_BRUSH:
		case SID_ATTR_BORDER_SHADOW:
		case RES_SHADOW:
		{
			rSh.StartAllAction();
			SfxItemSet	 aSet( rSh.GetAttrPool(),
                                RES_SHADOW, RES_SHADOW,
                                RES_BACKGROUND, RES_BACKGROUND, 0 );

			aSet.Put(*pItem);
			// Tabellenzelle(n) selektiert?
			if ( rSh.IsTableMode() )
			{
				SwFrmFmt *pFmt = rSh.GetTableFmt();
                pFmt->SetFmtAttr( *pItem );
			}
			else if ( rSh.IsFrmSelected() )
			{
				// Umrandungsattribute ueber Frame-Manager setzen
				SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
				aMgr.SetAttrSet( *pArgs );
				aMgr.UpdateFlyFrm();
			}
			else
			{
				rSh.SetAttrSet( *pArgs );
			}
			rSh.EndAllAction();
		}
		break;
		case FN_PAGE_STYLE_SET_LR_MARGIN:
		case FN_PAGE_STYLE_SET_UL_MARGIN:
		case FN_PAGE_STYLE_SET_NUMBER_FORMAT:
		case FN_PAGE_STYLE_SET_PAPER_SIZE:
		case FN_PAGE_STYLE_SET_PAPER_BIN:
		{
			DBG_ERROR("not implemented");
		}
		break;

		case SID_ATTR_BORDER_OUTER:
		{
			// Tabellenzelle(n) selektiert?
			if ( rSh.IsTableMode() )
			{
				// Umrandungattribute Get/SetTabBorders() setzen
				rSh.SetTabBorders(*pArgs);
			}
			else if ( rSh.IsFrmSelected() )
			{
				// Umrandungsattribute ueber Frame-Manager setzen
				SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
				aMgr.SetAttrSet(*pArgs);
				aMgr.UpdateFlyFrm();
			}
			else
			{
				// Umrandungsattribute ganz normal ueber Shell setzen
				rSh.SetAttrItem( *pItem );
			}
		}
		break;
		default:
				DBG_ERROR("falscher Dispatcher");
		}

	}
}

/* -----------------14.04.99 15:10-------------------
 * Hier wird der State fuer SID_IMAP / SID_CONTOUR behandelt,
 * wenn die Grafik ausgeswappt ist
 * --------------------------------------------------*/
IMPL_LINK(SwBaseShell, GraphicArrivedHdl, SwCrsrShell* , EMPTYARG )
{
	sal_uInt16 nGrfType;
	SwWrtShell &rSh = GetShell();
	if( CNT_GRF == rSh.SwEditShell::GetCntType() &&
		GRAPHIC_NONE != ( nGrfType = rSh.GetGraphicType() ) &&
		aGrfUpdateSlots.Count() )
	{
		sal_Bool bProtect = 0 != rSh.IsSelObjProtected(FLYPROTECT_CONTENT|FLYPROTECT_PARENT);
		SfxViewFrame* pVFrame = GetView().GetViewFrame();
		sal_uInt16 nSlot;
		for( sal_uInt16 n = 0; n < aGrfUpdateSlots.Count(); ++n )
		{
			sal_Bool bSetState = sal_False;
			sal_Bool bState = sal_False;
			switch( nSlot = aGrfUpdateSlots[ n ] )
			{
			case SID_IMAP:
			case SID_IMAP_EXEC:
				{
					sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId();
					SvxIMapDlg *pDlg = pVFrame->HasChildWindow( nId ) ?
						(SvxIMapDlg*) ( pVFrame->GetChildWindow( nId )
											->GetWindow()) : 0;

					if( pDlg && ( SID_IMAP_EXEC == nSlot ||
								( SID_IMAP == nSlot && !bProtect)) &&
						pDlg->GetEditingObject() != rSh.GetIMapInventor())
							lcl_UpdateIMapDlg( rSh );

					if( !bProtect && SID_IMAP == nSlot )
						bSetState = sal_True, bState = 0 != pDlg;
				}
				break;

			case SID_CONTOUR_DLG:
				if( !bProtect )
				{
					sal_uInt16 nId = SvxContourDlgChildWindow::GetChildWindowId();
					SvxIMapDlg *pDlg = pVFrame->HasChildWindow( nId ) ?
						(SvxIMapDlg*) ( pVFrame->GetChildWindow( nId )
											->GetWindow()) : 0;
					if( pDlg && pDlg->GetEditingObject() !=
								rSh.GetIMapInventor() )
						lcl_UpdateContourDlg( rSh, nsSelectionType::SEL_GRF );

					bSetState = sal_True;
					bState = 0 != pDlg;
				}
				break;

			case FN_FRAME_WRAP_CONTOUR:
				if( !bProtect )
				{
					SfxItemSet aSet(GetPool(), RES_SURROUND, RES_SURROUND);
					rSh.GetFlyFrmAttr(aSet);
					const SwFmtSurround& rWrap = (const SwFmtSurround&)aSet.Get(RES_SURROUND);
					bSetState = sal_True;
					bState = rWrap.IsContour();
				}
				break;

			case SID_GRFFILTER:
			case SID_GRFFILTER_INVERT:
			case SID_GRFFILTER_SMOOTH:
			case SID_GRFFILTER_SHARPEN:
			case SID_GRFFILTER_REMOVENOISE:
			case SID_GRFFILTER_SOBEL:
			case SID_GRFFILTER_MOSAIC:
			case SID_GRFFILTER_EMBOSS:
			case SID_GRFFILTER_POSTER:
			case SID_GRFFILTER_POPART:
			case SID_GRFFILTER_SEPIA:
			case SID_GRFFILTER_SOLARIZE:
				bSetState = bState = GRAPHIC_BITMAP == nGrfType;
				break;
			}

			if( bSetState )
			{
				SfxBoolItem aBool( nSlot, bState );
				if( pGetStateSet )
					pGetStateSet->Put( aBool );
				else
					pVFrame->GetBindings().SetState( aBool );
			}
		}
		aGrfUpdateSlots.RemoveAt( 0, aGrfUpdateSlots.Count() );
	}
	return 0;
}

void SwBaseShell::GetState( SfxItemSet &rSet )
{
	SwWrtShell &rSh = GetShell();
	SfxViewFrame* pVFrame = GetView().GetViewFrame();
	SfxWhichIter aIter( rSet );
	sal_uInt16 nWhich = aIter.FirstWhich();
	pGetStateSet = &rSet;
	while ( nWhich )
	{
		switch ( nWhich )
		{
			case SID_GALLERY_FORMATS:
				if ( rSh.IsObjSelected() ||
					 (rSh.IsSelFrmMode() &&
					  !(rSh.GetSelectionType() & nsSelectionType::SEL_GRF)) )
					rSet.DisableItem( nWhich );
				break;
			case SID_GALLERY_ENABLE_ADDCOPY:
                // #108230# allow copy from gallery in Writer AND Writer/Web!
                rSet.Put( SfxBoolItem( SID_GALLERY_ENABLE_ADDCOPY, sal_True ) );
				break;
			case FN_EDIT_REGION:
				if( !rSh.IsAnySectionInDoc() )
					rSet.DisableItem(nWhich);
				break;

            case FN_INSERT_REGION:
                if( rSh.CrsrInsideInputFld()
                    || rSh.IsSelFrmMode()
                    || !rSh.IsInsRegionAvailable() )
                {
                    rSet.DisableItem( nWhich );
                }
                break;

            case FN_CONVERT_TABLE_TO_TEXT:
            {
                sal_uInt16 eFrmType = rSh.GetFrmType(0,sal_True);
                if( (eFrmType & FRMTYPE_FOOTNOTE) ||
                    !rSh.GetTableFmt() )
                    rSet.DisableItem( nWhich );
            }
            break;
            case FN_CONVERT_TEXT_TO_TABLE:
            {
                sal_uInt16 eFrmType = rSh.GetFrmType(0,sal_True);
                if( (eFrmType & FRMTYPE_FOOTNOTE) ||
                    !rSh.IsTextToTableAvailable()  )
                    rSet.DisableItem( nWhich );
            }
            break;
            case FN_CONVERT_TEXT_TABLE:
			{
				sal_uInt16 eFrmType = rSh.GetFrmType(0,sal_True);
				if( (eFrmType & FRMTYPE_FOOTNOTE) ||
					(!rSh.GetTableFmt() && !rSh.IsTextToTableAvailable() ) )
					rSet.DisableItem( nWhich );
			}
			break;
			case RES_SHADOW:
			{
				SfxItemSet	 aSet( rSh.GetAttrPool(),
									RES_SHADOW, RES_SHADOW );

				// Tabellenzelle(n) selektiert?
				if ( rSh.IsTableMode() )
				{
					SwFrmFmt *pFmt = rSh.GetTableFmt();
                    aSet.Put(pFmt->GetFmtAttr( nWhich, sal_True ));
				}
				else if( rSh.IsFrmSelected() )
				{
					SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
					aSet.Put( aMgr.GetAttrSet() );
				}
				else
                    rSh.GetCurAttr( aSet );
#if OSL_DEBUG_LEVEL > 1

				const SvxShadowItem& rShItem = (const SvxShadowItem&)aSet.Get(nWhich);
				rSet.Put(rShItem);
#else
				rSet.Put((const SvxShadowItem&)aSet.Get(nWhich));
#endif
			}
			break;
			case SID_IMAP:
			{
                // --> OD 2006-11-08 #i59688#
                // improve efficiency:
                // If selected object is protected, item has to disabled.
                const sal_Bool bProtect = 0 != rSh.IsSelObjProtected(FLYPROTECT_CONTENT|FLYPROTECT_PARENT);
                if ( bProtect )
                {
                    rSet.DisableItem( nWhich );
                }
                else
                {
                    const sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId();
                    const sal_Bool bHas = pVFrame->HasChildWindow( nId );
                    const sal_Bool bFrmSel = rSh.IsFrmSelected();
                    const sal_Bool bIsGraphicSelection =
                                rSh.GetSelectionType() == nsSelectionType::SEL_GRF;

                    // --> OD 2006-11-08 #i59688#
                    // avoid unnecessary loading of selected graphic.
                    // The graphic is only needed, if the dialog is open.
                    //wenn die Grafik ausgeswappt ist, dann muss der
                    //Status asynchron ermittelt werden
                    //bis dahin wird der Slot disabled
                    if ( bHas && bIsGraphicSelection && rSh.IsGrfSwapOut( sal_True ) )
                    {
                        if( AddGrfUpdateSlot( nWhich ))
                            rSh.GetGraphic(sal_False);  // start the loading
                    }
                    else
                    {
                        if ( !bHas &&
                             ( !bFrmSel ||
                               ( bIsGraphicSelection &&
                                 rSh.GetGraphicType() == GRAPHIC_NONE ) ) )
                        {
                            rSet.DisableItem( nWhich );
                        }
                        else
                        {
                            SfxBoolItem aBool(nWhich, bHas);
                            if ( bHas && bFrmSel )
                                lcl_UpdateIMapDlg( rSh );
                            rSet.Put(aBool);
                        }
                    }
                    // <--
                }
                // <--
			}
			break;
			case SID_IMAP_EXEC:
			{
				sal_Bool bDisable = sal_False;
				if( !rSh.IsFrmSelected())
					bDisable = sal_True;
				sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId();
				if(!bDisable && pVFrame->HasChildWindow( nId ))
				{
					if(rSh.GetSelectionType() == nsSelectionType::SEL_GRF
									&& rSh.IsGrfSwapOut(sal_True))
					{
						if( AddGrfUpdateSlot( nWhich ))
							rSh.GetGraphic(sal_False);  // start the loading
					}
					else
					{
						SvxIMapDlg *pDlg = SWIMAPDLG(GetView());
						if( pDlg->GetEditingObject() != rSh.GetIMapInventor() )
							lcl_UpdateIMapDlg( rSh );
					}
				}
				rSet.Put(SfxBoolItem(nWhich, bDisable));
			}
			break;

            case FN_BACKSPACE:
            case SID_DELETE:
                if ( ( rSh.HasReadonlySel() && !rSh.CrsrInsideInputFld() )
                     || rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0 )
                {
                    rSet.DisableItem( nWhich );
                }
                break;

			case SID_CONTOUR_DLG:
			{
				sal_Bool bParentCntProt = 0 != rSh.IsSelObjProtected(FLYPROTECT_CONTENT|FLYPROTECT_PARENT );

				if( bParentCntProt || 0 != (HTMLMODE_ON & ::GetHtmlMode(
											GetView().GetDocShell() )) )
					rSet.DisableItem( nWhich );
				else
				{
					sal_uInt16 nId = SvxContourDlgChildWindow::GetChildWindowId();
					sal_Bool bHas = GetView().GetViewFrame()->HasChildWindow( nId );
					int nSel = rSh.GetSelectionType();
					sal_Bool bOk = 0 != (nSel & (nsSelectionType::SEL_GRF|nsSelectionType::SEL_OLE));

                    sal_Bool bDisable = sal_False;
					if( !bHas && !bOk )
						bDisable = sal_True;
                    // --> OD 2006-11-08 #i59688#
                    // avoid unnecessary loading of selected graphic.
                    // The graphic is only needed, if the dialog is open.
					// wenn die Grafik ausgeswappt ist, dann muss der Status
					// asynchron ermittelt werden bis dahin wird der Slot
					// disabled
                    else if ( bHas && (nSel & nsSelectionType::SEL_GRF) &&
                              rSh.IsGrfSwapOut(sal_True) )
					{
						if( AddGrfUpdateSlot( nWhich ))
							rSh.GetGraphic(sal_False);  // start the loading
                        // --> OD 2007-07-04 #i75481#
                        bDisable = sal_True;
                        // <--
					}
					else if( bHas && bOk )
						bDisable = !lcl_UpdateContourDlg( rSh, nSel );
					else if( bOk )
                    {
                        // --> OD 2007-07-04 #i75481#
                        // apply fix #i59688# only for selected graphics
                        if ( nSel & nsSelectionType::SEL_GRF )
                            bDisable = GRAPHIC_NONE == rSh.GetGraphicType();
                        else
                            bDisable = GRAPHIC_NONE == rSh.GetIMapGraphic().GetType();
                        // <--
                    }
                    // <--

					if( bDisable )
						rSet.DisableItem( nWhich );
					else
						rSet.Put( SfxBoolItem(nWhich, bHas) );
				}
			}
			break;
			case SID_CONTOUR_EXEC:
			{
				sal_Bool bDisable = sal_False;
				int nSel = rSh.GetSelectionType();
				if( !(nSel & (nsSelectionType::SEL_GRF|nsSelectionType::SEL_OLE)) )
					bDisable = sal_True;
				sal_uInt16 nId = SvxContourDlgChildWindow::GetChildWindowId();
				if( !bDisable && GetView().GetViewFrame()->HasChildWindow( nId ))
				{
					SvxContourDlg *pDlg = SWCONTOURDLG(GetView());
					if( pDlg->GetEditingObject() != rSh.GetIMapInventor() )
						bDisable = sal_True;
				}
				rSet.Put(SfxBoolItem(nWhich, bDisable));
			}
			break;

			case FN_TOOL_ANKER:
			case FN_TOOL_ANKER_PAGE:
			case FN_TOOL_ANKER_PARAGRAPH:
			case FN_TOOL_ANKER_CHAR:
			case FN_TOOL_ANKER_AT_CHAR:
			case FN_TOOL_ANKER_FRAME:
			{
				sal_Bool bObj = 0 != rSh.IsObjSelected();
				sal_Bool bParentCntProt = rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;

				if( !bParentCntProt && (bObj || rSh.IsFrmSelected()))
				{
					SfxItemSet aSet(GetPool(), RES_ANCHOR, RES_ANCHOR);
					if(bObj)
						rSh.GetObjAttr(aSet);
					else
						rSh.GetFlyFrmAttr(aSet);
					RndStdIds eSet = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
                    const sal_Bool bSet =
                           ((nWhich == FN_TOOL_ANKER_PAGE) &&
                            (eSet == FLY_AT_PAGE))
                        || ((nWhich == FN_TOOL_ANKER_PARAGRAPH) &&
                            (eSet == FLY_AT_PARA))
                        || ((nWhich == FN_TOOL_ANKER_FRAME) &&
                            (eSet == FLY_AT_FLY))
                        || ((nWhich == FN_TOOL_ANKER_AT_CHAR) &&
                            (eSet == FLY_AT_CHAR))
                        || ((nWhich == FN_TOOL_ANKER_CHAR) &&
                            (eSet == FLY_AS_CHAR));
					if(nWhich != FN_TOOL_ANKER)
					{
						sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
						if( ( nWhich == FN_TOOL_ANKER_PAGE &&
							  ((HTMLMODE_ON & nHtmlMode) && (0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS)))) ||
                            ( nWhich == FN_TOOL_ANKER_FRAME && !rSh.IsFlyInFly() ) )
							rSet.DisableItem(nWhich);
						else
							rSet.Put(SfxBoolItem(nWhich, bSet));
					}
					else
					{
						sal_uInt16 nSlotId = 0;

						switch (eSet)
						{
                            case FLY_AT_PAGE:
								nSlotId = FN_TOOL_ANKER_PAGE;
							break;
                            case FLY_AT_PARA:
								nSlotId = FN_TOOL_ANKER_PARAGRAPH;
							break;
							case FLY_AS_CHAR:
								nSlotId = FN_TOOL_ANKER_CHAR;
							break;
                            case FLY_AT_CHAR:
								nSlotId = FN_TOOL_ANKER_AT_CHAR;
							break;
							case FLY_AT_FLY:
								nSlotId = FN_TOOL_ANKER_FRAME;
							break;
							default:
								;
						}
						rSet.Put(SfxUInt16Item(nWhich, nSlotId));
					}
				}
				else
					rSet.DisableItem( nWhich );
			}
			break;
			case FN_FRAME_NOWRAP:
			case FN_FRAME_WRAP:
			case FN_FRAME_WRAP_IDEAL:
			case FN_FRAME_WRAPTHRU:
			case FN_FRAME_WRAPTHRU_TRANSP:
			case FN_FRAME_WRAP_CONTOUR:
			case FN_WRAP_ANCHOR_ONLY:
			case FN_FRAME_WRAP_LEFT:
			case FN_FRAME_WRAP_RIGHT:
			{
				sal_Bool bObj = 0 != rSh.IsObjSelected();
				sal_Bool bParentCntProt = rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;

				if( !bParentCntProt && (bObj || rSh.IsFrmSelected()))
				{
					SfxItemSet aSet(GetPool(), RES_OPAQUE, RES_ANCHOR);
					int nAnchorType;
					if(bObj)
					{
						rSh.GetObjAttr(aSet);
						nAnchorType = rSh.GetAnchorId();
					}
					else
					{
						rSh.GetFlyFrmAttr(aSet);
						nAnchorType = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
					}
					const SwFmtSurround& rWrap = (const SwFmtSurround&)aSet.Get(RES_SURROUND);

					const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)aSet.Get(RES_OPAQUE);
					sal_Bool bOpaque = rOpaque.GetValue();
					SwSurround nSurround = rWrap.GetSurround();
                    sal_Bool bSet = sal_False;

                    bool bDisable =
                        (nAnchorType == - 1) || (nAnchorType == FLY_AS_CHAR);
                    const bool bHtmlMode =
                        0 != ::GetHtmlMode(GetView().GetDocShell());

					switch( nWhich )
					{
						case FN_FRAME_NOWRAP:
                            bDisable |=
                                (   (nAnchorType != FLY_AT_PARA)
                                 && (nAnchorType != FLY_AT_CHAR)
                                 && (nAnchorType != FLY_AT_PAGE));
							bSet = nSurround == SURROUND_NONE;
						break;
						case FN_FRAME_WRAP:
							bDisable |= bHtmlMode;
							bSet = nSurround == SURROUND_PARALLEL;
						break;
						case FN_FRAME_WRAP_IDEAL:
							bDisable |= bHtmlMode;
							bSet = nSurround == SURROUND_IDEAL;
						break;
						case FN_FRAME_WRAPTHRU:
							bDisable |= (bHtmlMode ||
                                (   (nAnchorType != FLY_AT_PARA)
                                 && (nAnchorType != FLY_AT_CHAR)
                                 && (nAnchorType != FLY_AT_PAGE)));
							if(bObj)
								bSet = nSurround == SURROUND_THROUGHT && rSh.GetLayerId();
							else
								bSet = nSurround == SURROUND_THROUGHT && bOpaque;
						break;
						case FN_FRAME_WRAPTHRU_TRANSP:
							bDisable |= bHtmlMode;
							if(bObj)
								bSet = nSurround == SURROUND_THROUGHT && !rSh.GetLayerId();
							else
								bSet = nSurround == SURROUND_THROUGHT && !bOpaque;
						break;
						case FN_FRAME_WRAP_CONTOUR:
							bDisable |= bHtmlMode;
                            //no contour available whenn no wrap or wrap through is set
                            bDisable |= (nSurround == SURROUND_NONE || nSurround == SURROUND_THROUGHT);
							bSet = rWrap.IsContour();
							if( !bDisable )
							{
								int nSel = rSh.GetSelectionType();
								if( (nSel & nsSelectionType::SEL_GRF) &&
											rSh.IsGrfSwapOut(sal_True))
								{
									if( AddGrfUpdateSlot( nWhich ))
										rSh.GetGraphic(sal_False);  // start the loading
								}
								else if( rSh.IsFrmSelected() )
                                {
									// #i102253# applied patch from OD (see task)
                                    bDisable =
                                        nSel & nsSelectionType::SEL_FRM ||
                                        GRAPHIC_NONE == rSh.GetIMapGraphic().GetType();
								}
							}
							bSet = bDisable ? sal_False : rWrap.IsContour();

						break;
						case FN_WRAP_ANCHOR_ONLY:
							bDisable |= (bHtmlMode ||
                                (nAnchorType != FLY_AT_PARA));
							bSet = rWrap.IsAnchorOnly();
						break;
						case FN_FRAME_WRAP_LEFT:
							bSet = nSurround == SURROUND_LEFT;
						break;
						case FN_FRAME_WRAP_RIGHT:
							bSet = nSurround == SURROUND_RIGHT;
						break;
					}

					if(bDisable)
						rSet.DisableItem(nWhich);
					else
						rSet.Put(SfxBoolItem(nWhich, bSet));
				}
				else
					rSet.DisableItem(nWhich);
			}
			break;
			case FN_UPDATE_CHARTS:
				if( !rSh.HasCharts() )
					rSet.DisableItem( nWhich );
				break;
			case FN_UPDATE_ALL_LINKS:
				if ( !rSh.GetLinkManager().GetLinks().Count() )
					rSet.DisableItem(nWhich);
				break;
            case FN_XFORMS_DESIGN_MODE:
                // enable if in XForms document
                if( rSh.GetDoc()->isXForms() )
                {
                    // determine current state from view options
                    sal_Bool bValue = ! rSh.GetViewOptions()->IsFormView();
                    rSet.Put( SfxBoolItem( nWhich, bValue ) );
                }
                else
                    rSet.Put( SfxVisibilityItem( nWhich, sal_False ) );
                break;
		}
		nWhich = aIter.NextWhich();
	}
	pGetStateSet = 0;
}

/*--------------------------------------------------------------------
	Beschreibung:	Slots mit dieser Statusmethode disablen
 --------------------------------------------------------------------*/


void SwBaseShell::StateDisableItems( SfxItemSet &rSet )
{
	SfxWhichIter aIter(rSet);
	sal_uInt16 nWhich = aIter.FirstWhich();

	while (nWhich)
	{
		rSet.DisableItem( nWhich );
		nWhich = aIter.NextWhich();
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Slots mit dieser Statusmethode disablen
 --------------------------------------------------------------------*/


void SwBaseShell::StateStyle( SfxItemSet &rSet )
{
	sal_Bool bParentCntProt = GetShell().IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;
	ShellModes eMode = GetView().GetShellMode();

	if ( bParentCntProt ||
		 SHELL_MODE_DRAW == eMode ||
		 SHELL_MODE_DRAW_CTRL == eMode ||
		 SHELL_MODE_DRAW_FORM == eMode ||
		 SHELL_MODE_DRAWTEXT == eMode ||
		 SHELL_MODE_BEZIER == eMode )
	{
		SfxWhichIter aIter( rSet );
		sal_uInt16 nWhich = aIter.FirstWhich();
		while ( nWhich )
		{
			rSet.DisableItem( nWhich );
			nWhich = aIter.NextWhich();
		}
	}
	else
		GetView().GetDocShell()->StateStyleSheet(rSet, &GetShell());
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::SetWrapMode( sal_uInt16 nSlot )
{
	SwWrtShell &rSh = GetShell();
	sal_Bool bObj = 0 != rSh.IsObjSelected();
	if( bObj || rSh.IsFrmSelected())
	{
		SfxItemSet aSet(GetPool(), RES_OPAQUE, RES_SURROUND);
		if(bObj)
			rSh.GetObjAttr(aSet);
		else
			rSh.GetFlyFrmAttr(aSet);
		SwFmtSurround aWrap( (SwFmtSurround&)aSet.Get(RES_SURROUND) );
		SwSurround nOldSurround(aWrap.GetSurround());
		SwSurround nSurround = SURROUND_PARALLEL;

		switch (nSlot)
		{
			case FN_FRAME_NOWRAP:
				nSurround = SURROUND_NONE;
				if (aWrap.IsContour())
					aWrap.SetContour(sal_False);
				break;
			case FN_FRAME_WRAP_IDEAL:
				nSurround = SURROUND_IDEAL;
				break;
			case FN_WRAP_ANCHOR_ONLY:
				aWrap.SetAnchorOnly(!aWrap.IsAnchorOnly());
                // --> OD 2006-06-02 #b6432130#
                // keep previous wrapping
                // --> OD 2006-09-21 #138144# - adjust fix #b6432130#
                // switch to wrap SURROUND_PARALLEL, if previous wrap is SURROUND_NONE
                if ( nOldSurround != SURROUND_NONE )
                {
                    nSurround = nOldSurround;
                }
                // <--
				break;
			case FN_FRAME_WRAP_CONTOUR:
				aWrap.SetContour(!aWrap.IsContour());
				if (nSurround == SURROUND_THROUGHT)
					nSurround = SURROUND_PARALLEL;
				break;
			case FN_FRAME_WRAPTHRU_TRANSP:
				if (aWrap.IsContour())
					aWrap.SetContour(sal_False);
				// kein break!!!
			case FN_FRAME_WRAPTHRU:
				nSurround = SURROUND_THROUGHT;
				break;

			case FN_FRAME_WRAP_LEFT:
				nSurround = SURROUND_LEFT;
				break;

			case FN_FRAME_WRAP_RIGHT:
				nSurround = SURROUND_RIGHT;
				break;

			default:
				break;
		}
		aWrap.SetSurround(nSurround);

		if (nSlot != FN_FRAME_WRAP_CONTOUR)
		{
			// Konturumfluss bei Draw-Objekten defaulten
			if (bObj && nOldSurround != nSurround &&
				(nOldSurround == SURROUND_NONE || nOldSurround == SURROUND_THROUGHT))
			{
				aWrap.SetContour(sal_True);
			}
		}

		aSet.Put( aWrap );
		aSet.Put(SvxOpaqueItem(RES_OPAQUE, nSlot != FN_FRAME_WRAPTHRU_TRANSP));
		if(bObj)
		{
			rSh.SetObjAttr(aSet);
			if (nSlot != FN_FRAME_WRAPTHRU_TRANSP)
				rSh.SelectionToHeaven();
			else
				rSh.SelectionToHell();
		}
		else
			rSh.SetFlyFrmAttr(aSet);
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Update der Statuszeile erzwingen
 --------------------------------------------------------------------*/

void SwBaseShell::SetFrmMode(FlyMode eMode, SwWrtShell *pSh )
{
    eFrameMode = eMode;
	SfxBindings &rBnd = pSh->GetView().GetViewFrame()->GetBindings();

    if( eMode == FLY_DRAG ||
		(pSh && (pSh->IsFrmSelected() || pSh->IsObjSelected())) )
	{
		const SfxPointItem aTmp1( SID_ATTR_POSITION, pSh->GetAnchorObjDiff());
		const SvxSizeItem  aTmp2( SID_ATTR_SIZE,	 pSh->GetObjSize());
		rBnd.SetState( aTmp1 );
		rBnd.SetState( aTmp2 );
	}
    else if( eMode == FLY_DRAG_END )
	{
		static sal_uInt16 __READONLY_DATA aInval[] =
		{
			SID_ATTR_POSITION, SID_ATTR_SIZE, 0
		};
		rBnd.Invalidate(aInval);
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Ctor
 --------------------------------------------------------------------*/

SwBaseShell::SwBaseShell(SwView& rVw) :
	SfxShell( &rVw ),
	rView(rVw),
	pGetStateSet(0)
{
	SwWrtShell& rWrtSh = rView.GetWrtShell();

	SetPool(&rWrtSh.GetAttrPool());
	SetName(C2S("Base"));
	rWrtSh.SetGrfArrivedLnk( LINK( this, SwBaseShell, GraphicArrivedHdl));
}


SwBaseShell::~SwBaseShell()
{
	if( rView.GetCurShell() == this )
		rView.ResetSubShell();

	Link aTmp( LINK( this, SwBaseShell, GraphicArrivedHdl));
	if( aTmp == rView.GetWrtShell().GetGrfArrivedLnk() )
		rView.GetWrtShell().SetGrfArrivedLnk( Link() );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecTxtCtrl( SfxRequest& rReq )
{
	const SfxItemSet *pArgs = rReq.GetArgs();

	if( pArgs)
	{
		SwWrtShell &rSh = GetShell();
		SvxScriptSetItem* pSSetItem = 0;
		sal_uInt16 nSlot = rReq.GetSlot();
		SfxItemPool& rPool = rSh.GetAttrPool();
		sal_uInt16 nWhich = rPool.GetWhich( nSlot );
        sal_uInt16 nScripts = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
        SfxItemSet aHeightSet( GetPool(),  RES_CHRATR_FONTSIZE, RES_CHRATR_FONTSIZE,
                                            RES_CHRATR_CJK_FONTSIZE, RES_CHRATR_CJK_FONTSIZE,
                                            RES_CHRATR_CTL_FONTSIZE, RES_CHRATR_CTL_FONTSIZE,
                                        0L);

		switch( nSlot )
		{
		    case SID_ATTR_CHAR_FONT:
            {
                nScripts = rSh.GetScriptType();
                // #i42732# input language should be preferred over
                // current cursor position to detect script type
                if(!rSh.HasSelection())
                {
                    LanguageType nInputLang = GetView().GetEditWin().GetInputLanguage();
                    if(nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
                        nScripts = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
                }
            }
		    case SID_ATTR_CHAR_POSTURE:
		    case SID_ATTR_CHAR_WEIGHT:
			{
				pSSetItem = new SvxScriptSetItem( nSlot, rPool );
				pSSetItem->PutItemForScriptType( nScripts, pArgs->Get( nWhich ));
				pArgs = &pSSetItem->GetItemSet();
			}
			break;
            case SID_ATTR_CHAR_FONTHEIGHT:
            {
				if(rSh.HasSelection())
                {
                    pSSetItem = new SvxScriptSetItem( nSlot, rPool );
				    pSSetItem->PutItemForScriptType( nScripts, pArgs->Get( nWhich ));
				    pArgs = &pSSetItem->GetItemSet();
                }
                else
                {
                    nScripts = rSh.GetScriptType();
                    LanguageType nInputLang = GetView().GetEditWin().GetInputLanguage();
                    if(nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
                        nScripts = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
                    sal_uInt32 nHeight = static_cast< const SvxFontHeightItem& >(pArgs->Get( nWhich )).GetHeight();
                    SwStdFontConfig* pStdFont = SW_MOD()->GetStdFontConfig();

                    SfxItemSet aLangSet( GetPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
                                                    RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
                                                    RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
                                                    0L);
                    rSh.GetCurAttr( aLangSet );

                    sal_Int32 nWesternSize =
                            pStdFont->GetFontHeight(FONT_STANDARD, FONT_GROUP_DEFAULT,
                            static_cast<const SvxLanguageItem&>(aLangSet.Get( RES_CHRATR_LANGUAGE)).GetLanguage());
                    sal_Int32 nCJKSize =
                            pStdFont->GetFontHeight(FONT_STANDARD, FONT_GROUP_CJK,
                            static_cast<const SvxLanguageItem&>(aLangSet.Get( RES_CHRATR_CJK_LANGUAGE)).GetLanguage());
                    sal_Int32 nCTLSize =
                            pStdFont->GetFontHeight(FONT_STANDARD, FONT_GROUP_CTL,
                            static_cast<const SvxLanguageItem&>(aLangSet.Get( RES_CHRATR_CTL_LANGUAGE)).GetLanguage());

                    switch(nScripts)
                    {
                        case SCRIPTTYPE_LATIN:
                            nCJKSize = nHeight * nCJKSize / nWesternSize;
                            nCTLSize = nHeight * nCTLSize / nWesternSize;
                            nWesternSize = (sal_Int32) nHeight;
                        break;
                        case SCRIPTTYPE_ASIAN:
                            nCTLSize = nHeight* nCTLSize / nCJKSize;
                            nWesternSize = nHeight * nWesternSize / nCJKSize;
                            nCJKSize = (sal_Int32) nHeight;
                        break;
                        case SCRIPTTYPE_COMPLEX:
                            nCJKSize = nHeight * nCJKSize / nCTLSize;
                            nWesternSize = nHeight * nWesternSize / nCTLSize;
                            nCTLSize = (sal_Int32) nHeight;
                        break;
                    }
                    aHeightSet.Put( SvxFontHeightItem( (sal_uInt32)nWesternSize, 100, RES_CHRATR_FONTSIZE ));
                    aHeightSet.Put( SvxFontHeightItem( (sal_uInt32)nCJKSize, 100, RES_CHRATR_CJK_FONTSIZE ));
                    aHeightSet.Put( SvxFontHeightItem( (sal_uInt32)nCTLSize, 100, RES_CHRATR_CTL_FONTSIZE ));
                    pArgs = &aHeightSet;
                }
            }
            break;
		}

		if( pArgs )
        {
            bool bAuto = false;
            if ( !isCHRATR(nWhich) ||
                 ( rSh.HasSelection() && rSh.IsSelFullPara() ) )
            {
                SwTxtFmtColl * pColl = rSh.GetCurTxtFmtColl();
                if ( pColl && pColl->IsAutoUpdateFmt() )
                {
                    rSh.AutoUpdatePara( pColl, *pArgs );
                    bAuto = true;
                }
            }

            if (!bAuto)
            {
                rSh.SetAttrSet( *pArgs );
            }
        }
		delete pSSetItem;
	}
    else
        GetView().GetViewFrame()->GetDispatcher()->Execute( SID_CHAR_DLG, sal_False);
    rReq.Done();
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::GetTxtCtrlState( SfxItemSet& rSet )
{
	SwWrtShell &rSh = GetShell();
    rSh.GetCurAttr( rSet );
}

void SwBaseShell::GetTxtFontCtrlState( SfxItemSet& rSet )
{
	SwWrtShell &rSh = GetShell();
	sal_Bool bFirst = sal_True;
	SfxItemSet* pFntCoreSet = 0;
    sal_uInt16 nScriptType = SCRIPTTYPE_LATIN;
	SfxWhichIter aIter( rSet );
	sal_uInt16 nWhich = aIter.FirstWhich();
	while( nWhich )
	{
		switch( nWhich )
		{
		case RES_CHRATR_FONT:
		case RES_CHRATR_FONTSIZE:
		case RES_CHRATR_WEIGHT:
		case RES_CHRATR_POSTURE:
			{
				if( !pFntCoreSet )
				{
					pFntCoreSet = new SfxItemSet( *rSet.GetPool(),
									RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
                    rSh.GetCurAttr( *pFntCoreSet );
                    nScriptType = rSh.GetScriptType();
                    // #i42732# input language should be preferred over
                    // current cursor position to detect script type
                    SwEditWin& rEditWin = GetView().GetEditWin();
                    if( rEditWin.IsUseInputLanguage() )
                    {
                        if(!rSh.HasSelection() && (
                            nWhich == RES_CHRATR_FONT ||
                            nWhich == RES_CHRATR_FONTSIZE ))
                        {
                            LanguageType nInputLang = rEditWin.GetInputLanguage();
                            if(nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
                                nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
                        }
                    }
				}
				SfxItemPool& rPool = *rSet.GetPool();
				SvxScriptSetItem aSetItem( rPool.GetSlotId( nWhich ), rPool );
				aSetItem.GetItemSet().Put( *pFntCoreSet, sal_False );
				const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScriptType );
				if( pI )
					rSet.Put( *pI, nWhich );
				else
					rSet.InvalidateItem( nWhich );
                //set input context of the SwEditWin according to the selected font and script type
                if(RES_CHRATR_FONT == nWhich)
                {
                    Font aFont;
                    if(pI && pI->ISA(SvxFontItem))
                    {
                        aFont.SetName( ((const SvxFontItem*)pI)->GetFamilyName());
                        aFont.SetStyleName(((const SvxFontItem*)pI)->GetStyleName());
                        aFont.SetFamily(((const SvxFontItem*)pI)->GetFamily());
                        aFont.SetPitch(((const SvxFontItem*)pI)->GetPitch());
                        aFont.SetCharSet(((const SvxFontItem*)pI)->GetCharSet());
                    }

                    sal_Bool bVertical = rSh.IsInVerticalText();
                    aFont.SetOrientation(bVertical ? 2700 : 0);
                    aFont.SetVertical(bVertical);
                    GetView().GetEditWin().SetInputContext( InputContext( aFont, INPUTCONTEXT_TEXT |
                                                        INPUTCONTEXT_EXTTEXTINPUT ) );
                }
			}
			break;

		default:
			if( bFirst )
			{
                rSh.GetCurAttr( rSet );
				bFirst = sal_False;
			}
		}
		nWhich = aIter.NextWhich();
	}
	delete pFntCoreSet;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::GetBckColState(SfxItemSet &rSet)
{
	SwWrtShell &rSh = GetShell();
	SfxWhichIter aIter( rSet );
	sal_uInt16 nWhich = aIter.FirstWhich();
	int nSelType = rSh.GetSelectionType();

//	if ( nSelType & nsSelectionType::SEL_GRF ||
	if( nSelType & nsSelectionType::SEL_OLE )
	{
		rSet.DisableItem( SID_BACKGROUND_COLOR );
		return;
	}

	if ( nSelType & nsSelectionType::SEL_FRM )
	{
		sal_Bool bParentCntProt = rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;
		if (bParentCntProt)
		{
			rSet.DisableItem( SID_BACKGROUND_COLOR );
			return;
		}
	}

    SvxBrushItem aBrushItem( RES_BACKGROUND );

	if( nsSelectionType::SEL_TBL_CELLS & nSelType )
		rSh.GetBoxBackground( aBrushItem );
	else
	{
		SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
		if( nSelType & nsSelectionType::SEL_GRF || nsSelectionType::SEL_FRM & nSelType )
			rSh.GetFlyFrmAttr( aCoreSet );
		else
            rSh.GetCurAttr( aCoreSet );
		aBrushItem = (const SvxBrushItem&)aCoreSet.Get(RES_BACKGROUND);
	}

	while ( nWhich )
	{
		switch(nWhich)
		{
			case SID_BACKGROUND_COLOR  :
			{
                SvxColorItem aColorItem(aBrushItem.GetColor(), SID_BACKGROUND_COLOR);
				rSet.Put( aColorItem, SID_BACKGROUND_COLOR );
			}
			break;
			case SID_ATTR_BRUSH:
			case RES_BACKGROUND:
				rSet.Put( aBrushItem, GetPool().GetWhich(nWhich) );
			break;
		}
		nWhich = aIter.NextWhich();
	}
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecBckCol(SfxRequest& rReq)
{
	SwWrtShell &rSh = GetShell();
	int nSelType = rSh.GetSelectionType();
	if ( nSelType & nsSelectionType::SEL_OLE )
	{
		return;
	}

	const SfxItemSet* pArgs = rReq.GetArgs();
	sal_uInt16 nSlot = rReq.GetSlot();
	if( !pArgs  && nSlot != SID_BACKGROUND_COLOR)
		return ;

    SvxBrushItem aBrushItem( RES_BACKGROUND );

    if( nsSelectionType::SEL_TBL_CELLS & nSelType )
	{
		rSh.GetBoxBackground( aBrushItem );
	}
	else
	{
		SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
		if( (nsSelectionType::SEL_FRM & nSelType) || (nsSelectionType::SEL_GRF & nSelType) )
			rSh.GetFlyFrmAttr( aCoreSet );
		else
            rSh.GetCurAttr( aCoreSet );
		aBrushItem = (const SvxBrushItem&)aCoreSet.Get(RES_BACKGROUND);
	}

//	sal_Bool bMsgOk = sal_False;

	switch (nSlot)
	{
		// RES_BACKGROUND (=SID_ATTR_BRUSH) muss ueber zwei IDs
		// gesetzt werden:
		case SID_BACKGROUND_COLOR:
			{
				aBrushItem.SetGraphicPos(GPOS_NONE);

				//Brush &rBrush = aBrushItem.GetBrush();
				if(pArgs)
				{
					const SvxColorItem&	rNewColorItem = (const SvxColorItem&)
											pArgs->Get(SID_BACKGROUND_COLOR);
					const Color& rNewColor = rNewColorItem.GetValue();
					aBrushItem.SetColor( rNewColor );
					GetView().GetViewFrame()->GetBindings().SetState(rNewColorItem);
				}
				else
                {
					aBrushItem.SetColor( COL_TRANSPARENT );
                    rReq.AppendItem( SvxColorItem( Color( COL_TRANSPARENT ), nSlot ) );
                }
			}
			break;

		case SID_ATTR_BRUSH:
		case RES_BACKGROUND:
		{
			const SvxBrushItem& rNewBrushItem = (const SvxBrushItem&)
									pArgs->Get( GetPool().GetWhich(nSlot) );
			aBrushItem = rNewBrushItem;
		}
		break;
		default:
//			bMsgOk = sal_False;
            rReq.Ignore();
			DBG_ERROR( "Unbekannte Message bei ExecuteAttr!" );
			return;
	}

    if( nsSelectionType::SEL_TBL_CELLS & nSelType )
	{
		rSh.SetBoxBackground( aBrushItem );
	}
	else if( (nsSelectionType::SEL_FRM & nSelType) ||
		(nsSelectionType::SEL_GRF & nSelType)  )
	{
		SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
		aCoreSet.Put( aBrushItem );
		// Vorlagen-AutoUpdate
		SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
		if(pFmt && pFmt->IsAutoUpdateFmt())
			rSh.AutoUpdateFrame( pFmt, aCoreSet);
		else
			rSh.SetFlyFrmAttr( aCoreSet );
	}
	else
	{
		SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
		if(	pColl && pColl->IsAutoUpdateFmt())
		{
			SfxItemSet aSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND );
			aSet.Put(aBrushItem);
			rSh.AutoUpdatePara( pColl, aSet);
		}
		else
			rSh.SetAttrItem( aBrushItem );
	}

    rReq.Done();
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::GetBorderState(SfxItemSet &rSet)
{
	SwWrtShell &rSh = GetShell();
	// Tabellenzelle(n) selektiert?
	sal_Bool bPrepare = sal_True;
    sal_Bool bTableMode = rSh.IsTableMode();
    if ( bTableMode )
	{
		SfxItemSet aCoreSet( GetPool(),
							 RES_BOX, RES_BOX,
							 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
        SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
		aCoreSet.Put( aBoxInfo );
		rSh.GetTabBorders( aCoreSet );
		rSet.Put( aCoreSet );
	}
	else if ( rSh.IsFrmSelected() )
	{
		SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
		rSet.Put( aMgr.GetAttrSet() );
		bPrepare = sal_False;
	}
	else
		// Umrandungsattribute ganz normal ueber Shell holen
        rSh.GetCurAttr( rSet );
    if ( bPrepare )
		::PrepareBoxInfo( rSet, rSh );
    // switch the border toolbox controller mode
    rSet.Put( SfxBoolItem( SID_BORDER_REDUCED_MODE, !bTableMode ));
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::ExecDlg(SfxRequest &rReq)
{
	SwWrtShell &rSh = GetShell();
	Window *pMDI = &GetView().GetViewFrame()->GetWindow();
	//Damit aus dem Basic keine Dialoge fuer Hintergrund-Views aufgerufen werden:
	sal_Bool bBackground = (&GetView() != GetActiveView());
	const SfxPoolItem* pItem = 0;
	const SfxItemSet* pArgs = rReq.GetArgs();

	sal_uInt16 nSlot = rReq.GetSlot();
	const SfxItemSet* pOutSet = 0;
    bool bDone = false;
	if(pArgs)
		pArgs->GetItemState( GetPool().GetWhich(nSlot), sal_False, &pItem );

    switch ( nSlot )
    {
        case FN_FORMAT_PAGE_DLG:
        case FN_FORMAT_PAGE_COLUMN_DLG:
        case FN_FORMAT_PAGE_SETTING_DLG:
        {
            if( !bBackground )
            {
                const sal_uInt16 nCurIdx = rSh.GetCurPageDesc();
                const SwPageDesc& rPageDesc = rSh.GetPageDesc( nCurIdx );
                //temp. View, weil die Shell nach dem Dialog nicht mehr gueltig sein muss
                //z.B. Kopfzeile ausschalten
                SwView& rTempView = GetView();
                rTempView.GetDocShell()->FormatPage(
                    rPageDesc.GetName(),
                    nSlot,
                    rSh );
                rTempView.InvalidateRulerPos();
            }
        }
        break;
        case FN_FORMAT_BORDER_DLG:
		{
			SfxItemSet	 aSet( rSh.GetAttrPool(),
							   RES_BOX	  			, RES_SHADOW,
							   SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
							   0 );
			SfxAbstractDialog * pDlg = 0;
			// Tabellenzelle(n) selektiert?
			if ( rSh.IsTableMode() )
			{
				// Umrandungattribute Get/SetTabBorders() setzen
				::PrepareBoxInfo( aSet, rSh );
				rSh.GetTabBorders( aSet );
                SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
                DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");

                pDlg = pFact->CreateSwBorderDlg( pMDI, aSet, SW_BORDER_MODE_TABLE, RC_DLG_SWBORDERDLG );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				if ( pDlg->Execute() == RET_OK )
				{
					rSh.SetTabBorders( *pDlg->GetOutputItemSet() );
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
			else if ( rSh.IsFrmSelected() )
			{
				// Umrandungsattribute ueber Frame-Manager setzen
				SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
				aSet.Put( aMgr.GetAttrSet() );

                SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
                DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");

                pDlg = pFact->CreateSwBorderDlg( pMDI, aSet, SW_BORDER_MODE_FRAME, RC_DLG_SWBORDERDLG );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				if ( pDlg->Execute() == RET_OK )
				{
					aMgr.SetAttrSet( *pDlg->GetOutputItemSet() );
					aMgr.UpdateFlyFrm();
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
			else
			{
				// Umrandungsattribute ganz normal ueber Shell setzen
                rSh.GetCurAttr( aSet );
				::PrepareBoxInfo( aSet, rSh );

                SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
                DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");

                pDlg = pFact->CreateSwBorderDlg( pMDI, aSet, SW_BORDER_MODE_PARA, RC_DLG_SWBORDERDLG );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				if ( pDlg->Execute() == RET_OK )
				{
					rSh.SetAttrSet( *pDlg->GetOutputItemSet() );
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
            if(pOutSet)
            {
                rReq.Done(*pOutSet);
                bDone = true;
            }
            delete pDlg;
		}
		break;
		case FN_FORMAT_BACKGROUND_DLG:
		{
			SfxItemSet aSet( rSh.GetAttrPool(),
							 RES_BACKGROUND, RES_BACKGROUND );

            SfxAbstractDialog * pDlg = 0;
            SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
            DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");


			// Tabellenzelle(n) selektiert?
			if ( rSh.IsTableMode() )
			{
				//Hintergrundattribute der Tabelle holen und in den Set packen
				SvxBrushItem aBrush(RES_BACKGROUND);
				rSh.GetBoxBackground( aBrush );
                pDlg = pFact->CreateSfxDialog( pMDI, aSet,
					rView.GetViewFrame()->GetFrame().GetFrameInterface(),
					RC_SWDLG_BACKGROUND );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				aSet.Put( aBrush );
				if ( pDlg->Execute() == RET_OK )
				{
					//aBrush = (SvxBrushItem) pDlg->GetOutputItemSet()->Get( RES_BACKGROUND );

					rSh.SetBoxBackground( (SvxBrushItem&)
						pDlg->GetOutputItemSet()->Get( RES_BACKGROUND ));
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
			else if ( rSh.IsFrmSelected() )
			{

				rSh.GetFlyFrmAttr( aSet );

                pDlg = pFact->CreateSfxDialog( pMDI, aSet,
					rView.GetViewFrame()->GetFrame().GetFrameInterface(),
					RC_SWDLG_BACKGROUND );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				if ( pDlg->Execute() == RET_OK )
				{
					rSh.SetFlyFrmAttr((SfxItemSet &) *pDlg->GetOutputItemSet() );
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
			else
			{
				// Umrandungsattribute ganz normal ueber Shell setzen
                rSh.GetCurAttr( aSet );

                pDlg = pFact->CreateSfxDialog( pMDI, aSet,
					rView.GetViewFrame()->GetFrame().GetFrameInterface(),
					RC_SWDLG_BACKGROUND );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
				if ( pDlg->Execute() == RET_OK )
				{
					rSh.SetAttrSet( *pDlg->GetOutputItemSet() );
					pOutSet = pDlg->GetOutputItemSet();
				}
			}
            if(pOutSet)
            {
                rReq.Done(*pOutSet);
                bDone = true;
            }
            delete pDlg;

		}
		break;
		default:DBG_ERROR("falscher Dispatcher (basesh.cxx)");
	}
    if(!bDone)
        rReq.Done();
}

// ----------------------------------------------------------------------------


SwWrtShell& SwBaseShell::GetShell()
{
	return rView.GetWrtShell();
}

// ----------------------------------------------------------------------------

SwWrtShell* SwBaseShell::GetShellPtr()
{
	return rView.GetWrtShellPtr();
}

// ----------------------------------------------------------------------------

void SwBaseShell::InsertTable( SfxRequest& _rRequest )
{
	const SfxItemSet* pArgs = _rRequest.GetArgs();
	SwWrtShell& rSh = GetShell();

	if ( !( rSh.GetFrmType( 0, sal_True ) & FRMTYPE_FOOTNOTE ) )
	{
        SwView &rTempView = GetView(); // Da GetView() nach Shellwechsel nicht mehr geht
        sal_Bool bHTMLMode = 0 != (::GetHtmlMode(rTempView.GetDocShell())&HTMLMODE_ON);
		sal_Bool bCallEndUndo = sal_False;

		if( !pArgs && rSh.IsSelection() && !rSh.IsInClickToEdit() &&
            !rSh.IsTableMode() )
		{
			const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
            SwInsertTableOptions aInsTblOpts = pModOpt->GetInsTblFlags(bHTMLMode);

			rSh.StartUndo(UNDO_INSTABLE);
			bCallEndUndo = sal_True;

            sal_Bool bInserted = rSh.TextToTable( aInsTblOpts, '\t', text::HoriOrientation::FULL );
			rSh.EnterStdMode();
			if (bInserted)
                rTempView.AutoCaption(TABLE_CAP);
	        _rRequest.Done();
		}
		else
		{
			sal_uInt16 nCols = 0;
			sal_uInt16 nRows = 0;
            SwInsertTableOptions aInsTblOpts( tabopts::ALL_TBL_INS_ATTR, 1 );
            String aTableName, aAutoName;
			SwTableAutoFmt* pTAFmt = 0;

			if( pArgs && pArgs->Count() >= 2 )
			{
	            SFX_REQUEST_ARG( _rRequest, pName, SfxStringItem, FN_INSERT_TABLE, sal_False );
	            SFX_REQUEST_ARG( _rRequest, pCols, SfxUInt16Item, SID_ATTR_TABLE_COLUMN, sal_False );
	            SFX_REQUEST_ARG( _rRequest, pRows, SfxUInt16Item, SID_ATTR_TABLE_ROW, sal_False );
	            SFX_REQUEST_ARG( _rRequest, pFlags, SfxInt32Item, FN_PARAM_1, sal_False );
	            SFX_REQUEST_ARG( _rRequest, pAuto, SfxStringItem, FN_PARAM_2, sal_False );

	            if ( pName )
	                aTableName = pName->GetValue();
	            if ( pCols )
	                nCols = pCols->GetValue();
	            if ( pRows )
	                nRows = pRows->GetValue();
	            if ( pAuto )
	            {
	                aAutoName = pAuto->GetValue();
	                if ( aAutoName.Len() )
	                {
	                    SwTableAutoFmtTbl aTableTbl;
	                    aTableTbl.Load();
	                    for ( sal_uInt16 n=0; n<aTableTbl.Count(); n++ )
	                    {
	                        if ( aTableTbl[n]->GetName() == aAutoName )
	                        {
	                            pTAFmt = new SwTableAutoFmt( *aTableTbl[n] );
	                            break;
	                        }
	                    }
	                }
	            }

	            if ( pFlags )
                    aInsTblOpts.mnInsMode = (sal_uInt16) pFlags->GetValue();
                else
	            {
	                const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
                    aInsTblOpts = pModOpt->GetInsTblFlags(bHTMLMode);
                }
			}

			if( !nCols || !nRows )
			{
                SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
                DBG_ASSERT(pFact, "Dialogdiet fail!");
                AbstractInsTableDlg* pDlg = pFact->CreateInsTableDlg( DLG_INSERT_TABLE, rTempView );
                DBG_ASSERT(pDlg, "Dialogdiet fail!");
                if( RET_OK == pDlg->Execute() )
				{
	                pDlg->GetValues( aTableName, nRows, nCols, aInsTblOpts, aAutoName, pTAFmt );
				}
	            else
	                _rRequest.Ignore();
				delete pDlg;
            }

			if( nCols && nRows )
			{
	            // record before shell change
	            _rRequest.AppendItem( SfxStringItem( FN_INSERT_TABLE, aTableName ) );
	            if ( aAutoName.Len() )
	                _rRequest.AppendItem( SfxStringItem( FN_PARAM_2, aAutoName ) );
	            _rRequest.AppendItem( SfxUInt16Item( SID_ATTR_TABLE_COLUMN, nCols ) );
	            _rRequest.AppendItem( SfxUInt16Item( SID_ATTR_TABLE_ROW, nRows ) );
                _rRequest.AppendItem( SfxInt32Item( FN_PARAM_1, (sal_Int32) aInsTblOpts.mnInsMode ) );
	            _rRequest.Done();

				rSh.StartUndo(UNDO_INSTABLE);
				bCallEndUndo = sal_True;

				rSh.StartAllAction();
				if( rSh.HasSelection() )
					rSh.DelRight();

                rSh.InsertTable( aInsTblOpts, nRows, nCols, text::HoriOrientation::FULL, pTAFmt );
				rSh.MoveTable( fnTablePrev, fnTableStart );

				if( aTableName.Len() && !rSh.GetTblStyle( aTableName ) )
					rSh.GetTableFmt()->SetName( aTableName );

				rSh.EndAllAction();
                rTempView.AutoCaption(TABLE_CAP);
			}
			delete pTAFmt;
		}

		if( bCallEndUndo )
        {
            SwRewriter aRewriter;

            if (rSh.GetTableFmt())
            {
                aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_START_QUOTE));
                aRewriter.AddRule(UNDO_ARG2, rSh.GetTableFmt()->GetName());
                aRewriter.AddRule(UNDO_ARG3, SW_RES(STR_END_QUOTE));

            }
            rSh.EndUndo(UNDO_INSTABLE, &aRewriter);	// wegen moegl. Shellwechsel
        }
	}
}

// ----------------------------------------------------------------------------

void SwBaseShell::GetGalleryState( SfxItemSet &rSet )
{
	SwWrtShell &rSh = GetShell();
	SfxWhichIter aIter( rSet );
	sal_uInt16 nWhich = aIter.FirstWhich();
	switch ( nWhich )
	{
		case SID_GALLERY_BG_BRUSH:
		{
			int nSel = rSh.GetSelectionType();
			SfxStringListItem aLst( nWhich );
			List *pLst = aLst.GetList();
			nParagraphPos = nGraphicPos = nOlePos = nFramePos = nTablePos =
			nTableRowPos  = nTableCellPos = nPagePos =
			nHeaderPos 	  = nFooterPos = 0;
			sal_uInt8 nPos = 1;
			pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_PAGE ), pLst->Count() );
			nPagePos = nPos++;
			sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
			sal_Bool bHtmlMode = 0 != (nHtmlMode & HTMLMODE_ON);

			if ( (!bHtmlMode || (nHtmlMode & HTMLMODE_FULL_STYLES)) &&
				 (nSel & nsSelectionType::SEL_TXT) )
			{
				pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_PARAGRAPH ), pLst->Count() );
				nParagraphPos = nPos++;
			}
			if ( (!bHtmlMode || (nHtmlMode & HTMLMODE_SOME_STYLES)) &&
					nSel & (nsSelectionType::SEL_TBL|nsSelectionType::SEL_TBL_CELLS) )
			{
				pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE ), pLst->Count() );
				nTablePos = nPos++;

				if(!bHtmlMode)
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE_ROW ), pLst->Count() );
					nTableRowPos = nPos++;
				}

				pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE_CELL), pLst->Count() );
				nTableCellPos = nPos++;
			}
			if(!bHtmlMode)
			{
				if ( nSel & nsSelectionType::SEL_FRM )
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_FRAME ), pLst->Count() );
					nFramePos = nPos++;
				}
				if ( nSel & nsSelectionType::SEL_GRF )
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_GRAPHIC ), pLst->Count() );
					nGraphicPos = nPos++;
				}
				if ( nSel & nsSelectionType::SEL_OLE )
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_OLE ), pLst->Count() );
					nOlePos = nPos++;
				}
				const sal_uInt16 nType = rSh.GetFrmType(0,sal_True);
				if ( nType & FRMTYPE_HEADER )
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_HEADER ), pLst->Count() );
					nHeaderPos = nPos++;
				}
				if ( nType & FRMTYPE_FOOTER )
				{
					pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_FOOTER ), pLst->Count() );
					nFooterPos = nPos;
				}
			}
			if ( pLst->Count() )
				rSet.Put( aLst );
			else
				rSet.DisableItem( nWhich );
			break;
		}
	}
}


void SwBaseShell::ExecuteGallery(SfxRequest &rReq)
{
	SwWrtShell &rSh = GetShell();
	rSh.StartAction();
	const SfxItemSet* pArgs = rReq.GetArgs();
	sal_uInt16 nSlot = rReq.GetSlot();
	switch(nSlot)
	{
		case SID_GALLERY_BG_BRUSH:
		{
            if ( !pArgs )
                break;

			int nSel = rSh.GetSelectionType();
			if ( nSel & nsSelectionType::SEL_DRW_TXT )
				break;

            SFX_REQUEST_ARG( rReq, pPos, SfxUInt16Item, SID_GALLERY_BG_POS, sal_False );
            SFX_REQUEST_ARG( rReq, pBrush, SvxBrushItem, SID_GALLERY_BG_BRUSH, sal_False );
            if ( !pPos || !pBrush )
                break;

			sal_uInt8 nPos = pPos->GetValue();
			++nPos;

			SvxBrushItem aBrush( *pBrush );
			aBrush.SetWhich( RES_BACKGROUND );
			if ( nPos == nParagraphPos )
				rSh.SetAttrItem( aBrush );
			else if ( nPos == nTablePos )
				rSh.SetTabBackground( aBrush );
			else if ( nPos == nTableRowPos )
				rSh.SetRowBackground( aBrush );
			else if ( nPos == nTableCellPos )
				rSh.SetBoxBackground( aBrush );
			else if ( nPos == nFramePos || nPos == nGraphicPos || nPos == nOlePos )
			{
				SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
				aCoreSet.Put( aBrush );
				rSh.SetFlyFrmAttr( aCoreSet );
			}
			else if ( nPos == nPagePos || nPos == nHeaderPos || nPos == nFooterPos )
			{
				sal_uInt16 nDesc = rSh.GetCurPageDesc();
				SwPageDesc aDesc( rSh.GetPageDesc( nDesc ) );
				if ( nPos == nPagePos )
                    aDesc.GetMaster().SetFmtAttr( aBrush );
				else if ( nPos == nHeaderPos )
				{
					SwFmtHeader aHead( aDesc.GetMaster().GetHeader() );
                    aHead.GetHeaderFmt()->SetFmtAttr( aBrush );
                    aDesc.GetMaster().SetFmtAttr( aHead );
				}
				else if ( nPos == nFooterPos )
				{
					SwFmtFooter aFoot( aDesc.GetMaster().GetFooter() );
                    aFoot.GetFooterFmt()->SetFmtAttr( aBrush );
                    aDesc.GetMaster().SetFmtAttr( aFoot );
				}
				rSh.ChgPageDesc( nDesc, aDesc );
			}
			break;
		}
	}
	rSh.EndAction();
    rReq.Done();
}

void SwBaseShell::ExecField( SfxRequest& rReq )
{
	sal_uInt16 nSlot = rReq.GetSlot();
	switch( nSlot )
	{
		case FN_CHANGE_DBFIELD:
		{
            SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
            DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");

            VclAbstractDialog* pDlg = pFact->CreateSwChangeDBDlg(GetView(), DLG_CHANGE_DB );
            DBG_ASSERT(pDlg, "Dialogdiet fail!");
			pDlg->Execute();
			delete pDlg;
		}
		break;
		default:
			ASSERT(sal_False, falscher Dispatcher);
	}
}

