1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "ChartTransferable.hxx" 28 29 #include <unotools/streamwrap.hxx> 30 #include <vcl/graph.hxx> 31 #include <svl/itempool.hxx> 32 #include <editeng/eeitem.hxx> 33 #include <editeng/fhgtitem.hxx> 34 #include <svx/svditer.hxx> 35 #include <svx/svdmodel.hxx> 36 #include <svx/svdpage.hxx> 37 #include <svx/unomodel.hxx> 38 39 // header for class SdrView 40 #include <svx/svdview.hxx> 41 42 #define CHARTTRANSFER_OBJECTTYPE_DRAWMODEL 1 43 44 using namespace ::com::sun::star; 45 46 using ::com::sun::star::uno::Reference; 47 using ::com::sun::star::uno::Sequence; 48 using ::rtl::OUString; 49 50 namespace chart 51 { 52 53 ChartTransferable::ChartTransferable( SdrModel* pDrawModel, SdrObject* pSelectedObj, bool bDrawing ) 54 :m_pMarkedObjModel( NULL ) 55 ,m_bDrawing( bDrawing ) 56 { 57 SdrExchangeView * pExchgView( new SdrView( pDrawModel )); 58 SdrPageView* pPv = pExchgView->ShowSdrPage( pDrawModel->GetPage( 0 )); 59 if( pSelectedObj ) 60 pExchgView->MarkObj( pSelectedObj, pPv ); 61 else 62 pExchgView->MarkAllObj( pPv ); 63 Graphic aGraphic( pExchgView->GetMarkedObjMetaFile(true)); 64 m_xMetaFileGraphic.set( aGraphic.GetXGraphic()); 65 if ( m_bDrawing ) 66 { 67 m_pMarkedObjModel = ( pExchgView ? pExchgView->GetAllMarkedModel() : NULL ); 68 } 69 delete pExchgView; 70 } 71 72 ChartTransferable::~ChartTransferable() 73 {} 74 75 void ChartTransferable::AddSupportedFormats() 76 { 77 if ( m_bDrawing ) 78 { 79 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 80 } 81 AddFormat( SOT_FORMAT_GDIMETAFILE ); 82 AddFormat( SOT_FORMATSTR_ID_PNG ); 83 AddFormat( SOT_FORMAT_BITMAP ); 84 } 85 86 sal_Bool ChartTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) 87 { 88 sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); 89 sal_Bool bResult = sal_False; 90 91 if( HasFormat( nFormat )) 92 { 93 if ( nFormat == SOT_FORMATSTR_ID_DRAWING ) 94 { 95 bResult = SetObject( m_pMarkedObjModel, CHARTTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor ); 96 } 97 else if ( nFormat == FORMAT_GDIMETAFILE ) 98 { 99 Graphic aGraphic( m_xMetaFileGraphic ); 100 bResult = SetGDIMetaFile( aGraphic.GetGDIMetaFile(), rFlavor ); 101 } 102 else if( nFormat == FORMAT_BITMAP ) 103 { 104 Graphic aGraphic( m_xMetaFileGraphic ); 105 bResult = SetBitmapEx( aGraphic.GetBitmapEx(), rFlavor ); 106 } 107 } 108 109 return bResult; 110 } 111 112 sal_Bool ChartTransferable::WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, 113 const datatransfer::DataFlavor& /* rFlavor */ ) 114 { 115 // called from SetObject, put data into stream 116 117 sal_Bool bRet = sal_False; 118 switch ( nUserObjectId ) 119 { 120 case CHARTTRANSFER_OBJECTTYPE_DRAWMODEL: 121 { 122 SdrModel* pMarkedObjModel = reinterpret_cast< SdrModel* >( pUserObject ); 123 if ( pMarkedObjModel ) 124 { 125 rxOStm->SetBufferSize( 0xff00 ); 126 127 // #108584# 128 // for the changed pool defaults from drawing layer pool set those 129 // attributes as hard attributes to preserve them for saving 130 const SfxItemPool& rItemPool = pMarkedObjModel->GetItemPool(); 131 const SvxFontHeightItem& rDefaultFontHeight = static_cast< const SvxFontHeightItem& >( 132 rItemPool.GetDefaultItem( EE_CHAR_FONTHEIGHT ) ); 133 sal_uInt16 nCount = pMarkedObjModel->GetPageCount(); 134 for ( sal_uInt16 i = 0; i < nCount; ++i ) 135 { 136 const SdrPage* pPage = pMarkedObjModel->GetPage( i ); 137 SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); 138 while ( aIter.IsMore() ) 139 { 140 SdrObject* pObj = aIter.Next(); 141 const SvxFontHeightItem& rItem = static_cast< const SvxFontHeightItem& >( 142 pObj->GetMergedItem( EE_CHAR_FONTHEIGHT ) ); 143 if ( rItem.GetHeight() == rDefaultFontHeight.GetHeight() ) 144 { 145 pObj->SetMergedItem( rDefaultFontHeight ); 146 } 147 } 148 } 149 150 Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); 151 if ( SvxDrawingLayerExport( pMarkedObjModel, xDocOut ) ) 152 { 153 rxOStm->Commit(); 154 } 155 156 bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 157 } 158 } 159 break; 160 default: 161 { 162 DBG_ERROR( "ChartTransferable::WriteObject: unknown object id" ); 163 } 164 break; 165 } 166 return bRet; 167 } 168 169 } // namespace chart 170