diff options
Diffstat (limited to 'sc/source/ui/view/tabvwsh2.cxx')
-rw-r--r-- | sc/source/ui/view/tabvwsh2.cxx | 481 |
1 files changed, 481 insertions, 0 deletions
diff --git a/sc/source/ui/view/tabvwsh2.cxx b/sc/source/ui/view/tabvwsh2.cxx new file mode 100644 index 000000000000..ca47535ad2cf --- /dev/null +++ b/sc/source/ui/view/tabvwsh2.cxx @@ -0,0 +1,481 @@ +/************************************************************************* + * + * 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_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- + +#ifdef _MSC_VER +#pragma optimize ("", off) +#endif + +#include <sfx2/bindings.hxx> +#include <sfx2/viewfrm.hxx> +#include <svl/aeitem.hxx> +#include <svl/whiter.hxx> +#include <unotools/moduleoptions.hxx> +#include <svl/languageoptions.hxx> +#include <sfx2/dispatch.hxx> + +#include "tabvwsh.hxx" +#include "drawattr.hxx" +#include "drawsh.hxx" +#include "drawview.hxx" +#include "fupoor.hxx" +#include "fuconrec.hxx" +#include "fuconpol.hxx" +#include "fuconarc.hxx" +#include "fuconuno.hxx" +#include "fusel.hxx" +#include "futext.hxx" +#include "fumark.hxx" +#include "fuinsert.hxx" +#include "global.hxx" +#include "sc.hrc" +#include "scmod.hxx" +#include "appoptio.hxx" + +// #98185# Create default drawing objects via keyboard +#include <svx/svdpagv.hxx> +#include <svl/stritem.hxx> +#include <svx/svdpage.hxx> +#include <fuconcustomshape.hxx> + +// ----------------------------------------------------------------------- + +SdrView* __EXPORT ScTabViewShell::GetDrawView() const +{ + return ((ScTabViewShell*)this)->GetScDrawView(); // GetScDrawView ist nicht-const +} + +void ScTabViewShell::WindowChanged() +{ + Window* pWin = GetActiveWin(); + + ScDrawView* pDrView = GetScDrawView(); + if (pDrView) + pDrView->SetActualWin(pWin); + + FuPoor* pFunc = GetDrawFuncPtr(); + if (pFunc) + pFunc->SetWindow(pWin); + + // when font from InputContext is used, + // this must be moved to change of cursor position: + UpdateInputContext(); +} + +void ScTabViewShell::ExecDraw(SfxRequest& rReq) +{ + SC_MOD()->InputEnterHandler(); + UpdateInputHandler(); + + MakeDrawLayer(); + + ScTabView* pTabView = GetViewData()->GetView(); + SfxBindings& rBindings = GetViewFrame()->GetBindings(); + + Window* pWin = pTabView->GetActiveWin(); + ScDrawView* pView = pTabView->GetScDrawView(); + SdrModel* pDoc = pView->GetModel(); + + const SfxItemSet *pArgs = rReq.GetArgs(); + USHORT nNewId = rReq.GetSlot(); + + if ( nNewId == SID_DRAW_CHART ) + { + // #i71254# directly insert a chart instead of drawing its output rectangle + FuInsertChart(this, pWin, pView, pDoc, rReq); + return; + } + + // + // Pseudo-Slots von Draw-Toolbox auswerten + //! wird das ueberhaupt noch gebraucht ????? + // + + if (nNewId == SID_INSERT_DRAW && pArgs) + { + const SfxPoolItem* pItem; + if ( pArgs->GetItemState( SID_INSERT_DRAW, TRUE, &pItem ) == SFX_ITEM_SET && + pItem->ISA( SvxDrawToolItem ) ) + { + SvxDrawToolEnum eSel = (SvxDrawToolEnum)((const SvxDrawToolItem*)pItem)->GetValue(); + switch (eSel) + { + case SVX_SNAP_DRAW_SELECT: nNewId = SID_OBJECT_SELECT; break; + case SVX_SNAP_DRAW_LINE: nNewId = SID_DRAW_LINE; break; + case SVX_SNAP_DRAW_RECT: nNewId = SID_DRAW_RECT; break; + case SVX_SNAP_DRAW_ELLIPSE: nNewId = SID_DRAW_ELLIPSE; break; + case SVX_SNAP_DRAW_POLYGON_NOFILL: nNewId = SID_DRAW_POLYGON_NOFILL; break; + case SVX_SNAP_DRAW_BEZIER_NOFILL: nNewId = SID_DRAW_BEZIER_NOFILL; break; + case SVX_SNAP_DRAW_FREELINE_NOFILL: nNewId = SID_DRAW_FREELINE_NOFILL; break; + case SVX_SNAP_DRAW_ARC: nNewId = SID_DRAW_ARC; break; + case SVX_SNAP_DRAW_PIE: nNewId = SID_DRAW_PIE; break; + case SVX_SNAP_DRAW_CIRCLECUT: nNewId = SID_DRAW_CIRCLECUT; break; + case SVX_SNAP_DRAW_TEXT: nNewId = SID_DRAW_TEXT; break; + case SVX_SNAP_DRAW_TEXT_VERTICAL: nNewId = SID_DRAW_TEXT_VERTICAL; break; + case SVX_SNAP_DRAW_TEXT_MARQUEE: nNewId = SID_DRAW_TEXT_MARQUEE; break; + case SVX_SNAP_DRAW_CAPTION: nNewId = SID_DRAW_CAPTION; break; + case SVX_SNAP_DRAW_CAPTION_VERTICAL: nNewId = SID_DRAW_CAPTION_VERTICAL; break; + } + } + else // USHORT-Item vom Controller + { + rReq.Done(); + return; + } + } + + if ( nNewId == SID_DRAW_SELECT ) + nNewId = SID_OBJECT_SELECT; + + USHORT nNewFormId = 0; + if ( nNewId == SID_FM_CREATE_CONTROL && pArgs ) + { + const SfxPoolItem* pItem; + if ( pArgs->GetItemState( SID_FM_CONTROL_IDENTIFIER, TRUE, &pItem ) == SFX_ITEM_SET && + pItem->ISA( SfxUInt16Item ) ) + nNewFormId = ((const SfxUInt16Item*)pItem)->GetValue(); + } + + String sStringItemValue; + if ( pArgs ) + { + const SfxPoolItem* pItem; + if ( pArgs->GetItemState( nNewId, TRUE, &pItem ) == SFX_ITEM_SET && pItem->ISA( SfxStringItem ) ) + sStringItemValue = static_cast<const SfxStringItem*>(pItem)->GetValue(); + } + bool bSwitchCustom = ( sStringItemValue.Len() && sDrawCustom.Len() && sStringItemValue != sDrawCustom ); + + if (nNewId == SID_INSERT_FRAME) // vom Tbx-Button + nNewId = SID_DRAW_TEXT; + + // #97016# CTRL-SID_OBJECT_SELECT is used to select the first object, + // but not if SID_OBJECT_SELECT is the result of clicking a create function again, + // so this must be tested before changing nNewId below. + BOOL bSelectFirst = ( nNewId == SID_OBJECT_SELECT && (rReq.GetModifier() & KEY_MOD1) ); + + BOOL bEx = IsDrawSelMode(); + if ( rReq.GetModifier() & KEY_MOD1 ) + { + // #97016# always allow keyboard selection also on background layer + // #98185# also allow creation of default objects if the same object type + // was already active + bEx = TRUE; + } + else if ( nNewId == nDrawSfxId && ( nNewId != SID_FM_CREATE_CONTROL || + nNewFormId == nFormSfxId || nNewFormId == 0 ) && !bSwitchCustom ) + { + // #i52871# if a different custom shape is selected, the slot id can be the same, + // so the custom shape type string has to be compared, too. + + // SID_FM_CREATE_CONTROL mit nNewFormId==0 (ohne Parameter) kommt beim Deaktivieren + // aus FuConstruct::SimpleMouseButtonUp + // #59280# Execute fuer die Form-Shell, um im Controller zu deselektieren + if ( nNewId == SID_FM_CREATE_CONTROL ) + { + GetViewData()->GetDispatcher().Execute(SID_FM_LEAVE_CREATE); + GetViewFrame()->GetBindings().InvalidateAll(FALSE); + //! was fuer einen Slot braucht der komische Controller wirklich, um das anzuzeigen???? + } + + bEx = !bEx; + nNewId = SID_OBJECT_SELECT; + } + else + bEx = TRUE; + + if ( nDrawSfxId == SID_FM_CREATE_CONTROL && nNewId != nDrawSfxId ) + { + // Wechsel von Control- zu Zeichenfunktion -> im Control-Controller deselektieren + GetViewData()->GetDispatcher().Execute(SID_FM_LEAVE_CREATE); + GetViewFrame()->GetBindings().InvalidateAll(FALSE); + //! was fuer einen Slot braucht der komische Controller wirklich, um das anzuzeigen???? + } + + SetDrawSelMode(bEx); + + pView->LockBackgroundLayer( !bEx ); + + if ( bSelectFirst ) + { + // #97016# select first draw object if none is selected yet + if(!pView->AreObjectsMarked()) + { + // select first object + pView->UnmarkAllObj(); + pView->MarkNextObj(TRUE); + + // ...and make it visible + if(pView->AreObjectsMarked()) + pView->MakeVisible(pView->GetAllMarkedRect(), *pWin); + } + } + + nDrawSfxId = nNewId; + sDrawCustom.Erase(); // value is set below for custom shapes + + if ( nNewId != SID_DRAW_CHART ) // Chart nicht mit DrawShell + { + if ( nNewId == SID_DRAW_TEXT || nNewId == SID_DRAW_TEXT_VERTICAL || + nNewId == SID_DRAW_TEXT_MARQUEE || nNewId == SID_DRAW_NOTEEDIT ) + SetDrawTextShell( TRUE ); + else + { + if ( bEx || pView->GetMarkedObjectList().GetMarkCount() != 0 ) + SetDrawShellOrSub(); + else + SetDrawShell( FALSE ); + } + } + + if (pTabView->GetDrawFuncPtr()) + { + if (pTabView->GetDrawFuncOldPtr() != pTabView->GetDrawFuncPtr()) + delete pTabView->GetDrawFuncOldPtr(); + + pTabView->GetDrawFuncPtr()->Deactivate(); + pTabView->SetDrawFuncOldPtr(pTabView->GetDrawFuncPtr()); + pTabView->SetDrawFuncPtr(NULL); + } + + SfxRequest aNewReq(rReq); + aNewReq.SetSlot(nDrawSfxId); + + switch (nNewId) + { + case SID_OBJECT_SELECT: + //@#70206# Nicht immer zurueckschalten + if(pView->GetMarkedObjectList().GetMarkCount() == 0) SetDrawShell(bEx); + pTabView->SetDrawFuncPtr(new FuSelection(this, pWin, pView, pDoc, aNewReq)); + break; + + case SID_DRAW_LINE: + case SID_DRAW_RECT: + case SID_DRAW_ELLIPSE: + pTabView->SetDrawFuncPtr(new FuConstRectangle(this, pWin, pView, pDoc, aNewReq)); + break; + + case SID_DRAW_CAPTION: + case SID_DRAW_CAPTION_VERTICAL: + pTabView->SetDrawFuncPtr(new FuConstRectangle(this, pWin, pView, pDoc, aNewReq)); + pView->SetFrameDragSingles( FALSE ); + rBindings.Invalidate( SID_BEZIER_EDIT ); + break; + + case SID_DRAW_POLYGON: + case SID_DRAW_POLYGON_NOFILL: + case SID_DRAW_BEZIER_NOFILL: + case SID_DRAW_FREELINE_NOFILL: + pTabView->SetDrawFuncPtr(new FuConstPolygon(this, pWin, pView, pDoc, aNewReq)); + break; + + case SID_DRAW_ARC: + case SID_DRAW_PIE: + case SID_DRAW_CIRCLECUT: + pTabView->SetDrawFuncPtr(new FuConstArc(this, pWin, pView, pDoc, aNewReq)); + break; + + case SID_DRAW_TEXT: + case SID_DRAW_TEXT_VERTICAL: + case SID_DRAW_TEXT_MARQUEE: + case SID_DRAW_NOTEEDIT: + pTabView->SetDrawFuncPtr(new FuText(this, pWin, pView, pDoc, aNewReq)); + break; + + case SID_FM_CREATE_CONTROL: + SetDrawFormShell(TRUE); + pTabView->SetDrawFuncPtr(new FuConstUnoControl(this, pWin, pView, pDoc, aNewReq)); + nFormSfxId = nNewFormId; + break; + + case SID_DRAW_CHART: +//UNUSED2008-05 bChartDlgIsEdit = FALSE; + pTabView->SetDrawFuncPtr(new FuMarkRect(this, pWin, pView, pDoc, aNewReq)); + 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 : + { + pTabView->SetDrawFuncPtr( new FuConstCustomShape( this, pWin, pView, pDoc, aNewReq )); + if ( nNewId != SID_DRAW_CS_ID ) + { + SFX_REQUEST_ARG( rReq, pEnumCommand, SfxStringItem, nNewId, sal_False ); + if ( pEnumCommand ) + { + aCurrShapeEnumCommand[ nNewId - SID_DRAWTBX_CS_BASIC ] = pEnumCommand->GetValue(); + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate( nNewId ); + rBind.Update( nNewId ); + + sDrawCustom = pEnumCommand->GetValue(); // to detect when a different shape type is selected + } + } + } + break; + + default: + break; + } + + if (pTabView->GetDrawFuncPtr()) + pTabView->GetDrawFuncPtr()->Activate(); + + rReq.Done(); + + rBindings.Invalidate( SID_INSERT_DRAW ); + rBindings.Update( SID_INSERT_DRAW ); + + // #98185# Create default drawing objects via keyboard + // with qualifier construct directly + FuPoor* pFuActual = GetDrawFuncPtr(); + + if(pFuActual && (rReq.GetModifier() & KEY_MOD1)) + { + // #98185# Create default drawing objects via keyboard + const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions(); + sal_uInt32 nDefaultObjectSizeWidth = rAppOpt.GetDefaultObjectSizeWidth(); + sal_uInt32 nDefaultObjectSizeHeight = rAppOpt.GetDefaultObjectSizeHeight(); + + // calc position and size + Rectangle aVisArea = pWin->PixelToLogic(Rectangle(Point(0,0), pWin->GetOutputSizePixel())); + Point aPagePos = aVisArea.Center(); + aPagePos.X() -= nDefaultObjectSizeWidth / 2; + aPagePos.Y() -= nDefaultObjectSizeHeight / 2; + Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight)); + + ScDrawView* pDrView = GetScDrawView(); + + if(pDrView) + { + SdrPageView* pPageView = pDrView->GetSdrPageView(); + + if(pPageView) + { + // create the default object + SdrObject* pObj = pFuActual->CreateDefaultObject(nNewId, aNewObjectRectangle); + + if(pObj) + { + // insert into page + pView->InsertObjectAtView(pObj, *pPageView); + + if ( nNewId == SID_DRAW_CAPTION || nNewId == SID_DRAW_CAPTION_VERTICAL ) + { + // #105815# use KeyInput to start edit mode (FuText is created). + // For FuText objects, edit mode is handled within CreateDefaultObject. + // KEY_F2 is handled in FuDraw::KeyInput. + + pFuActual->KeyInput( KeyEvent( 0, KeyCode( KEY_F2 ) ) ); + } + } + } + } + } +} + +void ScTabViewShell::GetDrawState(SfxItemSet &rSet) +{ + SfxWhichIter aIter(rSet); + USHORT nWhich = aIter.FirstWhich(); + + while ( nWhich ) + { + switch ( nWhich ) + { + case SID_INSERT_DRAW: + { + // SID_OBJECT_SELECT nur, wenn "harter" Selektionsmodus + USHORT nPutId = nDrawSfxId; + if ( nPutId == SID_OBJECT_SELECT && !IsDrawSelMode() ) + nPutId = USHRT_MAX; + // nur die Images, die auch auf dem Controller liegen + if ( nPutId != SID_OBJECT_SELECT && + nPutId != SID_DRAW_LINE && + nPutId != SID_DRAW_RECT && + nPutId != SID_DRAW_ELLIPSE && + nPutId != SID_DRAW_POLYGON_NOFILL && + nPutId != SID_DRAW_BEZIER_NOFILL && + nPutId != SID_DRAW_FREELINE_NOFILL && + nPutId != SID_DRAW_ARC && + nPutId != SID_DRAW_PIE && + nPutId != SID_DRAW_CIRCLECUT && + nPutId != SID_DRAW_TEXT && + nPutId != SID_DRAW_TEXT_VERTICAL && + nPutId != SID_DRAW_TEXT_MARQUEE && + nPutId != SID_DRAW_CAPTION && + nPutId != SID_DRAW_CAPTION_VERTICAL ) + nPutId = USHRT_MAX; + SfxAllEnumItem aItem( nWhich, nPutId ); + if ( !SvtLanguageOptions().IsVerticalTextEnabled() ) + { + aItem.DisableValue( SID_DRAW_TEXT_VERTICAL ); + aItem.DisableValue( SID_DRAW_CAPTION_VERTICAL ); + } + rSet.Put( aItem ); + } + break; + + case SID_DRAW_CHART: + { + BOOL bOle = GetViewFrame()->GetFrame().IsInPlace(); + if ( bOle || !SvtModuleOptions().IsChart() ) + rSet.DisableItem( nWhich ); + } + break; + + case SID_OBJECT_SELECT: // wichtig fuer den ollen Control-Controller + rSet.Put( SfxBoolItem( nWhich, nDrawSfxId == SID_OBJECT_SELECT && IsDrawSelMode() ) ); + break; + } + nWhich = aIter.NextWhich(); + } +} + +BOOL ScTabViewShell::SelectObject( const String& rName ) +{ + ScDrawView* pView = GetViewData()->GetScDrawView(); + if (!pView) + return FALSE; + + BOOL bFound = pView->SelectObject( rName ); + // DrawShell etc. is handled in MarkListHasChanged + + return bFound; +} + + + |