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_filter.hxx"
26 #include <com/sun/star/container/XNameAccess.hpp>
27 #ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_
28 #include <com/sun/star/beans/PropertyValue.hpp>
29 #endif
30 #include <tools/resid.hxx>
31 #include <vcl/msgbox.hxx>
32 #include <osl/file.hxx>
33
34 #include "xmlfilterdialogstrings.hrc"
35 #include "xmlfiltertabdialog.hxx"
36 #include "xmlfiltertabdialog.hrc"
37 #include "xmlfiltertabpagebasic.hrc"
38 #include "xmlfiltertabpagexslt.hrc"
39 #include "xmlfiltertabpagebasic.hxx"
40 #include "xmlfiltertabpagexslt.hxx"
41 #include "xmlfiltersettingsdialog.hxx"
42 #include "xmlfiltersettingsdialog.hrc"
43 #include "xmlfilterhelpids.hrc"
44
45 using namespace rtl;
46 using namespace com::sun::star::uno;
47 using namespace com::sun::star::container;
48 using namespace com::sun::star::beans;
49 using namespace com::sun::star::lang;
50
XMLFilterTabDialog(Window * pParent,ResMgr & rResMgr,const Reference<XMultiServiceFactory> & rxMSF,const filter_info_impl * pInfo)51 XMLFilterTabDialog::XMLFilterTabDialog( Window *pParent, ResMgr& rResMgr, const Reference< XMultiServiceFactory >& rxMSF, const filter_info_impl* pInfo ) :
52 TabDialog( pParent, ResId( DLG_XML_FILTER_TABDIALOG, rResMgr ) ),
53 mxMSF( rxMSF ),
54 mrResMgr( rResMgr ),
55 maTabCtrl( this, ResId( 1, rResMgr ) ),
56 maOKBtn( this ),
57 maCancelBtn( this ),
58 maHelpBtn( this )
59 {
60 FreeResource();
61
62 maTabCtrl.SetHelpId( HID_XML_FILTER_TABPAGE_CTRL );
63
64 mpOldInfo = pInfo;
65 mpNewInfo = new filter_info_impl( *mpOldInfo );
66
67 String aTitle( GetText() );
68 aTitle.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s") ), mpNewInfo->maFilterName );
69 SetText( aTitle );
70
71 maTabCtrl.Show();
72 maOKBtn.Show();
73 maCancelBtn.Show();
74 maHelpBtn.Show();
75
76 maOKBtn.SetClickHdl( LINK( this, XMLFilterTabDialog, OkHdl ) );
77
78 maTabCtrl.SetActivatePageHdl( LINK( this, XMLFilterTabDialog, ActivatePageHdl ) );
79 maTabCtrl.SetDeactivatePageHdl( LINK( this, XMLFilterTabDialog, DeactivatePageHdl ) );
80
81 mpBasicPage = new XMLFilterTabPageBasic( &maTabCtrl, mrResMgr );
82 mpBasicPage->SetInfo( mpNewInfo );
83
84 maTabCtrl.SetTabPage( RID_XML_FILTER_TABPAGE_BASIC, mpBasicPage );
85
86 Size aSiz = mpBasicPage->GetSizePixel();
87 Size aCtrlSiz = maTabCtrl.GetTabPageSizePixel();
88 // set size on TabControl only if smaller than TabPage
89 if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() )
90 {
91 maTabCtrl.SetTabPageSizePixel( aSiz );
92 aCtrlSiz = aSiz;
93 }
94
95 mpXSLTPage = new XMLFilterTabPageXSLT( &maTabCtrl, mrResMgr, mxMSF );
96 mpXSLTPage->SetInfo( mpNewInfo );
97
98 maTabCtrl.SetTabPage( RID_XML_FILTER_TABPAGE_XSLT, mpXSLTPage );
99
100 aSiz = mpXSLTPage->GetSizePixel();
101 if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() )
102 {
103 maTabCtrl.SetTabPageSizePixel( aSiz );
104 aCtrlSiz = aSiz;
105 }
106
107 ActivatePageHdl( &maTabCtrl );
108
109 AdjustLayout();
110 }
111
112 // -----------------------------------------------------------------------
113
~XMLFilterTabDialog()114 XMLFilterTabDialog::~XMLFilterTabDialog()
115 {
116 delete mpBasicPage;
117 delete mpXSLTPage;
118 delete mpNewInfo;
119 }
120
121 // -----------------------------------------------------------------------
122
onOk()123 bool XMLFilterTabDialog::onOk()
124 {
125 mpXSLTPage->FillInfo( mpNewInfo );
126 mpBasicPage->FillInfo( mpNewInfo );
127
128 sal_uInt16 nErrorPage = 0;
129 sal_uInt16 nErrorId = 0;
130 Window* pFocusWindow = NULL;
131 String aReplace1;
132 String aReplace2;
133
134 // 1. see if the filter name is ok
135 if( (mpNewInfo->maFilterName.getLength() == 0) || (mpNewInfo->maFilterName != mpOldInfo->maFilterName) )
136 {
137 // if the user deleted the filter name, we reset the original filter name
138 if( mpNewInfo->maFilterName.getLength() == 0 )
139 {
140 mpNewInfo->maFilterName = mpOldInfo->maFilterName;
141 }
142 else
143 {
144 try
145 {
146 Reference< XNameAccess > xFilterContainer( mxMSF->createInstance( OUString::createFromAscii("com.sun.star.document.FilterFactory" ) ), UNO_QUERY );
147 if( xFilterContainer.is() )
148 {
149 if( xFilterContainer->hasByName( mpNewInfo->maFilterName ) )
150 {
151 nErrorPage = RID_XML_FILTER_TABPAGE_BASIC;
152 nErrorId = STR_ERROR_FILTER_NAME_EXISTS;
153 pFocusWindow = &(mpBasicPage->maEDFilterName);
154 aReplace1 = mpNewInfo->maFilterName;
155 }
156
157 }
158 }
159 catch( Exception& )
160 {
161 DBG_ERROR( "XMLFilterTabDialog::onOk exception caught!" );
162 }
163 }
164 }
165
166 // 2. see if the interface name is ok
167 if( (mpNewInfo->maInterfaceName.getLength() == 0) || (mpNewInfo->maInterfaceName != mpOldInfo->maInterfaceName) )
168 {
169 // if the user deleted the interface name, we reset the original filter name
170 if( mpNewInfo->maInterfaceName.getLength() == 0 )
171 {
172 mpNewInfo->maInterfaceName = mpOldInfo->maInterfaceName;
173 }
174 else
175 {
176 try
177 {
178 Reference< XNameAccess > xFilterContainer( mxMSF->createInstance( OUString::createFromAscii("com.sun.star.document.FilterFactory" ) ), UNO_QUERY );
179 if( xFilterContainer.is() )
180 {
181 Sequence< OUString > aFilterNames( xFilterContainer->getElementNames() );
182 OUString* pFilterName = aFilterNames.getArray();
183
184 const sal_Int32 nCount = aFilterNames.getLength();
185 sal_Int32 nFilter;
186
187 Sequence< PropertyValue > aValues;
188 for( nFilter = 0; (nFilter < nCount) && (nErrorId == 0); nFilter++, pFilterName++ )
189 {
190 Any aAny( xFilterContainer->getByName( *pFilterName ) );
191 if( !(aAny >>= aValues) )
192 continue;
193
194 const sal_Int32 nValueCount( aValues.getLength() );
195 PropertyValue* pValues = aValues.getArray();
196 sal_Int32 nValue;
197
198 for( nValue = 0; (nValue < nValueCount) && (nErrorId == 0); nValue++, pValues++ )
199 {
200 if( pValues->Name.equalsAscii( "UIName" ) )
201 {
202 OUString aInterfaceName;
203 pValues->Value >>= aInterfaceName;
204 if( aInterfaceName == mpNewInfo->maInterfaceName )
205 {
206 nErrorPage = RID_XML_FILTER_TABPAGE_BASIC;
207 nErrorId = STR_ERROR_TYPE_NAME_EXISTS;
208 pFocusWindow = &(mpBasicPage->maEDInterfaceName);
209 aReplace1 = mpNewInfo->maInterfaceName;
210 aReplace2 = *pFilterName;
211 }
212 }
213 }
214 }
215 }
216 }
217 catch( Exception& )
218 {
219 DBG_ERROR( "XMLFilterTabDialog::onOk exception caught!" );
220 }
221 }
222 }
223
224 // 3. see if the dtd is valid
225 if( 0 == nErrorId )
226 {
227 if( (mpNewInfo->maDTD != mpOldInfo->maDTD) && isFileURL( mpNewInfo->maDTD ) )
228 {
229 osl::File aFile( mpNewInfo->maDTD );
230 osl::File::RC aRC = aFile.open( OpenFlag_Read );
231 if( aRC != osl::File::E_None )
232 {
233 nErrorId = STR_ERROR_DTD_NOT_FOUND;
234 nErrorPage = RID_XML_FILTER_TABPAGE_XSLT;
235 pFocusWindow = &(mpXSLTPage->maEDDTDSchema);
236 }
237 }
238 }
239
240 if( 0 == nErrorId )
241 {
242 // 4. see if the export xslt is valid
243 if( (mpNewInfo->maExportXSLT != mpOldInfo->maExportXSLT) && isFileURL( mpNewInfo->maExportXSLT ) )
244 {
245 osl::File aFile( mpNewInfo->maExportXSLT );
246 osl::File::RC aRC = aFile.open( OpenFlag_Read );
247 if( aRC != osl::File::E_None )
248 {
249 nErrorId = STR_ERROR_EXPORT_XSLT_NOT_FOUND;
250 nErrorPage = RID_XML_FILTER_TABPAGE_XSLT;
251 pFocusWindow = &(mpXSLTPage->maEDExportXSLT);
252 }
253 }
254 }
255
256 if( 0 == nErrorId )
257 {
258 // 5. see if the import xslt is valid
259 if( (mpNewInfo->maImportXSLT != mpOldInfo->maImportXSLT) && isFileURL( mpNewInfo->maImportXSLT ) )
260 {
261 osl::File aFile( mpNewInfo->maImportXSLT );
262 osl::File::RC aRC = aFile.open( OpenFlag_Read );
263 if( aRC != osl::File::E_None )
264 {
265 nErrorId = STR_ERROR_IMPORT_XSLT_NOT_FOUND;
266 nErrorPage = RID_XML_FILTER_TABPAGE_XSLT;
267 pFocusWindow = &(mpXSLTPage->maEDImportTemplate);
268 }
269 }
270 }
271
272 // see if we have at least an import or an export dtd
273 if((mpNewInfo->maImportXSLT.getLength() == 0) && (mpNewInfo->maExportXSLT.getLength() == 0) )
274 {
275 nErrorId = STR_ERROR_EXPORT_XSLT_NOT_FOUND;
276 nErrorPage = RID_XML_FILTER_TABPAGE_XSLT;
277 pFocusWindow = &(mpXSLTPage->maEDExportXSLT);
278 }
279
280 if( 0 == nErrorId )
281 {
282 // 6. see if the import template is valid
283 if( (mpNewInfo->maImportTemplate != mpOldInfo->maImportTemplate) && isFileURL( mpNewInfo->maImportTemplate ) )
284 {
285 osl::File aFile( mpNewInfo->maImportTemplate );
286 osl::File::RC aRC = aFile.open( OpenFlag_Read );
287 if( aRC != osl::File::E_None )
288 {
289 nErrorId = STR_ERROR_IMPORT_TEMPLATE_NOT_FOUND;
290 nErrorPage = RID_XML_FILTER_TABPAGE_XSLT;
291 pFocusWindow = &(mpXSLTPage->maEDImportTemplate);
292 }
293 }
294 }
295
296 if( 0 != nErrorId )
297 {
298 maTabCtrl.SetCurPageId( (sal_uInt16)nErrorPage );
299 ActivatePageHdl( &maTabCtrl );
300
301 ResId aResId( nErrorId, mrResMgr );
302 String aMessage( aResId );
303
304 if( aReplace2.Len() )
305 {
306 aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s1") ), aReplace1 );
307 aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s2") ), aReplace2 );
308 }
309 else if( aReplace1.Len() )
310 {
311 aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s") ), aReplace1 );
312 }
313
314 ErrorBox aBox(this, (WinBits)(WB_OK), aMessage );
315 aBox.Execute();
316
317 if( pFocusWindow )
318 pFocusWindow->GrabFocus();
319
320 return false;
321 }
322 else
323 {
324 return true;
325 }
326 }
327
328 // -----------------------------------------------------------------------
329
getNewFilterInfo() const330 filter_info_impl* XMLFilterTabDialog::getNewFilterInfo() const
331 {
332 return mpNewInfo;
333 }
334
335 // -----------------------------------------------------------------------
336
337 IMPL_LINK( XMLFilterTabDialog, CancelHdl, Button*, /* pButton */ )
338 {
339 Close();
340 return 0;
341 }
342
343 // -----------------------------------------------------------------------
344
IMPL_LINK(XMLFilterTabDialog,OkHdl,Button *,EMPTYARG)345 IMPL_LINK( XMLFilterTabDialog, OkHdl, Button *, EMPTYARG )
346 {
347 if( onOk() )
348 EndDialog(1);
349
350 return 0;
351 }
352
353 // -----------------------------------------------------------------------
354
IMPL_LINK(XMLFilterTabDialog,ActivatePageHdl,TabControl *,pTabCtrl)355 IMPL_LINK( XMLFilterTabDialog, ActivatePageHdl, TabControl *, pTabCtrl )
356 {
357 const sal_uInt16 nId = pTabCtrl->GetCurPageId();
358 TabPage* pTabPage = pTabCtrl->GetTabPage( nId );
359 pTabPage->Show();
360
361 return 0;
362 }
363
364 // -----------------------------------------------------------------------
365
366 IMPL_LINK( XMLFilterTabDialog, DeactivatePageHdl, TabControl *, /* pTabCtrl */ )
367 {
368 return sal_True;
369 }
370