diff options
Diffstat (limited to 'filter/source/xsltdialog/xmlfiltertabdialog.cxx')
-rw-r--r-- | filter/source/xsltdialog/xmlfiltertabdialog.cxx | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/filter/source/xsltdialog/xmlfiltertabdialog.cxx b/filter/source/xsltdialog/xmlfiltertabdialog.cxx new file mode 100644 index 000000000000..1aea5c934d13 --- /dev/null +++ b/filter/source/xsltdialog/xmlfiltertabdialog.cxx @@ -0,0 +1,373 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_filter.hxx" +#include <com/sun/star/container/XNameAccess.hpp> +#ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif +#include <tools/resid.hxx> +#include <vcl/msgbox.hxx> +#include <osl/file.hxx> + +#include "xmlfilterdialogstrings.hrc" +#include "xmlfiltertabdialog.hxx" +#include "xmlfiltertabdialog.hrc" +#include "xmlfiltertabpagebasic.hrc" +#include "xmlfiltertabpagexslt.hrc" +#include "xmlfiltertabpagebasic.hxx" +#include "xmlfiltertabpagexslt.hxx" +#include "xmlfiltersettingsdialog.hxx" +#include "xmlfiltersettingsdialog.hrc" +#include "xmlfilterhelpids.hrc" + +using namespace rtl; +using namespace com::sun::star::uno; +using namespace com::sun::star::container; +using namespace com::sun::star::beans; +using namespace com::sun::star::lang; + +XMLFilterTabDialog::XMLFilterTabDialog( Window *pParent, ResMgr& rResMgr, const Reference< XMultiServiceFactory >& rxMSF, const filter_info_impl* pInfo ) : + TabDialog( pParent, ResId( DLG_XML_FILTER_TABDIALOG, rResMgr ) ), + mxMSF( rxMSF ), + mrResMgr( rResMgr ), + maTabCtrl( this, ResId( 1, rResMgr ) ), + maOKBtn( this ), + maCancelBtn( this ), + maHelpBtn( this ) +{ + FreeResource(); + + maTabCtrl.SetHelpId( HID_XML_FILTER_TABPAGE_CTRL ); + + mpOldInfo = pInfo; + mpNewInfo = new filter_info_impl( *mpOldInfo ); + + String aTitle( GetText() ); + aTitle.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s") ), mpNewInfo->maFilterName ); + SetText( aTitle ); + + maTabCtrl.Show(); + maOKBtn.Show(); + maCancelBtn.Show(); + maHelpBtn.Show(); + + maOKBtn.SetClickHdl( LINK( this, XMLFilterTabDialog, OkHdl ) ); + + maTabCtrl.SetActivatePageHdl( LINK( this, XMLFilterTabDialog, ActivatePageHdl ) ); + maTabCtrl.SetDeactivatePageHdl( LINK( this, XMLFilterTabDialog, DeactivatePageHdl ) ); + + mpBasicPage = new XMLFilterTabPageBasic( &maTabCtrl, mrResMgr ); + mpBasicPage->SetInfo( mpNewInfo ); + + maTabCtrl.SetTabPage( RID_XML_FILTER_TABPAGE_BASIC, mpBasicPage ); + + Size aSiz = mpBasicPage->GetSizePixel(); + Size aCtrlSiz = maTabCtrl.GetTabPageSizePixel(); + // set size on TabControl only if smaller than TabPage + if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() ) + { + maTabCtrl.SetTabPageSizePixel( aSiz ); + aCtrlSiz = aSiz; + } + + mpXSLTPage = new XMLFilterTabPageXSLT( &maTabCtrl, mrResMgr, mxMSF ); + mpXSLTPage->SetInfo( mpNewInfo ); + + maTabCtrl.SetTabPage( RID_XML_FILTER_TABPAGE_XSLT, mpXSLTPage ); + + aSiz = mpXSLTPage->GetSizePixel(); + if ( aCtrlSiz.Width() < aSiz.Width() || aCtrlSiz.Height() < aSiz.Height() ) + { + maTabCtrl.SetTabPageSizePixel( aSiz ); + aCtrlSiz = aSiz; + } + + ActivatePageHdl( &maTabCtrl ); + + AdjustLayout(); +} + +// ----------------------------------------------------------------------- + +XMLFilterTabDialog::~XMLFilterTabDialog() +{ + delete mpBasicPage; + delete mpXSLTPage; + delete mpNewInfo; +} + +// ----------------------------------------------------------------------- + +bool XMLFilterTabDialog::onOk() +{ + mpXSLTPage->FillInfo( mpNewInfo ); + mpBasicPage->FillInfo( mpNewInfo ); + + sal_uInt16 nErrorPage = 0; + sal_uInt16 nErrorId = 0; + Window* pFocusWindow = NULL; + String aReplace1; + String aReplace2; + + // 1. see if the filter name is ok + if( (mpNewInfo->maFilterName.getLength() == 0) || (mpNewInfo->maFilterName != mpOldInfo->maFilterName) ) + { + // if the user deleted the filter name, we reset the original filter name + if( mpNewInfo->maFilterName.getLength() == 0 ) + { + mpNewInfo->maFilterName = mpOldInfo->maFilterName; + } + else + { + try + { + Reference< XNameAccess > xFilterContainer( mxMSF->createInstance( OUString::createFromAscii("com.sun.star.document.FilterFactory" ) ), UNO_QUERY ); + if( xFilterContainer.is() ) + { + if( xFilterContainer->hasByName( mpNewInfo->maFilterName ) ) + { + nErrorPage = RID_XML_FILTER_TABPAGE_BASIC; + nErrorId = STR_ERROR_FILTER_NAME_EXISTS; + pFocusWindow = &(mpBasicPage->maEDFilterName); + aReplace1 = mpNewInfo->maFilterName; + } + + } + } + catch( Exception& ) + { + DBG_ERROR( "XMLFilterTabDialog::onOk exception catched!" ); + } + } + } + + // 2. see if the interface name is ok + if( (mpNewInfo->maInterfaceName.getLength() == 0) || (mpNewInfo->maInterfaceName != mpOldInfo->maInterfaceName) ) + { + // if the user deleted the interface name, we reset the original filter name + if( mpNewInfo->maInterfaceName.getLength() == 0 ) + { + mpNewInfo->maInterfaceName = mpOldInfo->maInterfaceName; + } + else + { + try + { + Reference< XNameAccess > xFilterContainer( mxMSF->createInstance( OUString::createFromAscii("com.sun.star.document.FilterFactory" ) ), UNO_QUERY ); + if( xFilterContainer.is() ) + { + Sequence< OUString > aFilterNames( xFilterContainer->getElementNames() ); + OUString* pFilterName = aFilterNames.getArray(); + + const sal_Int32 nCount = aFilterNames.getLength(); + sal_Int32 nFilter; + + Sequence< PropertyValue > aValues; + for( nFilter = 0; (nFilter < nCount) && (nErrorId == 0); nFilter++, pFilterName++ ) + { + Any aAny( xFilterContainer->getByName( *pFilterName ) ); + if( !(aAny >>= aValues) ) + continue; + + const sal_Int32 nValueCount( aValues.getLength() ); + PropertyValue* pValues = aValues.getArray(); + sal_Int32 nValue; + + for( nValue = 0; (nValue < nValueCount) && (nErrorId == 0); nValue++, pValues++ ) + { + if( pValues->Name.equalsAscii( "UIName" ) ) + { + OUString aInterfaceName; + pValues->Value >>= aInterfaceName; + if( aInterfaceName == mpNewInfo->maInterfaceName ) + { + nErrorPage = RID_XML_FILTER_TABPAGE_BASIC; + nErrorId = STR_ERROR_TYPE_NAME_EXISTS; + pFocusWindow = &(mpBasicPage->maEDInterfaceName); + aReplace1 = mpNewInfo->maInterfaceName; + aReplace2 = *pFilterName; + } + } + } + } + } + } + catch( Exception& ) + { + DBG_ERROR( "XMLFilterTabDialog::onOk exception catched!" ); + } + } + } + + // 3. see if the dtd is valid + if( 0 == nErrorId ) + { + if( (mpNewInfo->maDTD != mpOldInfo->maDTD) && isFileURL( mpNewInfo->maDTD ) ) + { + osl::File aFile( mpNewInfo->maDTD ); + osl::File::RC aRC = aFile.open( OpenFlag_Read ); + if( aRC != osl::File::E_None ) + { + nErrorId = STR_ERROR_DTD_NOT_FOUND; + nErrorPage = RID_XML_FILTER_TABPAGE_XSLT; + pFocusWindow = &(mpXSLTPage->maEDDTDSchema); + } + } + } + + if( 0 == nErrorId ) + { + // 4. see if the export xslt is valid + if( (mpNewInfo->maExportXSLT != mpOldInfo->maExportXSLT) && isFileURL( mpNewInfo->maExportXSLT ) ) + { + osl::File aFile( mpNewInfo->maExportXSLT ); + osl::File::RC aRC = aFile.open( OpenFlag_Read ); + if( aRC != osl::File::E_None ) + { + nErrorId = STR_ERROR_EXPORT_XSLT_NOT_FOUND; + nErrorPage = RID_XML_FILTER_TABPAGE_XSLT; + pFocusWindow = &(mpXSLTPage->maEDExportXSLT); + } + } + } + + if( 0 == nErrorId ) + { + // 5. see if the import xslt is valid + if( (mpNewInfo->maImportXSLT != mpOldInfo->maImportXSLT) && isFileURL( mpNewInfo->maImportXSLT ) ) + { + osl::File aFile( mpNewInfo->maImportXSLT ); + osl::File::RC aRC = aFile.open( OpenFlag_Read ); + if( aRC != osl::File::E_None ) + { + nErrorId = STR_ERROR_IMPORT_XSLT_NOT_FOUND; + nErrorPage = RID_XML_FILTER_TABPAGE_XSLT; + pFocusWindow = &(mpXSLTPage->maEDImportTemplate); + } + } + } + + // see if we have at least an import or an export dtd + if((mpNewInfo->maImportXSLT.getLength() == 0) && (mpNewInfo->maExportXSLT.getLength() == 0) ) + { + nErrorId = STR_ERROR_EXPORT_XSLT_NOT_FOUND; + nErrorPage = RID_XML_FILTER_TABPAGE_XSLT; + pFocusWindow = &(mpXSLTPage->maEDExportXSLT); + } + + if( 0 == nErrorId ) + { + // 6. see if the import template is valid + if( (mpNewInfo->maImportTemplate != mpOldInfo->maImportTemplate) && isFileURL( mpNewInfo->maImportTemplate ) ) + { + osl::File aFile( mpNewInfo->maImportTemplate ); + osl::File::RC aRC = aFile.open( OpenFlag_Read ); + if( aRC != osl::File::E_None ) + { + nErrorId = STR_ERROR_IMPORT_TEMPLATE_NOT_FOUND; + nErrorPage = RID_XML_FILTER_TABPAGE_XSLT; + pFocusWindow = &(mpXSLTPage->maEDImportTemplate); + } + } + } + + if( 0 != nErrorId ) + { + maTabCtrl.SetCurPageId( (sal_uInt16)nErrorPage ); + ActivatePageHdl( &maTabCtrl ); + + ResId aResId( nErrorId, mrResMgr ); + String aMessage( aResId ); + + if( aReplace2.Len() ) + { + aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s1") ), aReplace1 ); + aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s2") ), aReplace2 ); + } + else if( aReplace1.Len() ) + { + aMessage.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("%s") ), aReplace1 ); + } + + ErrorBox aBox(this, (WinBits)(WB_OK), aMessage ); + aBox.Execute(); + + if( pFocusWindow ) + pFocusWindow->GrabFocus(); + + return false; + } + else + { + return true; + } +} + +// ----------------------------------------------------------------------- + +filter_info_impl* XMLFilterTabDialog::getNewFilterInfo() const +{ + return mpNewInfo; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( XMLFilterTabDialog, CancelHdl, Button*, /* pButton */ ) +{ + Close(); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( XMLFilterTabDialog, OkHdl, Button *, EMPTYARG ) +{ + if( onOk() ) + EndDialog(1); + + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( XMLFilterTabDialog, ActivatePageHdl, TabControl *, pTabCtrl ) +{ + const sal_uInt16 nId = pTabCtrl->GetCurPageId(); + TabPage* pTabPage = pTabCtrl->GetTabPage( nId ); + pTabPage->Show(); + + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( XMLFilterTabDialog, DeactivatePageHdl, TabControl *, /* pTabCtrl */ ) +{ + return sal_True; +} |