/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * 
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

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

#include <com/sun/star/presentation/XPresentation2.hpp>
#include <com/sun/star/form/FormButtonType.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/i18n/TransliterationModules.hpp>
#include <com/sun/star/i18n/TransliterationModulesExtra.hpp>

#include <comphelper/processfactory.hxx>

#include "undo/undomanager.hxx"
#include <vcl/waitobj.hxx>
#include <svl/aeitem.hxx>
#include <editeng/editstat.hxx>
#include <vcl/msgbox.hxx>
#include <svl/urlbmk.hxx>
#include <svx/svdpagv.hxx>
#include <svx/fmshell.hxx>
#include <vcl/scrbar.hxx>
#include <svx/svdopath.hxx>
#include <svx/svdundo.hxx>
#include <svx/svdorect.hxx>
#include <svx/svdograf.hxx>
#include <svl/eitem.hxx>
#include <editeng/eeitem.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/request.hxx>
#include <svx/svxids.hrc>
#include <editeng/flditem.hxx>
#include <svx/ruler.hxx>
#include <svx/obj3d.hxx>
#include <svx/fmglob.hxx>
#include <svx/svdouno.hxx>
#include <svx/dataaccessdescriptor.hxx>
#include <tools/urlobj.hxx>
#include <svl/slstitm.hxx>
#include <sfx2/ipclient.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <avmedia/mediawindow.hxx>
#include <svl/urihelper.hxx>
#include <sfx2/docfile.hxx>

#include "DrawViewShell.hxx"
#include "slideshow.hxx"
#include "ViewShellImplementation.hxx"
#include "ViewShellHint.hxx"
#include "framework/FrameworkHelper.hxx"
#include "app.hrc"
#include "glob.hrc"
#include "strings.hrc"
#include "res_bmp.hrc"
#include "drawdoc.hxx"
#include "fusel.hxx"
#include "futext.hxx"
#include "fuconrec.hxx"
#include "fuconcs.hxx"
#include "fuconuno.hxx"
#include "fuconbez.hxx"
#include "fuediglu.hxx"
#include "fuconarc.hxx"
#include "fucon3d.hxx"
#include "sdresid.hxx"
#include "slideshow.hxx"
#include "Outliner.hxx"
#include "PresentationViewShell.hxx"
#include "sdpage.hxx"
#include "FrameView.hxx"
#include "zoomlist.hxx"
#include "drawview.hxx"
#include "DrawDocShell.hxx"
#include "sdattr.hxx"
#include "ViewShellBase.hxx"
#include "ToolBarManager.hxx"
#include "anminfo.hxx"
#include "optsitem.hxx"
#include "Window.hxx"
#include "fuformatpaintbrush.hxx"

using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::presentation;

namespace sd {

#ifdef _MSC_VER
#pragma optimize ( "", off )
#endif

/*************************************************************************
|*
|* Permanente Funktionen
|*
\************************************************************************/

void ImpAddPrintableCharactersToTextEdit(SfxRequest& rReq, ::sd::View* pView)
{
	// #98198# evtl. feed characters to activated textedit
	const SfxItemSet* pSet = rReq.GetArgs();

	if(pSet)
	{
		String aInputString;

		if(SFX_ITEM_SET == pSet->GetItemState(SID_ATTR_CHAR))
			aInputString = ((SfxStringItem&)pSet->Get(SID_ATTR_CHAR)).GetValue();

		if(aInputString.Len())
		{
			OutlinerView* pOLV = pView->GetTextEditOutlinerView();

			if(pOLV)
			{
				for(sal_uInt16 a(0); a < aInputString.Len(); a++)
				{
					sal_Char aChar = (sal_Char)aInputString.GetChar(a);
					KeyCode aKeyCode;
					KeyEvent aKeyEvent(aChar, aKeyCode);

					// add actual character
					pOLV->PostKeyEvent(aKeyEvent);
				}
			}
		}
	}
}

void DrawViewShell::FuPermanent(SfxRequest& rReq)
{
	// Waehrend einer Native-Diashow wird nichts ausgefuehrt!

	if (SlideShow::IsRunning(GetViewShellBase()))
		return;

	sal_uInt16 nSId = rReq.GetSlot();

	if( HasCurrentFunction() &&
		( nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
		  nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ) )
	{
		FunctionReference xFunc( GetCurrentFunction() );

		FuText* pFuText = dynamic_cast< FuText* >( xFunc.get() );

		if( pFuText )
		{
			pFuText->SetPermanent(sal_True);
			xFunc->ReceiveRequest( rReq );

			MapSlot( nSId );

			Invalidate();

			Invalidate();

			// #98198# evtl. feed characters to activated textedit
			if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
				ImpAddPrintableCharactersToTextEdit(rReq, GetView());

			rReq.Done();
			return;
		}
	}

	CheckLineTo (rReq);
    sal_uInt16 nOldSId = 0;
    sal_Bool bPermanent = sal_False;

	if( !mpDrawView )
		return;

	if(HasCurrentFunction())
	{
		if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) )
		{
			// save text edit mode for format paintbrush!
			SetOldFunction( GetCurrentFunction() );
		}
		else
		{
			if(GetOldFunction() == GetCurrentFunction())
			{
				SetOldFunction(0);
			}
		}

		if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE &&
			 nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL &&
			 nSId != SID_FORMATPAINTBRUSH &&
			 mpDrawView->IsTextEdit() )
		{
			mpDrawView->SdrEndTextEdit();
		}

		if( HasCurrentFunction() )
		{
			nOldSId = GetCurrentFunction()->GetSlotID();

			if (nOldSId == nSId ||
				((nOldSId == SID_TEXTEDIT || nOldSId == SID_ATTR_CHAR || nOldSId == SID_TEXT_FITTOSIZE ||
				nOldSId == SID_ATTR_CHAR_VERTICAL || nOldSId == SID_TEXT_FITTOSIZE_VERTICAL) &&
				(nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
				nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL )))
			{
				bPermanent = sal_True;
			}

			GetCurrentFunction()->Deactivate();
		}

		SetCurrentFunction(0);

		SfxBindings& rBind = GetViewFrame()->GetBindings();
        rBind.Invalidate(nOldSId);
        rBind.Update(nOldSId);
	}

	// Slot wird gemapped (ToolboxImages/-Slots)
	MapSlot( nSId );

    switch ( nSId )
	{
		case SID_TEXTEDIT:	// BASIC ???
		case SID_ATTR_CHAR:
		case SID_ATTR_CHAR_VERTICAL:
		case SID_TEXT_FITTOSIZE:
		case SID_TEXT_FITTOSIZE_VERTICAL:
		{
			SetCurrentFunction( FuText::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
			GetCurrentFunction()->DoExecute(rReq);

			SfxBindings& rBindings = GetViewFrame()->GetBindings();
			rBindings.Invalidate( SID_ATTR_CHAR );
			rBindings.Invalidate( SID_ATTR_CHAR_VERTICAL );
			rBindings.Invalidate( SID_TEXT_FITTOSIZE );
			rBindings.Invalidate( SID_TEXT_FITTOSIZE_VERTICAL );

			// #98198# evtl. feed characters to activated textedit
			if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
				ImpAddPrintableCharactersToTextEdit(rReq, GetView());

			rReq.Done();
		}
		break;

		case SID_FM_CREATE_CONTROL:
		{
			SetCurrentFunction( FuConstructUnoControl::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
			rReq.Done();
		}
		break;

		// #98721#
		case SID_FM_CREATE_FIELDCONTROL:
		{
			SFX_REQUEST_ARG( rReq, pDescriptorItem, SfxUnoAnyItem, SID_FM_DATACCESS_DESCRIPTOR, sal_False );
			DBG_ASSERT( pDescriptorItem, "DrawViewShell::FuPermanent(SID_FM_CREATE_FIELDCONTROL): invalid request args!" );

			if(pDescriptorItem)
			{
				// get the form view
				FmFormView* pFormView = PTR_CAST(FmFormView, mpDrawView);
				SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : NULL;

				if(pPageView)
				{
					::svx::ODataAccessDescriptor aDescriptor(pDescriptorItem->GetValue());
					SdrObject* pNewDBField = pFormView->CreateFieldControl(aDescriptor);

					if(pNewDBField)
					{
						Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
						Point aObjPos(aVisArea.Center());
						Size aObjSize(pNewDBField->GetLogicRect().GetSize());
						aObjPos.X() -= aObjSize.Width() / 2;
						aObjPos.Y() -= aObjSize.Height() / 2;
						Rectangle aNewObjectRectangle(aObjPos, aObjSize);

						pNewDBField->SetLogicRect(aNewObjectRectangle);

						GetView()->InsertObjectAtView(pNewDBField, *pPageView);
					}
				}
			}
			rReq.Done();
		}
		break;

		case SID_OBJECT_SELECT:
		case SID_OBJECT_ROTATE:
		case SID_OBJECT_MIRROR:
		case SID_OBJECT_CROP:
		case SID_OBJECT_TRANSPARENCE:
		case SID_OBJECT_GRADIENT:
		case SID_OBJECT_SHEAR:
		case SID_OBJECT_CROOK_ROTATE:
		case SID_OBJECT_CROOK_SLANT:
		case SID_OBJECT_CROOK_STRETCH:
        case SID_CONVERT_TO_3D_LATHE:
		{
			short nSlotId = rReq.GetSlot();

			if( nSlotId == SID_OBJECT_ROTATE )
			{
				// togle rotation
				if( nOldSId == nSlotId )
				{
					nSlotId = SID_OBJECT_SELECT;
					rReq.SetSlot( nSlotId );
				}
			}

			if (nSlotId == SID_OBJECT_CROOK_ROTATE ||
				nSlotId == SID_OBJECT_CROOK_SLANT ||
				nSlotId == SID_OBJECT_CROOK_STRETCH)
			{
				if ( mpDrawView->GetMarkedObjectList().GetMarkCount() > 0 &&
				    !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) )
				{
					if ( mpDrawView->IsPresObjSelected() )
					{
                        ::sd::Window* pWindow = GetActiveWindow();
                        InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
					}
					else if ( QueryBox(GetActiveWindow(), WB_YES_NO,
                                      String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) )
									  ).Execute() == RET_YES )
					{
						// Implizite Wandlung in Bezier
                        WaitObject aWait( (Window*)GetActiveWindow() );
						mpDrawView->ConvertMarkedToPathObj(sal_False);
					}
				}
			}
			else if (nSlotId == SID_OBJECT_SHEAR)
			{
                sal_uLong i = 0;
                const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
                sal_uLong nMarkCnt = rMarkList.GetMarkCount();
                sal_Bool b3DObjMarked = sal_False;

                while (i < nMarkCnt && !b3DObjMarked)
                {
                    if (rMarkList.GetMark(i)->GetMarkedSdrObj()->ISA(E3dObject))
                    {
                        b3DObjMarked = sal_True;
                    }
                    else
                    {
                        i++;
                    }
                }

                if ( nMarkCnt > 0 && !b3DObjMarked &&
                     (!mpDrawView->IsShearAllowed() || !mpDrawView->IsDistortAllowed()) )
				{
					if ( mpDrawView->IsPresObjSelected() )
					{
                        ::sd::Window* pWindow = GetActiveWindow();
                        InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
					}
					else if ( QueryBox(GetActiveWindow(), WB_YES_NO,
                                      String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) )
									  ).Execute() == RET_YES )
					{
						// Implizite Wandlung in Bezier
                        WaitObject aWait( (Window*)GetActiveWindow() );
						mpDrawView->ConvertMarkedToPathObj(sal_False);
					}
				}
			}

			SetCurrentFunction( FuSelection::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
			rReq.Done();
			Invalidate( SID_OBJECT_SELECT );
		}
		break;

		case SID_DRAW_LINE:
		case SID_DRAW_XLINE:
        case SID_DRAW_MEASURELINE:
		case SID_LINE_ARROW_START:
		case SID_LINE_ARROW_END:
		case SID_LINE_ARROWS:
		case SID_LINE_ARROW_CIRCLE:
		case SID_LINE_CIRCLE_ARROW:
		case SID_LINE_ARROW_SQUARE:
		case SID_LINE_SQUARE_ARROW:

		case SID_DRAW_RECT:
		case SID_DRAW_RECT_NOFILL:
		case SID_DRAW_RECT_ROUND:
		case SID_DRAW_RECT_ROUND_NOFILL:
		case SID_DRAW_SQUARE:
		case SID_DRAW_SQUARE_NOFILL:
		case SID_DRAW_SQUARE_ROUND:
		case SID_DRAW_SQUARE_ROUND_NOFILL:
		case SID_DRAW_ELLIPSE:
		case SID_DRAW_ELLIPSE_NOFILL:
		case SID_DRAW_CIRCLE:
		case SID_DRAW_CIRCLE_NOFILL:
		case SID_DRAW_CAPTION:
		case SID_DRAW_CAPTION_VERTICAL:
		case SID_TOOL_CONNECTOR:
        case SID_CONNECTOR_ARROW_START:
        case SID_CONNECTOR_ARROW_END:
        case SID_CONNECTOR_ARROWS:
        case SID_CONNECTOR_CIRCLE_START:
        case SID_CONNECTOR_CIRCLE_END:
        case SID_CONNECTOR_CIRCLES:
        case SID_CONNECTOR_LINE:
        case SID_CONNECTOR_LINE_ARROW_START:
        case SID_CONNECTOR_LINE_ARROW_END:
        case SID_CONNECTOR_LINE_ARROWS:
        case SID_CONNECTOR_LINE_CIRCLE_START:
        case SID_CONNECTOR_LINE_CIRCLE_END:
        case SID_CONNECTOR_LINE_CIRCLES:
        case SID_CONNECTOR_CURVE:
        case SID_CONNECTOR_CURVE_ARROW_START:
        case SID_CONNECTOR_CURVE_ARROW_END:
        case SID_CONNECTOR_CURVE_ARROWS:
        case SID_CONNECTOR_CURVE_CIRCLE_START:
        case SID_CONNECTOR_CURVE_CIRCLE_END:
        case SID_CONNECTOR_CURVE_CIRCLES:
        case SID_CONNECTOR_LINES:
        case SID_CONNECTOR_LINES_ARROW_START:
        case SID_CONNECTOR_LINES_ARROW_END:
        case SID_CONNECTOR_LINES_ARROWS:
        case SID_CONNECTOR_LINES_CIRCLE_START:
        case SID_CONNECTOR_LINES_CIRCLE_END:
        case SID_CONNECTOR_LINES_CIRCLES:
        {
			SetCurrentFunction( FuConstructRectangle::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
            rReq.Done();
		}
		break;
		case SID_DRAW_POLYGON:
		case SID_DRAW_POLYGON_NOFILL:
		case SID_DRAW_XPOLYGON:
		case SID_DRAW_XPOLYGON_NOFILL:
        case SID_DRAW_FREELINE:
        case SID_DRAW_FREELINE_NOFILL:
        case SID_DRAW_BEZIER_FILL:          // BASIC
        case SID_DRAW_BEZIER_NOFILL:        // BASIC
		{
			SetCurrentFunction( FuConstructBezierPolygon::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) );
            rReq.Done();
		}
		break;

        case SID_GLUE_EDITMODE:
		{
            if (nOldSId != SID_GLUE_EDITMODE)
            {
				SetCurrentFunction( FuEditGluePoints::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
            }
            else
            {
				GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
            }

			rReq.Done();
		}
		break;

		case SID_DRAW_ARC:
		case SID_DRAW_CIRCLEARC:
		case SID_DRAW_PIE:
		case SID_DRAW_PIE_NOFILL:
		case SID_DRAW_CIRCLEPIE:
		case SID_DRAW_CIRCLEPIE_NOFILL:
		case SID_DRAW_ELLIPSECUT:
		case SID_DRAW_ELLIPSECUT_NOFILL:
		case SID_DRAW_CIRCLECUT:
		case SID_DRAW_CIRCLECUT_NOFILL:
		{
			SetCurrentFunction( FuConstructArc::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) );
            rReq.Done();
		}
		break;

		case SID_3D_CUBE:
		case SID_3D_SHELL:
		case SID_3D_SPHERE:
		case SID_3D_TORUS:
		case SID_3D_HALF_SPHERE:
		case SID_3D_CYLINDER:
		case SID_3D_CONE:
		case SID_3D_PYRAMID:
		{
			SetCurrentFunction( FuConstruct3dObject::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
            rReq.Done();
		}
		break;

		case SID_DRAWTBX_CS_BASIC :
		case SID_DRAWTBX_CS_SYMBOL :
		case SID_DRAWTBX_CS_ARROW :
		case SID_DRAWTBX_CS_FLOWCHART :
		case SID_DRAWTBX_CS_CALLOUT :
		case SID_DRAWTBX_CS_STAR :
		case SID_DRAW_CS_ID :
		{
			SetCurrentFunction( FuConstructCustomShape::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
            rReq.Done();

            if ( nSId != SID_DRAW_CS_ID )
            {
                SfxBindings& rBind = GetViewFrame()->GetBindings();
                rBind.Invalidate( nSId );
                rBind.Update( nSId );
            }
		}
		break;

        case SID_FORMATPAINTBRUSH:
        {
    		SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
    		rReq.Done();
            SfxBindings& rBind = GetViewFrame()->GetBindings();
            rBind.Invalidate( nSId );
            rBind.Update( nSId );
            break;
        }
        
        default:
   		break;
	}

	if(HasOldFunction())
	{
		sal_uInt16 nSlotId = GetOldFunction()->GetSlotID();

		GetOldFunction()->Deactivate();
		SetOldFunction(0);

		SfxBindings& rBind = GetViewFrame()->GetBindings();
		rBind.Invalidate( nSlotId );
		rBind.Update( nSlotId );
	}

	if(HasCurrentFunction())
	{
		GetCurrentFunction()->Activate();
		SetOldFunction( GetCurrentFunction() );

		SetHelpId( GetCurrentFunction()->GetSlotID() );
	}

	// Shell wird invalidiert, schneller als einzeln (laut MI)
	// Jetzt explizit der letzte Slot incl. Update()
	Invalidate();

	// #97016# III CTRL-SID_OBJECT_SELECT -> select first draw object if none is selected yet
	if(SID_OBJECT_SELECT == nSId && HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1))
	{
		if(!GetView()->AreObjectsMarked())
		{
			// select first object
			GetView()->UnmarkAllObj();
			GetView()->MarkNextObj(sal_True);

			// ...and make it visible
			if(GetView()->AreObjectsMarked())
				GetView()->MakeVisible(GetView()->GetAllMarkedRect(), *GetActiveWindow());
		}
	}

	// #97016# with qualifier construct directly
	if(HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1))
	{
		// get SdOptions
		SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
		sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth());
		sal_uInt32 nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight());

		// calc position and size
		Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
		Point aPagePos = aVisArea.Center();
		aPagePos.X() -= nDefaultObjectSizeWidth / 2;
		aPagePos.Y() -= nDefaultObjectSizeHeight / 2;
		Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight));
		SdrPageView* pPageView = mpDrawView->GetSdrPageView();

		if(pPageView)
		{
			// create the default object
			SdrObject* pObj = GetCurrentFunction()->CreateDefaultObject(nSId, aNewObjectRectangle);

			if(pObj)
			{
				// insert into page
				GetView()->InsertObjectAtView(pObj, *pPageView);

                // Now that pFuActual has done what it was created for we
                // can switch on the edit mode for callout objects.
                switch (nSId)
                {
                    case SID_DRAW_CAPTION:
                    case SID_DRAW_CAPTION_VERTICAL:
                    {
                        // Make FuText the current function.
                        SfxUInt16Item aItem (SID_TEXTEDIT, 1);
                        GetViewFrame()->GetDispatcher()->
                            Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON |
                                SFX_CALLMODE_RECORD, &aItem, 0L);
                        // Put text object into edit mode.
                        GetView()->SdrBeginTextEdit(static_cast<SdrTextObj*>(pObj), pPageView);
                        break;
                    }
                }
			}
		}
	}
}

//////////////////////////////////////////////////////////////////////////////
// service routine for Undo/Redo implementation
extern SfxUndoManager* ImpGetUndoManagerFromViewShell(DrawViewShell& rDViewShell);

/*************************************************************************
|*
|* SfxRequests fuer Support-Funktionen
|*
\************************************************************************/

void DrawViewShell::FuSupport(SfxRequest& rReq)
{
	if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
		GetDocSh()->SetStyleFamily(((SfxUInt16Item&)rReq.GetArgs()->Get( SID_STYLE_FAMILY )).GetValue());

	// Waehrend einer Native-Diashow wird nichts ausgefuehrt!
	if(SlideShow::IsRunning(GetViewShellBase()) &&
		(rReq.GetSlot() != SID_PRESENTATION_END &&
         rReq.GetSlot() != SID_SIZE_PAGE))
		return;

	CheckLineTo (rReq);

	if( !mpDrawView )
		return;

	sal_uInt16 nSId = rReq.GetSlot();

	// Slot wird evtl. gemapped (ToolboxImages/-Slots)
	MapSlot( nSId );

	switch ( nSId )
	{
		case SID_CLEAR_UNDO_STACK:
		{
			GetDocSh()->ClearUndoBuffer();
            rReq.Ignore ();
		}
		break;

        // Slots der ToolboxController gemapped ausfuehren
        case SID_OBJECT_CHOOSE_MODE:
        case SID_POSITION:
        case SID_OBJECT_ALIGN:
        case SID_ZOOM_TOOLBOX:
        case SID_DRAWTBX_TEXT:
        case SID_DRAWTBX_RECTANGLES:
        case SID_DRAWTBX_ELLIPSES:
        case SID_DRAWTBX_LINES:
        case SID_DRAWTBX_ARROWS:
        case SID_DRAWTBX_3D_OBJECTS:
        case SID_DRAWTBX_CONNECTORS:
        case SID_DRAWTBX_INSERT:
        {
            sal_uInt16 nMappedSlot = GetMappedSlot( nSId );
            if( nMappedSlot > 0 )
            {
                SfxRequest aReq( nMappedSlot, 0, GetDoc()->GetItemPool() );
                ExecuteSlot( aReq );
            }
        }
        break;

		case SID_PRESENTATION:
		case SID_REHEARSE_TIMINGS:
		{
			Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
			if( xPresentation.is() )
			{
				if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) )
					xPresentation->start(); 
				else
					xPresentation->rehearseTimings();
			}
			rReq.Ignore ();
        }
		break;

		case SID_PRESENTATION_END:
		{
            StopSlideShow(true);

            rReq.Ignore ();
		}
		break;

		case SID_BEZIER_EDIT:
		{
            mpDrawView->SetFrameDragSingles(!mpDrawView->IsFrameDragSingles());

            /******************************************************************
            * ObjectBar einschalten
            ******************************************************************/
            if( dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) || dynamic_cast< FuConstructBezierPolygon* >( GetCurrentFunction().get() ) )
            {
                // Tell the tool bar manager about the context change.
				GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView);
            }

            Invalidate(SID_BEZIER_EDIT);
            rReq.Ignore();
        }
        break;

		case SID_OBJECT_CLOSE:
		{
			const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
			if ( rMarkList.GetMark(0) && !mpDrawView->IsAction() )
			{
				SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
				const bool bUndo = mpDrawView->IsUndoEnabled();
				if( bUndo )
					mpDrawView->BegUndo(String(SdResId(STR_UNDO_BEZCLOSE)));

				mpDrawView->UnmarkAllPoints();

				if( bUndo )
					mpDrawView->AddUndo(new SdrUndoGeoObj(*pPathObj));

				pPathObj->ToggleClosed();

				if( bUndo )
					mpDrawView->EndUndo();
			}
			rReq.Done();
		}
		break;

		case SID_CUT:
		{
			if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
			{
                ::sd::Window* pWindow = GetActiveWindow();
                InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
			}
			else
			{
				if(HasCurrentFunction())
				{
					GetCurrentFunction()->DoCut();
				}
				else if(mpDrawView)
				{
					mpDrawView->DoCut();
				}
			}
			rReq.Ignore ();
		}
		break;

		case SID_COPY:
		{
			if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
			{
                ::sd::Window* pWindow = GetActiveWindow();
                InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
			}
			else
			{
				if(HasCurrentFunction())
				{
					GetCurrentFunction()->DoCopy();
				}
				else if( mpDrawView )
				{
					mpDrawView->DoCopy();
				}
			}
			rReq.Ignore ();
		}
		break;

		case SID_PASTE:
		{
			WaitObject aWait( (Window*)GetActiveWindow() );

			if(HasCurrentFunction())
			{
				GetCurrentFunction()->DoPaste();
			}
			else if(mpDrawView)
			{
				mpDrawView->DoPaste();
			}

			rReq.Ignore ();
		}
		break;

        case SID_CLIPBOARD_FORMAT_ITEMS:
        {
			WaitObject              aWait( (Window*)GetActiveWindow() );
	        TransferableDataHelper  aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
            const SfxItemSet*       pReqArgs = rReq.GetArgs();
            sal_uInt32                  nFormat = 0;

            if( pReqArgs )
            {
                SFX_REQUEST_ARG( rReq, pIsActive, SfxUInt32Item, SID_CLIPBOARD_FORMAT_ITEMS, sal_False );
                nFormat = pIsActive->GetValue();
            }


	        if( nFormat && aDataHelper.GetTransferable().is() )
	        {
		        sal_Int8 nAction = DND_ACTION_COPY;

                if( !mpDrawView->InsertData( aDataHelper,
						                  GetActiveWindow()->PixelToLogic( Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ),
						                  nAction, sal_False, nFormat ) )
                {
			        INetBookmark    aINetBookmark( aEmptyStr, aEmptyStr );

			        if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) &&
				          aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
				        ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) &&
				          aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
				        ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) &&
				          aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
			        {
				        InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL );
			        }
                }
	        }
        }
        break;

		case SID_DELETE:
		{
			if ( mpDrawView->IsTextEdit() )
			{
				OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();

				if (pOLV)
				{
					KeyCode aKCode(KEY_DELETE);
					KeyEvent aKEvt( 0, aKCode);
					pOLV->PostKeyEvent(aKEvt);
				}
			}
			else if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
			{
                ::sd::Window* pWindow = GetActiveWindow();
                InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
			}
			else
			{
				KeyCode aKCode(KEY_DELETE);
				KeyEvent aKEvt( 0, aKCode);

				bool bConsumed = mpDrawView && mpDrawView->getSmartTags().KeyInput( aKEvt );

				if( !bConsumed && HasCurrentFunction() )
					bConsumed = GetCurrentFunction()->KeyInput(aKEvt);

				if( !bConsumed && mpDrawView )
					mpDrawView->DeleteMarked();
			}
			rReq.Ignore ();
		}
		break;

        case SID_NOTESMODE:
		case SID_HANDOUTMODE:
			// AutoLayouts have to be ready.
			GetDoc()->StopWorkStartupDelay();
            // Fall through to following case statements.

        case SID_DRAWINGMODE:
		case SID_DIAMODE:
        case SID_OUTLINEMODE:
            // Let the sub-shell manager handle the slot handling.
            framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
                nSId,
                rReq);
			rReq.Ignore ();
            break;

        case SID_MASTERPAGE:          // BASIC
        case SID_SLIDE_MASTERPAGE:    // BASIC
        case SID_TITLE_MASTERPAGE:    // BASIC
        case SID_NOTES_MASTERPAGE:    // BASIC
        case SID_HANDOUT_MASTERPAGE:  // BASIC
		{
			// AutoLayouts muessen fertig sein
			GetDoc()->StopWorkStartupDelay();

			const SfxItemSet* pReqArgs = rReq.GetArgs();

			if ( pReqArgs )
			{
				SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_MASTERPAGE, sal_False);
				mbIsLayerModeActive = pIsActive->GetValue ();
			}

            Broadcast (
                ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));

            if (nSId == SID_MASTERPAGE                                       ||
                (nSId == SID_SLIDE_MASTERPAGE   && mePageKind == PK_STANDARD) ||
                (nSId == SID_TITLE_MASTERPAGE   && mePageKind == PK_STANDARD) ||
                (nSId == SID_NOTES_MASTERPAGE   && mePageKind == PK_NOTES)    ||
                (nSId == SID_HANDOUT_MASTERPAGE && mePageKind == PK_HANDOUT))
            {
                if (nSId == SID_TITLE_MASTERPAGE ||
					nSId == SID_SLIDE_MASTERPAGE)
                {
                    // Gibt es eine Seite mit dem AutoLayout "Titel"?
                    sal_Bool bFound = sal_False;
                    sal_uInt16 i = 0;
                    sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);

                    while (i < nCount && !bFound)
                    {
                        SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);

                        if (nSId == SID_TITLE_MASTERPAGE && pPage->GetAutoLayout() == AUTOLAYOUT_TITLE)
                        {
                            bFound = sal_True;
                            SwitchPage((pPage->GetPageNum() - 1) / 2);
                        }
                        else if (nSId == SID_SLIDE_MASTERPAGE && pPage->GetAutoLayout() != AUTOLAYOUT_TITLE)
                        {
                            bFound = sal_True;
                            SwitchPage((pPage->GetPageNum() - 1) / 2);
                        }

                        i++;
                    }
                }

                // Default-Layer der MasterPage einschalten
                mpDrawView->SetActiveLayer( String( SdResId(STR_LAYER_BCKGRNDOBJ) ) );

                ChangeEditMode(EM_MASTERPAGE, mbIsLayerModeActive);

                if(HasCurrentFunction(SID_BEZIER_EDIT))
					GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
            }
            else
            {
                // Switch to requested ViewShell.
                ::OUString sRequestedView;
                PageKind ePageKind;
                switch (nSId)
                {
                    case SID_SLIDE_MASTERPAGE:
                    case SID_TITLE_MASTERPAGE:
                    default:
                        sRequestedView = framework::FrameworkHelper::msImpressViewURL;
                        ePageKind = PK_STANDARD;
                        break;

                    case SID_NOTES_MASTERPAGE:
                        sRequestedView = framework::FrameworkHelper::msNotesViewURL;
                        ePageKind = PK_NOTES;
                        break;

                    case SID_HANDOUT_MASTERPAGE:
                        sRequestedView = framework::FrameworkHelper::msHandoutViewURL;
                        ePageKind = PK_HANDOUT;
                        break;
                }

                mpFrameView->SetViewShEditMode(EM_MASTERPAGE, ePageKind);
                mpFrameView->SetLayerMode(mbIsLayerModeActive);
                framework::FrameworkHelper::Instance(GetViewShellBase())->RequestView(
                    sRequestedView,
                    framework::FrameworkHelper::msCenterPaneURL);
            }
            Broadcast (
                ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));

			InvalidateWindows();
			Invalidate();

			rReq.Done();
		}
		break;


        case SID_CLOSE_MASTER_VIEW:
        {
            Broadcast (
                ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));

            // Switch page back to the first one.  Not doing so leads to a
            // crash.  This seems to be some bug in the edit mode switching
            // and page switching methods.
			SwitchPage (0);
            ChangeEditMode(EM_PAGE, IsLayerModeActive());
            Broadcast (
                ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));

            if(HasCurrentFunction(SID_BEZIER_EDIT))
            {
                GetViewFrame()->GetDispatcher()->Execute(
                    SID_OBJECT_SELECT,
                    SFX_CALLMODE_ASYNCHRON);
            }


			rReq.Done();
        }
        break;


		case SID_RULER:
        {
			const SfxItemSet* pReqArgs = rReq.GetArgs();

			// #97516# Remember old ruler state
			sal_Bool bOldHasRuler(HasRuler());

			if ( pReqArgs )
			{
				SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_RULER, sal_False);
				SetRuler (pIsActive->GetValue ());
			}
			else SetRuler (!HasRuler());

			// #97516# Did ruler state change? Tell that to SdOptions, too.
			sal_Bool bHasRuler(HasRuler());

			if(bOldHasRuler != bHasRuler)
			{
				SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());

				if(pOptions && pOptions->IsRulerVisible() != bHasRuler)
				{
					pOptions->SetRulerVisible(bHasRuler);
				}
			}

            Invalidate (SID_RULER);
            Resize();
            rReq.Done ();
        }
        break;

		case SID_SIZE_PAGE:
		case SID_SIZE_PAGE_WIDTH:  // BASIC
		{
			mbZoomOnPage = ( rReq.GetSlot() == SID_SIZE_PAGE );

			SdrPageView* pPageView = mpDrawView->GetSdrPageView();

			if ( pPageView )
			{
				Point aPagePos(0, 0); // = pPageView->GetOffset();
				Size aPageSize = pPageView->GetPage()->GetSize();

				aPagePos.X() += aPageSize.Width()  / 2;
                aPageSize.Width() = (long) (aPageSize.Width() * 1.03);

                if( rReq.GetSlot() == SID_SIZE_PAGE )
				{
					aPagePos.Y() += aPageSize.Height() / 2;
                    aPageSize.Height() = (long) (aPageSize.Height() * 1.03);
					aPagePos.Y() -= aPageSize.Height() / 2;
				}
				else
				{
					Point aPt = GetActiveWindow()->PixelToLogic( Point( 0, GetActiveWindow()->GetSizePixel().Height() / 2 ) );
					aPagePos.Y() += aPt.Y();
					aPageSize.Height() = 2;
				}

				aPagePos.X() -= aPageSize.Width()  / 2;

				SetZoomRect( Rectangle( aPagePos, aPageSize ) );

				Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
											  GetActiveWindow()->GetOutputSizePixel()) );
				mpZoomList->InsertZoomRect(aVisAreaWin);
			}
			Invalidate( SID_ZOOM_IN );
			Invalidate( SID_ZOOM_OUT );
			Invalidate( SID_ZOOM_PANNING );
			Invalidate( SID_ZOOM_TOOLBOX );
			rReq.Done ();
		}
		break;

		case SID_SIZE_REAL:  // BASIC
		{
			mbZoomOnPage = sal_False;
			SetZoom( 100 );
			Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
											  GetActiveWindow()->GetOutputSizePixel()) );
			mpZoomList->InsertZoomRect(aVisAreaWin);
			Invalidate( SID_ZOOM_IN );
			Invalidate( SID_ZOOM_OUT );
			Invalidate( SID_ZOOM_PANNING );
			Invalidate( SID_ZOOM_TOOLBOX );
			rReq.Done ();
		}
		break;

		case SID_ZOOM_IN:  // BASIC
		{
			mbZoomOnPage = sal_False;
			SetZoom( Max( (long) ( GetActiveWindow()->GetZoom() / 2 ), (long) GetActiveWindow()->GetMinZoom() ) );
			Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
											  GetActiveWindow()->GetOutputSizePixel()) );
			mpZoomList->InsertZoomRect(aVisAreaWin);
			Invalidate( SID_ZOOM_IN );
			Invalidate( SID_ZOOM_OUT );
			Invalidate( SID_ZOOM_PANNING );
			Invalidate( SID_ZOOM_TOOLBOX );
			rReq.Done ();
		}
		break;

		case SID_SIZE_VISAREA:
		{
			Rectangle aVisArea = mpFrameView->GetVisArea();
			Size aVisAreaSize = aVisArea.GetSize();

			if (aVisAreaSize.Height()!=0 && aVisAreaSize.Width()!=0)
			{
				mbZoomOnPage = sal_False;
				SetZoomRect(aVisArea);
				Invalidate( SID_ZOOM_IN );
				Invalidate( SID_ZOOM_OUT );
				Invalidate( SID_ZOOM_PANNING );
				Invalidate( SID_ZOOM_TOOLBOX );
			}
			rReq.Done ();
		}
		break;

		// Namensverwirrung: SID_SIZE_OPTIMAL -> Zoom auf selektierte Objekte
		// --> Wird als Objektzoom im Programm angeboten
		case SID_SIZE_OPTIMAL:	// BASIC
		{
			mbZoomOnPage = sal_False;
			if ( mpDrawView->AreObjectsMarked() )
			{
                maMarkRect = mpDrawView->GetAllMarkedRect();
                long nW = (long) (maMarkRect.GetWidth()  * 1.03);
                long nH = (long) (maMarkRect.GetHeight() * 1.03);
				Point aPos = maMarkRect.Center();
				aPos.X() -= nW / 2;
				aPos.Y() -= nH / 2;
				if ( nW && nH )
				{
					SetZoomRect(Rectangle(aPos, Size(nW, nH)));

					Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
											  GetActiveWindow()->GetOutputSizePixel()) );
					mpZoomList->InsertZoomRect(aVisAreaWin);
				}
			}
			Invalidate( SID_ZOOM_IN );
			Invalidate( SID_ZOOM_OUT );
			Invalidate( SID_ZOOM_PANNING );
			Invalidate( SID_ZOOM_TOOLBOX );
			rReq.Done ();
		}
		break;

		// Namensverwirrung: SID_SIZE_ALL -> Zoom auf alle Objekte
		// --> Wird als Optimal im Programm angeboten
		case SID_SIZE_ALL:	// BASIC
		{
			mbZoomOnPage = sal_False;
			SdrPageView* pPageView = mpDrawView->GetSdrPageView();

			if( pPageView )
			{
				Rectangle aBoundRect( pPageView->GetObjList()->GetAllObjBoundRect() );

                long nW = (long) (aBoundRect.GetWidth() * 1.03);
                long nH = (long) (aBoundRect.GetHeight() * 1.03);
				Point aPos = aBoundRect.Center();
				aPos.X() -= nW / 2;
				aPos.Y() -= nH / 2;
				if ( nW && nH )
				{
					SetZoomRect( Rectangle( aPos, Size( nW, nH ) ) );

					Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
											  GetActiveWindow()->GetOutputSizePixel()) );
					mpZoomList->InsertZoomRect(aVisAreaWin);
				}

				Invalidate( SID_ZOOM_IN );
				Invalidate( SID_ZOOM_OUT );
				Invalidate( SID_ZOOM_PANNING );
				Invalidate( SID_ZOOM_TOOLBOX );
			}
			rReq.Done ();
		}
		break;

		case SID_ZOOM_PREV:
		{
			if (mpDrawView->IsTextEdit())
			{
				mpDrawView->SdrEndTextEdit();
			}

			if (mpZoomList->IsPreviousPossible())
			{
				// Vorheriges ZoomRect einstellen
				SetZoomRect(mpZoomList->GetPreviousZoomRect());
			}
			rReq.Done ();
			Invalidate( SID_ZOOM_TOOLBOX );
		}
		break;

		case SID_ZOOM_NEXT:
		{
			if (mpDrawView->IsTextEdit())
			{
				mpDrawView->SdrEndTextEdit();
			}

			if (mpZoomList->IsNextPossible())
			{
				// Naechstes ZoomRect einstellen
				SetZoomRect(mpZoomList->GetNextZoomRect());
			}
			rReq.Done ();
			Invalidate( SID_ZOOM_TOOLBOX );
		}
		break;

		case SID_GLUE_INSERT_POINT:
		case SID_GLUE_PERCENT:
		case SID_GLUE_ESCDIR:
		case SID_GLUE_ESCDIR_LEFT:
		case SID_GLUE_ESCDIR_RIGHT:
		case SID_GLUE_ESCDIR_TOP:
		case SID_GLUE_ESCDIR_BOTTOM:
		case SID_GLUE_HORZALIGN_CENTER:
		case SID_GLUE_HORZALIGN_LEFT:
		case SID_GLUE_HORZALIGN_RIGHT:
		case SID_GLUE_VERTALIGN_CENTER:
		case SID_GLUE_VERTALIGN_TOP:
		case SID_GLUE_VERTALIGN_BOTTOM:
		{
			FunctionReference xFunc( GetCurrentFunction() );
			FuEditGluePoints* pFunc = dynamic_cast< FuEditGluePoints* >( xFunc.get() );

			if(pFunc)
				pFunc->ReceiveRequest(rReq);

			rReq.Done();
		}
		break;

#ifdef DBG_UTIL
		case SID_SHOW_ITEMBROWSER:
		{
			mpDrawView->ShowItemBrowser( !mpDrawView->IsItemBrowserVisible() );
			rReq.Done ();
		}
		break;
#endif

        case SID_AUTOSPELL_CHECK:
		{
            sal_Bool bOnlineSpell = !GetDoc()->GetOnlineSpell();
            GetDoc()->SetOnlineSpell(bOnlineSpell);

            ::Outliner* pOL = mpDrawView->GetTextEditOutliner();

            if (pOL)
            {
                sal_uLong nCntrl = pOL->GetControlWord();

                if (bOnlineSpell)
                    nCntrl |= EE_CNTRL_ONLINESPELLING;
                else
                    nCntrl &= ~EE_CNTRL_ONLINESPELLING;

                pOL->SetControlWord(nCntrl);
            }

            GetActiveWindow()->Invalidate();
			rReq.Done ();
		}
		break;

        case SID_CONVERT_TO_1BIT_THRESHOLD:
        case SID_CONVERT_TO_1BIT_MATRIX:
        case SID_CONVERT_TO_4BIT_GRAYS:
        case SID_CONVERT_TO_4BIT_COLORS:
        case SID_CONVERT_TO_8BIT_GRAYS:
        case SID_CONVERT_TO_8BIT_COLORS:
        case SID_CONVERT_TO_24BIT:
        {
            BmpConversion eBmpConvert = BMP_CONVERSION_NONE;

            switch( nSId )
            {
                case SID_CONVERT_TO_1BIT_THRESHOLD:
                    eBmpConvert = BMP_CONVERSION_1BIT_THRESHOLD;
                    break;

                case SID_CONVERT_TO_1BIT_MATRIX:
                    eBmpConvert = BMP_CONVERSION_1BIT_MATRIX;
                    break;

                case SID_CONVERT_TO_4BIT_GRAYS:
                    eBmpConvert = BMP_CONVERSION_4BIT_GREYS;
                    break;

                case SID_CONVERT_TO_4BIT_COLORS:
                    eBmpConvert = BMP_CONVERSION_4BIT_COLORS;
                    break;

                case SID_CONVERT_TO_8BIT_GRAYS:
                    eBmpConvert = BMP_CONVERSION_8BIT_GREYS;
                    break;

                case SID_CONVERT_TO_8BIT_COLORS:
                    eBmpConvert = BMP_CONVERSION_8BIT_COLORS;
                    break;

                case SID_CONVERT_TO_24BIT:
                    eBmpConvert = BMP_CONVERSION_24BIT;
                    break;
            }

            mpDrawView->BegUndo(String(SdResId(STR_UNDO_COLORRESOLUTION)));
            const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();

            for (sal_uLong i=0; i<rMarkList.GetMarkCount(); i++)
            {
                SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();

                if (pObj->GetObjInventor() == SdrInventor)
                {
                    if (pObj->GetObjIdentifier() == OBJ_GRAF && !((SdrGrafObj*) pObj)->IsLinkedGraphic())
                    {
                        const Graphic& rGraphic = ((SdrGrafObj*) pObj)->GetGraphic();

                        if( rGraphic.GetType() == GRAPHIC_BITMAP )
                        {
                            SdrGrafObj*	pNewObj = (SdrGrafObj*) pObj->Clone();

							if( rGraphic.IsAnimated() )
							{
								Animation aAnim( rGraphic.GetAnimation() );
								aAnim.Convert( eBmpConvert );
	                            pNewObj->SetGraphic( aAnim );
							}
							else
							{
								BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
								aBmpEx.Convert( eBmpConvert );
	                            pNewObj->SetGraphic( aBmpEx );
							}

                            mpDrawView->ReplaceObjectAtView( pObj, *mpDrawView->GetSdrPageView(), pNewObj );
                        }
                    }
                }
            }

            mpDrawView->EndUndo();
			rReq.Done ();
		}
		break;

        case SID_TRANSLITERATE_SENTENCE_CASE:
        case SID_TRANSLITERATE_TITLE_CASE:
        case SID_TRANSLITERATE_TOGGLE_CASE:
		case SID_TRANSLITERATE_UPPER:
		case SID_TRANSLITERATE_LOWER:
		case SID_TRANSLITERATE_HALFWIDTH:
		case SID_TRANSLITERATE_FULLWIDTH:
		case SID_TRANSLITERATE_HIRAGANA:
		case SID_TRANSLITERATE_KATAGANA:
		{
			OutlinerView* pOLV = GetView()->GetTextEditOutlinerView();
			if( pOLV )
			{
				using namespace ::com::sun::star::i18n;
				sal_Int32 nType = 0;

				switch( nSId )
				{
                    case SID_TRANSLITERATE_SENTENCE_CASE:
                        nType = TransliterationModulesExtra::SENTENCE_CASE;
                        break;
                    case SID_TRANSLITERATE_TITLE_CASE:
                        nType = TransliterationModulesExtra::TITLE_CASE;
                        break;
                    case SID_TRANSLITERATE_TOGGLE_CASE:
                        nType = TransliterationModulesExtra::TOGGLE_CASE;
                        break;
					case SID_TRANSLITERATE_UPPER:
						nType = TransliterationModules_LOWERCASE_UPPERCASE;
						break;
					case SID_TRANSLITERATE_LOWER:
						nType = TransliterationModules_UPPERCASE_LOWERCASE;
						break;
					case SID_TRANSLITERATE_HALFWIDTH:
						nType = TransliterationModules_FULLWIDTH_HALFWIDTH;
						break;
					case SID_TRANSLITERATE_FULLWIDTH:
						nType = TransliterationModules_HALFWIDTH_FULLWIDTH;
						break;
					case SID_TRANSLITERATE_HIRAGANA:
						nType = TransliterationModules_KATAKANA_HIRAGANA;
						break;
					case SID_TRANSLITERATE_KATAGANA:
						nType = TransliterationModules_HIRAGANA_KATAKANA;
						break;
				}

				pOLV->TransliterateText( nType );
			}

			rReq.Done();
		}
		break;

		// #UndoRedo#
		case SID_UNDO :
		{
			// #96090# moved implementation to BaseClass
			ImpSidUndo(sal_True, rReq);
		}
		break;
		case SID_REDO :
		{
			// #96090# moved implementation to BaseClass
			ImpSidRedo(sal_True, rReq);
		}
		break;

        default:
		break;
	}
}

/*************************************************************************
|*
|* URL-Feld einfuegen
|*
\************************************************************************/

void DrawViewShell::InsertURLField(const String& rURL, const String& rText,
									 const String& rTarget, const Point* pPos)
{
    OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();

    if (pOLV)
	{
        ESelection aSel( pOLV->GetSelection() );
        SvxFieldItem aURLItem( SvxURLField( rURL, rText, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
        pOLV->InsertField( aURLItem );
        if ( aSel.nStartPos <= aSel.nEndPos )
		    aSel.nEndPos = aSel.nStartPos + 1;
        else
            aSel.nStartPos = aSel.nEndPos + 1;
        pOLV->SetSelection( aSel );
	}
	else
	{
		Outliner* pOutl = GetDoc()->GetInternalOutliner();
		pOutl->Init( OUTLINERMODE_TEXTOBJECT );
		sal_uInt16 nOutlMode = pOutl->GetMode();

		SvxURLField aURLField(rURL, rText, SVXURLFORMAT_REPR);
		aURLField.SetTargetFrame(rTarget);
        SvxFieldItem aURLItem(aURLField, EE_FEATURE_FIELD);
		pOutl->QuickInsertField( aURLItem, ESelection() );
		OutlinerParaObject* pOutlParaObject = pOutl->CreateParaObject();

		SdrRectObj* pRectObj = new SdrRectObj(OBJ_TEXT);

		pOutl->UpdateFields();
		pOutl->SetUpdateMode( sal_True );
		Size aSize(pOutl->CalcTextSize());
		pOutl->SetUpdateMode( sal_False );

		Point aPos;

		if (pPos)
		{
			aPos = *pPos;
		}
		else
		{
			Rectangle aRect(aPos, GetActiveWindow()->GetOutputSizePixel() );
			aPos = aRect.Center();
			aPos = GetActiveWindow()->PixelToLogic(aPos);
			aPos.X() -= aSize.Width() / 2;
			aPos.Y() -= aSize.Height() / 2;
		}

		Rectangle aLogicRect(aPos, aSize);
		pRectObj->SetLogicRect(aLogicRect);
		pRectObj->SetOutlinerParaObject( pOutlParaObject );
		mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView());
		pOutl->Init( nOutlMode );
	}
}

/*************************************************************************
|*
|* URL-Button einfuegen
|*
\************************************************************************/

void DrawViewShell::InsertURLButton(const String& rURL, const String& rText,
									  const String& rTarget, const Point* pPos)
{
    sal_Bool bNewObj = sal_True;

    const OUString sTargetURL( ::URIHelper::SmartRel2Abs( INetURLObject( GetDocSh()->GetMedium()->GetBaseURL() ), rURL, URIHelper::GetMaybeFileHdl(), true, false,
																INetURLObject::WAS_ENCODED,
																INetURLObject::DECODE_UNAMBIGUOUS ) );
    if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0)
    {
        SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
        if( pMarkedObj ) try
        {
            // change first marked object
            if( (FmFormInventor == pMarkedObj->GetObjInventor() && pMarkedObj->GetObjIdentifier() == OBJ_FM_BUTTON) )
            {
                bNewObj = sal_False;

	            SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pMarkedObj );

                Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), UNO_QUERY_THROW );
			    Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY_THROW );

                xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) );
                xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) );

			    if( rTarget.Len() )
                    xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) );

                xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any( form::FormButtonType_URL ) );
			    if ( ::avmedia::MediaWindow::isMediaURL( rURL ) )
			    {
				    // #105638# OJ
                    xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) );
			    }
            }
            else
            {
                // add url as interaction for first selected shape
                bNewObj = sal_False;

                SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj, true);
                pInfo->meClickAction = presentation::ClickAction_DOCUMENT;
                pInfo->SetBookmark( sTargetURL );
            }
        }
        catch( uno::Exception& )
        {
        }
    }

    if (bNewObj) try
    {
        SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( SdrObjFactory::MakeNewObject(FmFormInventor, OBJ_FM_BUTTON,
                                mpDrawView->GetSdrPageView()->GetPage(), GetDoc()) );

        Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_QUERY_THROW );
		Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW );

        xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) );
		xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) );

		if( rTarget.Len() )
			xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) );

		xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any(  form::FormButtonType_URL ) );
		// #105638# OJ
		if ( ::avmedia::MediaWindow::isMediaURL( rURL ) )
			xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) );

        Point aPos;

        if (pPos)
        {
            aPos = *pPos;
        }
        else
        {
            aPos = Rectangle(aPos, GetActiveWindow()->GetOutputSizePixel()).Center();
            aPos = GetActiveWindow()->PixelToLogic(aPos);
        }

        Size aSize(4000, 1000);
        aPos.X() -= aSize.Width() / 2;
        aPos.Y() -= aSize.Height() / 2;
        pUnoCtrl->SetLogicRect(Rectangle(aPos, aSize));

        sal_uLong nOptions = SDRINSERT_SETDEFLAYER;

        OSL_ASSERT (GetViewShell()!=NULL);
        SfxInPlaceClient* pIpClient = GetViewShell()->GetIPClient();
        if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive())
        {
            nOptions |= SDRINSERT_DONTMARK;
        }

        mpDrawView->InsertObjectAtView(pUnoCtrl, *mpDrawView->GetSdrPageView(), nOptions);
    }
    catch( Exception& )
    {
    }
}

/*************************************************************************
|*
|*
|*
\************************************************************************/

void DrawViewShell::ShowUIControls (bool bVisible)
{
    ViewShell::ShowUIControls (bVisible);

    //AF: The LayerDialogChildWindow is not used anymore (I hope).
    //    GetViewFrame()->SetChildWindow(
    //        LayerDialogChildWindow::GetChildWindowId(),
    //        IsLayerModeActive() && bVisible);
    maTabControl.Show (bVisible);
}

void DrawViewShell::StopSlideShow (bool /*bCloseFrame*/)
{
	Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
    if(xPresentation.is() && xPresentation->isRunning())
    {
        if( mpDrawView->IsTextEdit() )
            mpDrawView->SdrEndTextEdit();

		xPresentation->end();
    }
}

#ifdef _MSC_VER
#pragma optimize ( "", on )
#endif

} // end of namespace sd
