blob: 6dda25f2b09910754a38e9f021058b34a4c251dc [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_sw.hxx"
#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#include <tools/stream.hxx>
#include <unotools/pathoptions.hxx>
#include <sot/storage.hxx>
#include <svl/intitem.hxx>
#include <editeng/forbiddencharacterstable.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <svx/xtable.hxx>
#include <svx/drawitem.hxx>
#include <viewsh.hxx>
#include <doc.hxx>
#include <rootfrm.hxx>
#include <drawdoc.hxx>
#include <dpage.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <shellio.hxx>
#include <hintids.hxx>
#include <com/sun/star/embed/ElementModes.hpp>
using namespace com::sun::star;
/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/
const String GetPalettePath()
{
SvtPathOptions aPathOpt;
return aPathOpt.GetPalettePath();
}
SwDrawDocument::SwDrawDocument( SwDoc* pD ) :
FmFormModel( ::GetPalettePath(), &pD->GetAttrPool(), pD->GetDocShell() ),
pDoc( pD )
{
SetScaleUnit( MAP_TWIP );
SetSwapGraphics( sal_True );
SwDocShell* pDocSh = pDoc->GetDocShell();
if ( pDocSh )
{
SetObjectShell( pDocSh );
SvxColorTableItem* pColItem = ( SvxColorTableItem* )
( pDocSh->GetItem( SID_COLOR_TABLE ) );
XColorListSharedPtr aXCol = pColItem ?
pColItem->GetColorTable() :
XColorList::GetStdColorList();
SetColorTableAtSdrModel( aXCol );
if ( !pColItem )
pDocSh->PutItem( SvxColorTableItem( aXCol, SID_COLOR_TABLE ) );
pDocSh->PutItem( SvxGradientListItem( GetGradientListFromSdrModel(), SID_GRADIENT_LIST ));
pDocSh->PutItem( SvxHatchListItem( GetHatchListFromSdrModel(), SID_HATCH_LIST ) );
pDocSh->PutItem( SvxBitmapListItem( GetBitmapListFromSdrModel(), SID_BITMAP_LIST ) );
pDocSh->PutItem( SvxDashListItem( GetDashListFromSdrModel(), SID_DASH_LIST ) );
pDocSh->PutItem( SvxLineEndListItem( GetLineEndListFromSdrModel(), SID_LINEEND_LIST ) );
pDocSh->PutItem( SfxUInt16Item(SID_ATTR_LINEEND_WIDTH_DEFAULT, 111) );
SetObjectShell( pDocSh );
}
else
SetColorTableAtSdrModel( XColorList::GetStdColorList() );
// copy all the default values to the SdrModel
SfxItemPool* pSdrPool = pD->GetAttrPool().GetSecondaryPool();
if( pSdrPool )
{
const sal_uInt16 aWhichRanges[] =
{
RES_CHRATR_BEGIN, RES_CHRATR_END,
RES_PARATR_BEGIN, RES_PARATR_END,
0
};
SfxItemPool& rDocPool = pD->GetAttrPool();
sal_uInt16 nEdtWhich, nSlotId;
const SfxPoolItem* pItem;
for( const sal_uInt16* pRangeArr = aWhichRanges;
*pRangeArr; pRangeArr += 2 )
for( sal_uInt16 nW = *pRangeArr, nEnd = *(pRangeArr+1);
nW < nEnd; ++nW )
if( 0 != (pItem = rDocPool.GetPoolDefaultItem( nW )) &&
0 != (nSlotId = rDocPool.GetSlotId( nW ) ) &&
nSlotId != nW &&
0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
nSlotId != nEdtWhich )
{
SfxPoolItem* pCpy = pItem->Clone();
pCpy->SetWhich( nEdtWhich );
pSdrPool->SetPoolDefaultItem( *pCpy );
delete pCpy;
}
}
SetForbiddenCharsTable( pD->getForbiddenCharacterTable() );
// #87795# Implementation for asian compression
SetCharCompressType( static_cast<sal_uInt16>(pD->getCharacterCompressionType() ));
}
/*************************************************************************
|*
|* Destruktor
|*
\************************************************************************/
SwDrawDocument::~SwDrawDocument()
{
Broadcast(SdrHint(HINT_MODELCLEARED));
// #116168#
ClearModel(sal_True);
//Clear();
}
/*************************************************************************
|*
|* Diese Methode erzeugt eine neue Seite (SdPage) und gibt einen Zeiger
|* darauf zurueck. Die Drawing Engine benutzt diese Methode beim Laden
|* zur Erzeugung von Seiten (deren Typ sie ja nicht kennt, da es ABLEITUNGEN
|* der SdrPage sind).
|*
\************************************************************************/
SdrPage* SwDrawDocument::AllocPage(FASTBOOL bMasterPage)
{
SwDPage* pPage = new SwDPage(*this, 0 != bMasterPage);
pPage->SetName( String::CreateFromAscii(
RTL_CONSTASCII_STRINGPARAM( "Controls" )) );
return pPage;
}
SvStream* SwDrawDocument::GetDocumentStream( SdrDocumentStreamInfo& rInfo ) const
{
SvStream* pRet = NULL;
uno::Reference < embed::XStorage > xRoot( pDoc->GetDocStorage() );
if( xRoot.is() )
{
if( rInfo.maUserData.Len() &&
( rInfo.maUserData.GetToken( 0, ':' ) ==
String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) )
{
const String aPicturePath( rInfo.maUserData.GetToken( 1, ':' ) );
// graphic from picture stream in picture storage in XML package
if( aPicturePath.GetTokenCount( '/' ) == 2 )
{
const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) );
const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) );
try
{
uno::Reference < embed::XStorage > xPictureStorage = xRoot->openStorageElement(
aPictureStorageName, embed::ElementModes::READ );
uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement(
aPictureStreamName, embed::ElementModes::READ );
pRet = utl::UcbStreamHelper::CreateStream( xStream );
if( pRet )
{
rInfo.mbDeleteAfterUse = sal_True;
rInfo.mxStorageRef = xPictureStorage;
}
}
catch ( uno::Exception& )
{
}
}
}
}
return pRet;
}
SdrLayerID SwDrawDocument::GetControlExportLayerId( const SdrObject & ) const
{
//fuer Versionen < 5.0, es gab nur Hell und Heaven
return (SdrLayerID)pDoc->GetHeavenId();
}
// --> OD 2006-03-01 #b6382898#
uno::Reference< uno::XInterface > SwDrawDocument::createUnoModel()
{
uno::Reference< uno::XInterface > xModel;
try
{
if ( GetDoc().GetDocShell() )
{
xModel = GetDoc().GetDocShell()->GetModel();
}
}
catch( uno::RuntimeException& )
{
ASSERT( false,
"<SwDrawDocument::createUnoModel()> - could *not* retrieve model at <SwDocShell>" );
}
return xModel;
}
// <--