summaryrefslogtreecommitdiff
path: root/svtools/workben/treecontrol/treetest.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/workben/treecontrol/treetest.cxx')
-rw-r--r--svtools/workben/treecontrol/treetest.cxx396
1 files changed, 396 insertions, 0 deletions
diff --git a/svtools/workben/treecontrol/treetest.cxx b/svtools/workben/treecontrol/treetest.cxx
new file mode 100644
index 000000000000..f82c4ae388f5
--- /dev/null
+++ b/svtools/workben/treecontrol/treetest.cxx
@@ -0,0 +1,396 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <wchar.h>
+
+#include <cppuhelper/bootstrap.hxx>
+
+#include <osl/file.hxx>
+#include <osl/process.h>
+
+#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/tree/XMutableTreeDataModel.hpp>
+#include <com/sun/star/awt/tree/XTreeControl.hpp>
+#include <com/sun/star/awt/tree/XTreeExpansionListener.hpp>
+#include <com/sun/star/awt/tree/XTreeEditListener.hpp>
+#include <com/sun/star/awt/XDialog.hpp>
+#include <com/sun/star/awt/XControlModel.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/awt/XControl.hpp>
+#include <com/sun/star/awt/XControlContainer.hpp>
+#include <com/sun/star/view/SelectionType.hpp>
+
+#include <tools/urlobj.hxx>
+#include <vcl/image.hxx>
+#include <vcl/graph.hxx>
+
+#include <cppuhelper/implbase2.hxx>
+
+#include <string.h>
+#include <rtl/ref.hxx>
+
+#include "imagemgr.hxx"
+
+using rtl::OUString;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::bridge;
+using namespace com::sun::star::frame;
+using namespace com::sun::star::registry;
+using namespace com::sun::star::awt;
+using namespace com::sun::star::awt::tree;
+using namespace com::sun::star::container;
+using namespace com::sun::star::view;
+using namespace com::sun::star::util;
+
+class DirectoryTree : public ::cppu::WeakImplHelper2< XTreeExpansionListener, XTreeEditListener >
+{
+public:
+ DirectoryTree( const Reference< XComponentContext >& xComponentContext );
+ virtual ~DirectoryTree();
+
+ void fillNode( const Reference< XMutableTreeNode >& xNode );
+ void display( const OUString& rURL );
+
+ // XTreeExpansionListener
+ virtual void SAL_CALL requestChildNodes( const TreeExpansionEvent& Event ) throw (RuntimeException);
+ virtual void SAL_CALL treeExpanding( const TreeExpansionEvent& Event ) throw (ExpandVetoException, RuntimeException);
+ virtual void SAL_CALL treeCollapsing( const TreeExpansionEvent& Event ) throw (ExpandVetoException, RuntimeException);
+ virtual void SAL_CALL treeExpanded( const TreeExpansionEvent& Event ) throw (RuntimeException);
+ virtual void SAL_CALL treeCollapsed( const TreeExpansionEvent& Event ) throw (RuntimeException);
+
+ // XTreeEditListener
+ virtual void SAL_CALL nodeEditing( const Reference< XTreeNode >& Node ) throw (VetoException, RuntimeException);
+ virtual void SAL_CALL nodeEdited( const Reference< XTreeNode >& Node, const OUString& NewText ) throw (RuntimeException);
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (RuntimeException);
+
+ Reference< XMultiComponentFactory > mxMultiComponentFactoryServer;
+ Reference< XComponentContext > mxComponentContext;
+ Reference< XTreeControl > mxTreeControl;
+ Reference< XMutableTreeDataModel > mxTreeDataModel;
+};
+
+DirectoryTree::DirectoryTree( const Reference< XComponentContext >& xComponentContext )
+: mxComponentContext( xComponentContext )
+, mxMultiComponentFactoryServer( xComponentContext->getServiceManager() )
+{
+}
+
+DirectoryTree::~DirectoryTree()
+{
+}
+
+void DirectoryTree::display( const OUString& rURL )
+{
+ // some property names for later use
+ const OUString sPositionX( RTL_CONSTASCII_USTRINGPARAM( "PositionX" ) );
+ const OUString sPositionY( RTL_CONSTASCII_USTRINGPARAM( "PositionY" ) );
+ const OUString sWidth( RTL_CONSTASCII_USTRINGPARAM( "Width" ) );
+ const OUString sHeight( RTL_CONSTASCII_USTRINGPARAM( "Height" ) );
+ const OUString sDataModel( RTL_CONSTASCII_USTRINGPARAM( "DataModel" ) );
+ const OUString sSelectionType( RTL_CONSTASCII_USTRINGPARAM( "SelectionType" ) );
+ const OUString sShowsRootHandles( RTL_CONSTASCII_USTRINGPARAM( "ShowsRootHandles" ) );
+ const OUString sShowsHandles( RTL_CONSTASCII_USTRINGPARAM( "ShowsHandles" ) );
+ const OUString sRootDisplayed( RTL_CONSTASCII_USTRINGPARAM( "RootDisplayed" ) );
+ const OUString sEditable( RTL_CONSTASCII_USTRINGPARAM( "Editable" ) );
+ const OUString sTitle( RTL_CONSTASCII_USTRINGPARAM( "Title" ) );
+ const OUString sRowHeight( RTL_CONSTASCII_USTRINGPARAM( "RowHeight" ) );
+
+ // first create a data model for our tree control
+ mxTreeDataModel = Reference< XMutableTreeDataModel >(
+ mxMultiComponentFactoryServer->createInstanceWithContext(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.tree.MutableTreeDataModel" ) ),
+ mxComponentContext ), UNO_QUERY_THROW );
+
+ // now fill it with some sample data
+ Reference< XMutableTreeNode > xNode( mxTreeDataModel->createNode( Any( rURL ), false ), UNO_QUERY_THROW );
+ xNode->setDataValue( Any( rURL ) );
+ xNode->setExpandedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_down.png" ) ) );
+ xNode->setCollapsedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_right.png" ) ) );
+
+ fillNode( xNode );
+ mxTreeDataModel->setRoot( xNode );
+
+ // now create the dialog
+ Reference< XControlModel > xDialogModel(
+ mxMultiComponentFactoryServer->createInstanceWithContext(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlDialogModel" ) ),
+ mxComponentContext ), UNO_QUERY_THROW );
+
+ Reference< XPropertySet > xDialogPropertySet( xDialogModel, UNO_QUERY_THROW );
+ xDialogPropertySet->setPropertyValue( sPositionX, Any( sal_Int32(50) ) );
+ xDialogPropertySet->setPropertyValue( sPositionY, Any( sal_Int32(50) ) );
+ xDialogPropertySet->setPropertyValue( sWidth, Any( sal_Int32(256) ) );
+ xDialogPropertySet->setPropertyValue( sHeight, Any( sal_Int32(256) ) );
+ xDialogPropertySet->setPropertyValue( sTitle, Any( OUString( RTL_CONSTASCII_USTRINGPARAM( "Tree Control Test" ) ) ) );
+
+ Reference< XMultiServiceFactory > xDialogMSF( xDialogModel, UNO_QUERY_THROW );
+
+ // now create our tree control
+ Reference< XControlModel > xTreeControlModel(
+ xDialogMSF->createInstance(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.tree.TreeControlModel" ) ) ),
+ UNO_QUERY_THROW );
+
+ Reference< XPropertySet > XTreeControlModelSet( xTreeControlModel, UNO_QUERY_THROW );
+
+ XTreeControlModelSet->setPropertyValue( sSelectionType, Any( SelectionType_NONE ) );
+ XTreeControlModelSet->setPropertyValue( sPositionX, Any( sal_Int32(3) ) );
+ XTreeControlModelSet->setPropertyValue( sPositionY, Any( sal_Int32(3) ) );
+ XTreeControlModelSet->setPropertyValue( sWidth, Any( sal_Int32(253) ) );
+ XTreeControlModelSet->setPropertyValue( sHeight, Any( sal_Int32(253) ) );
+ XTreeControlModelSet->setPropertyValue( sDataModel, Any( mxTreeDataModel ) );
+ XTreeControlModelSet->setPropertyValue( sShowsRootHandles,Any( sal_False ) );
+ XTreeControlModelSet->setPropertyValue( sShowsHandles, Any( sal_False ) );
+ XTreeControlModelSet->setPropertyValue( sRootDisplayed, Any( sal_True ) );
+ XTreeControlModelSet->setPropertyValue( sEditable, Any( sal_True ) );
+// XTreeControlModelSet->setPropertyValue( sRowHeight, Any( sal_Int32( 12 ) ) );
+
+ Reference< XNameContainer > xDialogModelContainer( xDialogModel, UNO_QUERY_THROW );
+
+ const OUString sTreeControlName( RTL_CONSTASCII_USTRINGPARAM( "tree" ) );
+
+ xDialogModelContainer->insertByName( sTreeControlName, Any( xTreeControlModel ) );
+
+ // now create the peers
+ Reference< XControl > xDialogControl(
+ mxMultiComponentFactoryServer->createInstanceWithContext(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlDialog" ) ),
+ mxComponentContext ), UNO_QUERY_THROW );
+
+ xDialogControl->setModel( xDialogModel );
+
+ Reference< XToolkit > xToolkit(
+ mxMultiComponentFactoryServer->createInstanceWithContext(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.Toolkit" ) ),
+ mxComponentContext ), UNO_QUERY_THROW );
+ xDialogControl->createPeer( xToolkit, 0 );
+
+ // get the peers of the sub controls from the dialog peer container
+ Reference< XControlContainer > xDialogContainer( xDialogControl, UNO_QUERY_THROW );
+ mxTreeControl = Reference< XTreeControl >( xDialogContainer->getControl( sTreeControlName ), UNO_QUERY_THROW );
+
+ Reference< XTreeExpansionListener > xListener( static_cast<XWeak*>(this), UNO_QUERY_THROW );
+ mxTreeControl->addTreeExpansionListener( xListener );
+ Reference< XDialog > xDialog( xDialogControl, UNO_QUERY_THROW );
+ xDialog->execute();
+}
+
+void DirectoryTree::fillNode( const Reference< XMutableTreeNode >& xNode )
+{
+ if( xNode->getChildCount() == 0 )
+ {
+ OUString sParentPath;
+ xNode->getDataValue() >>= sParentPath;
+
+ osl::Directory aDirectory( sParentPath );
+ if( aDirectory.open() == osl::Directory::E_None )
+ {
+ osl::DirectoryItem aItem;
+ osl::FileStatus fs( FileStatusMask_Type | FileStatusMask_FileURL);
+ while( aDirectory.getNextItem( aItem, 0xffffffff ) == osl::Directory::E_None )
+ {
+ if (aItem.getFileStatus(fs) == osl::FileBase::E_None)
+ {
+ bool bDirectory = fs.getFileType() == osl::FileStatus::Directory;
+ Reference< XMutableTreeNode > xChildNode( mxTreeDataModel->createNode( Any( fs.getFileName() ), bDirectory ), UNO_QUERY_THROW );
+ xChildNode->setDataValue( Any( fs.getFileURL() ) );
+ if( bDirectory )
+ {
+ xChildNode->setExpandedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_down.png" ) ) );
+ xChildNode->setCollapsedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_right.png" ) ) );
+ }
+ else
+ {
+ xChildNode->setNodeGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM("private:graphicrepository/sw/imglst/nc20010.png") ) );
+ }
+ xNode->appendChild( xChildNode );
+ }
+ }
+ }
+ }
+}
+
+// XTreeExpansionListener
+void SAL_CALL DirectoryTree::requestChildNodes( const TreeExpansionEvent& rEvent ) throw (RuntimeException)
+{
+ if( rEvent.Node.is() && rEvent.Node->hasChildsOnDemand() )
+ {
+ Reference< XMutableTreeNode > xNode( rEvent.Node, UNO_QUERY );
+ if( xNode.is() )
+ {
+ fillNode( xNode );
+ xNode->setHasChildsOnDemand( sal_False );
+ }
+ }
+}
+
+void SAL_CALL DirectoryTree::treeExpanding( const TreeExpansionEvent& /*rEvent*/ ) throw (ExpandVetoException, RuntimeException)
+{
+}
+
+void SAL_CALL DirectoryTree::treeCollapsing( const TreeExpansionEvent& ) throw (ExpandVetoException, RuntimeException)
+{
+}
+
+void SAL_CALL DirectoryTree::treeExpanded( const TreeExpansionEvent& ) throw (RuntimeException)
+{
+}
+
+void SAL_CALL DirectoryTree::treeCollapsed( const TreeExpansionEvent& /*rEvent*/ ) throw (RuntimeException)
+{
+/*
+ if( rEvent.Node != mxTreeDataModel->getRoot() )
+ {
+ Reference< XMutableTreeNode > xNode( rEvent.Node, UNO_QUERY );
+ if( xNode.is() )
+ {
+ while( xNode->getChildCount() )
+ xNode->removeChildByIndex(0);
+ xNode->setHasChildsOnDemand( sal_True );
+ }
+ }
+*/
+}
+
+// XTreeEditListener
+void SAL_CALL DirectoryTree::nodeEditing( const Reference< XTreeNode >& ) throw (VetoException, RuntimeException)
+{
+}
+
+void SAL_CALL DirectoryTree::nodeEdited( const Reference< XTreeNode >& , const OUString& ) throw (RuntimeException)
+{
+}
+
+// XEventListener
+void SAL_CALL DirectoryTree::disposing( const ::com::sun::star::lang::EventObject& ) throw (RuntimeException)
+{
+}
+
+//============================================================================
+int SAL_CALL main( int argc, char **argv )
+{
+ OUString sConnectionString(RTL_CONSTASCII_USTRINGPARAM("uno:socket,host=localhost,port=5678;urp;StarOffice.ServiceManager"));
+
+ if (argc < 2)
+ {
+ printf("using: treetest <directory> [<uno_connection_url>]\n\n"
+#ifdef WNT
+ "example: treetest \"c:\" \"uno:socket,host=localhost,port=5678;urp;StarOffice.ServiceManager\"\n");
+#else
+ "example: treetest \"/etc\" \"uno:socket,host=localhost,port=5678;urp;StarOffice.ServiceManager\"\n");
+#endif
+ exit(1);
+ }
+ if (argc == 3)
+ {
+ sConnectionString = OUString::createFromAscii(argv[2]);
+ }
+
+ // Creates a simple registry service instance.
+ Reference< XSimpleRegistry > xSimpleRegistry(::cppu::createSimpleRegistry() );
+
+ // Connects the registry to a persistent data source represented by an URL.
+ xSimpleRegistry->open(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("treetest.rdb") ), sal_True, sal_False );
+
+ /* Bootstraps an initial component context with service manager upon a given
+ registry. This includes insertion of initial services:
+ - (registry) service manager, shared lib loader,
+ - simple registry, nested registry,
+ - implementation registration
+ - registry typedescription provider, typedescription manager (also
+ installs it into cppu core)
+ */
+ Reference< XComponentContext > xComponentContext(
+ ::cppu::bootstrap_InitialComponentContext( xSimpleRegistry ) );
+
+ /* Gets the service manager instance to be used (or null). This method has
+ been added for convenience, because the service manager is a often used
+ object.
+ */
+ Reference< XMultiComponentFactory > xMultiComponentFactoryClient(
+ xComponentContext->getServiceManager() );
+
+ /* Creates an instance of a component which supports the services specified
+ by the factory.
+ */
+ Reference< XInterface > xInterface =
+ xMultiComponentFactoryClient->createInstanceWithContext(
+ OUString::createFromAscii( "com.sun.star.bridge.UnoUrlResolver" ),
+ xComponentContext );
+
+ Reference< XUnoUrlResolver > resolver( xInterface, UNO_QUERY );
+
+ // Resolves the component context from the office, on the uno URL given by argv[1].
+ try
+ {
+ xInterface = Reference< XInterface >(
+ resolver->resolve( sConnectionString ), UNO_QUERY );
+ }
+ catch ( Exception& e )
+ {
+ printf("Error: cannot establish a connection using '%s':\n %s\n",
+ OUStringToOString(sConnectionString, RTL_TEXTENCODING_ASCII_US).getStr(),
+ OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US).getStr());
+ exit(1);
+ }
+
+ // gets the server component context as property of the office component factory
+ Reference< XPropertySet > xPropSet( xInterface, UNO_QUERY );
+ xPropSet->getPropertyValue( OUString::createFromAscii("DefaultContext") ) >>= xComponentContext;
+
+ // gets the service manager from the office
+ Reference< XMultiComponentFactory > xMultiComponentFactoryServer(
+ xComponentContext->getServiceManager() );
+
+ try
+ {
+ OUString ustrFileURL;
+ osl::FileBase::getFileURLFromSystemPath( OUString::createFromAscii(argv[1]), ustrFileURL );
+
+ rtl::Reference< DirectoryTree >(
+ new DirectoryTree( xComponentContext ) )->display(ustrFileURL);
+ }
+ catch( Exception& e )
+ {
+ printf("Error: exception caught during test:\n %s\n",
+ OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US).getStr());
+ exit(1);
+ }
+
+ // dispose the local service manager
+ Reference< XComponent >::query( xMultiComponentFactoryClient )->dispose();
+
+ return 0;
+}