summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-07-11 11:37:25 +0200
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-07-11 11:49:16 +0200
commitbd5262540a97e0115a070a7b34479b0661e94248 (patch)
treed4f47994430ce4a35a2af911e55ef932fe2e6b64 /fpicker
parent464f69b8bb5f64f9f4660ba2e2095cdc1c65952b (diff)
fpicker: Add place dialog, added CMIS repositories list
Users don't have to open the XML file to know what repository they want to use... we are now doing it for them and showing the repositories in a dropdown listbox Change-Id: I7c20c5a2880061d1ede35a17001e2a75c49a6e88
Diffstat (limited to 'fpicker')
-rw-r--r--fpicker/source/office/PlaceEditDialog.cxx24
-rw-r--r--fpicker/source/office/PlaceEditDialog.hrc3
-rw-r--r--fpicker/source/office/PlaceEditDialog.hxx10
-rw-r--r--fpicker/source/office/PlaceEditDialog.src20
-rw-r--r--fpicker/source/office/ServerDetailsControls.cxx120
-rw-r--r--fpicker/source/office/ServerDetailsControls.hxx19
-rw-r--r--fpicker/source/office/iodlg.cxx3
7 files changed, 181 insertions, 18 deletions
diff --git a/fpicker/source/office/PlaceEditDialog.cxx b/fpicker/source/office/PlaceEditDialog.cxx
index d305bc409c33..7480553465d1 100644
--- a/fpicker/source/office/PlaceEditDialog.cxx
+++ b/fpicker/source/office/PlaceEditDialog.cxx
@@ -60,7 +60,8 @@ PlaceEditDialog::PlaceEditDialog( Window* pParent ) :
m_aFTCmisBinding( this, SvtResId( FT_ADDPLACE_CMIS_BINDING ) ),
m_aEDCmisBinding( this, SvtResId( ED_ADDPLACE_CMIS_BINDING ) ),
m_aFTCmisRepository( this, SvtResId( FT_ADDPLACE_CMIS_REPOSITORY ) ),
- m_aEDCmisRepository( this, SvtResId( ED_ADDPLACE_CMIS_REPOSITORY ) ),
+ m_aLBCmisRepository( this, SvtResId( LB_ADDPLACE_CMIS_REPOSITORY ) ),
+ m_aBTCmisRepoRefresh( this, SvtResId( BT_ADDPLACE_CMIS_REPOREFRESH ) ),
m_aFTUsername( this, SvtResId( FT_ADDPLACE_USERNAME ) ),
m_aEDUsername( this, SvtResId( ED_ADDPLACE_USERNAME ) ),
m_aBTOk( this, SvtResId( BT_ADDPLACE_OK ) ),
@@ -77,6 +78,7 @@ PlaceEditDialog::PlaceEditDialog( Window* pParent ) :
m_aBTDelete.Hide();
m_aLBServerType.SetSelectHdl( LINK( this, PlaceEditDialog, SelectTypeHdl ) );
+ m_aEDUsername.SetModifyHdl( LINK( this, PlaceEditDialog, EditUsernameHdl ) );
InitDetails( );
}
@@ -103,7 +105,8 @@ PlaceEditDialog::PlaceEditDialog( Window* pParent, const PlacePtr& pPlace ) :
m_aFTCmisBinding( this, SvtResId( FT_ADDPLACE_CMIS_BINDING ) ),
m_aEDCmisBinding( this, SvtResId( ED_ADDPLACE_CMIS_BINDING ) ),
m_aFTCmisRepository( this, SvtResId( FT_ADDPLACE_CMIS_REPOSITORY ) ),
- m_aEDCmisRepository( this, SvtResId( ED_ADDPLACE_CMIS_REPOSITORY ) ),
+ m_aLBCmisRepository( this, SvtResId( LB_ADDPLACE_CMIS_REPOSITORY ) ),
+ m_aBTCmisRepoRefresh( this, SvtResId( BT_ADDPLACE_CMIS_REPOREFRESH ) ),
m_aFTUsername( this, SvtResId( FT_ADDPLACE_USERNAME ) ),
m_aEDUsername( this, SvtResId( ED_ADDPLACE_USERNAME ) ),
m_aBTOk( this, SvtResId( BT_ADDPLACE_OK ) ),
@@ -148,7 +151,9 @@ rtl::OUString PlaceEditDialog::GetServerUrl()
if ( m_pCurrentDetails.get( ) )
{
INetURLObject aUrl = m_pCurrentDetails->getUrl();
- aUrl.SetUser( rtl::OUString( m_aEDUsername.GetText( ) ).trim( ) );
+ rtl::OUString sUsername = rtl::OUString( m_aEDUsername.GetText( ) ).trim( );
+ if ( !sUsername.isEmpty( ) )
+ aUrl.SetUser( sUsername );
if ( !aUrl.HasError( ) )
sUrl = aUrl.GetMainURL( INetURLObject::NO_DECODE );
}
@@ -212,7 +217,8 @@ void PlaceEditDialog::InitDetails( )
pCmisDetails->addControl( FT_ADDPLACE_CMIS_BINDING, &m_aFTCmisBinding );
pCmisDetails->addControl( ED_ADDPLACE_CMIS_BINDING, &m_aEDCmisBinding );
pCmisDetails->addControl( FT_ADDPLACE_CMIS_REPOSITORY, &m_aFTCmisRepository );
- pCmisDetails->addControl( ED_ADDPLACE_CMIS_REPOSITORY, &m_aEDCmisRepository );
+ pCmisDetails->addControl( LB_ADDPLACE_CMIS_REPOSITORY, &m_aLBCmisRepository );
+ pCmisDetails->addControl( BT_ADDPLACE_CMIS_REPOREFRESH, &m_aBTCmisRepoRefresh );
pCmisDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
if ( officecfg::Office::Common::Misc::ExperimentalMode::get() )
@@ -249,6 +255,16 @@ IMPL_LINK ( PlaceEditDialog, EditHdl, void *, EMPTYARG )
return 1;
}
+IMPL_LINK ( PlaceEditDialog, EditUsernameHdl, void *, EMPTYARG )
+{
+ for ( std::vector< boost::shared_ptr< DetailsContainer > >::iterator it = m_aDetailsContainers.begin( );
+ it != m_aDetailsContainers.end( ); ++it )
+ {
+ ( *it )->setUsername( rtl::OUString( m_aEDUsername.GetText() ) );
+ }
+ return 1;
+}
+
IMPL_LINK( PlaceEditDialog, SelectTypeHdl, void*, EMPTYARG )
{
// Compute the vertical space between two rows
diff --git a/fpicker/source/office/PlaceEditDialog.hrc b/fpicker/source/office/PlaceEditDialog.hrc
index 74900f72aec7..738d19d66b4a 100644
--- a/fpicker/source/office/PlaceEditDialog.hrc
+++ b/fpicker/source/office/PlaceEditDialog.hrc
@@ -56,7 +56,8 @@
#define FT_ADDPLACE_CMIS_BINDING 31
#define ED_ADDPLACE_CMIS_BINDING 32
#define FT_ADDPLACE_CMIS_REPOSITORY 33
-#define ED_ADDPLACE_CMIS_REPOSITORY 34
+#define LB_ADDPLACE_CMIS_REPOSITORY 34
+#define BT_ADDPLACE_CMIS_REPOREFRESH 35
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/office/PlaceEditDialog.hxx b/fpicker/source/office/PlaceEditDialog.hxx
index fd38f13b0d8e..b74eb617300f 100644
--- a/fpicker/source/office/PlaceEditDialog.hxx
+++ b/fpicker/source/office/PlaceEditDialog.hxx
@@ -71,7 +71,8 @@ private :
FixedText m_aFTCmisBinding;
Edit m_aEDCmisBinding;
FixedText m_aFTCmisRepository;
- Edit m_aEDCmisRepository;
+ ListBox m_aLBCmisRepository;
+ ImageButton m_aBTCmisRepoRefresh;
FixedText m_aFTUsername;
Edit m_aEDUsername;
@@ -106,10 +107,11 @@ private:
void InitDetails( );
- DECL_LINK ( OKHdl, Button * );
- DECL_LINK ( DelHdl, Button * );
- DECL_LINK ( EditHdl, void * );
+ DECL_LINK ( OKHdl, Button * );
+ DECL_LINK ( DelHdl, Button * );
+ DECL_LINK ( EditHdl, void * );
DECL_LINK ( SelectTypeHdl, void * );
+ DECL_LINK ( EditUsernameHdl, void * );
};
diff --git a/fpicker/source/office/PlaceEditDialog.src b/fpicker/source/office/PlaceEditDialog.src
index 313f25bc16fd..0c312d552456 100644
--- a/fpicker/source/office/PlaceEditDialog.src
+++ b/fpicker/source/office/PlaceEditDialog.src
@@ -152,11 +152,27 @@ ModalDialog DLG_FPICKER_PLACE_EDIT
Size = MAP_APPFONT ( 40 , 10 ) ;
Text [ en-US ] = "Repository" ;
};
- Edit ED_ADDPLACE_CMIS_REPOSITORY
+ ListBox LB_ADDPLACE_CMIS_REPOSITORY
{
Pos = MAP_APPFONT ( 55, 60 ) ;
- Size = MAP_APPFONT ( 137 , 12 ) ;
+ Size = MAP_APPFONT ( 122 , 75 ) ;
Border = TRUE ;
+ DropDown = TRUE;
+ };
+ ImageButton BT_ADDPLACE_CMIS_REPOREFRESH
+ {
+ Pos = MAP_APPFONT ( 180, 60 ) ;
+ Size = MAP_APPFONT ( 12, 12 );
+ TabStop = FALSE ;
+ QuickHelpText [ en-US ] = "Refresh" ;
+ ButtonImage = Image
+ {
+ ImageBitmap = Bitmap
+ {
+ File = "reload.png" ;
+ };
+ MaskColor = Color { Red = 0xFF00; Green = 0x0000; Blue = 0xFF00; } ;
+ };
};
ListBox LB_ADDPLACE_SERVERTYPE
{
diff --git a/fpicker/source/office/ServerDetailsControls.cxx b/fpicker/source/office/ServerDetailsControls.cxx
index bcc9cd3451af..69dfa4f74611 100644
--- a/fpicker/source/office/ServerDetailsControls.cxx
+++ b/fpicker/source/office/ServerDetailsControls.cxx
@@ -26,7 +26,16 @@
* instead of those above.
*/
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+#include <com/sun/star/ucb/XContentAccess.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/XRow.hpp>
+
#include <rtl/uri.hxx>
+#include <ucbhelper/content.hxx>
+#include <ucbhelper/commandenvironment.hxx>
#include "PlaceEditDialog.hrc"
@@ -35,6 +44,11 @@
#include "ServerDetailsControls.hxx"
using namespace std;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::task;
+using namespace com::sun::star::ucb;
+using namespace com::sun::star::uno;
DetailsContainer::DetailsContainer( ) :
m_aControls( ),
@@ -273,21 +287,30 @@ bool SmbDetailsContainer::setUrl( const INetURLObject& rUrl )
return bSuccess;
}
+CmisDetailsContainer::CmisDetailsContainer( ) :
+ DetailsContainer( ),
+ m_sUsername( ),
+ m_xCmdEnv( )
+{
+ Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
+ Reference< XInteractionHandler > xGlobalInteractionHandler = Reference< XInteractionHandler >(
+ xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), UNO_QUERY );
+ m_xCmdEnv = new ucbhelper::CommandEnvironment( xGlobalInteractionHandler, Reference< XProgressHandler >() );
+}
+
INetURLObject CmisDetailsContainer::getUrl( )
{
rtl::OUString sBindingUrl = rtl::OUString( static_cast< Edit* >( getControl( ED_ADDPLACE_CMIS_BINDING ) )->GetText() ).trim( );
- rtl::OUString sRepo = rtl::OUString( static_cast< Edit* >( getControl( ED_ADDPLACE_CMIS_REPOSITORY ) )->GetText() ).trim( );
rtl::OUString sUrl;
- if ( !sBindingUrl.isEmpty( ) && !sRepo.isEmpty() )
+ if ( !sBindingUrl.isEmpty( ) && !m_sRepoId.isEmpty() )
{
rtl::OUString sEncodedBinding = rtl::Uri::encode(
- sBindingUrl + "#" + sRepo,
+ sBindingUrl + "#" + m_sRepoId,
rtl_UriCharClassRelSegment,
rtl_UriEncodeKeepEscapes,
RTL_TEXTENCODING_UTF8 );
sUrl = "vnd.libreoffice.cmis+atom://" + sEncodedBinding;
- INetURLObject test( sUrl );
}
return INetURLObject( sUrl );
@@ -308,11 +331,98 @@ bool CmisDetailsContainer::setUrl( const INetURLObject& rUrl )
sRepositoryId = aHostUrl.GetMark( );
static_cast< Edit* >( getControl( ED_ADDPLACE_CMIS_BINDING ) )->SetText( sBindingUrl );
- static_cast< Edit* >( getControl( ED_ADDPLACE_CMIS_REPOSITORY ) )->SetText( sRepositoryId );
}
return bSuccess;
}
+void CmisDetailsContainer::setUsername( const rtl::OUString& rUsername )
+{
+ m_sUsername = rtl::OUString( rUsername );
+}
+
+void CmisDetailsContainer::addControl( sal_uInt16 nId, Control* pControl )
+{
+ DetailsContainer::addControl( nId, pControl );
+
+ // Add listener on BT_ADDPLACE_CMIS_REPOREFRESH
+ if ( nId == BT_ADDPLACE_CMIS_REPOREFRESH )
+ static_cast< ImageButton* >( pControl )->SetClickHdl( LINK( this, CmisDetailsContainer, RefreshReposHdl ) );
+ if ( nId == LB_ADDPLACE_CMIS_REPOSITORY )
+ static_cast< ListBox* >( pControl )->SetSelectHdl( LINK( this, CmisDetailsContainer, SelectRepoHdl ) );
+}
+
+void CmisDetailsContainer::selectRepository( )
+{
+ // Get the repo ID and call the Change listener
+ ListBox* pReposList = static_cast< ListBox* >( getControl( LB_ADDPLACE_CMIS_REPOSITORY ) );
+ sal_uInt16 nPos = pReposList->GetSelectEntryPos( );
+ m_sRepoId = m_aRepoIds[nPos];
+
+ notifyChange( );
+}
+
+IMPL_LINK( CmisDetailsContainer, RefreshReposHdl, void *, EMPTYARG )
+{
+ rtl::OUString sBindingUrl = rtl::OUString( static_cast< Edit* >( getControl( ED_ADDPLACE_CMIS_BINDING ) )->GetText() ).trim( );
+
+ // Clean the listbox
+ ListBox* pReposList = static_cast< ListBox* >( getControl( LB_ADDPLACE_CMIS_REPOSITORY ) );
+ pReposList->Clear( );
+ m_aRepoIds.clear( );
+
+ // Compute the URL
+ rtl::OUString sUrl;
+ if ( !sBindingUrl.isEmpty( ) )
+ {
+ rtl::OUString sEncodedBinding = rtl::Uri::encode(
+ sBindingUrl,
+ rtl_UriCharClassRelSegment,
+ rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_UTF8 );
+ sUrl = "vnd.libreoffice.cmis+atom://" + sEncodedBinding;
+ }
+
+ // Get the Content
+ ::ucbhelper::Content aCnt( sUrl, m_xCmdEnv );
+ Sequence< rtl::OUString > aProps( 1 );
+ aProps[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) );
+
+ try
+ {
+ Reference< XResultSet > xResultSet( aCnt.createCursor( aProps ), UNO_QUERY_THROW );
+ Reference< XContentAccess > xAccess( xResultSet, UNO_QUERY_THROW );
+ while ( xResultSet->next() )
+ {
+ rtl::OUString sURL = xAccess->queryContentIdentifierString( );
+ INetURLObject aURL( sURL );
+ rtl::OUString sId = aURL.GetURLPath( INetURLObject::DECODE_WITH_CHARSET );
+ sId = sId.copy( 1 );
+ m_aRepoIds.push_back( sId );
+
+ Reference< XRow > xRow( xResultSet, UNO_QUERY );
+ rtl::OUString sName = xRow->getString( 1 );
+ pReposList->InsertEntry( sName );
+ }
+ }
+ catch ( const Exception& )
+ {
+ }
+
+ // Auto-select the first one
+ if ( pReposList->GetEntryCount( ) > 0 )
+ {
+ pReposList->SelectEntryPos( 0 );
+ selectRepository( );
+ }
+
+ return 0;
+}
+
+IMPL_LINK( CmisDetailsContainer, SelectRepoHdl, void *, EMPTYARG )
+{
+ selectRepository( );
+ return 0;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/office/ServerDetailsControls.hxx b/fpicker/source/office/ServerDetailsControls.hxx
index 6543ded42154..206f1aaa5870 100644
--- a/fpicker/source/office/ServerDetailsControls.hxx
+++ b/fpicker/source/office/ServerDetailsControls.hxx
@@ -28,6 +28,8 @@
#ifndef _SERVERDETAILSCONTROLS_HXX
#define _SERVERDETAILSCONTROLS_HXX
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+
#include <tools/urlobj.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/edit.hxx>
@@ -61,6 +63,8 @@ class DetailsContainer
*/
virtual bool setUrl( const INetURLObject& rUrl );
+ virtual void setUsername( const rtl::OUString& /*rUsername*/ ) { };
+
protected:
void notifyChange( );
@@ -119,12 +123,25 @@ class SmbDetailsContainer : public DetailsContainer
class CmisDetailsContainer : public DetailsContainer
{
+ private:
+ rtl::OUString m_sUsername;
+ com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment > m_xCmdEnv;
+ std::vector< rtl::OUString > m_aRepoIds;
+ rtl::OUString m_sRepoId;
+
public:
- CmisDetailsContainer( ) : DetailsContainer( ) { };
+ CmisDetailsContainer( );
~CmisDetailsContainer( ) { };
virtual INetURLObject getUrl( );
virtual bool setUrl( const INetURLObject& rUrl );
+ virtual void setUsername( const rtl::OUString& rUsername );
+ virtual void addControl( sal_uInt16 nId, Control* pControl );
+
+ private:
+ void selectRepository( );
+ DECL_LINK ( RefreshReposHdl, void * );
+ DECL_LINK ( SelectRepoHdl, void * );
};
#endif
diff --git a/fpicker/source/office/iodlg.cxx b/fpicker/source/office/iodlg.cxx
index 13540848252b..c461addefd73 100644
--- a/fpicker/source/office/iodlg.cxx
+++ b/fpicker/source/office/iodlg.cxx
@@ -3349,7 +3349,8 @@ void SvtFileDialog::initDefaultPlaces( )
Sequence< ::rtl::OUString > placesUrlsList(officecfg::Office::Common::Misc::FilePickerPlacesUrls::get(m_context));
Sequence< ::rtl::OUString > placesNamesList(officecfg::Office::Common::Misc::FilePickerPlacesNames::get(m_context));
- for(sal_Int32 nPlace = 0; nPlace < placesUrlsList.getLength() && nPlace < placesNamesList.getLength(); ++nPlace) {
+ for(sal_Int32 nPlace = 0; nPlace < placesUrlsList.getLength() && nPlace < placesNamesList.getLength(); ++nPlace)
+ {
PlacePtr pPlace(new Place(placesNamesList[nPlace], placesUrlsList[nPlace], true));
_pImp->_pPlaces->AppendPlace(pPlace);
}