diff options
Diffstat (limited to 'sd/source/ui/dlg/sdtreelb.cxx')
-rw-r--r-- | sd/source/ui/dlg/sdtreelb.cxx | 1397 |
1 files changed, 0 insertions, 1397 deletions
diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx deleted file mode 100644 index bd6e2fae8..000000000 --- a/sd/source/ui/dlg/sdtreelb.cxx +++ /dev/null @@ -1,1397 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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 <sal/types.h> -#include <sot/formats.hxx> -#include <sot/storage.hxx> -#include <vcl/msgbox.hxx> -#include <svl/urihelper.hxx> -#include <svx/svditer.hxx> -#include <sfx2/docfile.hxx> -#include <svx/svdoole2.hxx> -#include <vcl/svapp.hxx> -#include "cusshow.hxx" -#include <sfx2/childwin.hxx> - -#include <sfx2/viewfrm.hxx> - -#include "strmname.h" -#include "sdtreelb.hxx" -#include "DrawDocShell.hxx" -#include "drawdoc.hxx" -#include "sdpage.hxx" -#include "sdresid.hxx" -#include "navigatr.hxx" -#include "strings.hrc" -#include "res_bmp.hrc" - -#include <com/sun/star/embed/XEmbedPersist.hpp> -#include <svtools/embedtransfer.hxx> -#include <tools/diagnose_ex.h> -#include <comphelper/servicehelper.hxx> -#include <ViewShell.hxx> - -using namespace com::sun::star; - -class SdPageObjsTLB::IconProvider -{ -public: - IconProvider (void); - - // Regular icons. - Image maImgPage; - Image maImgPageExcl; - Image maImgPageObjsExcl; - Image maImgPageObjs; - Image maImgObjects; - Image maImgGroup; -}; - - -sal_Bool SD_DLLPRIVATE SdPageObjsTLB::bIsInDrag = sal_False; - -sal_Bool SdPageObjsTLB::IsInDrag() -{ - return bIsInDrag; -} - -sal_uInt32 SdPageObjsTLB::SdPageObjsTransferable::mnListBoxDropFormatId = SAL_MAX_UINT32; - -// ----------------------------------------- -// - SdPageObjsTLB::SdPageObjsTransferable - -// ----------------------------------------- - -SdPageObjsTLB::SdPageObjsTransferable::SdPageObjsTransferable( - SdPageObjsTLB& rParent, - const INetBookmark& rBookmark, - ::sd::DrawDocShell& rDocShell, - NavigatorDragType eDragType, - const ::com::sun::star::uno::Any& rTreeListBoxData ) - : SdTransferable(rDocShell.GetDoc(), NULL, sal_True), - mrParent( rParent ), - maBookmark( rBookmark ), - mrDocShell( rDocShell ), - meDragType( eDragType ), - maTreeListBoxData( rTreeListBoxData ) -{ -} - - - - -SdPageObjsTLB::SdPageObjsTransferable::~SdPageObjsTransferable() -{ -} - -// ----------------------------------------------------------------------------- - -void SdPageObjsTLB::SdPageObjsTransferable::AddSupportedFormats() -{ - AddFormat(SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK); - AddFormat(SOT_FORMATSTR_ID_TREELISTBOX); - AddFormat(GetListBoxDropFormatId()); -} - -// ----------------------------------------------------------------------------- - -sal_Bool SdPageObjsTLB::SdPageObjsTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) -{ - sal_uLong nFormatId = SotExchange::GetFormat( rFlavor ); - switch (nFormatId) - { - case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK: - SetINetBookmark( maBookmark, rFlavor ); - return sal_True; - - case SOT_FORMATSTR_ID_TREELISTBOX: - SetAny(maTreeListBoxData, rFlavor); - return sal_True; - - default: - return sal_False; - } -} - -// ----------------------------------------------------------------------------- - -void SdPageObjsTLB::SdPageObjsTransferable::DragFinished( sal_Int8 nDropAction ) -{ - mrParent.OnDragFinished( nDropAction ); -} - -// ----------------------------------------------------------------------------- - -::sd::DrawDocShell& SdPageObjsTLB::SdPageObjsTransferable::GetDocShell() const -{ - return mrDocShell; -} - -// ----------------------------------------------------------------------------- - -NavigatorDragType SdPageObjsTLB::SdPageObjsTransferable::GetDragType() const -{ - return meDragType; -} - -// ----------------------------------------------------------------------------- - -sal_Int64 SAL_CALL SdPageObjsTLB::SdPageObjsTransferable::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException ) -{ - sal_Int64 nRet; - - if( ( rId.getLength() == 16 ) && - ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) ) - { - nRet = (sal_Int64)(sal_IntPtr)this; - } - else - nRet = SdTransferable::getSomething(rId); - - return nRet; -} - -namespace -{ - class theSdPageObjsTLBUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSdPageObjsTLBUnoTunnelId > {}; -} - -const ::com::sun::star::uno::Sequence< sal_Int8 >& SdPageObjsTLB::SdPageObjsTransferable::getUnoTunnelId() -{ - return theSdPageObjsTLBUnoTunnelId::get().getSeq(); -} - -// ----------------------------------------------------------------------------- - -SdPageObjsTLB::SdPageObjsTransferable* SdPageObjsTLB::SdPageObjsTransferable::getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxData ) - throw() -{ - try - { - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUnoTunnel( rxData, ::com::sun::star::uno::UNO_QUERY_THROW ); - - return reinterpret_cast<SdPageObjsTLB::SdPageObjsTransferable*>( - sal::static_int_cast<sal_uIntPtr>( - xUnoTunnel->getSomething( SdPageObjsTLB::SdPageObjsTransferable::getUnoTunnelId()) ) ); - } - catch( const ::com::sun::star::uno::Exception& ) - { - } - return 0; -} - - -sal_uInt32 SdPageObjsTLB::SdPageObjsTransferable::GetListBoxDropFormatId (void) -{ - if (mnListBoxDropFormatId == SAL_MAX_UINT32) - mnListBoxDropFormatId = SotExchange::RegisterFormatMimeType( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( - "application/x-openoffice-treelistbox-moveonly;" - "windows_formatname=\"SV_LBOX_DD_FORMAT_MOVE\""))); - return mnListBoxDropFormatId; -} - -/************************************************************************* -|* -|* Ctor1 SdPageObjsTLB -|* -\************************************************************************/ - -SdPageObjsTLB::SdPageObjsTLB( Window* pParentWin, const SdResId& rSdResId ) -: SvTreeListBox ( pParentWin, rSdResId ) -, mpParent ( pParentWin ) -, mpDoc ( NULL ) -, mpBookmarkDoc ( NULL ) -, mpMedium ( NULL ) -, mpOwnMedium ( NULL ) -, maImgOle ( BitmapEx( SdResId( BMP_OLE ) ) ) -, maImgGraphic ( BitmapEx( SdResId( BMP_GRAPHIC ) ) ) -, mbLinkableSelected ( sal_False ) -, mpDropNavWin ( NULL ) -, mbShowAllShapes ( false ) -, mbShowAllPages ( false ) - -{ - // Tree-ListBox mit Linien versehen - SetStyle( GetStyle() | WB_TABSTOP | WB_BORDER | WB_HASLINES | - WB_HASBUTTONS | // WB_HASLINESATROOT | - WB_HSCROLL | - WB_HASBUTTONSATROOT | - WB_QUICK_SEARCH /* i31275 */ ); - SetNodeBitmaps( Bitmap( SdResId( BMP_EXPAND ) ), - Bitmap( SdResId( BMP_COLLAPSE ) ) ); - - SetDragDropMode( - SV_DRAGDROP_CTRL_MOVE | SV_DRAGDROP_CTRL_COPY | - SV_DRAGDROP_APP_MOVE | SV_DRAGDROP_APP_COPY | SV_DRAGDROP_APP_DROP ); -} - -/************************************************************************* -|* -|* Dtor SdPageObjsTLB -|* -\************************************************************************/ - -SdPageObjsTLB::~SdPageObjsTLB() -{ - if ( mpBookmarkDoc ) - CloseBookmarkDoc(); - else - // no document was created from mpMedium, so this object is still the owner of it - delete mpMedium; -} - -/************************************************************************* -|* -|* return name of object -|* -\************************************************************************/ - -String SdPageObjsTLB::GetObjectName( - const SdrObject* pObject, - const bool bCreate) const -{ - String aRet; - - if ( pObject ) - { - aRet = pObject->GetName(); - - if( !aRet.Len() && pObject->ISA( SdrOle2Obj ) ) - aRet = static_cast< const SdrOle2Obj* >( pObject )->GetPersistName(); - } - - if (bCreate - && mbShowAllShapes - && aRet.Len() == 0 - && pObject!=NULL) - { - aRet = SdResId(STR_NAVIGATOR_SHAPE_BASE_NAME); - aRet.SearchAndReplaceAscii("%1", String::CreateFromInt32(pObject->GetOrdNum() + 1)); - } - - return aRet; -} - -/************************************************************************* -|* -|* In TreeLB Eintrag selektieren -|* -\************************************************************************/ - -sal_Bool SdPageObjsTLB::SelectEntry( const String& rName ) -{ - sal_Bool bFound = sal_False; - - if( rName.Len() ) - { - SvLBoxEntry* pEntry = NULL; - String aTmp; - - for( pEntry = First(); pEntry && !bFound; pEntry = Next( pEntry ) ) - { - aTmp = GetEntryText( pEntry ); - if( aTmp == rName ) - { - bFound = sal_True; - SetCurEntry( pEntry ); - } - } - } - return( bFound ); -} - -/************************************************************************* -|* -|* Gibt zurueck, ob Childs des uebergebenen Strings selektiert sind -|* -\************************************************************************/ - -sal_Bool SdPageObjsTLB::HasSelectedChilds( const String& rName ) -{ - sal_Bool bFound = sal_False; - sal_Bool bChilds = sal_False; - - if( rName.Len() ) - { - SvLBoxEntry* pEntry = NULL; - String aTmp; - - for( pEntry = First(); pEntry && !bFound; pEntry = Next( pEntry ) ) - { - aTmp = GetEntryText( pEntry ); - if( aTmp == rName ) - { - bFound = sal_True; - sal_Bool bExpanded = IsExpanded( pEntry ); - long nCount = GetChildSelectionCount( pEntry ); - if( bExpanded && nCount > 0 ) - bChilds = sal_True; - } - } - } - return( bChilds ); -} - - -/************************************************************************* -|* -|* TreeLB mit Seiten und Objekten fuellen -|* -\************************************************************************/ - -void SdPageObjsTLB::Fill( const SdDrawDocument* pInDoc, sal_Bool bAllPages, - const String& rDocName) -{ - String aSelection; - if( GetSelectionCount() > 0 ) - { - aSelection = GetSelectEntry(); - Clear(); - } - - mpDoc = pInDoc; - maDocName = rDocName; - mbShowAllPages = (bAllPages == sal_True); - mpMedium = NULL; - - SdPage* pPage = NULL; - - IconProvider aIconProvider; - - // first insert all pages including objects - sal_uInt16 nPage = 0; - const sal_uInt16 nMaxPages = mpDoc->GetPageCount(); - - while( nPage < nMaxPages ) - { - pPage = (SdPage*) mpDoc->GetPage( nPage ); - if( (mbShowAllPages || pPage->GetPageKind() == PK_STANDARD) - && !(pPage->GetPageKind()==PK_HANDOUT) ) //#94954# never list the normal handout page ( handout-masterpage is used instead ) - { - sal_Bool bPageExluded = pPage->IsExcluded(); - - bool bPageBelongsToShow = PageBelongsToCurrentShow (pPage); - bPageExluded |= !bPageBelongsToShow; - - AddShapeList(*pPage, NULL, pPage->GetName(), bPageExluded, NULL, aIconProvider); - } - nPage++; - } - - // dann alle MasterPages incl. Objekte einfuegen - if( mbShowAllPages ) - { - nPage = 0; - const sal_uInt16 nMaxMasterPages = mpDoc->GetMasterPageCount(); - - while( nPage < nMaxMasterPages ) - { - pPage = (SdPage*) mpDoc->GetMasterPage( nPage ); - AddShapeList(*pPage, NULL, pPage->GetName(), false, NULL, aIconProvider); - nPage++; - } - } - if( aSelection.Len() ) - SelectEntry( aSelection ); -} - -/************************************************************************* -|* -|* Es wird nur der erste Eintrag eingefuegt. Childs werden OnDemand erzeugt -|* -\************************************************************************/ - -void SdPageObjsTLB::Fill( const SdDrawDocument* pInDoc, SfxMedium* pInMedium, - const String& rDocName ) -{ - mpDoc = pInDoc; - - // this object now owns the Medium - mpMedium = pInMedium; - maDocName = rDocName; - - Image aImgDocOpen=Image( BitmapEx( SdResId( BMP_DOC_OPEN ) ) ); - Image aImgDocClosed=Image( BitmapEx( SdResId( BMP_DOC_CLOSED ) ) ); - - // Dokumentnamen einfuegen - InsertEntry( maDocName, aImgDocOpen, aImgDocClosed, NULL, sal_True, LIST_APPEND, - reinterpret_cast< void* >( 1 ) - ); -} - - - - -void SdPageObjsTLB::AddShapeList ( - const SdrObjList& rList, - SdrObject* pShape, - const ::rtl::OUString& rsName, - const bool bIsExcluded, - SvLBoxEntry* pParentEntry, - const IconProvider& rIconProvider) -{ - Image aIcon (rIconProvider.maImgPage); - if (bIsExcluded) - aIcon = rIconProvider.maImgPageExcl; - else if (pShape != NULL) - aIcon = rIconProvider.maImgGroup; - - void* pUserData (reinterpret_cast<void*>(1)); - if (pShape != NULL) - pUserData = pShape; - - SvLBoxEntry* pEntry = InsertEntry( - rsName, - aIcon, - aIcon, - pParentEntry, - sal_False, - LIST_APPEND, - pUserData); - - SdrObjListIter aIter( - rList, - !rList.HasObjectNavigationOrder() /* use navigation order, if available */, - IM_FLAT, - sal_False /*not reverse*/); - - while( aIter.IsMore() ) - { - SdrObject* pObj = aIter.Next(); - OSL_ASSERT(pObj!=NULL); - - // Get the shape name. - String aStr (GetObjectName( pObj ) ); - - if( aStr.Len() ) - { - if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_OLE2 ) - { - InsertEntry( - aStr, - maImgOle, - maImgOle, - pEntry, - sal_False, - LIST_APPEND, - pObj - ); - } - else if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_GRAF ) - { - InsertEntry( - aStr, - maImgGraphic, - maImgGraphic, - pEntry, - sal_False, - LIST_APPEND, - pObj - ); - } - else if (pObj->IsGroupObject()) - { - AddShapeList( - *pObj->GetSubList(), - pObj, - aStr, - false, - pEntry, - rIconProvider - ); - } - else - { - InsertEntry( - aStr, - rIconProvider.maImgObjects, - rIconProvider.maImgObjects, - pEntry, - sal_False, - LIST_APPEND, - pObj - ); - } - } - } - - if( pEntry->HasChilds() ) - { - SetExpandedEntryBmp( - pEntry, - bIsExcluded ? rIconProvider.maImgPageObjsExcl : rIconProvider.maImgPageObjs); - SetCollapsedEntryBmp( - pEntry, - bIsExcluded ? rIconProvider.maImgPageObjsExcl : rIconProvider.maImgPageObjs); - } -} - - - - -void SdPageObjsTLB::SetShowAllShapes ( - const bool bShowAllShapes, - const bool bFillList) -{ - mbShowAllShapes = bShowAllShapes; - if (bFillList) - { - if (mpMedium == NULL) - Fill(mpDoc, mbShowAllPages, maDocName); - else - Fill(mpDoc, mpMedium, maDocName); - } -} - - - - -bool SdPageObjsTLB::GetShowAllShapes (void) const -{ - return mbShowAllShapes; -} - - - - -/************************************************************************* -|* -|* Prueft, ob die Seiten (PK_STANDARD) und die darauf befindlichen Objekte -|* des Docs und der TreeLB identisch sind. -|* Wird ein Doc uebergeben, wird dieses zum aktuellem Doc (Wichtig bei -|* mehreren Documenten). -|* -\************************************************************************/ - -sal_Bool SdPageObjsTLB::IsEqualToDoc( const SdDrawDocument* pInDoc ) -{ - if( pInDoc ) - mpDoc = pInDoc; - - if( !mpDoc ) - return( sal_False ); - - SdrObject* pObj = NULL; - SdPage* pPage = NULL; - SvLBoxEntry* pEntry = First(); - String aName; - - // Alle Pages incl. Objekte vergleichen - sal_uInt16 nPage = 0; - const sal_uInt16 nMaxPages = mpDoc->GetPageCount(); - - while( nPage < nMaxPages ) - { - pPage = (SdPage*) mpDoc->GetPage( nPage ); - if( pPage->GetPageKind() == PK_STANDARD ) - { - if( !pEntry ) - return( sal_False ); - aName = GetEntryText( pEntry ); - - if( pPage->GetName() != aName ) - return( sal_False ); - - pEntry = Next( pEntry ); - - SdrObjListIter aIter( - *pPage, - !pPage->HasObjectNavigationOrder() /* use navigation order, if available */, - IM_DEEPWITHGROUPS ); - - while( aIter.IsMore() ) - { - pObj = aIter.Next(); - - const String aObjectName( GetObjectName( pObj ) ); - - if( aObjectName.Len() ) - { - if( !pEntry ) - return( sal_False ); - - aName = GetEntryText( pEntry ); - - if( aObjectName != aName ) - return( sal_False ); - - pEntry = Next( pEntry ); - } - } - } - nPage++; - } - // Wenn noch Eintraege in der Listbox vorhanden sind, wurden - // Objekte (mit Namen) oder Seiten geloescht - return( !pEntry ); -} - -/************************************************************************* -|* -|* Selectierten String zurueckgeben -|* -\************************************************************************/ - -String SdPageObjsTLB::GetSelectEntry() -{ - return( GetEntryText( GetCurEntry() ) ); -} - -/************************************************************************* -|* -|* Selektierte Eintrage zurueckgeben -|* nDepth == 0 -> Seiten -|* nDepth == 1 -> Objekte -|* -\************************************************************************/ - -List* SdPageObjsTLB::GetSelectEntryList( sal_uInt16 nDepth ) -{ - List* pList = NULL; - SvLBoxEntry* pEntry = FirstSelected(); - - while( pEntry ) - { - sal_uInt16 nListDepth = GetModel()->GetDepth( pEntry ); - if( nListDepth == nDepth ) - { - if( !pList ) - pList = new List(); - - const String aEntryText( GetEntryText( pEntry ) ); - pList->Insert( new String( aEntryText ), LIST_APPEND ); - } - pEntry = NextSelected( pEntry ); - } - - return( pList ); -} - -/************************************************************************* -|* -|* Eintraege werden erst auf Anforderung (Doppelklick) eingefuegt -|* -\************************************************************************/ - -void SdPageObjsTLB::RequestingChilds( SvLBoxEntry* pFileEntry ) -{ - if( !pFileEntry->HasChilds() ) - { - if( GetBookmarkDoc() ) - { - SdrObject* pObj = NULL; - SdPage* pPage = NULL; - SvLBoxEntry* pPageEntry = NULL; - - Image aImgPage = Image( BitmapEx( SdResId( BMP_PAGE ) ) ); - Image aImgPageObjs = Image( BitmapEx( SdResId( BMP_PAGEOBJS ) ) ); - Image aImgObjects = Image( BitmapEx( SdResId( BMP_OBJECTS ) ) ); - - // document name already inserted - - // only insert all "normal" ? slides with objects - sal_uInt16 nPage = 0; - const sal_uInt16 nMaxPages = mpBookmarkDoc->GetPageCount(); - - while( nPage < nMaxPages ) - { - pPage = (SdPage*) mpBookmarkDoc->GetPage( nPage ); - if( pPage->GetPageKind() == PK_STANDARD ) - { - pPageEntry = InsertEntry( pPage->GetName(), - aImgPage, - aImgPage, - pFileEntry, - sal_False, - LIST_APPEND, - reinterpret_cast< void* >( 1 ) ); - - SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); - - while( aIter.IsMore() ) - { - pObj = aIter.Next(); - String aStr( GetObjectName( pObj ) ); - if( aStr.Len() ) - { - if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_OLE2 ) - { - InsertEntry(aStr, maImgOle, maImgOle, pPageEntry); - } - else if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_GRAF ) - { - InsertEntry(aStr, maImgGraphic, maImgGraphic, pPageEntry); - } - else - { - InsertEntry(aStr, aImgObjects, aImgObjects, pPageEntry); - } - } - } - if( pPageEntry->HasChilds() ) - { - SetExpandedEntryBmp( pPageEntry, aImgPageObjs ); - SetCollapsedEntryBmp( pPageEntry, aImgPageObjs ); - } - } - nPage++; - } - } - } - else - SvTreeListBox::RequestingChilds( pFileEntry ); -} - -/************************************************************************* -|* -|* Prueft, ob es sich um eine Draw-Datei handelt und oeffnet anhand des -|* uebergebenen Docs das BookmarkDoc -|* -\************************************************************************/ - -SdDrawDocument* SdPageObjsTLB::GetBookmarkDoc(SfxMedium* pMed) -{ - if ( - !mpBookmarkDoc || - (pMed && (!mpOwnMedium || mpOwnMedium->GetName() != pMed->GetName())) - ) - { - // create a new BookmarkDoc if now one exists or if a new Medium is provided - if (mpOwnMedium != pMed) - { - CloseBookmarkDoc(); - } - - if (pMed) - { - // it looks that it is undefined if a Medium was set by Fill() allready - DBG_ASSERT( !mpMedium, "SfxMedium confusion!" ); - delete mpMedium; - mpMedium = NULL; - - // take over this Medium (currently used only be Navigator) - mpOwnMedium = pMed; - } - - DBG_ASSERT( mpMedium || pMed, "No SfxMedium provided!" ); - - if( pMed ) - { - // in this mode the document is also owned and controlled by this instance - mxBookmarkDocShRef = new ::sd::DrawDocShell(SFX_CREATE_MODE_STANDARD, sal_True); - if (mxBookmarkDocShRef->DoLoad(pMed)) - mpBookmarkDoc = mxBookmarkDocShRef->GetDoc(); - else - mpBookmarkDoc = NULL; - } - else if ( mpMedium ) - // in this mode the document is owned and controlled by the SdDrawDocument - // it can be released by calling the corresponding CloseBookmarkDoc method - // successfull creation of a document makes this the owner of the medium - mpBookmarkDoc = ((SdDrawDocument*) mpDoc)->OpenBookmarkDoc(*mpMedium); - - if ( !mpBookmarkDoc ) - { - ErrorBox aErrorBox( this, WB_OK, String( SdResId( STR_READ_DATA_ERROR ) ) ); - aErrorBox.Execute(); - mpMedium = 0; //On failure the SfxMedium is invalid - } - } - - return( mpBookmarkDoc ); -} - -/************************************************************************* -|* -|* Bookmark-Dokument schlie�en und loeschen -|* -\************************************************************************/ - -void SdPageObjsTLB::CloseBookmarkDoc() -{ - if (mxBookmarkDocShRef.Is()) - { - mxBookmarkDocShRef->DoClose(); - mxBookmarkDocShRef.Clear(); - - // Medium is owned by document, so it's destroyed already - mpOwnMedium = 0; - } - else if ( mpBookmarkDoc ) - { - DBG_ASSERT( !mpOwnMedium, "SfxMedium confusion!" ); - if ( mpDoc ) - { - // The document owns the Medium, so the Medium will be invalid after closing the document - ((SdDrawDocument*) mpDoc)->CloseBookmarkDoc(); - mpMedium = 0; - } - } - else - { - // perhaps mpOwnMedium provided, but no successfull creation of BookmarkDoc - delete mpOwnMedium; - mpOwnMedium = NULL; - } - - mpBookmarkDoc = NULL; -} - -void SdPageObjsTLB::SelectHdl() -{ - SvLBoxEntry* pEntry = FirstSelected(); - - mbLinkableSelected = sal_True; - - while( pEntry && mbLinkableSelected ) - { - if( NULL == pEntry->GetUserData() ) - mbLinkableSelected = sal_False; - - pEntry = NextSelected( pEntry ); - } - - SvTreeListBox::SelectHdl(); -} - -/************************************************************************* -|* -|* Ueberlaedt RETURN mit der Funktionsweise von DoubleClick -|* -\************************************************************************/ - -void SdPageObjsTLB::KeyInput( const KeyEvent& rKEvt ) -{ - if( rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) - { - // Auskommentierter Code aus svtools/source/contnr/svimpbox.cxx - SvLBoxEntry* pCursor = GetCurEntry(); - if( pCursor->HasChilds() || pCursor->HasChildsOnDemand() ) - { - if( IsExpanded( pCursor ) ) - Collapse( pCursor ); - else - Expand( pCursor ); - } - - DoubleClickHdl(); - } - else - SvTreeListBox::KeyInput( rKEvt ); -} - -/************************************************************************* -|* -|* StartDrag-Request -|* -\************************************************************************/ - -void SdPageObjsTLB::StartDrag( sal_Int8 nAction, const Point& rPosPixel) -{ - (void)nAction; - (void)rPosPixel; - - SdNavigatorWin* pNavWin = NULL; - SvLBoxEntry* pEntry = GetEntry(rPosPixel); - - if( mpFrame->HasChildWindow( SID_NAVIGATOR ) ) - pNavWin = (SdNavigatorWin*) ( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) ); - - if (pEntry != NULL - && pNavWin !=NULL - && pNavWin == mpParent - && pNavWin->GetNavigatorDragType() != NAVIGATOR_DRAGTYPE_NONE ) - { - // Mark only the children of the page under the mouse as drop - // targets. This prevents moving shapes from one page to another. - - // Select all entries and disable them as drop targets. - SetSelectionMode(MULTIPLE_SELECTION); - SetCursor(NULL, sal_False); - SelectAll(sal_True, sal_False); - EnableSelectionAsDropTarget(sal_False, sal_True); - - // Enable only the entries as drop targets that are children of the - // page under the mouse. - SvLBoxEntry* pParent = GetRootLevelParent(pEntry); - if (pParent != NULL) - { - SelectAll(sal_False, sal_False); - Select(pParent, sal_True); - // for (SvLBoxEntry*pChild=FirstChild(pParent); pChild!=NULL; pChild=NextSibling(pChild)) - // Select(pChild, sal_True); - EnableSelectionAsDropTarget(sal_True, sal_True);//sal_False); - } - - // Set selection back to the entry under the mouse. - SelectAll(sal_False,sal_False); - SetSelectionMode(SINGLE_SELECTION); - Select(pEntry, sal_True); - - // Aus dem ExecuteDrag heraus kann der Navigator geloescht werden - // (beim Umschalten auf einen anderen Dokument-Typ), das wuerde aber - // den StarView MouseMove-Handler, der Command() aufruft, umbringen. - // Deshalb Drag&Drop asynchron: - Application::PostUserEvent( STATIC_LINK( this, SdPageObjsTLB, ExecDragHdl ) ); - } -} - -/************************************************************************* -|* -|* Begin drag -|* -\************************************************************************/ - -void SdPageObjsTLB::DoDrag() -{ - mpDropNavWin = ( mpFrame->HasChildWindow( SID_NAVIGATOR ) ) ? - (SdNavigatorWin*)( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) ) : - NULL; - - if( mpDropNavWin ) - { - ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); - String aURL = INetURLObject( pDocShell->GetMedium()->GetPhysicalName(), INET_PROT_FILE ).GetMainURL( INetURLObject::NO_DECODE ); - NavigatorDragType eDragType = mpDropNavWin->GetNavigatorDragType(); - - aURL.Append( '#' ); - aURL.Append( GetSelectEntry() ); - - INetBookmark aBookmark( aURL, GetSelectEntry() ); - sal_Int8 nDNDActions = DND_ACTION_COPYMOVE; - - if( eDragType == NAVIGATOR_DRAGTYPE_LINK ) - nDNDActions = DND_ACTION_LINK; // Either COPY *or* LINK, never both! - - SvTreeListBox::ReleaseMouse(); - - bIsInDrag = sal_True; - - SvLBoxDDInfo aDDInfo; - memset(&aDDInfo,0,sizeof(SvLBoxDDInfo)); - aDDInfo.pApp = GetpApp(); - aDDInfo.pSource = this; - // aDDInfo.pDDStartEntry = pEntry; - ::com::sun::star::uno::Sequence<sal_Int8> aSequence (sizeof(SvLBoxDDInfo)); - memcpy(aSequence.getArray(), (sal_Char*)&aDDInfo, sizeof(SvLBoxDDInfo)); - ::com::sun::star::uno::Any aTreeListBoxData (aSequence); - - // object is destroyed by internal reference mechanism - SdTransferable* pTransferable = new SdPageObjsTLB::SdPageObjsTransferable( - *this, aBookmark, *pDocShell, eDragType, aTreeListBoxData); - OSL_TRACE("created new SdPageObjsTransferable at %x", pTransferable); - - // Get the view. - sd::View* pView = NULL; - if (pDocShell != NULL) - { - ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); - if (pViewShell != NULL) - pView = pViewShell->GetView(); - } - if (pView == NULL) - { - OSL_ASSERT(pView!=NULL); - return; - } - - SdrObject* pObject = NULL; - void* pUserData = GetCurEntry()->GetUserData(); - if (pUserData != NULL && pUserData != (void*)1) - pObject = reinterpret_cast<SdrObject*>(pUserData); - if (pObject == NULL) - return; - - // For shapes without a user supplied name (the automatically - // created name does not count), a different drag and drop technique - // is used. - if (GetObjectName(pObject, false).Len() == 0) - { - AddShapeToTransferable(*pTransferable, *pObject); - pTransferable->SetView(pView); - SD_MOD()->pTransferDrag = pTransferable; - } - - // Unnamed shapes have to be selected to be recognized by the - // current drop implementation. In order to have a consistent - // behaviour for all shapes, every shape that is to be dragged is - // selected first. - SdrPageView* pPageView = pView->GetSdrPageView(); - pView->UnmarkAllObj(pPageView); - pView->MarkObj(pObject, pPageView); - - pTransferable->StartDrag( this, nDNDActions ); - } -} - -/************************************************************************* -|* -|* Drag finished -|* -\************************************************************************/ - -void SdPageObjsTLB::OnDragFinished( sal_uInt8 ) -{ - if( mpFrame->HasChildWindow( SID_NAVIGATOR ) ) - { - SdNavigatorWin* pNewNavWin = (SdNavigatorWin*) ( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) ); - - if( mpDropNavWin == pNewNavWin) - { - MouseEvent aMEvt( mpDropNavWin->GetPointerPosPixel() ); - SvTreeListBox::MouseButtonUp( aMEvt ); - } - } - - mpDropNavWin = NULL; - bIsInDrag = sal_False; -} - -/************************************************************************* -|* -|* AcceptDrop-Event -|* -\************************************************************************/ - -sal_Int8 SdPageObjsTLB::AcceptDrop (const AcceptDropEvent& rEvent) -{ - sal_Int8 nResult (DND_ACTION_NONE); - - if ( !bIsInDrag && IsDropFormatSupported( FORMAT_FILE ) ) - { - nResult = rEvent.mnAction; - } - else - { - SvLBoxEntry* pEntry = GetDropTarget(rEvent.maPosPixel); - if (rEvent.mbLeaving || !CheckDragAndDropMode( this, rEvent.mnAction )) - { - ImplShowTargetEmphasis( pTargetEntry, sal_False ); - } - else if( !nDragDropMode ) - { - DBG_ERRORFILE( "SdPageObjsTLB::AcceptDrop(): no target" ); - } - else if (IsDropAllowed(pEntry)) - { - nResult = DND_ACTION_MOVE; - - // Draw emphasis. - if (pEntry != pTargetEntry || !(nImpFlags & SVLBOX_TARGEMPH_VIS)) - { - ImplShowTargetEmphasis( pTargetEntry, sal_False ); - pTargetEntry = pEntry; - ImplShowTargetEmphasis( pTargetEntry, sal_True ); - } - } - } - - // Hide emphasis when there is no valid drop action. - if (nResult == DND_ACTION_NONE) - ImplShowTargetEmphasis(pTargetEntry, sal_False); - - return nResult; -} - -/************************************************************************* -|* -|* ExecuteDrop-Event -|* -\************************************************************************/ - -sal_Int8 SdPageObjsTLB::ExecuteDrop( const ExecuteDropEvent& rEvt ) -{ - sal_Int8 nRet = DND_ACTION_NONE; - - try - { - if( !bIsInDrag ) - { - SdNavigatorWin* pNavWin = NULL; - sal_uInt16 nId = SID_NAVIGATOR; - - if( mpFrame->HasChildWindow( nId ) ) - pNavWin = (SdNavigatorWin*)( mpFrame->GetChildWindow( nId )->GetContextWindow( SD_MOD() ) ); - - if( pNavWin && ( pNavWin == mpParent ) ) - { - TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable ); - String aFile; - - if( aDataHelper.GetString( FORMAT_FILE, aFile ) && - ( (SdNavigatorWin*) mpParent)->InsertFile( aFile ) ) - { - nRet = rEvt.mnAction; - } - } - } - } - catch (com::sun::star::uno::Exception&) - { - DBG_UNHANDLED_EXCEPTION(); - } - - if (nRet == DND_ACTION_NONE) - SvTreeListBox::ExecuteDrop(rEvt, this); - - - return nRet; -} - -/************************************************************************* -|* -|* Handler fuers Dragging -|* -\************************************************************************/ - -IMPL_STATIC_LINK(SdPageObjsTLB, ExecDragHdl, void*, EMPTYARG) -{ - // als Link, damit asynchron ohne ImpMouseMoveMsg auf dem Stack auch der - // Navigator geloescht werden darf - pThis->DoDrag(); - return 0; -} - - -bool SdPageObjsTLB::PageBelongsToCurrentShow (const SdPage* pPage) const -{ - // Return <TRUE/> as default when there is no custom show or when none - // is used. The page does then belong to the standard show. - bool bBelongsToShow = true; - - if (mpDoc->getPresentationSettings().mbCustomShow) - { - // Get the current custom show. - SdCustomShow* pCustomShow = NULL; - List* pShowList = const_cast<SdDrawDocument*>(mpDoc)->GetCustomShowList(); - if (pShowList != NULL) - { - sal_uLong nCurrentShowIndex = pShowList->GetCurPos(); - void* pObject = pShowList->GetObject(nCurrentShowIndex); - pCustomShow = static_cast<SdCustomShow*>(pObject); - } - - // Check whether the given page is part of that custom show. - if (pCustomShow != NULL) - { - bBelongsToShow = false; - sal_uLong nPageCount = pCustomShow->Count(); - for (sal_uInt16 i=0; i<nPageCount && !bBelongsToShow; i++) - if (pPage == static_cast<SdPage*>(pCustomShow->GetObject (i))) - bBelongsToShow = true; - } - } - - return bBelongsToShow; -} - - - - -sal_Bool SdPageObjsTLB::NotifyMoving( - SvLBoxEntry* pTarget, - SvLBoxEntry* pEntry, - SvLBoxEntry*& rpNewParent, - sal_uLong& rNewChildPos) -{ - SvLBoxEntry* pDestination = pTarget; - while (GetParent(pDestination) != NULL && GetParent(GetParent(pDestination)) != NULL) - pDestination = GetParent(pDestination); - - SdrObject* pTargetObject = reinterpret_cast<SdrObject*>(pDestination->GetUserData()); - SdrObject* pSourceObject = reinterpret_cast<SdrObject*>(pEntry->GetUserData()); - if (pSourceObject == reinterpret_cast<SdrObject*>(1)) - pSourceObject = NULL; - - if (pTargetObject != NULL && pSourceObject != NULL) - { - SdrPage* pObjectList = pSourceObject->GetPage(); - if (pObjectList != NULL) - { - sal_uInt32 nNewPosition; - if (pTargetObject == reinterpret_cast<SdrObject*>(1)) - nNewPosition = 0; - else - nNewPosition = pTargetObject->GetNavigationPosition() + 1; - pObjectList->SetObjectNavigationPosition(*pSourceObject, nNewPosition); - } - - // Update the tree list. - if (pTarget == NULL) - { - rpNewParent = 0; - rNewChildPos = 0; - return sal_True; - } - else if (GetParent(pDestination) == NULL) - { - rpNewParent = pDestination; - rNewChildPos = 0; - } - else - { - rpNewParent = GetParent(pDestination); - rNewChildPos = pModel->GetRelPos(pDestination) + 1; - rNewChildPos += nCurEntrySelPos; - nCurEntrySelPos++; - } - return sal_True; - } - else - return sal_False; -} - - - - -SvLBoxEntry* SdPageObjsTLB::GetDropTarget (const Point& rLocation) -{ - SvLBoxEntry* pEntry = SvTreeListBox::GetDropTarget(rLocation); - if (pEntry == NULL) - return NULL; - - OSL_TRACE("entry is %s", - ::rtl::OUStringToOString(GetEntryText(pEntry), RTL_TEXTENCODING_UTF8).getStr()); - if (GetParent(pEntry) == NULL) - { - // Use page entry as insertion position. - } - else - { - // Go to second hierarchy level, i.e. top level shapes, - // i.e. children of pages. - while (GetParent(pEntry) != NULL && GetParent(GetParent(pEntry)) != NULL) - pEntry = GetParent(pEntry); - - // Advance to next sibling. - SvLBoxEntry* pNext; - sal_uInt16 nDepth (0); - while (pEntry != NULL) - { - pNext = dynamic_cast<SvLBoxEntry*>(NextVisible(pEntry, &nDepth)); - if (pNext != NULL && nDepth > 0 && nDepth!=0xffff) - pEntry = pNext; - else - break; - } - OSL_TRACE("returning %s", - ::rtl::OUStringToOString(GetEntryText(pEntry), RTL_TEXTENCODING_UTF8).getStr()); - } - - return pEntry; -} - - - - -bool SdPageObjsTLB::IsDropAllowed (SvLBoxEntry* pEntry) -{ - if (pEntry == NULL) - return false; - - if ( ! IsDropFormatSupported(SdPageObjsTransferable::GetListBoxDropFormatId())) - return false; - - if ((pEntry->GetFlags() & SV_ENTRYFLAG_DISABLE_DROP) != 0) - return false; - - return true; -} - - - - -void SdPageObjsTLB::AddShapeToTransferable ( - SdTransferable& rTransferable, - SdrObject& rObject) const -{ - TransferableObjectDescriptor aObjectDescriptor; - bool bIsDescriptorFillingPending (true); - - const SdrOle2Obj* pOleObject = dynamic_cast<const SdrOle2Obj*>(&rObject); - if (pOleObject != NULL && pOleObject->GetObjRef().is()) - { - // If object has no persistence it must be copied as part of the document - try - { - uno::Reference< embed::XEmbedPersist > xPersObj (pOleObject->GetObjRef(), uno::UNO_QUERY ); - if (xPersObj.is() && xPersObj->hasEntry()) - { - SvEmbedTransferHelper::FillTransferableObjectDescriptor( - aObjectDescriptor, - pOleObject->GetObjRef(), - pOleObject->GetGraphic(), - pOleObject->GetAspect()); - bIsDescriptorFillingPending = false; - } - } - catch( uno::Exception& ) - { - } - } - - ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); - if (bIsDescriptorFillingPending && pDocShell!=NULL) - { - bIsDescriptorFillingPending = false; - pDocShell->FillTransferableObjectDescriptor(aObjectDescriptor); - } - - Point aDragPos (rObject.GetCurrentBoundRect().Center()); - //Point aDragPos (0,0); - aObjectDescriptor.maDragStartPos = aDragPos; - // aObjectDescriptor.maSize = GetAllMarkedRect().GetSize(); - if (pDocShell != NULL) - aObjectDescriptor.maDisplayName = pDocShell->GetMedium()->GetURLObject().GetURLNoPass(); - else - aObjectDescriptor.maDisplayName = String(); - aObjectDescriptor.mbCanLink = sal_False; - - rTransferable.SetStartPos(aDragPos); - rTransferable.SetObjectDescriptor( aObjectDescriptor ); -} - - - - -//===== IconProvider ========================================================== - -SdPageObjsTLB::IconProvider::IconProvider (void) - : maImgPage( BitmapEx( SdResId( BMP_PAGE ) ) ), - maImgPageExcl( BitmapEx( SdResId( BMP_PAGE_EXCLUDED ) ) ), - maImgPageObjsExcl( BitmapEx( SdResId( BMP_PAGEOBJS_EXCLUDED ) ) ), - maImgPageObjs( BitmapEx( SdResId( BMP_PAGEOBJS ) ) ), - maImgObjects( BitmapEx( SdResId( BMP_OBJECTS ) ) ), - maImgGroup( BitmapEx( SdResId( BMP_GROUP ) ) ) -{ -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |