blob: 8ceeddc3ed0fa669e12267d7caf1b504f9c0d88c [file] [log] [blame]
/**************************************************************
*
* 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_ucbhelper.hxx"
#include <cppuhelper/weak.hxx>
#include <cppuhelper/bootstrap.hxx>
#include <comphelper/processfactory.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <com/sun/star/io/XActiveDataSink.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/ucb/XCommandInfo.hpp>
#include <com/sun/star/ucb/XContentAccess.hpp>
#include <com/sun/star/ucb/CommandAbortedException.hpp>
#include <com/sun/star/ucb/ContentInfo.hpp>
#include <com/sun/star/ucb/ContentInfoAttribute.hpp>
#include "rtl/ref.hxx"
#include <ucbhelper/content.hxx>
#include <ucbhelper/contentbroker.hxx>
#include <ucbhelper/commandenvironment.hxx>
#include <svtools/svtreebx.hxx>
#include <vcl/wrkwin.hxx>
#include <vcl/svapp.hxx>
#include <vcl/menu.hxx>
#include <vcl/dialog.hxx>
#include <vcl/fixed.hxx>
#include <vcl/group.hxx>
#include <vcl/button.hxx>
#include <vcl/msgbox.hxx>
#include <ucbhelper/macros.hxx>
#include <ucbhelper/configurationkeys.hxx>
#ifndef _UCBEXPLORER_HRC
#include "ucbexplorer.hrc"
#endif
using namespace com::sun::star;
using namespace com::sun::star::beans;
using namespace com::sun::star::io;
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;
using namespace rtl;
//=========================================================================
//
// class TestDataSink.
//
//=========================================================================
class TestDataSink : public cppu::OWeakObject, public XActiveDataSink
{
uno::Reference< XInputStream > m_xStream;
public:
// TestDataSink() {}
// virtual ~TestDataSink();
// XInterface methods
virtual Any SAL_CALL queryInterface( const Type & rType )
throw( RuntimeException );
virtual void SAL_CALL acquire()
throw ();
virtual void SAL_CALL release()
throw ();
// XActiveDataSink methods.
virtual void SAL_CALL setInputStream(
const uno::Reference< XInputStream >& aStream )
throw( RuntimeException );
virtual uno::Reference< XInputStream > SAL_CALL getInputStream()
throw( RuntimeException );
};
//=========================================================================
//
// class StringInputDialog.
//
//=========================================================================
class StringInputDialog : public ModalDialog
{
private:
FixedText m_aNameText;
Edit m_aNameEdit;
GroupBox m_aNameGroup;
OKButton m_aOKBtn;
CancelButton m_aCancelBtn;
HelpButton m_aHelpBtn;
DECL_LINK( OKHdl, Button * );
DECL_LINK( NameHdl, Edit * );
public:
StringInputDialog( ResMgr& rResMgr,
const String& rTitle,
const String& rDefaultText,
String* pGroupName = 0 );
String GetValue() const { return m_aNameEdit.GetText(); }
void SetValue( const String& rNewName ) { m_aNameEdit.SetText( rNewName ); }
};
//=========================================================================
//
// class UcbExplorerListBoxEntry.
//
//=========================================================================
class UcbExplorerListBoxEntry : public SvLBoxEntry
{
friend class UcbExplorerTreeListBox;
enum EntryType { FOLDER, DOCUMENT, LINK };
::ucbhelper::Content m_aContent;
EntryType m_eType;
public:
UcbExplorerListBoxEntry();
virtual ~UcbExplorerListBoxEntry();
BOOL createNewContent( const ContentInfo& rInfo,
::ucbhelper::Content& rNewContent );
};
//=========================================================================
//
// class UcbExplorerTreeListBox.
//
//=========================================================================
class UcbExplorerTreeListBox : public SvTreeListBox
{
Bitmap m_aFolderClosed;
Bitmap m_aFolderOpened;
Bitmap m_aDocument;
Bitmap m_aLink;
private:
virtual SvLBoxEntry* CreateEntry() const;
virtual void RequestingChilds( SvLBoxEntry* pParent );
public:
UcbExplorerTreeListBox( ResMgr & rResMgr, Window* pParent, WinBits nWinStyle = 0 );
virtual ~UcbExplorerTreeListBox();
virtual void Command( const CommandEvent& rCEvt );
UcbExplorerListBoxEntry*
InsertEntry( ::ucbhelper::Content& rContent, SvLBoxEntry* pParent );
UcbExplorerListBoxEntry*
InsertEntry( const String& rURL, SvLBoxEntry* pParent = 0 );
};
//=========================================================================
//
// class UcbExplorerWindow.
//
//=========================================================================
class UcbExplorerWindow : public WorkWindow
{
friend class MyApp;
UcbExplorerTreeListBox m_aTree;
public:
UcbExplorerWindow( ResMgr & rResMgr, Window *pParent, WinBits nWinStyle );
virtual ~UcbExplorerWindow();
virtual void Resize();
};
//=========================================================================
//
// class MyApp.
//
//=========================================================================
class MyApp : public Application
{
public:
virtual void Main();
};
//=========================================================================
//
// TestDataSink implementation.
//
//=========================================================================
// virtual
Any SAL_CALL TestDataSink::queryInterface( const Type & rType )
throw( RuntimeException )
{
Any aRet = cppu::queryInterface(
rType,
static_cast< XActiveDataSink * >( this ) );
return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
}
//=========================================================================
// virtual
void SAL_CALL TestDataSink::acquire()
throw()
{
OWeakObject::acquire();
}
//=========================================================================
// virtual
void SAL_CALL TestDataSink::release()
throw()
{
OWeakObject::release();
}
//=========================================================================
// virtual
void SAL_CALL TestDataSink::setInputStream(
const uno::Reference< XInputStream >& aStream )
throw( RuntimeException )
{
m_xStream = aStream;
}
//=========================================================================
// virtual
uno::Reference< XInputStream > SAL_CALL TestDataSink::getInputStream()
throw( RuntimeException )
{
return m_xStream;
}
//=========================================================================
//
// StringInputDialog implementation.
//
//=========================================================================
StringInputDialog::StringInputDialog( ResMgr& rResMgr,
const String& rTitle,
const String& rDefaultText,
String* pGroupName )
: ModalDialog( 0, ResId( DLG_STRINGINPUT, rResMgr ) ),
m_aNameText ( this, ResId( FT_STRINGINPUT_DLG_NAME, rResMgr ) ),
m_aNameEdit ( this, ResId( ED_STRINGINPUT_DLG_NAME, rResMgr ) ),
m_aNameGroup( this, ResId( GB_STRINGINPUT_DLG_NAME, rResMgr ) ),
m_aOKBtn ( this, ResId( BT_STRINGINPUT_DLG_OK, rResMgr ) ),
m_aCancelBtn( this, ResId( BT_STRINGINPUT_DLG_CANCEL, rResMgr ) ),
m_aHelpBtn ( this, ResId( BT_STRINGINPUT_DLG_HELP, rResMgr ) )
{
FreeResource();
SetText( rTitle );
m_aNameEdit.SetText( rDefaultText );
m_aOKBtn.SetClickHdl( LINK( this, StringInputDialog, OKHdl ) );
m_aNameEdit.SetModifyHdl( LINK( this, StringInputDialog, NameHdl ) );
if ( pGroupName )
m_aNameGroup.SetText( *pGroupName );
};
//=========================================================================
IMPL_LINK( StringInputDialog, OKHdl, Button *, EMPTYARG )
{
// trim the strings
m_aNameEdit.SetText(
m_aNameEdit.GetText().EraseLeadingChars().EraseTrailingChars() );
EndDialog( RET_OK );
return 1;
}
//=========================================================================
IMPL_LINK( StringInputDialog, NameHdl, Edit *, EMPTYARG )
{
/*
// trim the strings
String aName = m_aNameEdit.GetText();
aName.EraseLeadingChars().EraseTrailingChars();
if ( aName.Len() )
{
if ( !m_aOKBtn.IsEnabled() )
m_aOKBtn.Enable( TRUE );
}
else
{
if ( m_aOKBtn.IsEnabled() )
m_aOKBtn.Enable( FALSE );
}
*/
return 0;
}
//=========================================================================
//
// UcbExplorerListBoxEntry implementation.
//
//=========================================================================
UcbExplorerListBoxEntry::UcbExplorerListBoxEntry()
{
}
//=========================================================================
// virtual
UcbExplorerListBoxEntry::~UcbExplorerListBoxEntry()
{
}
//=========================================================================
BOOL UcbExplorerListBoxEntry::createNewContent( const ContentInfo& rInfo,
::ucbhelper::Content& rNewContent )
{
sal_Int32 nCount = rInfo.Properties.getLength();
Sequence< Any > aPropValues( nCount );
Sequence< OUString > aPropNames( nCount );
if ( nCount > 0 )
{
// Collect property values.
Any* pValues = aPropValues.getArray();
const Property* pProps = rInfo.Properties.getConstArray();
for ( sal_Int32 n = 0; n < nCount; ++n )
{
const OUString& rName = pProps[ n ].Name;
std::auto_ptr< ResMgr > xManager(
ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) );
StringInputDialog* pDlg = new StringInputDialog( *xManager.get(), rName, rName );
USHORT nRet = pDlg->Execute();
if ( nRet == RET_OK )
{
OUString aValue( pDlg->GetValue() );
// Convert value according to supplied type info...
const Type& rType = pProps[ n ].Type;
if ( rType == getCppuType(
static_cast< const OUString * >( 0 ) ) )
{
// string
pValues[ n ] <<= aValue;
}
else if ( rType == getCppuType(
static_cast< const sal_Int32 * >( 0 ) ) )
{
// long
pValues[ n ] <<= aValue.toInt32();
}
else if ( rType == getCppuType(
static_cast< const sal_Int16 * >( 0 ) ) )
{
// short
pValues[ n ] <<= sal_Int16( aValue.toInt32() ) ;
}
else if ( rType == getCppuBooleanType() )
{
// boolean
pValues[ n ] <<= sal_Bool( aValue.toChar() ) ;
}
else if ( rType == getCppuCharType() )
{
// char
pValues[ n ] <<= aValue.toChar();
}
else if ( rType == getCppuType(
static_cast< const sal_Int8 * >( 0 ) ) )
{
// byte
pValues[ n ] <<= sal_Int8( aValue.toChar() ) ;
}
else if ( rType == getCppuType(
static_cast< const sal_Int64 * >( 0 ) ) )
{
// hyper
pValues[ n ] <<= aValue.toInt64();
}
else if ( rType == getCppuType(
static_cast< const float * >( 0 ) ) )
{
// float
pValues[ n ] <<= aValue.toFloat();
}
else if ( rType == getCppuType(
static_cast< const double * >( 0 ) ) )
{
// double
pValues[ n ] <<= aValue.toDouble();
}
else
{
// See com/sun/star/ucb/ContentInfo.idl
DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
"Invlid type for bootstrap property!" );
}
}
delete pDlg;
if ( nRet != RET_OK )
return FALSE;
aPropNames[ n ] = rName;
}
}
uno::Reference< XInputStream > xData;
if ( rInfo.Attributes & ContentInfoAttribute::INSERT_WITH_INPUTSTREAM )
{
// Let the user specify the URL of a content containing the
// data to supply to the new content.
std::auto_ptr< ResMgr > xManager(
ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) );
StringInputDialog* pDlg = new StringInputDialog(
*xManager.get(),
OUString::createFromAscii(
"Document Data Source URL" ),
OUString() );
USHORT nRet = pDlg->Execute();
if ( nRet == RET_OK )
{
// Create a content object for the given URL.
OUString aSourceURL( pDlg->GetValue() );
if ( aSourceURL.getLength() == 0 )
{
DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
"No document data URL!" );
return FALSE;
}
try
{
uno::Reference< XCommandEnvironment > xEnv;
::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
if ( pBroker )
{
uno::Reference< XInteractionHandler > xInteractionHandler(
pBroker->getServiceManager()->createInstance(
OUString::createFromAscii(
"com.sun.star.task.InteractionHandler" ) ),
UNO_QUERY );
uno::Reference< XProgressHandler > xProgressHandler
/* = new ProgressHandler( *pBroker ) */ ;
xEnv = new ::ucbhelper::CommandEnvironment( xInteractionHandler,
xProgressHandler );
}
::ucbhelper::Content aSourceContent( aSourceURL, xEnv );
// Get source data.
rtl::Reference< TestDataSink > xSourceData = new TestDataSink;
aSourceContent.openStream( xSourceData.get() );
xData = xSourceData->getInputStream();
}
catch ( ContentCreationException const & )
{
DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
"No content for document data!" );
return FALSE;
}
catch ( CommandAbortedException const & )
{
return FALSE;
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
return FALSE;
}
}
delete pDlg;
if ( nRet != RET_OK )
return FALSE;
}
// Create new content.
ULONG n = Application::ReleaseSolarMutex();
BOOL bRet = sal_False;
try
{
bRet = m_aContent.insertNewContent(
rInfo.Type, aPropNames, aPropValues, xData, rNewContent );
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
Application::AcquireSolarMutex( n );
return bRet;
}
//=========================================================================
//
// UcbExplorerTreeListBox implementation.
//
//=========================================================================
UcbExplorerTreeListBox::UcbExplorerTreeListBox( ResMgr & rResMgr,
Window* pParent,
WinBits nWinStyle )
: SvTreeListBox( pParent, nWinStyle ),
m_aFolderClosed( ResId( BMP_FOLDER_CLOSED, rResMgr ) ),
m_aFolderOpened( ResId( BMP_FOLDER_OPENED, rResMgr ) ),
m_aDocument( ResId( BMP_DOCUMENT, rResMgr ) ),
m_aLink( ResId( BMP_LINK, rResMgr ) )
{
}
//=========================================================================
// virtual
UcbExplorerTreeListBox::~UcbExplorerTreeListBox()
{
}
//=========================================================================
// virtual
SvLBoxEntry* UcbExplorerTreeListBox::CreateEntry() const
{
return new UcbExplorerListBoxEntry();
}
//=========================================================================
// virtual
void UcbExplorerTreeListBox::RequestingChilds( SvLBoxEntry* pParent )
{
UcbExplorerListBoxEntry* pEntry
= static_cast< UcbExplorerListBoxEntry * >( pParent );
if ( !pEntry->HasChilds() )
{
switch ( pEntry->m_eType )
{
case UcbExplorerListBoxEntry::FOLDER:
{
ULONG n = Application::ReleaseSolarMutex();
try
{
Sequence< OUString > aPropertyNames( 0 );
// OUString* pNames = aPropertyNames.getArray();
// pNames[ 0 ] = OUString::createFromAscii( "Title" );
uno::Reference< XResultSet > xResultSet
= pEntry->m_aContent.createCursor(
aPropertyNames,
::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS );
uno::Reference< XContentAccess > xContentAccess(
xResultSet, UNO_QUERY );
if ( xResultSet.is() && xContentAccess.is() )
{
while ( xResultSet->next() )
{
Application::AcquireSolarMutex( n );
InsertEntry(
xContentAccess->queryContentIdentifierString(),
pParent );
n = Application::ReleaseSolarMutex();
}
}
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
Application::AcquireSolarMutex( n );
break;
}
case UcbExplorerListBoxEntry::DOCUMENT:
break;
case UcbExplorerListBoxEntry::LINK:
break;
default:
break;
}
}
}
//=========================================================================
// virtual
void UcbExplorerTreeListBox::Command( const CommandEvent& rCEvt )
{
if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
{
const Point& rPos = rCEvt.GetMousePosPixel();
UcbExplorerListBoxEntry* pEntry
= static_cast< UcbExplorerListBoxEntry * >(
GetEntry( rPos, TRUE ) );
if ( pEntry )
{
std::auto_ptr< ResMgr > xManager(
ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) );
PopupMenu* pMenu = new PopupMenu( ResId( MENU_POPUP, *xManager.get() ) );
PopupMenu* pNewMenu = 0;
// pMenu->SetSelectHdl( LINK( this,
// SfxCommonTemplateDialog_Impl,
// MenuSelectHdl ) );
//////////////////////////////////////////////////////////////
// Configure "New"
//////////////////////////////////////////////////////////////
Sequence< ContentInfo > aInfo
= pEntry->m_aContent.queryCreatableContentsInfo();
const ContentInfo* pInfo = aInfo.getConstArray();
sal_Int32 nCount = aInfo.getLength();
BOOL bCanCreate = ( nCount > 0 );
pNewMenu = new PopupMenu;
pMenu->SetPopupMenu( MENU_NEW, pNewMenu );
for ( sal_Int32 n = 0; n < nCount; ++n )
{
const ContentInfo& rInfo = pInfo[ n ];
pNewMenu->InsertItem( 20000 + n + 1, rInfo.Type );
}
pMenu->EnableItem( MENU_NEW, bCanCreate );
//////////////////////////////////////////////////////////////
// Configure "Rename"
//////////////////////////////////////////////////////////////
sal_Bool bEnable = sal_False;
try
{
Property aProp =
pEntry->m_aContent.getProperties()->getPropertyByName(
OUString::createFromAscii( "Title" ) );
bEnable = !( aProp.Attributes & PropertyAttribute::READONLY );
}
catch( UnknownPropertyException const & )
{
// getPropertyByName
bEnable = sal_False;
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
pMenu->EnableItem( MENU_RENAME, bEnable );
//////////////////////////////////////////////////////////////
// Configure "Delete"
//////////////////////////////////////////////////////////////
try
{
pMenu->EnableItem( MENU_DELETE,
pEntry->m_aContent
.getCommands()->hasCommandByName(
OUString::createFromAscii(
"delete" ) ) );
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
//////////////////////////////////////////////////////////////
// Execute menu.
//////////////////////////////////////////////////////////////
USHORT nSelected = pMenu->Execute( this, rPos );
switch ( nSelected )
{
// case MENU_NEW:
// break;
case MENU_RENAME:
{
OUString aNewTitle;
try
{
pEntry->m_aContent.getPropertyValue(
OUString::createFromAscii( "Title" ) )
>>= aNewTitle;
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
std::auto_ptr< ResMgr > xManager(
ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) );
StringInputDialog* pDlg
= new StringInputDialog(
*xManager.get(),
OUString::createFromAscii( "Title" ),
aNewTitle );
USHORT nRet = pDlg->Execute();
Any aValue;
if ( nRet == RET_OK )
{
aNewTitle = pDlg->GetValue();
aValue <<= aNewTitle;
}
delete pDlg;
if ( nRet != RET_OK )
break;
sal_Bool bOK = sal_False;
ULONG n = Application::ReleaseSolarMutex();
try
{
pEntry->m_aContent.setPropertyValue(
OUString::createFromAscii( "Title" ),
aValue );
bOK = sal_True;
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
}
Application::AcquireSolarMutex( n );
if ( bOK )
{
OUString aText( aNewTitle );
OUString aTargetURL;
try
{
pEntry->m_aContent.getPropertyValue(
OUString::createFromAscii( "TargetURL" ) )
>>= aTargetURL;
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
// The property is optional!
}
if ( aTargetURL.getLength() > 0 )
{
// Insert link.
aText += OUString::createFromAscii( " --> " );
aText += aTargetURL;
}
SetEntryText( pEntry, aText );
}
break;
}
case MENU_DELETE:
{
ULONG n = Application::ReleaseSolarMutex();
sal_Bool bOK = sal_True;
try
{
pEntry->m_aContent.executeCommand(
OUString::createFromAscii( "delete" ),
makeAny( sal_True ) );
}
catch ( CommandAbortedException const & )
{
bOK = sal_False;
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
bOK = sal_False;
}
Application::AcquireSolarMutex( n );
if ( bOK )
RemoveSelection();
break;
}
default:
{
if ( ( nSelected > 20000 ) &&
( ( nSelected - 20000 ) <= aInfo.getLength() ) )
{
// New-menu entry selected.
::ucbhelper::Content aNewContent;
if ( pEntry->createNewContent(
aInfo.getConstArray()[ nSelected - 20001 ],
aNewContent ) )
{
if ( !IsExpanded( pEntry ) )
Expand( pEntry );
else
InsertEntry( aNewContent, pEntry );
}
}
break;
}
}
delete pNewMenu;
delete pMenu;
return;
}
}
SvTreeListBox::Command( rCEvt );
}
//=========================================================================
UcbExplorerListBoxEntry* UcbExplorerTreeListBox::InsertEntry(
::ucbhelper::Content& rContent,
SvLBoxEntry* pParent )
{
try
{
OUString aTitle;
rContent.getPropertyValue(
OUString::createFromAscii( "Title" ) ) >>= aTitle;
if ( !aTitle.getLength() )
aTitle = OUString::createFromAscii( "/" );
UcbExplorerListBoxEntry* pEntry = 0;
if ( rContent.isFolder() )
{
// Insert folder.
pEntry = static_cast< UcbExplorerListBoxEntry * >(
SvTreeListBox::InsertEntry( aTitle,
m_aFolderOpened,
m_aFolderClosed,
pParent,
TRUE ) );
pEntry->m_eType = UcbExplorerListBoxEntry::FOLDER;
}
else
{
OUString aTargetURL;
try
{
rContent.getPropertyValue(
OUString::createFromAscii( "TargetURL" ) ) >>= aTargetURL;
}
catch ( CommandAbortedException const & )
{
}
catch ( RuntimeException const & )
{
throw;
}
catch ( Exception const & )
{
// The property is optional!
}
if ( aTargetURL.getLength() > 0 )
{
// Insert link.
aTitle += OUString::createFromAscii( " --> " );
aTitle += aTargetURL;
pEntry = static_cast< UcbExplorerListBoxEntry * >(
SvTreeListBox::InsertEntry( aTitle,
m_aLink,
m_aLink,
pParent,
TRUE ) );
pEntry->m_eType = UcbExplorerListBoxEntry::LINK;
}
else
{
// Insert Document
pEntry = static_cast< UcbExplorerListBoxEntry * >(
SvTreeListBox::InsertEntry( aTitle,
m_aDocument,
m_aDocument,
pParent,
TRUE ) );
pEntry->m_eType = UcbExplorerListBoxEntry::DOCUMENT;
}
}
pEntry->m_aContent = rContent;
return pEntry;
}
catch ( CommandAbortedException const & )
{
}
catch ( Exception const & )
{
}
return 0;
}
//=========================================================================
UcbExplorerListBoxEntry* UcbExplorerTreeListBox::InsertEntry(
const String& rURL,
SvLBoxEntry* pParent )
{
try
{
uno::Reference< XCommandEnvironment > xEnv;
::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
if ( pBroker )
{
uno::Reference< XInteractionHandler > xInteractionHandler(
pBroker->getServiceManager()->createInstance(
OUString::createFromAscii(
"com.sun.star.task.InteractionHandler" ) ),
UNO_QUERY );
uno::Reference< XProgressHandler > xProgressHandler
/* = new ProgressHandler( *pBroker ) */ ;
xEnv = new ::ucbhelper::CommandEnvironment( xInteractionHandler,
xProgressHandler );
}
::ucbhelper::Content aContent( rURL, xEnv );
return InsertEntry( aContent, pParent );
}
catch ( ContentCreationException const & )
{
}
return 0;
}
//=========================================================================
//
// UcbExplorerWindow implementation.
//
//=========================================================================
UcbExplorerWindow::UcbExplorerWindow( ResMgr & rResMgr, Window *pParent, WinBits nWinStyle )
: WorkWindow( pParent, nWinStyle ),
m_aTree( rResMgr, this, WB_HSCROLL )
{
Font aTreeFont( m_aTree.GetFont() );
aTreeFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM("Courier") ) );
aTreeFont.SetFamily( FAMILY_MODERN );
aTreeFont.SetPitch( PITCH_FIXED );
aTreeFont.SetSize( Size( 0, 12 ) );
m_aTree.SetFont( aTreeFont );
m_aTree.SetIndent( 20 );
m_aTree.SetPosPixel( Point( 0, 0 ) );
m_aTree.Show();
}
//-------------------------------------------------------------------------
// virtual
UcbExplorerWindow::~UcbExplorerWindow()
{
}
//-------------------------------------------------------------------------
// virtual
void UcbExplorerWindow::Resize()
{
m_aTree.SetSizePixel( GetOutputSizePixel() );
}
//=========================================================================
//
// MyApp implementation.
//
//=========================================================================
// virtual
void MyApp::Main()
{
//////////////////////////////////////////////////////////////////////
// Initialize local Service Manager and basic services.
//////////////////////////////////////////////////////////////////////
uno::Reference< XMultiServiceFactory > xFac;
try
{
uno::Reference< XComponentContext > xCtx(
cppu::defaultBootstrap_InitialComponentContext() );
if ( !xCtx.is() )
{
DBG_ERROR( "Error creating initial component context!" );
return;
}
xFac = uno::Reference< XMultiServiceFactory >(
xCtx->getServiceManager(), UNO_QUERY );
if ( !xFac.is() )
{
DBG_ERROR( "No service manager!" );
return;
}
}
catch ( com::sun::star::uno::Exception const & )
{
DBG_ERROR( "Exception during creation of initial component context!" );
return;
}
comphelper::setProcessServiceFactory( xFac );
uno::Reference< XComponent > xComponent( xFac, UNO_QUERY );
//////////////////////////////////////////////////////////////////////
// Create UCB.
//////////////////////////////////////////////////////////////////////
#if 1
// Init UCB (Read configuration from registry)
Sequence< Any > aArgs( 2 );
aArgs[ 0 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
aArgs[ 1 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
sal_Bool bSuccess = ::ucbhelper::ContentBroker::initialize( xFac, aArgs );
#else
// Init UCB (Use provided configuration data)
::ucbhelper::ContentProviderDataList aProviders;
aProviders.push_back(
::ucbhelper::ContentProviderData(
OUString::createFromAscii( "com.sun.star.ucb.FileContentProvider" ),
OUString::createFromAscii( "file" ),
OUString() ) );
sal_Bool bSuccess = ::ucbhelper::ContentBroker::initialize( xFac, aProviders );
#endif
if ( !bSuccess )
{
DBG_ERROR( "Error creating UCB!" );
return;
}
//////////////////////////////////////////////////////////////////////
// Create/init/show app window.
//////////////////////////////////////////////////////////////////////
std::auto_ptr< ResMgr > xManager(
ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) );
UcbExplorerWindow aAppWin( *xManager.get(), 0, WB_APP | WB_STDWORK );
MenuBar aMBMain( ResId( MENU_MAIN, *xManager.get() ) );
// Check for command line params
#if 0
for ( int i = 0; i < GetCommandLineParamCount(); ++i )
{
String aPara = GetCommandLineParam( i );
}
#endif
String aRootURL = GetCommandLineParam( 0 );
if ( aRootURL.Len() == 0 )
aRootURL = UniString::CreateFromAscii(
RTL_CONSTASCII_STRINGPARAM( "vnd.sun.star.hier:/" ) );
String aTitle( ResId( TEXT_TITLEBAR, *xManager.get() ) );
aTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " - " ) );
aTitle += aRootURL;
aAppWin.SetText( aTitle );
aAppWin.SetPosSizePixel( 0, 0, 500, 750 );
aAppWin.Show();
aAppWin.m_aTree.InsertEntry( aRootURL );
//////////////////////////////////////////////////////////////////////
// Execute app.
//////////////////////////////////////////////////////////////////////
Execute();
//////////////////////////////////////////////////////////////////////
// Cleanup.
//////////////////////////////////////////////////////////////////////
// m_aTree holds UCB contents!
aAppWin.m_aTree.Clear();
::ucbhelper::ContentBroker::deinitialize();
if ( xComponent.is() )
xComponent->dispose();
}
//=========================================================================
//
// The Application.
//
//=========================================================================
MyApp aMyApp;