blob: 134c407dbcda8e1c8bfcaafd3d36586e81f01fae [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"
#include <tools/urlobj.hxx>
#include <unotools/localfilehelper.hxx>
#include <sfx2/imgmgr.hxx>
#include <sfx2/fcontnr.hxx>
#include <svl/eitem.hxx>
#include <svl/stritem.hxx>
#include <sfx2/docfilt.hxx>
#include <sfx2/docfile.hxx>
#include <svl/intitem.hxx>
#include <sfx2/dispatch.hxx>
#include <svx/svxids.hrc>
#include <vcl/menu.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dockwin.hxx>
#include <sfx2/sfxresid.hxx>
#include "pres.hxx"
#include "navigatr.hxx"
#include "navigatr.hrc"
#include "pgjump.hxx"
#include "app.hrc"
#include "strings.hrc"
#include "res_bmp.hrc"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "sdresid.hxx"
#include "ViewShell.hxx"
#include "ViewShellBase.hxx"
#include "DrawViewShell.hxx"
#include "slideshow.hxx"
#include "FrameView.hxx"
#include "helpids.h"
namespace {
static const sal_uInt16 nShowNamedShapesFilter=1;
static const sal_uInt16 nShowAllShapesFilter=2;
}
/*************************************************************************
|* SdNavigatorWin - FloatingWindow
\************************************************************************/
SdNavigatorWin::SdNavigatorWin(
::Window* pParent,
::sd::NavigatorChildWindow* pChWinCtxt,
const SdResId& rSdResId,
SfxBindings* pInBindings,
const UpdateRequestFunctor& rUpdateRequest)
: ::Window( pParent, rSdResId ),
maToolbox ( this, SdResId( 1 ) ),
maTlbObjects( this, SdResId( TLB_OBJECTS ) ),
maLbDocs ( this, SdResId( LB_DOCS ) ),
mpChildWinContext( pChWinCtxt ),
mbDocImported ( sal_False ),
// Bei Aenderung des DragTypes: SelectionMode der TLB anpassen!
meDragType ( NAVIGATOR_DRAGTYPE_EMBEDDED ),
mpBindings ( pInBindings ),
maImageList ( SdResId( IL_NAVIGATR ) ),
maImageListH ( SdResId( ILH_NAVIGATR ) )
{
maTlbObjects.SetViewFrame( mpBindings->GetDispatcher()->GetFrame() );
FreeResource();
maTlbObjects.SetAccessibleName(String(SdResId(STR_OBJECTS_TREE)));
mpNavigatorCtrlItem = new SdNavigatorControllerItem( SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest);
mpPageNameCtrlItem = new SdPageNameControllerItem( SID_NAVIGATOR_PAGENAME, this, mpBindings, rUpdateRequest);
mpDocList = new List();
ApplyImageList(); // load images *before* calculating sizes to get something useful !!!
Size aTbxSize( maToolbox.CalcWindowSizePixel() );
maToolbox.SetOutputSizePixel( aTbxSize );
maToolbox.SetSelectHdl( LINK( this, SdNavigatorWin, SelectToolboxHdl ) );
maToolbox.SetClickHdl( LINK( this, SdNavigatorWin, ClickToolboxHdl ) );
maToolbox.SetDropdownClickHdl( LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl) );
maToolbox.SetItemBits( TBI_DRAGTYPE, maToolbox.GetItemBits( TBI_DRAGTYPE ) | TIB_DROPDOWNONLY );
// Shape filter drop down menu.
maToolbox.SetItemBits(
TBI_SHAPE_FILTER,
maToolbox.GetItemBits(TBI_SHAPE_FILTER) | TIB_DROPDOWNONLY);
// TreeListBox
// set position below toolbox
long nListboxYPos = maToolbox.GetPosPixel().Y() + maToolbox.GetSizePixel().Height() + 4;
maTlbObjects.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
maTlbObjects.SetDoubleClickHdl( LINK( this, SdNavigatorWin, ClickObjectHdl ) );
maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
// set focus to listbox, otherwise it is in the toolbox which is only useful
// for keyboard navigation
maTlbObjects.GrabFocus();
maTlbObjects.SetSdNavigatorWinFlag(sal_True);
// DragTypeListBox
maLbDocs.SetSelectHdl( LINK( this, SdNavigatorWin, SelectDocumentHdl ) );
// set position below treelistbox
nListboxYPos = maTlbObjects.GetPosPixel().Y() + maTlbObjects.GetSizePixel().Height() + 4;
maLbDocs.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
// assure that tool box is at least as wide as the tree list box
{
const Size aTlbSize( maTlbObjects.GetOutputSizePixel() );
if ( aTlbSize.Width() > aTbxSize.Width() )
{
maToolbox.SetPosSizePixel( 0, 0, aTlbSize.Width(), 0, WINDOW_POSSIZE_WIDTH );
aTbxSize = maToolbox.GetOutputSizePixel();
}
}
// set min outputsize after all sizes are known
const long nFullHeight = nListboxYPos + maLbDocs.GetSizePixel().Height() + 4;
maSize = GetOutputSizePixel();
if( maSize.Height() < nFullHeight )
{
maSize.Height() = nFullHeight;
SetOutputSizePixel( maSize );
}
maMinSize = maSize;
const long nMinWidth = 2*maToolbox.GetPosPixel().X() + aTbxSize.Width(); // never clip the toolbox
if( nMinWidth > maMinSize.Width() )
maMinSize.Width() = nMinWidth;
maMinSize.Height() -= 40;
SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(GetParent());
if (pDockingParent != NULL)
pDockingParent->SetMinOutputSizePixel( maMinSize );
// InitTlb; Wird ueber Slot initiiert
if (rUpdateRequest)
rUpdateRequest();
}
// -----------------------------------------------------------------------
SdNavigatorWin::~SdNavigatorWin()
{
delete mpNavigatorCtrlItem;
delete mpPageNameCtrlItem;
// Liste der DocInfos loeschen
long nCount = mpDocList->Count();
while( nCount-- )
delete (NavDocInfo*) mpDocList->Remove( (sal_uLong)0 );
delete mpDocList;
}
// -----------------------------------------------------------------------
//Solution: when object is marked , fresh the corresponding entry tree .
//==================================================
void SdNavigatorWin::FreshTree( const SdDrawDocument* pDoc )
{
SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
String aDocShName( pDocShell->GetName() );
String aDocName = pDocShell->GetMedium()->GetName();
maTlbObjects.SetSaveTreeItemStateFlag(sal_True); //Added by yanjun for sym2_6385
maTlbObjects.Clear();
maTlbObjects.Fill( pDoc, sal_False, aDocName ); // Nur normale Seiten
maTlbObjects.SetSaveTreeItemStateFlag(sal_False); //Added by yanjun for sym2_6385
RefreshDocumentLB();
maLbDocs.SelectEntry( aDocShName );
}
void SdNavigatorWin::FreshEntry( )
{
maTlbObjects.FreshCurEntry();
}
//==================================================
void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc )
{
SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
String aDocShName( pDocShell->GetName() );
::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
// Restore the 'ShowAllShapes' flag from the last time (in this session)
// that the navigator was shown.
if (pViewShell != NULL)
{
::sd::FrameView* pFrameView = pViewShell->GetFrameView();
if (pFrameView != NULL)
maTlbObjects.SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false);
}
// Disable the shape filter drop down menu when there is a running slide
// show.
if (pViewShell!=NULL && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ))
maToolbox.EnableItem(TBI_SHAPE_FILTER, sal_False);
else
maToolbox.EnableItem(TBI_SHAPE_FILTER);
if( !maTlbObjects.IsEqualToDoc( pDoc ) )
{
String aDocName = pDocShell->GetMedium()->GetName();
maTlbObjects.Clear();
maTlbObjects.Fill( pDoc, (sal_Bool) sal_False, aDocName ); // Nur normale Seiten
RefreshDocumentLB();
maLbDocs.SelectEntry( aDocShName );
}
else
{
maLbDocs.SetNoSelection();
maLbDocs.SelectEntry( aDocShName );
// auskommentiert um 30246 zu fixen
// if( maLbDocs.GetSelectEntryCount() == 0 )
{
RefreshDocumentLB();
maLbDocs.SelectEntry( aDocShName );
}
}
SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() );
if( pViewFrame )
pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, sal_True, sal_True);
}
/*************************************************************************
|*
|* DragType wird in Abhaengigkeit davon gesetzt, ob ein Drag ueberhaupt
|* moeglich ist. Graphiken duerfen beispielsweise unter gewissen Umstaenden
|* nicht gedragt werden (#31038#).
|*
\************************************************************************/
NavigatorDragType SdNavigatorWin::GetNavigatorDragType()
{
NavigatorDragType eDT = meDragType;
NavDocInfo* pInfo = GetDocInfo();
if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() ) )
eDT = NAVIGATOR_DRAGTYPE_NONE;
return( eDT );
}
// -----------------------------------------------------------------------
//Solution: Get SdDrawDocShell
sd::DrawDocShell* SdNavigatorWin::GetDrawDocShell( const SdDrawDocument* pDoc )
{
if( !pDoc )
return NULL; // const as const can...
sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
return pDocShell;
}
IMPL_LINK( SdNavigatorWin, SelectToolboxHdl, void *, EMPTYARG )
{
sal_uInt16 nId = maToolbox.GetCurItemId();
sal_uInt16 nSId = 0;
PageJump ePage = PAGE_NONE;
switch( nId )
{
case TBI_PEN:
{
if( nId == TBI_PEN )
{
nSId = SID_NAVIGATOR_PEN;
}
if( nSId > 0 )
{
SfxBoolItem aItem( nSId, sal_True );
mpBindings->GetDispatcher()->Execute(
nSId, SFX_CALLMODE_SLOT |SFX_CALLMODE_RECORD, &aItem, 0L );
}
}
break;
case TBI_FIRST:
case TBI_PREVIOUS:
case TBI_NEXT:
case TBI_LAST:
{
if( nId == TBI_FIRST )
ePage = PAGE_FIRST;
else if( nId == TBI_PREVIOUS )
ePage = PAGE_PREVIOUS;
else if( nId == TBI_NEXT )
ePage = PAGE_NEXT;
else if( nId == TBI_LAST )
ePage = PAGE_LAST;
if( ePage != PAGE_NONE )
{
SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, (sal_uInt16)ePage );
mpBindings->GetDispatcher()->Execute(
SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
}
}
break;
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SdNavigatorWin, ClickToolboxHdl, ToolBox*, EMPTYARG )
{
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SdNavigatorWin, DropdownClickToolBoxHdl, ToolBox*, pBox )
{
sal_uInt16 nId = maToolbox.GetCurItemId();
switch( nId )
{
case TBI_DRAGTYPE:
{
// Popup-Menu wird in Abhaengigkeit davon erzeugt, ob Dokument
// gespeichert ist oder nicht
PopupMenu *pMenu = new PopupMenu;
static const char* aHIDs[] =
{
HID_SD_NAVIGATOR_MENU1,
HID_SD_NAVIGATOR_MENU2,
HID_SD_NAVIGATOR_MENU3,
0
};
for( sal_uInt16 nID = NAVIGATOR_DRAGTYPE_URL;
nID < NAVIGATOR_DRAGTYPE_COUNT;
nID++ )
{
sal_uInt16 nRId = GetDragTypeSdResId( (NavigatorDragType)nID );
if( nRId > 0 )
{
DBG_ASSERT(aHIDs[nID-NAVIGATOR_DRAGTYPE_URL],"HelpId not added!");
pMenu->InsertItem( nID, String( SdResId( nRId ) ) );
pMenu->SetHelpId( nID, aHIDs[nID - NAVIGATOR_DRAGTYPE_URL] );
}
}
NavDocInfo* pInfo = GetDocInfo();
if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() )
{
pMenu->EnableItem( NAVIGATOR_DRAGTYPE_LINK, sal_False );
pMenu->EnableItem( NAVIGATOR_DRAGTYPE_URL, sal_False );
meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
}
pMenu->CheckItem( (sal_uInt16)meDragType );
pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, MenuSelectHdl ) );
pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
pBox->EndSelection();
delete pMenu;
}
break;
case TBI_SHAPE_FILTER:
{
PopupMenu *pMenu = new PopupMenu;
pMenu->InsertItem(
nShowNamedShapesFilter,
String(SdResId(STR_NAVIGATOR_SHOW_NAMED_SHAPES)));
pMenu->InsertItem(
nShowAllShapesFilter,
String(SdResId(STR_NAVIGATOR_SHOW_ALL_SHAPES)));
if (maTlbObjects.GetShowAllShapes())
pMenu->CheckItem(nShowAllShapesFilter);
else
pMenu->CheckItem(nShowNamedShapesFilter);
pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, ShapeFilterCallback ) );
pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
pBox->EndSelection();
delete pMenu;
}
break;
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SdNavigatorWin, ClickObjectHdl, void *, EMPTYARG )
{
if( !mbDocImported || maLbDocs.GetSelectEntryPos() != 0 )
{
NavDocInfo* pInfo = GetDocInfo();
// Nur wenn es sich um das aktive Fenster handelt, wird
// auf die Seite gesprungen
if( pInfo && pInfo->IsActive() )
{
String aStr( maTlbObjects.GetSelectEntry() );
if( aStr.Len() > 0 )
{
SfxStringItem aItem( SID_NAVIGATOR_OBJECT, aStr );
mpBindings->GetDispatcher()->Execute(
SID_NAVIGATOR_OBJECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
//Solution: set sign variable
maTlbObjects.MarkCurEntry(aStr);
// #98821# moved here from SetGetFocusHdl. Reset the
// focus only if something has been selected in the
// document.
SfxViewShell* pCurSh = SfxViewShell::Current();
if ( pCurSh )
{
Window* pShellWnd = pCurSh->GetWindow();
if ( pShellWnd )
pShellWnd->GrabFocus();
}
}
}
}
return( 0L );
}
// -----------------------------------------------------------------------
IMPL_LINK( SdNavigatorWin, SelectDocumentHdl, void *, EMPTYARG )
{
String aStrLb = maLbDocs.GetSelectEntry();
long nPos = maLbDocs.GetSelectEntryPos();
sal_Bool bFound = sal_False;
::sd::DrawDocShell* pDocShell = NULL;
NavDocInfo* pInfo = GetDocInfo();
// Handelt es sich um ein gedragtes Objekt?
if( mbDocImported && nPos == 0 )
{
// Dokument in TLB aufbauen
InsertFile( aStrLb );
}
else if (pInfo)
{
pDocShell = pInfo->mpDocShell;
bFound = sal_True;
}
if( bFound )
{
SdDrawDocument* pDoc = pDocShell->GetDoc();
if( !maTlbObjects.IsEqualToDoc( pDoc ) )
{
SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh();
String aDocName = pNCDocShell->GetMedium()->GetName();
maTlbObjects.Clear();
maTlbObjects.Fill( pDoc, (sal_Bool) sal_False, aDocName ); // Nur normale Seiten
}
}
// Pruefen, ob Link oder URL moeglich ist
if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) )
{
meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
SetDragImage();
}
return( 0L );
}
/*************************************************************************
|*
|* DrageType wird gesetzt und Image wird entspr. gesetzt.
|* Sollte Handler mit NULL gerufen werden, so wird der Default (URL) gesetzt.
|*
\************************************************************************/
IMPL_LINK( SdNavigatorWin, MenuSelectHdl, Menu *, pMenu )
{
sal_uInt16 nMenuId;
if( pMenu )
nMenuId = pMenu->GetCurItemId();
else
nMenuId = NAVIGATOR_DRAGTYPE_URL;
if( nMenuId != USHRT_MAX ) // Notwendig ?
{
NavigatorDragType eDT = (NavigatorDragType) nMenuId;
if( meDragType != eDT )
{
meDragType = eDT;
SetDragImage();
if( meDragType == NAVIGATOR_DRAGTYPE_URL )
{
// Fix, um Endlosschleife zu unterbinden
if( maTlbObjects.GetSelectionCount() > 1 )
maTlbObjects.SelectAll( sal_False );
maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
}
else
maTlbObjects.SetSelectionMode( MULTIPLE_SELECTION );
}
}
return( 0 );
}
IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, Menu *, pMenu )
{
if (pMenu != NULL)
{
bool bShowAllShapes (maTlbObjects.GetShowAllShapes());
sal_uInt16 nMenuId (pMenu->GetCurItemId());
switch (nMenuId)
{
case nShowNamedShapesFilter:
bShowAllShapes = false;
break;
case nShowAllShapesFilter:
bShowAllShapes = true;
break;
default:
OSL_ENSURE(
false, "SdNavigatorWin::ShapeFilterCallback called for unknown menu entry");
break;
}
maTlbObjects.SetShowAllShapes(bShowAllShapes, true);
// Remember the selection in the FrameView.
NavDocInfo* pInfo = GetDocInfo();
if (pInfo != NULL)
{
::sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
if (pDocShell != NULL)
{
::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
if (pViewShell != NULL)
{
::sd::FrameView* pFrameView = pViewShell->GetFrameView();
if (pFrameView != NULL)
{
pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes);
}
}
}
}
}
return 0;
}
// -----------------------------------------------------------------------
void SdNavigatorWin::Resize()
{
Size aWinSize( GetOutputSizePixel() );
if( aWinSize.Height() >= maMinSize.Height() )
//aWinSize.Width() >= maMinSize.Width() )
{
Size aDiffSize;
aDiffSize.Width() = aWinSize.Width() - maSize.Width();
aDiffSize.Height() = aWinSize.Height() - maSize.Height();
// Umgroessern der Toolbox
Size aObjSize( maToolbox.GetOutputSizePixel() );
aObjSize.Width() += aDiffSize.Width();
maToolbox.SetOutputSizePixel( aObjSize );
// Umgroessern der TreeLB
aObjSize = maTlbObjects.Control::GetOutputSizePixel();
aObjSize.Width() += aDiffSize.Width();
aObjSize.Height() += aDiffSize.Height();
maTlbObjects.SetOutputSizePixel( aObjSize );
Point aPt( 0, aDiffSize.Height() );
// Verschieben der anderen Controls (DocumentLB)
maLbDocs.Hide();
aObjSize = maLbDocs.GetOutputSizePixel();
aObjSize.Width() += aDiffSize.Width();
maLbDocs.SetPosPixel( maLbDocs.GetPosPixel() + aPt );
maLbDocs.SetOutputSizePixel( aObjSize );
maLbDocs.Show();
maSize = aWinSize;
}
Window::Resize();
}
// -----------------------------------------------------------------------
sal_Bool SdNavigatorWin::InsertFile(const String& rFileName)
{
INetURLObject aURL( rFileName );
sal_Bool bReturn = sal_True;
if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
{
String aURLStr;
::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aURLStr );
aURL = INetURLObject( aURLStr );
}
// get adjusted FileName
String aFileName( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
if (!aFileName.Len())
{
/**********************************************************************
* Wieder aktuelles Dokument anzeigen
**********************************************************************/
maDropFileName = aFileName;
}
else
{
/**********************************************************************
* Hineingedraggtes Dokument anzeigen
**********************************************************************/
const SfxFilter* pFilter = NULL;
ErrCode nErr = 0;
if (aFileName != maDropFileName)
{
SfxMedium aMed(aFileName, (STREAM_READ | STREAM_SHARE_DENYNONE), sal_False);
SfxFilterMatcher aMatch( String::CreateFromAscii("simpress") );
aMed.UseInteractionHandler( sal_True );
nErr = aMatch.GuessFilter(aMed, &pFilter);
}
if ((pFilter && !nErr) || aFileName == maDropFileName)
{
// Das Medium muss ggf. mit READ/WRITE geoeffnet werden, daher wird
// ersteinmal nachgeschaut, ob es einen Storage enthaelt
SfxMedium* pMedium = new SfxMedium( aFileName,
STREAM_READ | STREAM_NOCREATE,
sal_True); // Download
if (pMedium->IsStorage())
{
// Jetzt modusabhaengig:
// maTlbObjects.SetSelectionMode(MULTIPLE_SELECTION);
// Eigentuemeruebergabe von pMedium;
SdDrawDocument* pDropDoc = maTlbObjects.GetBookmarkDoc(pMedium);
if (pDropDoc)
{
maTlbObjects.Clear();
maDropFileName = aFileName;
if( !maTlbObjects.IsEqualToDoc( pDropDoc ) )
{
// Nur normale Seiten
maTlbObjects.Fill(pDropDoc, (sal_Bool) sal_False, maDropFileName);
RefreshDocumentLB( &maDropFileName );
}
}
}
else
{
bReturn = sal_False;
delete pMedium;
}
}
else
{
bReturn = sal_False;
}
}
return (bReturn);
}
// -----------------------------------------------------------------------
void SdNavigatorWin::RefreshDocumentLB( const String* pDocName )
{
sal_uInt16 nPos = 0;
if( pDocName )
{
if( mbDocImported )
maLbDocs.RemoveEntry( 0 );
maLbDocs.InsertEntry( *pDocName, 0 );
mbDocImported = sal_True;
}
else
{
nPos = maLbDocs.GetSelectEntryPos();
if( nPos == LISTBOX_ENTRY_NOTFOUND )
nPos = 0;
String aStr;
if( mbDocImported )
aStr = maLbDocs.GetEntry( 0 );
maLbDocs.Clear();
// Liste der DocInfos loeschen
long nCount = mpDocList->Count();
while( nCount-- )
delete (NavDocInfo*) mpDocList->Remove( (sal_uLong)0 );
if( mbDocImported )
maLbDocs.InsertEntry( aStr, 0 );
::sd::DrawDocShell* pCurrentDocShell =
PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() );
SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst(0, sal_False);
while( pSfxDocShell )
{
::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell, pSfxDocShell );
if( pDocShell && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) )
{
NavDocInfo* pInfo = new NavDocInfo();
pInfo->mpDocShell = pDocShell;
aStr = pDocShell->GetMedium()->GetName();
if( aStr.Len() )
pInfo->SetName();
else
pInfo->SetName( sal_False );
// z.Z. wird wieder der Name der Shell genommen (also ohne Pfad)
// da Koose es als Fehler ansieht, wenn er Pfad in URL-Notation
// angezeigt wird!
aStr = pDocShell->GetName();
maLbDocs.InsertEntry( aStr, LISTBOX_APPEND );
//
if( pDocShell == pCurrentDocShell )
pInfo->SetActive();
else
pInfo->SetActive( sal_False );
mpDocList->Insert( pInfo, LIST_APPEND );
}
pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, 0 , sal_False );
}
}
maLbDocs.SelectEntryPos( nPos );
}
//------------------------------------------------------------------------
sal_uInt16 SdNavigatorWin::GetDragTypeSdResId( NavigatorDragType eDT, sal_Bool bImage )
{
switch( eDT )
{
case NAVIGATOR_DRAGTYPE_NONE:
return( bImage ? 0 : STR_NONE );
case NAVIGATOR_DRAGTYPE_URL:
return( bImage ? TBI_HYPERLINK : STR_DRAGTYPE_URL );
case NAVIGATOR_DRAGTYPE_EMBEDDED:
return( bImage ? TBI_EMBEDDED : STR_DRAGTYPE_EMBEDDED );
case NAVIGATOR_DRAGTYPE_LINK:
return( bImage ? TBI_LINK : STR_DRAGTYPE_LINK );
default: DBG_ERROR( "Keine Resource fuer DragType vorhanden!" );
}
return( 0 );
}
//------------------------------------------------------------------------
NavDocInfo* SdNavigatorWin::GetDocInfo()
{
long nPos = maLbDocs.GetSelectEntryPos();
if( mbDocImported )
{
if( nPos == 0 )
{
return( NULL );
}
nPos--;
}
NavDocInfo* pInfo = (NavDocInfo*)mpDocList->GetObject( nPos );
return( pInfo );
}
/*************************************************************************
|*
|* PreNotify
|*
\************************************************************************/
long SdNavigatorWin::Notify(NotifyEvent& rNEvt)
{
const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
long nOK = sal_False;
if( pKEvt )
{
if( KEY_ESCAPE == pKEvt->GetKeyCode().GetCode() )
{
if( SdPageObjsTLB::IsInDrag() )
{
// during drag'n'drop we just stop the drag but do not close the navigator
nOK = sal_True;
}
else
{
::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
if( pBase )
{
sd::SlideShow::Stop( *pBase );
// Stopping the slide show may result in a synchronous
// deletion of the navigator window. Calling the
// parents Notify after this is unsafe. Therefore we
// return now.
return sal_True;
}
}
}
}
if( !nOK )
nOK = Window::Notify( rNEvt );
return( nOK );
}
/*************************************************************************
|*
|* KeyInput: ESCAPE abfangen, um Show zu beenden
|*
\************************************************************************/
void SdNavigatorWin::KeyInput( const KeyEvent& rKEvt )
{
long nOK = sal_False;
if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
{
if( SdPageObjsTLB::IsInDrag() )
{
// during drag'n'drop we just stop the drag but do not close the navigator
nOK = sal_True;
}
else
{
::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
if(pBase)
{
::sd::SlideShow::Stop( *pBase );
}
}
}
if (!nOK)
{
Window::KeyInput(rKEvt);
}
}
void SdNavigatorWin::DataChanged( const DataChangedEvent& rDCEvt )
{
if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
ApplyImageList();
Window::DataChanged( rDCEvt );
}
void SdNavigatorWin::SetDragImage()
{
maToolbox.SetItemImage( TBI_DRAGTYPE, maToolbox.GetImageList().GetImage( GetDragTypeSdResId( meDragType, sal_True ) ) );
}
void SdNavigatorWin::ApplyImageList()
{
const bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
maToolbox.SetImageList( bHighContrast ? maImageListH : maImageList );
maToolbox.SetItemImage(TBI_SHAPE_FILTER, BitmapEx(SdResId( bHighContrast ? BMP_GRAPHIC_H : BMP_GRAPHIC)));
SetDragImage();
}
/*************************************************************************
|*
|* ControllerItem fuer Navigator
|*
\************************************************************************/
SdNavigatorControllerItem::SdNavigatorControllerItem(
sal_uInt16 _nId,
SdNavigatorWin* pNavWin,
SfxBindings* _pBindings,
const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
: SfxControllerItem( _nId, *_pBindings ),
pNavigatorWin( pNavWin ),
maUpdateRequest(rUpdateRequest)
{
}
// -----------------------------------------------------------------------
void SdNavigatorControllerItem::StateChanged( sal_uInt16 nSId,
SfxItemState eState, const SfxPoolItem* pItem )
{
if( eState >= SFX_ITEM_AVAILABLE && nSId == SID_NAVIGATOR_STATE )
{
const SfxUInt32Item* pStateItem = PTR_CAST( SfxUInt32Item, pItem );
DBG_ASSERT( pStateItem, "SfxUInt16Item erwartet");
sal_uInt32 nState = pStateItem->GetValue();
// Stift
if( nState & NAVBTN_PEN_ENABLED &&
!pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
pNavigatorWin->maToolbox.EnableItem( TBI_PEN );
if( nState & NAVBTN_PEN_DISABLED &&
pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
pNavigatorWin->maToolbox.EnableItem( TBI_PEN, sal_False );
if( nState & NAVBTN_PEN_CHECKED &&
!pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
pNavigatorWin->maToolbox.CheckItem( TBI_PEN );
if( nState & NAVBTN_PEN_UNCHECKED &&
pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
pNavigatorWin->maToolbox.CheckItem( TBI_PEN, sal_False );
// Nur wenn Doc in LB das Aktive ist
NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
if( pInfo && pInfo->IsActive() )
{
// First
if( nState & NAVBTN_FIRST_ENABLED &&
!pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
pNavigatorWin->maToolbox.EnableItem( TBI_FIRST );
if( nState & NAVBTN_FIRST_DISABLED &&
pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
pNavigatorWin->maToolbox.EnableItem( TBI_FIRST, sal_False );
// Prev
if( nState & NAVBTN_PREV_ENABLED &&
!pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS );
if( nState & NAVBTN_PREV_DISABLED &&
pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS, sal_False );
// Last
if( nState & NAVBTN_LAST_ENABLED &&
!pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
pNavigatorWin->maToolbox.EnableItem( TBI_LAST );
if( nState & NAVBTN_LAST_DISABLED &&
pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
pNavigatorWin->maToolbox.EnableItem( TBI_LAST, sal_False );
// Next
if( nState & NAVBTN_NEXT_ENABLED &&
!pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
pNavigatorWin->maToolbox.EnableItem( TBI_NEXT );
if( nState & NAVBTN_NEXT_DISABLED &&
pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
pNavigatorWin->maToolbox.EnableItem( TBI_NEXT, sal_False );
if( nState & NAVTLB_UPDATE )
{
// InitTlb; Wird ueber Slot initiiert
if (maUpdateRequest)
maUpdateRequest();
}
}
}
}
/*************************************************************************
|*
|* ControllerItem fuer Navigator, um die Seite in der TreeLB anzuzeigen
|*
\************************************************************************/
SdPageNameControllerItem::SdPageNameControllerItem(
sal_uInt16 _nId,
SdNavigatorWin* pNavWin,
SfxBindings* _pBindings,
const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
: SfxControllerItem( _nId, *_pBindings ),
pNavigatorWin( pNavWin ),
maUpdateRequest(rUpdateRequest)
{
}
// -----------------------------------------------------------------------
void SdPageNameControllerItem::StateChanged( sal_uInt16 nSId,
SfxItemState eState, const SfxPoolItem* pItem )
{
if( eState >= SFX_ITEM_AVAILABLE && nSId == SID_NAVIGATOR_PAGENAME )
{
// Nur wenn Doc in LB das Aktive ist
NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
if( pInfo && pInfo->IsActive() )
{
const SfxStringItem* pStateItem = PTR_CAST( SfxStringItem, pItem );
DBG_ASSERT( pStateItem, "SfxStringItem erwartet");
String aPageName = pStateItem->GetValue();
if( !pNavigatorWin->maTlbObjects.HasSelectedChilds( aPageName ) )
{
if( pNavigatorWin->maTlbObjects.GetSelectionMode() == MULTIPLE_SELECTION )
{
// Weil sonst immer dazuselektiert wird
pNavigatorWin->maTlbObjects.SelectAll( sal_False );
}
pNavigatorWin->maTlbObjects.SelectEntry( aPageName );
}
}
}
}