/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: drviewsf.cxx,v $ * $Revision: 1.24 $ * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" #include "DrawViewShell.hxx" #include #include #ifndef _SVXIDS_HRC #include #endif #ifndef _GLOBL3D_HXX #include #endif #include #include #ifndef _FLDITEM_HXX #include #endif #include #include #include #include #include #ifndef _BINDING_HXX //autogen #include #endif #include #include #include #include #include #include #include #include #include #include #ifndef SD_FRAME_VIEW #include "FrameView.hxx" #endif #include "Outliner.hxx" #include "app.hrc" #include "app.hxx" #include "stlsheet.hxx" #include "drawview.hxx" #include "drawdoc.hxx" #include "Window.hxx" #include "ViewShellBase.hxx" #include "FormShellManager.hxx" #include "cfgids.hxx" #include "anminfo.hxx" using ::rtl::OUString; using namespace ::com::sun::star; namespace sd { /************************************************************************* |* |* Status von Controller-SfxSlots setzen |* \************************************************************************/ void DrawViewShell::GetCtrlState(SfxItemSet &rSet) { if (rSet.GetItemState(SID_RELOAD) != SFX_ITEM_UNKNOWN) { // "Letzte Version" vom SFx en/disablen lassen GetViewFrame()->GetSlotState (SID_RELOAD, NULL, &rSet); } if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_HYPERLINK_GETLINK)) { SvxHyperlinkItem aHLinkItem; OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); if (pOLV) { bool bField = false; const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection(); if (pFieldItem) { ESelection aSel = pOLV->GetSelection(); if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 ) { const SvxFieldData* pField = pFieldItem->GetField(); if (pField->ISA(SvxURLField)) { aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation()); aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL()); aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame()); bField = true; } } } if (!bField) { // use selected text as name for urls String sReturn = pOLV->GetSelected(); sReturn.Erase(255); sReturn.EraseTrailingChars(); aHLinkItem.SetName(sReturn); } } else { if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0) { bool bFound = false; SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); if( pMarkedObj && (FmFormInventor == pMarkedObj->GetObjInventor()) ) { SdrUnoObj* pUnoCtrl = dynamic_cast< SdrUnoObj* >( pMarkedObj ); if(pUnoCtrl) try { uno::Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_QUERY_THROW ); uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW ); uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo(), uno::UNO_QUERY_THROW ); form::FormButtonType eButtonType = form::FormButtonType_URL; const OUString sButtonType( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" ) ); if(xPropInfo->hasPropertyByName( sButtonType ) && (xPropSet->getPropertyValue( sButtonType ) >>= eButtonType ) ) { OUString aString; // Label const OUString sLabel( RTL_CONSTASCII_USTRINGPARAM( "Label" ) ); if(xPropInfo->hasPropertyByName(sLabel)) { if( xPropSet->getPropertyValue(sLabel) >>= aString ) aHLinkItem.SetName(String( aString )); } // URL const OUString sTargetURL(RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )); if(xPropInfo->hasPropertyByName(sTargetURL)) { if( xPropSet->getPropertyValue(sTargetURL) >>= aString ) aHLinkItem.SetURL(String( aString )); } // Target const OUString sTargetFrame( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" ) ); if(xPropInfo->hasPropertyByName(sTargetFrame) ) { if( xPropSet->getPropertyValue(sTargetFrame) >>= aString ) aHLinkItem.SetTargetFrame(String( aString )); } aHLinkItem.SetInsertMode(HLINK_BUTTON); bFound = true; } } catch( uno::Exception& ) { } } // try interaction link if( !bFound && pMarkedObj ) { SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj); if( pInfo && (pInfo->meClickAction == presentation::ClickAction_DOCUMENT) ) aHLinkItem.SetURL( pInfo->GetBookmark()); aHLinkItem.SetInsertMode(HLINK_BUTTON); } } } rSet.Put(aHLinkItem); } rSet.Put( SfxBoolItem( SID_READONLY_MODE, mbReadOnly ) ); // Ausgabequalitaet if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_OUTPUT_QUALITY_COLOR ) || SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_OUTPUT_QUALITY_GRAYSCALE ) || SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_OUTPUT_QUALITY_BLACKWHITE ) || SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_OUTPUT_QUALITY_CONTRAST ) ) { const ULONG nMode = (sal_Int32)GetActiveWindow()->GetDrawMode(); rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_COLOR, (BOOL)((ULONG)OUTPUT_DRAWMODE_COLOR == nMode) ) ); rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_GRAYSCALE, (BOOL)((ULONG)OUTPUT_DRAWMODE_GRAYSCALE == nMode) ) ); rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_BLACKWHITE, (BOOL)((ULONG)OUTPUT_DRAWMODE_BLACKWHITE == nMode) ) ); rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_CONTRAST, (BOOL)((ULONG)OUTPUT_DRAWMODE_CONTRAST == nMode) ) ); } if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) ) { rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, TRUE ) ); } if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_ATTR_YEAR2000) ) { FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell(); if (pFormShell != NULL) { UINT16 nState = 0; if (pFormShell->GetY2KState(nState)) rSet.Put( SfxUInt16Item( SID_ATTR_YEAR2000, nState ) ); else rSet.DisableItem( SID_ATTR_YEAR2000 ); } } if ( !GetView()->GetTextEditOutliner() ) { SvtCJKOptions aCJKOptions; if( !aCJKOptions.IsChangeCaseMapEnabled() ) { GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_False ); } else { GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_True ); } rSet.DisableItem( SID_TRANSLITERATE_UPPER ); rSet.DisableItem( SID_TRANSLITERATE_LOWER ); rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH ); rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH ); rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA ); rSet.DisableItem( SID_TRANSLITERATE_KATAGANA ); } else { SvtCJKOptions aCJKOptions; if( !aCJKOptions.IsChangeCaseMapEnabled() ) { GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_False ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_False ); rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH ); rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH ); rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA ); rSet.DisableItem( SID_TRANSLITERATE_KATAGANA ); } else { GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_True ); GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_True ); } } } /************************************************************************* |* |* Status der Attribut-Items |* \************************************************************************/ void DrawViewShell::GetAttrState( SfxItemSet& rSet ) { SfxWhichIter aIter( rSet ); USHORT nWhich = aIter.FirstWhich(); BOOL bAttr = FALSE; SfxAllItemSet aAllSet( *rSet.GetPool() ); while ( nWhich ) { USHORT nSlotId = SfxItemPool::IsWhich(nWhich) ? GetPool().GetSlotId(nWhich) : nWhich; switch ( nSlotId ) { case SID_ATTR_FILL_STYLE: case SID_ATTR_FILL_COLOR: case SID_ATTR_FILL_GRADIENT: case SID_ATTR_FILL_HATCH: case SID_ATTR_FILL_BITMAP: case SID_ATTR_FILL_SHADOW: case SID_ATTR_LINE_STYLE: case SID_ATTR_LINE_DASH: case SID_ATTR_LINE_WIDTH: case SID_ATTR_LINE_COLOR: case SID_ATTR_TEXT_FITTOSIZE: { bAttr = TRUE; } break; case SID_HYPHENATION: { SfxItemSet aAttrs( GetDoc()->GetPool() ); mpDrawView->GetAttributes( aAttrs ); if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SFX_ITEM_AVAILABLE ) { BOOL bValue = ( (const SfxBoolItem&) aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue(); rSet.Put( SfxBoolItem( SID_HYPHENATION, bValue ) ); } } break; case SID_STYLE_FAMILY2: case SID_STYLE_FAMILY3: case SID_STYLE_FAMILY5: case SID_STYLE_APPLY: // StyleControl { SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet(); if( pStyleSheet ) { if( nSlotId != SID_STYLE_APPLY && !mpDrawView->AreObjectsMarked() ) { SfxTemplateItem aTmpItem( nWhich, String() ); aAllSet.Put( aTmpItem, aTmpItem.Which() ); } else { if (pStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE) pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet(); if( pStyleSheet ) { SfxStyleFamily eFamily = pStyleSheet->GetFamily(); if ((eFamily == SD_STYLE_FAMILY_GRAPHICS && nSlotId == SID_STYLE_FAMILY2) || (eFamily == SD_STYLE_FAMILY_CELL && nSlotId == SID_STYLE_FAMILY3) || (eFamily == SD_STYLE_FAMILY_PSEUDO && nSlotId == SID_STYLE_FAMILY5)) { SfxTemplateItem aTmpItem ( nWhich, pStyleSheet->GetName() ); aAllSet.Put( aTmpItem, aTmpItem.Which() ); } else { SfxTemplateItem aTmpItem(nWhich, String()); aAllSet.Put(aTmpItem,aTmpItem.Which() ); } } } } else { SfxTemplateItem aItem( nWhich, String() ); aAllSet.Put( aItem, aItem.Which() ); // rSet.DisableItem( nWhich ); } } break; case SID_SET_DEFAULT: { if( !mpDrawView->GetMarkedObjectList().GetMarkCount() || ( !mpDrawView->IsTextEdit() && !mpDrawView->GetStyleSheet() ) ) rSet.DisableItem( nWhich ); } break; case SID_STYLE_WATERCAN: { ISfxTemplateCommon* pTemplateCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings()); if (pTemplateCommon && pTemplateCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO) rSet.Put(SfxBoolItem(nWhich,FALSE)); else { SfxBoolItem aItem(nWhich, SD_MOD()->GetWaterCan()); aAllSet.Put( aItem, aItem.Which()); } } break; case SID_STYLE_NEW: { ISfxTemplateCommon* pTemplateCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings()); if (pTemplateCommon && pTemplateCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO) rSet.DisableItem(nWhich); } break; case SID_STYLE_DRAGHIERARCHIE: { ISfxTemplateCommon* pTemplateCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings()); if (pTemplateCommon && pTemplateCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO) rSet.DisableItem(nWhich); } break; case SID_STYLE_NEW_BY_EXAMPLE: { // PseudoStyleSheets koennen nicht 'by Example' erzeugt werden; // normale StyleSheets brauchen dafuer ein selektiertes Objekt ISfxTemplateCommon* pTemplCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings()); if (pTemplCommon) { if (pTemplCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO) { rSet.DisableItem(nWhich); } else if (pTemplCommon->GetActualFamily() == SD_STYLE_FAMILY_GRAPHICS) { if (!mpDrawView->AreObjectsMarked()) { rSet.DisableItem(nWhich); } } } // falls (noch) kein Gestalter da ist, muessen wir uns auf den // View-Zustand zurueckziehen; eine aktuell eingestellte Familie // kann nicht beruecksichtigt werden else { if (!mpDrawView->AreObjectsMarked()) { rSet.DisableItem(nWhich); } } } break; case SID_STYLE_UPDATE_BY_EXAMPLE: { if (!mpDrawView->AreObjectsMarked()) { rSet.DisableItem(nWhich); } } break; } nWhich = aIter.NextWhich(); } SfxItemSet* pSet = NULL; if( bAttr ) { pSet = new SfxItemSet( GetDoc()->GetPool() ); mpDrawView->GetAttributes( *pSet ); rSet.Put( *pSet, FALSE ); } rSet.Put( aAllSet, FALSE ); // Flaechen und/oder Linienattribute wurden geaendert if( bAttr && pSet ) { // Wenn die View selektierte Objekte besitzt, muessen entspr. Items // von SFX_ITEM_DEFAULT (_ON) auf SFX_ITEM_DISABLED geaendert werden if( mpDrawView->AreObjectsMarked() ) { SfxWhichIter aNewIter( *pSet, XATTR_LINE_FIRST, XATTR_FILL_LAST ); nWhich = aNewIter.FirstWhich(); while( nWhich ) { if( SFX_ITEM_DEFAULT == pSet->GetItemState( nWhich ) ) { rSet.ClearItem( nWhich ); rSet.DisableItem( nWhich ); } nWhich = aNewIter.NextWhich(); } } delete pSet; } // const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); // ULONG nMarkCount = rMarkList.GetMarkCount(); // BOOL bDisabled = FALSE; // // for (ULONG i = 0; // i < nMarkCount && !bDisabled && i < 50; i++) // { // SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); // // if (pObj->GetObjInventor() == E3dInventor) // { // bDisabled = TRUE; // rSet.ClearItem(SDRATTR_SHADOW); // rSet.DisableItem(SDRATTR_SHADOW); // } // } } /************************************************************************* |* |* Text der Selektion zurueckgeben |* \************************************************************************/ String DrawViewShell::GetSelectionText(BOOL bCompleteWords) { String aStrSelection; ::Outliner* pOl = mpDrawView->GetTextEditOutliner(); OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); if (pOl && pOlView) { if (bCompleteWords) { ESelection aSel = pOlView->GetSelection(); String aStrCurrentDelimiters = pOl->GetWordDelimiters(); pOl->SetWordDelimiters( String( RTL_CONSTASCII_USTRINGPARAM( " .,;\"'" ))); aStrSelection = pOl->GetWord( aSel.nEndPara, aSel.nEndPos ); pOl->SetWordDelimiters( aStrCurrentDelimiters ); } else { aStrSelection = pOlView->GetSelected(); } } return (aStrSelection); } /************************************************************************* |* |* Ist etwas selektiert? |* \************************************************************************/ BOOL DrawViewShell::HasSelection(BOOL bText) const { BOOL bReturn = FALSE; if (bText) { OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView(); if (pOlView && pOlView->GetSelected().Len() != 0) { bReturn = TRUE; } } else if (mpDrawView->GetMarkedObjectList().GetMarkCount() != 0) { bReturn = TRUE; } return bReturn; } } // end of namespace sd