| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_dbaccess.hxx" |
| #ifndef DBAUI_COLLECTIONVIEW_HXX |
| #include "CollectionView.hxx" |
| #endif |
| #ifndef DBAUI_COLLECTIONVIEW_HRC |
| #include "CollectionView.hrc" |
| #endif |
| #ifndef _TOOLS_DEBUG_HXX |
| #include <tools/debug.hxx> |
| #endif |
| #ifndef TOOLS_DIAGNOSE_EX_H |
| #include <tools/diagnose_ex.h> |
| #endif |
| #ifndef _DBAUI_MODULE_DBU_HXX_ |
| #include "moduledbu.hxx" |
| #endif |
| #ifndef _DBU_DLG_HRC_ |
| #include "dbu_dlg.hrc" |
| #endif |
| #ifndef _COMPHELPER_INTERACTION_HXX_ |
| #include <comphelper/interaction.hxx> |
| #endif |
| #ifndef _CPPUHELPER_EXC_HLP_HXX_ |
| #include <cppuhelper/exc_hlp.hxx> |
| #endif |
| #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ |
| #include <toolkit/helper/vclunohelper.hxx> |
| #endif |
| #ifndef SVT_QUERYFOLDER_HXX |
| #include <svtools/QueryFolderName.hxx> |
| #endif |
| #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_ |
| #include <com/sun/star/lang/XInitialization.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_ |
| #include <com/sun/star/container/XChild.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ |
| #include <com/sun/star/container/XNameContainer.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #endif |
| #ifndef _SV_MSGBOX_HXX |
| #include <vcl/msgbox.hxx> |
| #endif |
| #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC |
| #include "dbustrings.hrc" |
| #endif |
| #ifndef DBAUI_TOOLS_HXX |
| #include "UITools.hxx" |
| #endif |
| #ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMECONTAINER_HPP_ |
| #include <com/sun/star/container/XHierarchicalNameContainer.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_UCB_INTERACTIVEAUGMENTEDIOEXCEPTION_HPP_ |
| #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_UCB_IOERRORCODE_HPP_ |
| #include <com/sun/star/ucb/IOErrorCode.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_ |
| #include <com/sun/star/task/XInteractionHandler.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_TASK_INTERACTIONCLASSIFICATION_HPP_ |
| #include <com/sun/star/task/InteractionClassification.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_SDBC_SQLEXCEPTION_HPP_ |
| #include <com/sun/star/sdbc/SQLException.hpp> |
| #endif |
| #ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ |
| #include <com/sun/star/awt/XWindow.hpp> |
| #endif |
| #ifndef INCLUDED_SVTOOLS_VIEWOPTIONS_HXX |
| #include <unotools/viewoptions.hxx> |
| #endif |
| #ifndef _OSL_THREAD_H_ |
| #include <osl/thread.h> |
| #endif |
| #ifndef _DBHELPER_DBEXCEPTION_HXX_ |
| #include <connectivity/dbexception.hxx> |
| #endif |
| |
| #define FILEDIALOG_DEF_IMAGEBORDER 10 |
| //......................................................................... |
| namespace dbaui |
| { |
| //......................................................................... |
| |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::ucb; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::ucb; |
| using namespace ::com::sun::star::task; |
| using namespace ::com::sun::star::sdbc; |
| using namespace comphelper; |
| // ----------------------------------------------------------------------------- |
| DBG_NAME(OCollectionView) |
| OCollectionView::OCollectionView( Window * pParent |
| ,const Reference< XContent>& _xContent |
| ,const ::rtl::OUString& _sDefaultName |
| ,const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _xORB) |
| : ModalDialog( pParent, ModuleRes(DLG_COLLECTION_VIEW)) |
| , m_aFTCurrentPath( this, ModuleRes( FT_EXPLORERFILE_CURRENTPATH ) ) |
| , m_aNewFolder( this, ModuleRes( BTN_EXPLORERFILE_NEWFOLDER ) ) |
| , m_aUp( this, ModuleRes( BTN_EXPLORERFILE_UP ) ) |
| , m_aView( this, ModuleRes( CTRL_VIEW ) ,FILEVIEW_SHOW_TITLE ) |
| , m_aFTName( this, ModuleRes( FT_EXPLORERFILE_FILENAME ) ) |
| , m_aName( this, ModuleRes( ED_EXPLORERFILE_FILENAME ) ) |
| , m_aFL( this, ModuleRes( FL_1 ) ) |
| , m_aPB_OK( this, ModuleRes( BTN_EXPLORERFILE_SAVE ) ) |
| , m_aPB_CANCEL( this, ModuleRes( PB_CANCEL ) ) |
| , m_aPB_HELP( this, ModuleRes( PB_HELP ) ) |
| , m_sPath( ModuleRes( STR_PATHNAME ) ) |
| , m_xContent(_xContent) |
| , m_xORB(_xORB) |
| , m_bCreateForm(sal_True) |
| { |
| DBG_CTOR(OCollectionView,NULL); |
| FreeResource(); |
| |
| OSL_ENSURE(m_xContent.is(),"No valid content!"); |
| m_aView.Initialize(m_xContent,String()); |
| m_aFTCurrentPath.SetStyle( m_aFTCurrentPath.GetStyle() | WB_PATHELLIPSIS ); |
| initCurrentPath(); |
| |
| m_aName.SetText(_sDefaultName); |
| m_aName.GrabFocus(); |
| |
| m_aNewFolder.SetStyle( m_aNewFolder.GetStyle() | WB_NOPOINTERFOCUS ); |
| m_aUp.SetModeImage(ModuleRes(IMG_NAVIGATION_BTN_UP_SC)); |
| m_aUp.SetModeImage(ModuleRes(IMG_NAVIGATION_BTN_UP_SCH),BMP_COLOR_HIGHCONTRAST); |
| m_aNewFolder.SetModeImage(ModuleRes(IMG_NAVIGATION_CREATEFOLDER_SC)); |
| m_aNewFolder.SetModeImage(ModuleRes(IMG_NAVIGATION_CREATEFOLDER_SCH),BMP_COLOR_HIGHCONTRAST); |
| |
| m_aView.SetDoubleClickHdl( LINK( this, OCollectionView, Dbl_Click_FileView ) ); |
| m_aView.EnableAutoResize(); |
| m_aUp.SetClickHdl( LINK( this, OCollectionView, Up_Click ) ); |
| m_aNewFolder.SetClickHdl( LINK( this, OCollectionView, NewFolder_Click ) ); |
| m_aPB_OK.SetClickHdl( LINK( this, OCollectionView, Save_Click ) ); |
| } |
| // ----------------------------------------------------------------------------- |
| OCollectionView::~OCollectionView( ) |
| { |
| DBG_DTOR(OCollectionView,NULL); |
| } |
| // ----------------------------------------------------------------------------- |
| Reference< XContent> OCollectionView::getSelectedFolder() const |
| { |
| return m_xContent; |
| } |
| // ----------------------------------------------------------------------------- |
| IMPL_LINK( OCollectionView, Save_Click, PushButton*, EMPTYARG ) |
| { |
| ::rtl::OUString sName = m_aName.GetText(); |
| if ( !sName.getLength() ) |
| return 0; |
| try |
| { |
| ::rtl::OUString sSubFolder = m_aView.GetCurrentURL(); |
| sal_Int32 nIndex = sName.lastIndexOf('/') + 1; |
| if ( nIndex ) |
| { |
| if ( nIndex == 1 ) // special handling for root |
| { |
| Reference<XChild> xChild(m_xContent,UNO_QUERY); |
| Reference<XNameAccess> xNameAccess(xChild,UNO_QUERY); |
| while( xNameAccess.is() ) |
| { |
| xNameAccess.set(xChild->getParent(),UNO_QUERY); |
| if ( xNameAccess.is() ) |
| { |
| m_xContent.set(xNameAccess,UNO_QUERY); |
| xChild.set(m_xContent,UNO_QUERY); |
| } |
| } |
| m_aView.Initialize(m_xContent,String()); |
| initCurrentPath(); |
| } |
| sSubFolder = sName.copy(0,nIndex-1); |
| sName = sName.copy(nIndex); |
| Reference<XHierarchicalNameContainer> xHier(m_xContent,UNO_QUERY); |
| OSL_ENSURE(xHier.is(),"XHierarchicalNameContainer not supported!"); |
| if ( sSubFolder.getLength() && xHier.is() ) |
| { |
| if ( xHier->hasByHierarchicalName(sSubFolder) ) |
| { |
| m_xContent.set(xHier->getByHierarchicalName(sSubFolder),UNO_QUERY); |
| } |
| else // sub folder doesn't exist |
| { |
| Sequence< Any > aValues(2); |
| PropertyValue aValue; |
| aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ResourceName")); |
| aValue.Value <<= sSubFolder; |
| aValues[0] <<= aValue; |
| |
| aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ResourceType")); |
| aValue.Value <<= ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("folder")); |
| aValues[1] <<= aValue; |
| |
| InteractionClassification eClass = InteractionClassification_ERROR; |
| ::com::sun::star::ucb::IOErrorCode eError = IOErrorCode_NOT_EXISTING_PATH; |
| ::rtl::OUString sTemp; |
| InteractiveAugmentedIOException aException(sTemp,Reference<XInterface>(),eClass,eError,aValues); |
| |
| |
| Reference<XInitialization> xIni(m_xORB->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler"))),UNO_QUERY); |
| if ( xIni.is() ) |
| { |
| aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Parent")); |
| aValue.Value <<= VCLUnoHelper::GetInterface( this ); |
| Sequence< Any > aArgs(1); |
| aArgs[0] <<= makeAny(aValue); |
| xIni->initialize(aArgs); |
| OInteractionRequest* pRequest = new OInteractionRequest(makeAny(aException)); |
| Reference< XInteractionRequest > xRequest(pRequest); |
| |
| OInteractionApprove* pApprove = new OInteractionApprove; |
| pRequest->addContinuation(pApprove); |
| |
| Reference< XInteractionHandler > xHandler(xIni,UNO_QUERY); |
| xHandler->handle(xRequest); |
| } |
| return 0; |
| } |
| } |
| } |
| Reference<XNameContainer> xNameContainer(m_xContent,UNO_QUERY); |
| if ( xNameContainer.is() ) |
| { |
| Reference< XContent> xContent; |
| if ( xNameContainer->hasByName(sName) ) |
| { |
| QueryBox aBox( this, WB_YES_NO, ModuleRes( STR_ALREADYEXISTOVERWRITE ) ); |
| if ( aBox.Execute() != RET_YES ) |
| return 0; |
| // xNameContainer->removeByName(sName); |
| } |
| m_aName.SetText(sName); |
| EndDialog( sal_True ); |
| } |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| return 0; |
| } |
| // ----------------------------------------------------------------------------- |
| IMPL_LINK( OCollectionView, NewFolder_Click, PushButton*, EMPTYARG ) |
| { |
| try |
| { |
| Reference<XHierarchicalNameContainer> xNameContainer(m_xContent,UNO_QUERY); |
| if ( dbaui::insertHierachyElement(this,m_xORB,xNameContainer,String(),m_bCreateForm) ) |
| m_aView.Initialize(m_xContent,String()); |
| } |
| catch( const SQLException& ) |
| { |
| showError( ::dbtools::SQLExceptionInfo( ::cppu::getCaughtException() ), this, m_xORB ); |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| return 0; |
| } |
| // ----------------------------------------------------------------------------- |
| IMPL_LINK( OCollectionView, Up_Click, PushButton*, EMPTYARG ) |
| { |
| try |
| { |
| Reference<XChild> xChild(m_xContent,UNO_QUERY); |
| if ( xChild.is() ) |
| { |
| Reference<XNameAccess> xNameAccess(xChild->getParent(),UNO_QUERY); |
| if ( xNameAccess.is() ) |
| { |
| m_xContent.set(xNameAccess,UNO_QUERY); |
| m_aView.Initialize(m_xContent,String()); |
| initCurrentPath(); |
| } |
| else |
| m_aUp.Disable(); |
| } |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| return 0; |
| } |
| // ----------------------------------------------------------------------------- |
| IMPL_LINK( OCollectionView, Dbl_Click_FileView, SvtFileView*, EMPTYARG ) |
| { |
| try |
| { |
| Reference<XNameAccess> xNameAccess(m_xContent,UNO_QUERY); |
| if ( xNameAccess.is() ) |
| { |
| ::rtl::OUString sSubFolder = m_aView.GetCurrentURL(); |
| sal_Int32 nIndex = sSubFolder.lastIndexOf('/') + 1; |
| sSubFolder = sSubFolder.getToken(0,'/',nIndex); |
| if ( sSubFolder.getLength() ) |
| { |
| Reference< XContent> xContent; |
| if ( xNameAccess->hasByName(sSubFolder) ) |
| xContent.set(xNameAccess->getByName(sSubFolder),UNO_QUERY); |
| if ( xContent.is() ) |
| { |
| m_xContent = xContent; |
| m_aView.Initialize(m_xContent,String()); |
| initCurrentPath(); |
| } |
| } |
| } |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| return 0; |
| } |
| // ----------------------------------------------------------------------------- |
| void OCollectionView::initCurrentPath() |
| { |
| sal_Bool bEnable = sal_False; |
| try |
| { |
| if ( m_xContent.is() ) |
| { |
| const ::rtl::OUString sCID = m_xContent->getIdentifier()->getContentIdentifier(); |
| const static ::rtl::OUString s_sFormsCID(RTL_CONSTASCII_USTRINGPARAM("private:forms")); |
| const static ::rtl::OUString s_sReportsCID(RTL_CONSTASCII_USTRINGPARAM("private:reports")); |
| m_bCreateForm = s_sFormsCID.compareTo(sCID) == 0; |
| ::rtl::OUString sPath(RTL_CONSTASCII_USTRINGPARAM("/")); |
| if ( m_bCreateForm && sCID.getLength() != s_sFormsCID.getLength()) |
| sPath = sCID.copy(s_sFormsCID.getLength()); |
| else if ( !m_bCreateForm && sCID.getLength() != s_sReportsCID.getLength() ) |
| sPath = sCID.copy(s_sReportsCID.getLength()); |
| |
| m_aFTCurrentPath.SetText(sPath); |
| Reference<XChild> xChild(m_xContent,UNO_QUERY); |
| bEnable = xChild.is() && Reference<XNameAccess>(xChild->getParent(),UNO_QUERY).is(); |
| } |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| m_aUp.Enable(bEnable); |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString OCollectionView::getName() const |
| { |
| return m_aName.GetText(); |
| } |
| // ----------------------------------------------------------------------------- |
| //......................................................................... |
| } // namespace dbaui |
| //......................................................................... |
| |
| |