xref: /trunk/main/cui/source/dialogs/pastedlg.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 #include <com/sun/star/embed/Aspects.hpp>
31 
32 #include <pastedlg.hxx>
33 #include <svtools/svmedit.hxx>
34 #include <svtools/insdlg.hxx>
35 #include <vcl/dialog.hxx>
36 #include <vcl/button.hxx>
37 #include <vcl/fixed.hxx>
38 #include <vcl/group.hxx>
39 #include <vcl/lstbox.hxx>
40 #include <vcl/msgbox.hxx>
41 #include "svuidlg.hrc"
42 #include <sot/formats.hxx>
43 #include <sot/stg.hxx>
44 #include <svtools/sores.hxx>
45 #include <vcl/svapp.hxx>
46 
47 #include <dialmgr.hxx>
48 
49 SvPasteObjectDialog::SvPasteObjectDialog( Window* pParent )
50 
51     : ModalDialog( pParent, CUI_RES( MD_PASTE_OBJECT ) ),
52     aFtSource( this, CUI_RES( FT_SOURCE ) ),
53     aFtObjectSource( this, CUI_RES( FT_OBJECT_SOURCE ) ),
54     aRbPaste( this, CUI_RES( RB_PASTE ) ),
55     aRbPasteLink( this, CUI_RES( RB_PASTE_LINK ) ),
56     aCbDisplayAsIcon( this, CUI_RES( CB_DISPLAY_AS_ICON ) ),
57     aPbChangeIcon( this, CUI_RES( PB_CHANGE_ICON ) ),
58     aFlChoice( this, CUI_RES( FL_CHOICE ) ),
59     aLbInsertList( this, CUI_RES( LB_INSERT_LIST ) ),
60     aOKButton1( this, CUI_RES( 1 ) ),
61     aCancelButton1( this, CUI_RES( 1 ) ),
62     aHelpButton1( this, CUI_RES( 1 ) ),
63     aSObject( CUI_RES( S_OBJECT ) )
64 {
65     FreeResource();
66 	SetHelpId( HID_PASTE_DLG );
67 	SetUniqueId( HID_PASTE_DLG );
68 
69 	Font aFont = aFtObjectSource.GetFont();
70 	aFont.SetWeight( WEIGHT_LIGHT );
71 	aFtObjectSource.SetFont( aFont );
72 	aOKButton1.Disable();
73 
74     ObjectLB().SetSelectHdl( LINK( this, SvPasteObjectDialog, SelectHdl ) );
75     ObjectLB().SetDoubleClickHdl( LINK( this, SvPasteObjectDialog, DoubleClickHdl ) );
76 	SetDefault();
77 
78 	aLbInsertList.SetAccessibleName(aFlChoice.GetText());
79 }
80 
81 void SvPasteObjectDialog::SelectObject()
82 {
83 	if ( aLbInsertList.GetEntryCount() &&
84 		 !aRbPaste.IsVisible() && !aRbPasteLink.IsVisible() )
85 	{
86 		aLbInsertList.SelectEntryPos(0);
87 		SelectHdl( &aLbInsertList );
88 	}
89 }
90 
91 IMPL_LINK( SvPasteObjectDialog, SelectHdl, ListBox *, pListBox )
92 {
93 	(void)pListBox;
94 
95 	if ( !aOKButton1.IsEnabled() )
96 		aOKButton1.Enable();
97 	return 0;
98 }
99 
100 IMPL_LINK_INLINE_START( SvPasteObjectDialog, DoubleClickHdl, ListBox *, pListBox )
101 {
102 	(void)pListBox;
103 
104 	EndDialog( RET_OK );
105 	return 0;
106 }
107 IMPL_LINK_INLINE_END( SvPasteObjectDialog, DoubleClickHdl, ListBox *, pListBox )
108 
109 void SvPasteObjectDialog::SetDefault()
110 {
111 	bLink   = sal_False;
112     nAspect = (sal_uInt16)::com::sun::star::embed::Aspects::MSOLE_CONTENT;
113 }
114 
115 SvPasteObjectDialog::~SvPasteObjectDialog()
116 {
117 	void * pStr = aSupplementTable.First();
118 	while( pStr )
119 	{
120 		delete (String *)pStr;
121 		pStr = aSupplementTable.Next();
122 	}
123 }
124 
125 /*************************************************************************
126 |*    SvPasteObjectDialog::Insert()
127 |*
128 |*    Beschreibung
129 |*    Ersterstellung    MM 14.06.94
130 |*    Letzte Aenderung  KA 16.03.2001
131 *************************************************************************/
132 void SvPasteObjectDialog::Insert( SotFormatStringId nFormat, const String& rFormatName )
133 {
134 	String * pStr = new String( rFormatName );
135 	if( !aSupplementTable.Insert( nFormat, pStr ) )
136 		delete pStr;
137 }
138 
139 sal_uLong SvPasteObjectDialog::GetFormat( const TransferableDataHelper& rHelper,
140                                       const DataFlavorExVector* pFormats,
141                                       const TransferableObjectDescriptor* )
142 {
143     //TODO/LATER: why is the Descriptor never used?!
144 	TransferableObjectDescriptor aDesc;
145     if( rHelper.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
146 	    ((TransferableDataHelper&)rHelper).GetTransferableObjectDescriptor(
147 								SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aDesc );
148     if ( !pFormats )
149         pFormats = &rHelper.GetDataFlavorExVector();
150 
151 	//Dialogbox erzeugen und fuellen
152 	String aSourceName, aTypeName;
153 	sal_uLong nSelFormat = 0;
154 	SvGlobalName aEmptyNm;
155 
156     ObjectLB().SetUpdateMode( sal_False );
157 
158     DataFlavorExVector::iterator aIter( ((DataFlavorExVector&)*pFormats).begin() ),
159                                  aEnd( ((DataFlavorExVector&)*pFormats).end() );
160 	while( aIter != aEnd )
161 	{
162 		::com::sun::star::datatransfer::DataFlavor aFlavor( *aIter );
163 		SotFormatStringId nFormat = (*aIter++).mnSotId;
164 
165 		String*	pName = (String*) aSupplementTable.Get( nFormat );
166 		String aName;
167 
168 #ifdef WNT
169 /*
170 		if( !pName &&
171 			( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE_OLE || nFormat == SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ) )
172 		{
173 			sal_Bool IsClipboardObject_Impl( SotDataObject * );
174 			if( IsClipboardObject_Impl( pDataObj ) )
175 			{
176 				IDataObject * pDO = NULL;
177 				OleGetClipboard( &pDO );
178 				if( pDO )
179 				{
180 					FORMATETC fe;
181 					STGMEDIUM stm;
182 					(fe).cfFormat=RegisterClipboardFormat( "Object Descriptor" );
183 					(fe).dwAspect=DVASPECT_CONTENT;
184 					(fe).ptd=NULL;
185 					(fe).tymed=TYMED_HGLOBAL;
186 					(fe).lindex=-1;
187 
188 					if (SUCCEEDED(pDO->GetData(&fe, &stm)))
189 					{
190 						LPOBJECTDESCRIPTOR pOD=(LPOBJECTDESCRIPTOR)GlobalLock(stm.hGlobal);
191 						if( pOD->dwFullUserTypeName )
192 						{
193 							OLECHAR * pN = (OLECHAR *)(((sal_uInt8 *)pOD) + pOD->dwFullUserTypeName);
194 							aName.Append( pN );
195 							pName = &aName;
196 							// set format to ole object
197 							nFormat = SOT_FORMATSTR_ID_EMBED_SOURCE_OLE;
198 						}
199 						if( pOD->dwSrcOfCopy )
200 						{
201 							OLECHAR * pN = (OLECHAR *)(((sal_uInt8 *)pOD) + pOD->dwSrcOfCopy);
202 							aSourceName.Append( *pN++ );
203 						}
204 						else
205 							aSourceName = String( ResId( STR_UNKNOWN_SOURCE, SOAPP->GetResMgr() ) );
206 						GlobalUnlock(stm.hGlobal);
207 						ReleaseStgMedium(&stm);
208 					}
209 				}
210 			}
211 		}
212 */
213 #endif
214 
215 		// if there is an "Embed Source" or and "Embedded Object" on the
216 		// Clipboard we read the Description and the Source of this object
217 		// from an accompanied "Object Descriptor" format on the clipboard
218 		// Remember: these formats mostly appear together on the clipboard
219 		if ( !pName )
220 		{
221             SvPasteObjectHelper::GetEmbeddedName(rHelper,aName,aSourceName,nFormat);
222 			if ( aName.Len() )
223 				pName = &aName;
224 		}
225 
226 
227 		if( pName )
228 		{
229 			aName = *pName;
230 
231 			if( SOT_FORMATSTR_ID_EMBED_SOURCE == nFormat )
232 			{
233                 if( aDesc.maClassName != aEmptyNm )                                {
234 					aSourceName = aDesc.maDisplayName;
235 
236 					if( aDesc.maClassName == aObjClassName )
237 						aName = aObjName;
238 					else
239 						aName = aTypeName = aDesc.maTypeName;
240 				}
241 			}
242 			else if( SOT_FORMATSTR_ID_LINK_SOURCE == nFormat )
243 			{
244                 PasteLink().Enable();
245 				continue;
246 			}
247 			else if( !aName.Len() )
248                 aName = SvPasteObjectHelper::GetSotFormatUIName( nFormat );
249 
250             if( LISTBOX_ENTRY_NOTFOUND == ObjectLB().GetEntryPos( aName ) )
251                 ObjectLB().SetEntryData(
252                     ObjectLB().InsertEntry( aName ), (void*) nFormat );
253 		}
254 	}
255 
256 	if( !aTypeName.Len() && !aSourceName.Len() )
257 	{
258 		if( aDesc.maClassName != aEmptyNm )
259 		{
260 			aSourceName = aDesc.maDisplayName;
261 			aTypeName = aDesc.maTypeName;
262 		}
263 
264 		if( !aTypeName.Len() && !aSourceName.Len() )
265         {
266             com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale();
267             ResMgr* pMgr = ResMgr::CreateResMgr( "svt", aLocale );
268             // global resource from svtools (former so3 resource)
269             if( pMgr )
270                 aSourceName = String( ResId( STR_UNKNOWN_SOURCE, *pMgr ) );
271             delete pMgr;
272         }
273 	}
274 
275     ObjectLB().SetUpdateMode( sal_True );
276     SelectObject();
277 
278 	if( aSourceName.Len() )
279 	{
280 		if( aTypeName.Len() )
281 			aTypeName += '\n';
282 
283 		aTypeName += aSourceName;
284 		aTypeName.ConvertLineEnd();
285 	}
286 
287     ObjectSource().SetText( aTypeName );
288 
289 	SetDefault();
290 
291     if( Dialog::Execute() == RET_OK )
292 	{
293         bLink = PasteLink().IsChecked();
294 
295         if( AsIconBox().IsChecked() )
296             nAspect = (sal_uInt16)com::sun::star::embed::Aspects::MSOLE_ICON;
297 
298         nSelFormat  = (sal_uLong)ObjectLB().GetEntryData( ObjectLB().GetSelectEntryPos() );
299 	}
300 
301 	return nSelFormat;
302 }
303 
304 void SvPasteObjectDialog::SetObjName( const SvGlobalName & rClass, const String & rObjName )
305 {
306     aObjClassName = rClass;
307     aObjName = rObjName;
308 }
309 
310