xref: /aoo42x/main/svx/source/dialog/pfiledlg.cxx (revision 86e1cf34)
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_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <sfx2/docfile.hxx>
29 #include <com/sun/star/plugin/PluginDescription.hpp>
30 #include <com/sun/star/plugin/XPluginManager.hpp>
31 
32 #include <comphelper/processfactory.hxx>
33 
34 #include "svx/pfiledlg.hxx"
35 #include <svx/dialogs.hrc>
36 
37 #include <svx/dialmgr.hxx>
38 #include <list>
39 
40 using namespace ::rtl;
41 using namespace ::com::sun::star;
42 
43 sal_Char __READONLY_DATA sAudio[] = "audio";
44 sal_Char __READONLY_DATA sVideo[] = "video";
45 
46 /*************************************************************************
47 |*
48 |* Filedialog to insert Plugin-Fileformats
49 |*
50 \************************************************************************/
51 
52 ErrCode SvxPluginFileDlg::Execute()
53 {
54 	return maFileDlg.Execute();
55 }
56 
57 String SvxPluginFileDlg::GetPath() const
58 {
59 	return maFileDlg.GetPath();
60 }
61 
62 SvxPluginFileDlg::SvxPluginFileDlg (Window *, sal_uInt16 nKind ) :
63 	maFileDlg(SFXWB_INSERT)
64 {
65 	// set title of the dialogwindow
66 	switch (nKind)
67 	{
68 		case SID_INSERT_SOUND :
69 		{
70 			maFileDlg.SetTitle(SVX_RESSTR(STR_INSERT_SOUND_TITLE));
71 		}
72 		break;
73 		case SID_INSERT_VIDEO :
74 		{
75 			maFileDlg.SetTitle(SVX_RESSTR(STR_INSERT_VIDEO_TITLE));
76 		}
77 		break;
78 	}
79 
80 	// fill the filterlist of the filedialog with data of installed plugins
81 	uno::Reference< lang::XMultiServiceFactory >  xMgr( ::comphelper::getProcessServiceFactory() );
82 
83 	if( xMgr.is() )
84 	{
85 		uno::Reference< plugin::XPluginManager > rPluginManager( xMgr->createInstance(
86 			OUString::createFromAscii( "com.sun.star.plugin.PluginManager" ) ), uno::UNO_QUERY );
87 		if ( rPluginManager.is() )
88 		{
89 			const uno::Sequence<plugin::PluginDescription > aSeq( rPluginManager->getPluginDescriptions() );
90 			const plugin::PluginDescription* pDescription = aSeq.getConstArray();
91 			sal_Int32 nAnzahlPlugins = rPluginManager->getPluginDescriptions().getLength();
92 
93 			std::list< String >	aPlugNames;
94 			std::list< String >	aPlugExtensions;
95 			std::list< String >::iterator j;
96 			std::list< String >::iterator k;
97 			std::list< String >::const_iterator end;
98 
99 			for ( int i = 0; i < nAnzahlPlugins; i++ )
100 			{
101 				String aStrPlugMIMEType( pDescription[i].Mimetype );
102 				String aStrPlugName( pDescription[i].Description );
103 				String aStrPlugExtension( pDescription[i].Extension );
104 
105 				aStrPlugMIMEType.ToLowerAscii();
106 				aStrPlugExtension.ToLowerAscii();
107 
108 				if ( ( nKind == SID_INSERT_SOUND && aStrPlugMIMEType.SearchAscii ( sAudio ) == 0 ) ||
109 					 ( nKind == SID_INSERT_VIDEO && aStrPlugMIMEType.SearchAscii ( sVideo ) == 0 ) )
110 				{
111 					// extension already in the filterlist of the filedlg ?
112 					sal_Bool bAlreadyExist = sal_False;
113 					for ( j = aPlugExtensions.begin(), end = aPlugExtensions.end(); j != end && !bAlreadyExist; ++j )
114 					{
115 						bAlreadyExist = (j->Search( aStrPlugExtension ) != STRING_NOTFOUND );
116 					}
117 
118 					if ( !bAlreadyExist )
119 					{
120 						// filterdescription already there?
121 						// (then append the new extension to the existing filter)
122 						int nfound = -1;
123  						for ( j = aPlugNames.begin(),
124 								  k = aPlugExtensions.begin(),
125 								  end = aPlugNames.end();
126 							  j != end && nfound != 0;  )
127 						{
128 							if ( ( nfound = j->Search( aStrPlugName ) ) == 0 )
129 							{
130 								if ( aStrPlugExtension.Len() > 0 )
131 									aStrPlugExtension.Insert( sal_Unicode( ';' ) );
132 								aStrPlugExtension.Insert( *k );
133 
134 								// remove old entry, increment (iterators are invalid thereafter, thus the postincrement)
135 								aPlugNames.erase(j++); aPlugExtensions.erase(k++);
136 
137 								// update end iterator (which may be invalid, too!)
138 								end = aPlugNames.end();
139 							}
140 							else
141 							{
142 								// next element
143 								++j; ++k;
144 							}
145 						}
146 
147 						// build filterdescription
148 						aStrPlugName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "  (" ) );
149 						aStrPlugName.Append( aStrPlugExtension );
150 						aStrPlugName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ")" ) );
151 
152 						// use a own description for the video-formate avi, mov and mpeg
153 						// the descriptions of these MIME-types are not very meaningful
154 						const sal_Char sAVI[] = "*.avi";
155 						const sal_Char sMOV[] = "*.mov";
156 						const sal_Char sMPG[] = "*.mpg";
157 						const sal_Char sMPE[] = "*.mpe";
158 						const sal_Char sMPEG[] = "*.mpeg";
159 
160 						if ( aStrPlugExtension.EqualsIgnoreCaseAscii( sAVI ) )
161 							aStrPlugName = SVX_RESSTR( STR_INSERT_VIDEO_EXTFILTER_AVI );
162 						else if ( aStrPlugExtension.EqualsIgnoreCaseAscii( sMOV ) )
163 							aStrPlugName = SVX_RESSTR( STR_INSERT_VIDEO_EXTFILTER_MOV );
164 						else if ( aStrPlugExtension.SearchAscii( sMPG ) != STRING_NOTFOUND ||
165 								  aStrPlugExtension.SearchAscii( sMPE ) != STRING_NOTFOUND ||
166 								  aStrPlugExtension.SearchAscii( sMPEG ) != STRING_NOTFOUND )
167 							aStrPlugName = SVX_RESSTR(STR_INSERT_VIDEO_EXTFILTER_MPEG);
168 
169 						aPlugNames.push_back( aStrPlugName );
170 						aPlugExtensions.push_back( aStrPlugExtension );
171 					}
172 				}
173 			}
174 
175 			// add filter to dialog
176 			for ( j = aPlugNames.begin(),
177 					  k = aPlugExtensions.begin(),
178 					  end = aPlugNames.end();
179 				  j != end; ++j, ++k )
180 			{
181 				maFileDlg.AddFilter( *j, *k );
182 			}
183 		}
184 	}
185 
186 	// add the All-Filter
187     String aAllFilter( ResId( STR_EXTFILTER_ALL, DIALOG_MGR() ) );
188 	maFileDlg.AddFilter( aAllFilter, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.*" ) ) );
189 
190 	// and activate him
191 	maFileDlg.SetCurrentFilter( aAllFilter );
192 }
193 
194 /*************************************************************************
195 |*
196 |* Dtor
197 |*
198 \************************************************************************/
199 
200 SvxPluginFileDlg::~SvxPluginFileDlg()
201 {
202 }
203 
204 /*************************************************************************
205 |*
206 |* Plugins available for the the MIME-Typ in nKind
207 |* (with nKind = SID_INSERT_SOUND for MIME-Type audio
208 |*                SID_INSERT_VIDEO for MIME-Type video
209 |*
210 \************************************************************************/
211 
212 #define PFDLG_CHECKED_SOUND		0x0001
213 #define PFDLG_CHECKED_VIDEO		0x0002
214 #define PFDLG_FOUND_SOUND		0x0004
215 #define PFDLG_FOUND_VIDEO		0x0008
216 
217 bool SvxPluginFileDlg::IsAvailable (sal_uInt16 nKind)
218 {
219 	static sal_uInt16 nCheck = 0;
220 
221 	if ( nKind == SID_INSERT_SOUND && ( nCheck & PFDLG_CHECKED_SOUND ) )
222 		return (nCheck & PFDLG_FOUND_SOUND) != 0;
223 	if ( nKind == SID_INSERT_VIDEO && ( nCheck & PFDLG_CHECKED_VIDEO ) )
224 		return (nCheck & PFDLG_FOUND_VIDEO) != 0;
225 
226 	bool bFound = false;
227 	uno::Reference< lang::XMultiServiceFactory >  xMgr( ::comphelper::getProcessServiceFactory() );
228 
229 	if( xMgr.is() )
230 	{
231 		uno::Reference< plugin::XPluginManager >  rPluginManager = uno::Reference< plugin::XPluginManager > ( xMgr->createInstance( OUString::createFromAscii( "com.sun.star.plugin.PluginManager" ) ), uno::UNO_QUERY );
232 		if( rPluginManager.is() )
233 		{
234 			const uno::Sequence<plugin::PluginDescription > aSeq( rPluginManager->getPluginDescriptions() );
235 			const plugin::PluginDescription* pDescription = aSeq.getConstArray();
236 			sal_Int32 nAnzahlPlugins = rPluginManager->getPluginDescriptions().getLength();
237 
238 			for ( sal_uInt16 i = 0; i < nAnzahlPlugins && !bFound; ++i )
239 			{
240 				String aStrPlugMIMEType( pDescription[i].Mimetype );
241 				switch (nKind)
242 				{
243 					case SID_INSERT_SOUND :
244 					{
245 						nCheck |= PFDLG_CHECKED_SOUND;
246 
247 						if( aStrPlugMIMEType.SearchAscii( sAudio ) == 0 )
248 						{
249 							bFound = true;
250 							nCheck |= PFDLG_FOUND_SOUND;
251 						}
252 					}
253 					break;
254 					case SID_INSERT_VIDEO :
255 					{
256 						nCheck |= PFDLG_CHECKED_VIDEO;
257 
258 						if (aStrPlugMIMEType.SearchAscii( sVideo ) == 0)
259 						{
260 							bFound = true;
261 							nCheck |= PFDLG_FOUND_VIDEO;
262 						}
263 					}
264 					break;
265 				}
266 			}
267 		}
268 	}
269 
270 	return bFound;
271 }
272 
273 void SvxPluginFileDlg::SetContext( sfx2::FileDialogHelper::Context _eNewContext )
274 {
275 	maFileDlg.SetContext( _eNewContext );
276 }
277