User: kz      
Date: 2008-06-25 12:43:06+0000
Modified:
   dba/dbaccess/source/ui/browser/unodatbr.cxx

Log:
 INTEGRATION: CWS dba30d (1.200.8); FILE MERGED
 2008/06/20 09:02:56 fs 1.200.8.10: #90912# proper state for SID_COPY when the 
table control is active
 2008/06/16 08:48:10 fs 1.200.8.9: #i10000#
 2008/06/16 08:45:12 fs 1.200.8.8: correct OnTreeEntryCompare
 2008/06/11 20:26:06 fs 1.200.8.7: renaming of some of the recently introduced 
css.sdb.application.DatabaseObjectContainer constants
 2008/06/10 14:01:41 fs 1.200.8.6: #i10000#
 2008/06/10 08:36:23 fs 1.200.8.5: #i80943# implement getCurrentSelection
 2008/06/10 06:41:11 fs 1.200.8.4: RESYNC: (1.200-1.201); FILE MERGED
 2008/06/01 20:55:23 fs 1.200.8.3: #i80943# +IContextMenuProvider
 2008/05/29 11:30:59 fs 1.200.8.2: during #i80943#: refactoring: 
requestContextMenu superseded by IContextMenuProvider
 2008/05/28 19:19:15 fs 1.200.8.1: some code re-arrangement during #i87514#

File Changes:

Directory: /dba/dbaccess/source/ui/browser/
===========================================

File [changed]: unodatbr.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/browser/unodatbr.cxx?r1=1.201&r2=1.202
Delta lines:  +291 -282
-----------------------
--- unodatbr.cxx        2008-06-06 14:09:43+0000        1.201
+++ unodatbr.cxx        2008-06-25 12:43:03+0000        1.202
@@ -81,6 +81,7 @@
 #include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
 #include <com/sun/star/sdb/XResultSetAccess.hpp>
 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
+#include <com/sun/star/sdb/application/NamedDatabaseObject.hpp>
 #include <com/sun/star/sdbc/DataType.hpp>
 #include <com/sun/star/sdbc/FetchDirection.hpp>
 #include <com/sun/star/sdbc/SQLWarning.hpp>
@@ -98,6 +99,7 @@
 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
 #include <com/sun/star/document/MacroExecMode.hpp>
 #include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/ui/XContextMenuInterceptor.hpp>
 /** === end UNO includes === **/
 
 #include <comphelper/extract.hxx>
@@ -136,6 +138,7 @@
 using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::awt;
 using namespace ::com::sun::star::sdb;
+using namespace ::com::sun::star::sdb::application;
 using namespace ::com::sun::star::sdbc;
 using namespace ::com::sun::star::sdbcx;
 using namespace ::com::sun::star::beans;
@@ -151,18 +154,19 @@
 using namespace ::com::sun::star::view;
 using namespace ::com::sun::star::datatransfer;
 using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::ui;
 using namespace ::dbtools;
 using namespace ::comphelper;
 using namespace ::svx;
 
-using ::com::sun::star::frame::XLayoutManager;      // obsolete of interface 
is moved outside drafts
-using ::com::sun::star::ui::XUIElement;             // dito
-
 // .........................................................................
 namespace dbaui
 {
 // .........................................................................
 
+namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject;
+namespace DatabaseObjectContainer = 
::com::sun::star::sdb::application::DatabaseObjectContainer;
+
 //==================================================================
 //= SbaTableQueryBrowser
 //==================================================================
@@ -220,6 +224,7 @@
 SbaTableQueryBrowser::SbaTableQueryBrowser(const Reference< 
XMultiServiceFactory >& _rM)
        :SbaXDataBrowserController(_rM)
        ,m_aSelectionListeners(m_aMutex)
+    ,m_aContextMenuInterceptors(m_aMutex)
     ,m_aTableCopyHelper(this)
     ,m_pTreeView(NULL)
     ,m_pSplitter(NULL)
@@ -313,6 +318,7 @@
        // kiss our listeners goodbye
        EventObject aEvt(*this);
        m_aSelectionListeners.disposeAndClear(aEvt);
+    m_aContextMenuInterceptors.disposeAndClear(aEvt);
 
        // reset the content's tree view: it holds a reference to our model 
which is to be deleted immediately,
        // and it will live longer than we do.
@@ -322,7 +328,7 @@
        clearTreeModel();
        // clear the tree model
        {
-               ::std::auto_ptr<DBTreeListModel> aTemp(m_pTreeModel);
+               ::std::auto_ptr<SvLBoxTreeList> aTemp(m_pTreeModel);
                m_pTreeModel = NULL;
        }
 
@@ -381,7 +387,8 @@
 
                m_pTreeView->setCopyHandler(LINK(this, SbaTableQueryBrowser, 
OnCopyEntry));
 
-               m_pTreeView->getListBox()->setControlActionListener(this);
+        m_pTreeView->getListBox().setContextMenuProvider( this );
+               m_pTreeView->getListBox().setControlActionListener( this );
                m_pTreeView->SetHelpId(HID_CTL_TREEVIEW);
 
                // a default pos for the splitter, so that the listbox is about 
80 (logical) pixels wide
@@ -391,7 +398,7 @@
                getBrowserView()->setTreeView(m_pTreeView);
 
                // fill view with data
-               m_pTreeModel = new DBTreeListModel;
+               m_pTreeModel = new SvLBoxTreeList;
                m_pTreeModel->SetSortMode(SortAscending);
                m_pTreeModel->SetCompareHdl(LINK(this, SbaTableQueryBrowser, 
OnTreeEntryCompare));
                m_pTreeView->setModel(m_pTreeModel);
@@ -422,7 +429,7 @@
                Sequence< ::rtl::OUString> aProperties(3);
                Sequence< Any> aValues(3);
 
-               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
+               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
         OSL_ENSURE( pData, "SbaTableQueryBrowser::InitializeForm: No user data 
set at the currently displayed entry!" );
         OSL_ENSURE( pData->xObjectProperties.is(), 
"SbaTableQueryBrowser::InitializeForm: No table available!" );
 
@@ -503,7 +510,7 @@
                                Sequence< ::rtl::OUString> aProperties(6 + ( 
m_bPreview ? 5 : 0 ));
                                Sequence< Any> aValues(7 + ( m_bPreview ? 5 : 0 
));
 
-                               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
+                               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
                                OSL_ENSURE( pData->xObjectProperties.is(), 
"SbaTableQueryBrowser::InitializeGridModel: No table available!" );
 
                                ::rtl::OUString* pStringIter = 
aProperties.getArray();
@@ -556,7 +563,8 @@
 
                        Reference<XChild> xChild(xConnection,UNO_QUERY);
                        Reference<XPropertySet> 
xDataSourceProp(xChild->getParent(),UNO_QUERY);
-                       sal_Bool bSupress = 
::cppu::any2bool(xDataSourceProp->getPropertyValue(PROPERTY_SUPPRESSVERSIONCL));
+                       sal_Bool bSuppressVersionCol = sal_False;
+            OSL_VERIFY( xDataSourceProp->getPropertyValue( 
PROPERTY_SUPPRESSVERSIONCL ) >>= bSuppressVersionCol );
 
                        // insert the column into the gridcontrol so that we 
see something :-)
                        ::rtl::OUString aCurrentModelType;
@@ -566,21 +574,24 @@
                        const ::rtl::OUString* pIter            = 
aNames.getConstArray();
                        const ::rtl::OUString* pEnd             = pIter + 
aNames.getLength();
 
-                       ::rtl::OUString sPropertyName;
-                       Reference<XPropertySet> xColumn;
+                       ::rtl::OUString sDefaultProperty;
+                       Reference< XPropertySet > xColumn;
+            Reference< XPropertySetInfo > xColPSI;
                        for (sal_uInt16 i=0; pIter != pEnd; ++i,++pIter)
                        {
-                               // Typ
-                               // first get type to determine wich control we 
need
-                               
::cppu::extractInterface(xColumn,xColumns->getByName(*pIter));
+                xColumn.set( xColumns->getByName( *pIter ), UNO_QUERY_THROW );
+                xColPSI.set( xColumn->getPropertySetInfo(), UNO_SET_THROW );
 
                                // ignore the column when it is a rowversion one
-                               if(bSupress && 
xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_ISROWVERSION)
-                                                       && 
::cppu::any2bool(xColumn->getPropertyValue(PROPERTY_ISROWVERSION)))
+                               if  (   bSuppressVersionCol
+                    &&  xColPSI->hasPropertyByName( PROPERTY_ISROWVERSION )
+                    &&  ::cppu::any2bool( xColumn->getPropertyValue( 
PROPERTY_ISROWVERSION ) )
+                    )
                                        continue;
 
+                               // use the result set column's type to 
determine the type of grid column to create
                                sal_Bool bFormattedIsNumeric    = sal_True;
-                               sal_Int32 nType = 
comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_TYPE));
+                sal_Int32 nType = ::comphelper::getINT32( 
xColumn->getPropertyValue( PROPERTY_TYPE ) );
 
                 ::std::vector< NamedValue > aInitialValues;
                 ::std::vector< ::rtl::OUString > aCopyProperties;
@@ -591,7 +602,7 @@
                     case DataType::BOOLEAN:
                                                aCurrentModelType = 
::rtl::OUString::createFromAscii("CheckBox");
                         aInitialValues.push_back( NamedValue( ::rtl::OUString( 
RTL_CONSTASCII_USTRINGPARAM( "VisualEffect" ) ), makeAny( VisualEffect::FLAT ) 
) );
-                                               sPropertyName = 
PROPERTY_DEFAULTSTATE;
+                                               sDefaultProperty = 
PROPERTY_DEFAULTSTATE;
                                                break;
 
                                        case DataType::LONGVARCHAR:
@@ -601,7 +612,7 @@
                                        case DataType::VARBINARY:
                                        case DataType::LONGVARBINARY:
                                                aCurrentModelType = 
::rtl::OUString::createFromAscii("TextField");
-                                               sPropertyName = 
PROPERTY_DEFAULTTEXT;
+                                               sDefaultProperty = 
PROPERTY_DEFAULTTEXT;
                                                break;
 
                                        case DataType::VARCHAR:
@@ -610,7 +621,7 @@
                                                // NO break!
                                        default:
                                                aCurrentModelType = 
::rtl::OUString::createFromAscii("FormattedField");
-                                               sPropertyName = 
PROPERTY_EFFECTIVEDEFAULT;
+                                               sDefaultProperty = 
PROPERTY_EFFECTIVEDEFAULT;
 
                         if ( xSupplier.is() )
                             aInitialValues.push_back( NamedValue( 
::rtl::OUString::createFromAscii( "FormatsSupplier" ), makeAny( xSupplier ) ) );
@@ -622,19 +633,18 @@
                 aInitialValues.push_back( NamedValue( PROPERTY_CONTROLSOURCE, 
makeAny( *pIter ) ) );
                 aInitialValues.push_back( NamedValue( PROPERTY_LABEL, makeAny( 
*pIter ) ) );
 
-                               Reference< XPropertySet > xCurrentCol = 
xColFactory->createColumn(aCurrentModelType);
-                Reference< XPropertySetInfo > xColumnPropertyInfo = 
xCurrentCol->getPropertySetInfo();
+                               Reference< XPropertySet > xGridCol( 
xColFactory->createColumn( aCurrentModelType ), UNO_SET_THROW );
+                Reference< XPropertySetInfo > xGridColPSI( 
xGridCol->getPropertySetInfo(), UNO_SET_THROW );
 
                 // calculate the default
                                Any aDefault;
-                               sal_Bool bDefault = 
xColumnPropertyInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT);
-                               if ( bDefault )
-                                       aDefault = 
xColumn->getPropertyValue(PROPERTY_CONTROLDEFAULT);
+                               if ( xGridColPSI->hasPropertyByName( 
PROPERTY_CONTROLDEFAULT ) )
+                                       aDefault = xColumn->getPropertyValue( 
PROPERTY_CONTROLDEFAULT );
 
                                // default value
                                if ( nType == DataType::BIT || nType == 
DataType::BOOLEAN )
                                {
-                                       if(bDefault && aDefault.hasValue())
+                                       if ( aDefault.hasValue() )
                                                aDefault <<= 
(comphelper::getString(aDefault).toInt32() == 0) ? (sal_Int16)STATE_NOCHECK : 
(sal_Int16)STATE_CHECK;
                                        else
                                                aDefault <<= 
((sal_Int16)STATE_DONTKNOW);
@@ -642,14 +652,15 @@
                                }
 
                                if ( aDefault.hasValue() )
-                    aInitialValues.push_back( NamedValue( sPropertyName, 
aDefault ) );
+                    aInitialValues.push_back( NamedValue( sDefaultProperty, 
aDefault ) );
 
                                // transfer properties from the definition to 
the UNO-model :
                 aCopyProperties.push_back( PROPERTY_HIDDEN );
                 aCopyProperties.push_back( PROPERTY_WIDTH );
 
+                // help text to display for the column
                 Any aDescription; aDescription <<= ::rtl::OUString();
-                               if ( 
xColumn->getPropertySetInfo()->hasPropertyByName( PROPERTY_HELPTEXT ) )
+                               if ( xColPSI->hasPropertyByName( 
PROPERTY_HELPTEXT ) )
                     aDescription <<= ::comphelper::getString( 
xColumn->getPropertyValue( PROPERTY_HELPTEXT ) );
                 aInitialValues.push_back( NamedValue( PROPERTY_HELPTEXT, 
aDescription ) );
 
@@ -662,25 +673,24 @@
                       ++property
                     )
                 {
-                                   xCurrentCol->setPropertyValue( 
property->Name, property->Value );
+                                   xGridCol->setPropertyValue( property->Name, 
property->Value );
                 }
                 for ( ::std::vector< ::rtl::OUString >::const_iterator 
copyPropertyName = aCopyProperties.begin();
                       copyPropertyName != aCopyProperties.end();
                       ++copyPropertyName
                     )
-                                   xCurrentCol->setPropertyValue( 
*copyPropertyName, xColumn->getPropertyValue( *copyPropertyName ) );
+                                   xGridCol->setPropertyValue( 
*copyPropertyName, xColumn->getPropertyValue( *copyPropertyName ) );
 
-                               xColContainer->insertByName(*pIter, 
makeAny(xCurrentCol));
+                               xColContainer->insertByName(*pIter, 
makeAny(xGridCol));
                        }
                }
        }
        catch(Exception&)
        {
-               DBG_ERROR("SbaTableQueryBrowser::InitializeGridModel : 
something went wrong !");
+        DBG_UNHANDLED_EXCEPTION();
                return sal_False;
        }
 
-
        return sal_True;
 }
 // 
-----------------------------------------------------------------------------
@@ -689,7 +699,7 @@
        Reference<XPropertySet> xRet;
        if(_pCurrentlyDisplayed)
        {
-               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(_pCurrentlyDisplayed->GetUserData());
+               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(_pCurrentlyDisplayed->GetUserData());
                Reference<XColumnsSupplier> 
xColumnsSup(pData->xObjectProperties,UNO_QUERY);
                Reference<XNameAccess> xNames = xColumnsSup->getColumns();
                ::rtl::OUString aName;
@@ -705,7 +715,7 @@
 {
        if(m_pCurrentlyDisplayed)
        {
-               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
+               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
                Reference< XPropertySet > 
xObjectProps(pData->xObjectProperties, UNO_QUERY);
                
OSL_ENSURE(xObjectProps.is(),"SbaTableQueryBrowser::transferChangedControlProperty:
 no table/query object!");
                if (xObjectProps.is())
@@ -790,7 +800,7 @@
                {
                        if(m_pCurrentlyDisplayed)
                        {
-                               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
+                               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
                                OSL_ENSURE( pData->xObjectProperties.is(), "No 
table available!" );
 
                                sal_Bool bDefault = !evt.NewValue.hasValue();
@@ -980,7 +990,7 @@
 
     bool FilterByEntryDataId::includeEntry( SvLBoxEntry* _pEntry ) const
     {
-        DBTreeListModel::DBTreeListUserData* pData = static_cast< 
DBTreeListModel::DBTreeListUserData* >( _pEntry->GetUserData() );
+        DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( 
_pEntry->GetUserData() );
         return ( !pData || ( pData->sAccessor == sId ) );
     }
 }
@@ -990,7 +1000,7 @@
 {
     DBG_ASSERT( _pDataSourceEntry, 
"SbaTableQueryBrowser::getDataSourceAcessor: invalid entry!" );
 
-       DBTreeListModel::DBTreeListUserData* pData = static_cast< 
DBTreeListModel::DBTreeListUserData* >( _pDataSourceEntry->GetUserData() );
+       DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( 
_pDataSourceEntry->GetUserData() );
     DBG_ASSERT( pData, "SbaTableQueryBrowser::getDataSourceAcessor: invalid 
entry data!" );
     DBG_ASSERT( pData->eType == etDatasource, 
"SbaTableQueryBrowser::getDataSourceAcessor: entry does not denote a data 
source!" );
     return pData->sAccessor.Len() ? pData->sAccessor : GetEntryText( 
_pDataSourceEntry );
@@ -1007,7 +1017,7 @@
                *_ppContainerEntry = NULL;
 
        SvLBoxEntry* pObject = NULL;
-       if (m_pTreeView && m_pTreeView->getListBox())
+       if ( m_pTreeView )
        {
                // look for the data source entry
         String sDisplayName, sDataSourceId;
@@ -1016,7 +1026,7 @@
             // #i33699# - 2004-09-24 - [EMAIL PROTECTED]
 
         FilterByEntryDataId aFilter( sDataSourceId );
-        SvLBoxEntry* pDataSource = 
m_pTreeView->getListBox()->GetEntryPosByName( sDisplayName, NULL, &aFilter );
+        SvLBoxEntry* pDataSource = 
m_pTreeView->getListBox().GetEntryPosByName( sDisplayName, NULL, &aFilter );
                if ( !pDataSource ) // check if the data source name is a file 
location
                {
                        if ( bIsDataSourceURL )
@@ -1026,7 +1036,7 @@
                                Image a, b, c;  // not interested in  reusing 
them
                                String e, f;
                                implAddDatasource( _rDataSource, a, e, b, f, c, 
_rxConnection );
-                               pDataSource = 
m_pTreeView->getListBox()->GetEntryPosByName( sDisplayName, NULL, &aFilter );
+                               pDataSource = 
m_pTreeView->getListBox().GetEntryPosByName( sDisplayName, NULL, &aFilter );
                 DBG_ASSERT( pDataSource, 
"SbaTableQueryBrowser::getObjectEntry: hmm - did not find it again!" );
                        }
                }
@@ -1038,18 +1048,18 @@
                {
                        // expand if required so
                        if (_bExpandAncestors)
-                               m_pTreeView->getListBox()->Expand(pDataSource);
+                               m_pTreeView->getListBox().Expand(pDataSource);
 
                        // look for the object container
                        SvLBoxEntry* pCommandType = NULL;
                        switch (_nCommandType)
                        {
                                case CommandType::TABLE:
-                                       pCommandType = 
m_pTreeView->getListBox()->GetModel()->GetEntry(pDataSource, CONTAINER_TABLES);
+                                       pCommandType = 
m_pTreeView->getListBox().GetModel()->GetEntry(pDataSource, CONTAINER_TABLES);
                                        break;
 
                                case CommandType::QUERY:
-                                       pCommandType = 
m_pTreeView->getListBox()->GetModel()->GetEntry(pDataSource, CONTAINER_QUERIES);
+                                       pCommandType = 
m_pTreeView->getListBox().GetModel()->GetEntry(pDataSource, CONTAINER_QUERIES);
                                        break;
                        }
 
@@ -1060,10 +1070,10 @@
                        {
                                // expand if required so
                                if (_bExpandAncestors)
-                                       
m_pTreeView->getListBox()->Expand(pCommandType);
+                                       
m_pTreeView->getListBox().Expand(pCommandType);
 
                                // look for the object
-                               pObject = 
m_pTreeView->getListBox()->GetEntryPosByName(_rCommand, pCommandType);
+                               pObject = 
m_pTreeView->getListBox().GetEntryPosByName(_rCommand, pCommandType);
                        }
                }
        }
@@ -1210,14 +1220,14 @@
                else
                {
                        Reference<XConnection> xCon(_rSource.Source, UNO_QUERY);
-                       if ( xCon.is() && m_pTreeView && 
m_pTreeView->getListBox() )
+                       if ( xCon.is() && m_pTreeView )
                        {       // our connection is in dispose so we have to 
find the entry equal with this connection
                                // and close it what means to collapse the entry
                                // get the top-level representing the removed 
data source
-                               SvLBoxEntry* pDSLoop = 
m_pTreeView->getListBox()->FirstChild(NULL);
+                               SvLBoxEntry* pDSLoop = 
m_pTreeView->getListBox().FirstChild(NULL);
                                while (pDSLoop)
                                {
-                                       DBTreeListModel::DBTreeListUserData* 
pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pDSLoop->GetUserData());
+                                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pDSLoop->GetUserData());
                                        if ( pData && pData->xConnection == 
xCon )
                                        {
                                                // we set the conenction to 
null to avoid a second disposing of the connection
@@ -1226,7 +1236,7 @@
                                                break;
                                        }
 
-                                       pDSLoop = 
m_pTreeView->getListBox()->NextSibling(pDSLoop);
+                                       pDSLoop = 
m_pTreeView->getListBox().NextSibling(pDSLoop);
                                }
                        }
                        else
@@ -1513,24 +1523,63 @@
        if (!getBrowserView() || !getBrowserView()->getVclControl())
                return aReturn;
 
-       switch (nId)
+       switch ( nId )
        {
                case ID_BROWSER_CLOSE:
                        // the close button should always be enabled
                        aReturn.bEnabled = !m_bEnableBrowser;
                        return aReturn;
+
        // "toggle explorer" is always enabled (if we have a explorer)
                case ID_BROWSER_EXPLORER:
-               {               // this slot is available even if no form is 
loaded
                        aReturn.bEnabled = m_bEnableBrowser;
                        aReturn.bChecked = haveExplorer();
                        return aReturn;
-               }
+
                case ID_BROWSER_REMOVEFILTER:
-                       aReturn = SbaXDataBrowserController::GetState(nId);
+                       return SbaXDataBrowserController::GetState( nId );
+
+        case ID_BROWSER_COPY:
+            if ( !m_pTreeView->HasChildPathFocus() )
+                // handled below
+                break;
+            // NO break!
+        case ID_TREE_CLOSE_CONN:
+        case ID_TREE_EDIT_DATABASE:
+        {
+            SvLBoxEntry* pCurrentEntry( 
m_pTreeView->getListBox().GetCurEntry() );
+            EntryType eType = getEntryType( pCurrentEntry );
+            if ( eType == etUnknown )
                        return aReturn;
+
+            SvLBoxEntry* pDataSourceEntry = 
m_pTreeView->getListBox().GetRootLevelParent( pCurrentEntry );
+            DBTreeListUserData* pDSData
+                =   pDataSourceEntry
+                ?      static_cast< DBTreeListUserData* >( 
pDataSourceEntry->GetUserData() )
+                :      NULL;
+
+            if ( nId == ID_TREE_CLOSE_CONN )
+            {
+                aReturn.bEnabled = ( pDSData != NULL ) && 
pDSData->xConnection.is();
+            }
+            else if ( nId == ID_TREE_EDIT_DATABASE )
+            {
+                ::utl::OConfigurationTreeRoot aConfig( 
::utl::OConfigurationTreeRoot::createWithServiceFactory( getORB(),
+                    ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 
"/org.openoffice.Office.DataAccess/ApplicationIntegration/InstalledFeatures/Common"
 ) ) ) );
+                sal_Bool bHaveEditDatabase( sal_True );
+                OSL_VERIFY( aConfig.getNodeValue( 
"EditDatabaseFromDataSourceView" ) >>= bHaveEditDatabase );
+                aReturn.bEnabled = getORB().is() && ( pDataSourceEntry != NULL 
) && bHaveEditDatabase;
+            }
+            else if ( nId == ID_BROWSER_COPY )
+            {
+                aReturn.bEnabled = isEntryCopyAllowed( pCurrentEntry );
+            }
+
+            return aReturn;
+        }
        }
 
+    // all slots not handled above are not available if no form is loaded
        if (!isLoaded())
                return aReturn;
 
@@ -1597,9 +1646,9 @@
                 {
                     DBG_UNHANDLED_EXCEPTION();
                 }
-
                        }
                        break;
+
                        case ID_BROWSER_TITLE:
                                {
                                        Reference<XPropertySet> 
xProp(getRowSet(),UNO_QUERY);
@@ -1634,17 +1683,14 @@
                                break;
 
                        case ID_BROWSER_COPY:
-                               if(m_pTreeView->HasChildPathFocus())
-                                       aReturn.bEnabled = 
isEntryCopyAllowed(m_pTreeView->getListBox()->GetCurEntry());
-                               else if (getBrowserView() && 
getBrowserView()->getVclControl() && 
!getBrowserView()->getVclControl()->IsEditing())
+                OSL_ENSURE( !m_pTreeView->HasChildPathFocus(), 
"SbaTableQueryBrowser::GetState( ID_BROWSER_COPY ): this should have been 
handled above!" );
+                               if (getBrowserView() && 
getBrowserView()->getVclControl() && 
!getBrowserView()->getVclControl()->IsEditing())
                                {
                                        SbaGridControl* pControl = 
getBrowserView()->getVclControl();
                                        aReturn.bEnabled = 
pControl->canCopyCellText(pControl->GetCurRow(), pControl->GetCurColumnId());
-                               }
-                               else
-                                       return 
SbaXDataBrowserController::GetState(nId);
                                break;
-
+                               }
+                // NO break here
                        default:
                                return SbaXDataBrowserController::GetState(nId);
                }
@@ -1663,6 +1709,23 @@
 {
        switch (nId)
        {
+               default:
+                       SbaXDataBrowserController::Execute(nId,aArgs);
+                       break;
+
+               case ID_TREE_EDIT_DATABASE:
+            implAdministrate( m_pTreeView->getListBox().GetCurEntry() );
+                       break;
+
+        case ID_TREE_CLOSE_CONN:
+            openHelpAgent( HID_DSBROWSER_DISCONNECTING );
+            closeConnection( m_pTreeView->getListBox().GetRootLevelParent( 
m_pTreeView->getListBox().GetCurEntry() ) );
+            break;
+
+        case ID_TREE_ADMINISTRATE:
+            ::svx::administrateDatabaseRegistration( getView() );
+            break;
+
                case ID_BROWSER_REFRESH:
                {
                        if ( !SaveModified( ) )
@@ -1815,7 +1878,7 @@
                case ID_BROWSER_COPY:
                        if(m_pTreeView->HasChildPathFocus())
                        {
-                               
copyEntry(m_pTreeView->getListBox()->GetCurEntry());
+                               
copyEntry(m_pTreeView->getListBox().GetCurEntry());
                        }
                        else if (getBrowserView() && 
getBrowserView()->getVclControl() && 
!getBrowserView()->getVclControl()->IsEditing())
                        {
@@ -1825,9 +1888,6 @@
                        else
                                SbaXDataBrowserController::Execute(nId,aArgs);
                        break;
-               default:
-                       SbaXDataBrowserController::Execute(nId,aArgs);
-                       break;
        }
 }
 // -------------------------------------------------------------------------
@@ -1857,8 +1917,8 @@
     String sDSDisplayName, sDataSourceId;
     getDataSourceDisplayName_isURL( _rDbName, sDSDisplayName, sDataSourceId );
 
-       SvLBoxEntry* pDatasourceEntry = m_pTreeView->getListBox()->InsertEntry( 
sDSDisplayName, _rDbImage, _rDbImage, NULL, sal_False );
-       DBTreeListModel::DBTreeListUserData* pDSData = new 
DBTreeListModel::DBTreeListUserData;
+       SvLBoxEntry* pDatasourceEntry = m_pTreeView->getListBox().InsertEntry( 
sDSDisplayName, _rDbImage, _rDbImage, NULL, sal_False );
+       DBTreeListUserData* pDSData = new DBTreeListUserData;
        pDSData->eType = etDatasource;
     pDSData->sAccessor = sDataSourceId;
        pDSData->xConnection = _rxConnection;
@@ -1866,18 +1926,22 @@
 
        // the child for the queries container
        {
-               SvLBoxEntry* pQueries = 
m_pTreeView->getListBox()->InsertEntry(_rQueryName, _rQueryImage, _rQueryImage, 
pDatasourceEntry, sal_True);
-               DBTreeListModel::DBTreeListUserData* pQueriesData = new 
DBTreeListModel::DBTreeListUserData;
+               DBTreeListUserData* pQueriesData = new DBTreeListUserData;
                pQueriesData->eType = etQueryContainer;
-               pQueries->SetUserData(pQueriesData);
+
+        m_pTreeView->getListBox().InsertEntry(
+            _rQueryName, _rQueryImage, _rQueryImage, pDatasourceEntry,
+            TRUE /*ChildsOnDemand*/, LIST_APPEND, pQueriesData );
        }
 
        // the child for the tables container
        {
-               SvLBoxEntry* pTables = 
m_pTreeView->getListBox()->InsertEntry(_rTableName, _rTableImage, _rTableImage, 
pDatasourceEntry, sal_True);
-               DBTreeListModel::DBTreeListUserData* pTablesData = new 
DBTreeListModel::DBTreeListUserData;
+               DBTreeListUserData* pTablesData = new DBTreeListUserData;
                pTablesData->eType = etTableContainer;
-               pTables->SetUserData(pTablesData);
+
+               m_pTreeView->getListBox().InsertEntry(
+            _rTableName, _rTableImage, _rTableImage, pDatasourceEntry,
+            TRUE /*ChildsOnDemand*/, LIST_APPEND, pTablesData );
        }
 
 }
@@ -1902,7 +1966,7 @@
                                                                                
        SvLBoxEntry* _pParent,
                                                                                
        EntryType _eEntryType)
 {
-       DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(_pParent->GetUserData());
+       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(_pParent->GetUserData());
        if(pData) // don't ask if the nameaccess is already set see 
OnExpandEntry views and tables
                pData->xContainer = _xNameAccess;
 
@@ -1913,9 +1977,9 @@
                const ::rtl::OUString* pEnd     = pIter + aNames.getLength();
                for (; pIter != pEnd; ++pIter)
                {
-                       
if(!m_pTreeView->getListBox()->GetEntryPosByName(*pIter,_pParent))
+                       
if(!m_pTreeView->getListBox().GetEntryPosByName(*pIter,_pParent))
                        {
-                               DBTreeListModel::DBTreeListUserData* pEntryData 
= new DBTreeListModel::DBTreeListUserData;
+                               DBTreeListUserData* pEntryData = new 
DBTreeListUserData;
                                pEntryData->eType = _eEntryType;
                 implAppendEntry( _pParent, *pIter, pEntryData, _eEntryType );
                        }
@@ -1937,12 +2001,12 @@
     Image aImage, aImageHC;
     pImageProvider->getImages( _rName, getDatabaseObjectType( _eEntryType ), 
aImage, aImageHC );
 
-    SvLBoxEntry* pNewEntry = m_pTreeView->getListBox()->InsertEntry( _rName, 
_pParent, sal_False, LIST_APPEND, _pUserData );
+    SvLBoxEntry* pNewEntry = m_pTreeView->getListBox().InsertEntry( _rName, 
_pParent, sal_False, LIST_APPEND, _pUserData );
 
-    m_pTreeView->getListBox()->SetExpandedEntryBmp( pNewEntry, aImage, 
BMP_COLOR_NORMAL );
-    m_pTreeView->getListBox()->SetCollapsedEntryBmp( pNewEntry, aImage, 
BMP_COLOR_NORMAL );
-    m_pTreeView->getListBox()->SetExpandedEntryBmp( pNewEntry, aImageHC, 
BMP_COLOR_HIGHCONTRAST );
-    m_pTreeView->getListBox()->SetCollapsedEntryBmp( pNewEntry, aImageHC, 
BMP_COLOR_HIGHCONTRAST );
+    m_pTreeView->getListBox().SetExpandedEntryBmp( pNewEntry, aImage, 
BMP_COLOR_NORMAL );
+    m_pTreeView->getListBox().SetCollapsedEntryBmp( pNewEntry, aImage, 
BMP_COLOR_NORMAL );
+    m_pTreeView->getListBox().SetExpandedEntryBmp( pNewEntry, aImageHC, 
BMP_COLOR_HIGHCONTRAST );
+    m_pTreeView->getListBox().SetCollapsedEntryBmp( pNewEntry, aImageHC, 
BMP_COLOR_HIGHCONTRAST );
 }
 
 
//------------------------------------------------------------------------------
@@ -1954,10 +2018,10 @@
 
        ::osl::MutexGuard aGuard(m_aEntryMutex);
 
-       SvLBoxEntry* pFirstParent = 
m_pTreeView->getListBox()->GetRootLevelParent(_pParent);
+       SvLBoxEntry* pFirstParent = 
m_pTreeView->getListBox().GetRootLevelParent(_pParent);
        OSL_ENSURE(pFirstParent,"SbaTableQueryBrowser::OnExpandEntry: No 
rootlevelparent!");
 
-       DBTreeListModel::DBTreeListUserData* pData = static_cast< 
DBTreeListModel::DBTreeListUserData* >(_pParent->GetUserData());
+       DBTreeListUserData* pData = static_cast< DBTreeListUserData* 
>(_pParent->GetUserData());
        OSL_ENSURE(pData,"SbaTableQueryBrowser::OnExpandEntry: No user data!");
 #if OSL_DEBUG_LEVEL > 0
        SvLBoxString* pString = 
static_cast<SvLBoxString*>(pFirstParent->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING));
@@ -2041,7 +2105,7 @@
        {       // we have to expand the queries or bookmarks
                if (ensureEntryObject(_pParent))
                {
-            DBTreeListModel::DBTreeListUserData* pParentData = static_cast< 
DBTreeListModel::DBTreeListUserData* >( _pParent->GetUserData() );
+            DBTreeListUserData* pParentData = static_cast< DBTreeListUserData* 
>( _pParent->GetUserData() );
                        Reference< XNameAccess > xCollection( 
pParentData->xContainer, UNO_QUERY );
                        populateTree( xCollection, _pParent, etQuery );
                }
@@ -2059,10 +2123,10 @@
        EntryType eType = getEntryType( _pEntry );
 
        // the user data of the entry
-       DBTreeListModel::DBTreeListUserData* pEntryData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(_pEntry->GetUserData());
+       DBTreeListUserData* pEntryData = 
static_cast<DBTreeListUserData*>(_pEntry->GetUserData());
        OSL_ENSURE(pEntryData,"ensureEntryObject: user data should already be 
set!");
 
-       SvLBoxEntry* pDataSourceEntry = 
m_pTreeView->getListBox()->GetRootLevelParent(_pEntry);
+       SvLBoxEntry* pDataSourceEntry = 
m_pTreeView->getListBox().GetRootLevelParent(_pEntry);
 
     sal_Bool bSuccess = sal_False;
        switch (eType)
@@ -2222,7 +2286,7 @@
                                        OnSelectEntry(pCommand);
                                }
                                else
-                                       
m_pTreeView->getListBox()->Select(pCommand);
+                                       
m_pTreeView->getListBox().Select(pCommand);
                        }
                        else if (!pCommandType)
                        {
@@ -2245,7 +2309,7 @@
 {
        ::osl::MutexGuard aGuard(m_aEntryMutex);
 
-       DBTreeListModel::DBTreeListUserData* pEntryData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(_pEntry->GetUserData());
+       DBTreeListUserData* pEntryData = 
static_cast<DBTreeListUserData*>(_pEntry->GetUserData());
        switch (pEntryData->eType)
        {
                case etTableOrView:
@@ -2261,11 +2325,11 @@
 
        // get the entry for the tables or queries
        SvLBoxEntry* pContainer = m_pTreeModel->GetParent(_pEntry);
-       DBTreeListModel::DBTreeListUserData* pContainerData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pContainer->GetUserData());
+       DBTreeListUserData* pContainerData = 
static_cast<DBTreeListUserData*>(pContainer->GetUserData());
 
        // get the entry for the datasource
        SvLBoxEntry* pConnection = m_pTreeModel->GetParent(pContainer);
-       DBTreeListModel::DBTreeListUserData* pConData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pConnection->GetUserData());
+       DBTreeListUserData* pConData = 
static_cast<DBTreeListUserData*>(pConnection->GetUserData());
 
        // reinitialize the rowset
        // but first check if it is necessary
@@ -2349,7 +2413,7 @@
 
                        if(xNameAccess.is() && xNameAccess->hasByName(aName))
                        {
-                               DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(_pEntry->GetUserData());
+                               DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(_pEntry->GetUserData());
                                if ( !pData->xObjectProperties.is() )
                                {
                                        Reference<XInterface> xObject;
@@ -2435,27 +2499,24 @@
 // 
-----------------------------------------------------------------------------
 SvLBoxEntry* SbaTableQueryBrowser::getEntryFromContainer(const 
Reference<XNameAccess>& _rxNameAccess)
 {
-       DBTreeListBox* pListBox = m_pTreeView->getListBox();
+       DBTreeListBox& rListBox = m_pTreeView->getListBox();
        SvLBoxEntry* pContainer = NULL;
-       if ( pListBox )
-       {
-               SvLBoxEntry* pDSLoop = pListBox->FirstChild(NULL);
+       SvLBoxEntry* pDSLoop = rListBox.FirstChild(NULL);
                while (pDSLoop)
                {
-                       pContainer      = pListBox->GetEntry(pDSLoop, 
CONTAINER_QUERIES);
-                       DBTreeListModel::DBTreeListUserData* pQueriesData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pContainer->GetUserData());
+               pContainer      = rListBox.GetEntry(pDSLoop, CONTAINER_QUERIES);
+               DBTreeListUserData* pQueriesData = 
static_cast<DBTreeListUserData*>(pContainer->GetUserData());
                        if ( pQueriesData && pQueriesData->xContainer == 
_rxNameAccess )
                                break;
 
-                       pContainer      = pListBox->GetEntry(pDSLoop, 
CONTAINER_TABLES);
-                       DBTreeListModel::DBTreeListUserData* pTablesData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pContainer->GetUserData());
+               pContainer      = rListBox.GetEntry(pDSLoop, CONTAINER_TABLES);
+               DBTreeListUserData* pTablesData = 
static_cast<DBTreeListUserData*>(pContainer->GetUserData());
                        if ( pTablesData && pTablesData->xContainer == 
_rxNameAccess )
                                break;
 
-                       pDSLoop         = pListBox->NextSibling(pDSLoop);
+               pDSLoop         = rListBox.NextSibling(pDSLoop);
                        pContainer      = NULL;
                }
-       }
        return pContainer;
 }
 
@@ -2472,10 +2533,10 @@
        if(pEntry)      // found one
        {
                // insert the new entry into the tree
-               DBTreeListModel::DBTreeListUserData* pContainerData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pEntry->GetUserData());
+               DBTreeListUserData* pContainerData = 
static_cast<DBTreeListUserData*>(pEntry->GetUserData());
                OSL_ENSURE(pContainerData, "elementInserted: There must be user 
data for this type!");
 
-               DBTreeListModel::DBTreeListUserData* pNewData = new 
DBTreeListModel::DBTreeListUserData;
+               DBTreeListUserData* pNewData = new DBTreeListUserData;
                sal_Bool bIsTable = etTableContainer == pContainerData->eType;
                if ( bIsTable )
                {
@@ -2484,7 +2545,7 @@
                }
                else
                {
-                       if 
((sal_Int32)m_pTreeView->getListBox()->GetChildCount(pEntry) < ( 
xNames->getElementNames().getLength() - 1 ) )
+                       if 
((sal_Int32)m_pTreeView->getListBox().GetChildCount(pEntry) < ( 
xNames->getElementNames().getLength() - 1 ) )
                        {
                                // the item inserts its children on demand, but 
it has not been expanded yet. So ensure here and
                                // now that it has all items
@@ -2513,8 +2574,8 @@
 {
        return m_pCurrentlyDisplayed
                        &&      getEntryType(m_pCurrentlyDisplayed) == 
getChildType(_pContainer)
-                       &&      
m_pTreeView->getListBox()->GetParent(m_pCurrentlyDisplayed) == _pContainer
-                       &&      
m_pTreeView->getListBox()->GetEntryText(m_pCurrentlyDisplayed) == _sName;
+                       &&      
m_pTreeView->getListBox().GetParent(m_pCurrentlyDisplayed) == _pContainer
+                       &&      
m_pTreeView->getListBox().GetEntryText(m_pCurrentlyDisplayed) == _sName;
 }
 // -------------------------------------------------------------------------
 void SAL_CALL SbaTableQueryBrowser::elementRemoved( const ContainerEvent& 
_rEvent ) throw(RuntimeException)
@@ -2540,7 +2601,7 @@
                        // unload
                        unloadAndCleanup( sal_False ); // don't dispose the 
connection
 
-                       DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pTemp->GetUserData());
+                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pTemp->GetUserData());
                        pTemp->SetUserData(NULL);
                        delete pData;
                                // the data could be null because we have a 
table which isn't correct
@@ -2552,9 +2613,9 @@
                        SvLBoxEntry* pChild = 
m_pTreeModel->FirstChild(pContainer);
                        while(pChild)
                        {
-                               if 
(m_pTreeView->getListBox()->GetEntryText(pChild) == aName)
+                               if 
(m_pTreeView->getListBox().GetEntryText(pChild) == aName)
                                {
-                                       DBTreeListModel::DBTreeListUserData* 
pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pChild->GetUserData());
+                                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pChild->GetUserData());
                                        pChild->SetUserData(NULL);
                                        delete pData;
                                        m_pTreeModel->Remove(pChild);
@@ -2576,26 +2637,26 @@
                String sNewDatasource = sNewDS;
 
                // get the top-level representing the removed data source
-               SvLBoxEntry* pDSLoop = 
m_pTreeView->getListBox()->FirstChild(NULL);
+               SvLBoxEntry* pDSLoop = 
m_pTreeView->getListBox().FirstChild(NULL);
                while (pDSLoop)
                {
-                       if (m_pTreeView->getListBox()->GetEntryText(pDSLoop) == 
sNewDatasource)
+                       if (m_pTreeView->getListBox().GetEntryText(pDSLoop) == 
sNewDatasource)
                                break;
 
-                       pDSLoop = 
m_pTreeView->getListBox()->NextSibling(pDSLoop);
+                       pDSLoop = 
m_pTreeView->getListBox().NextSibling(pDSLoop);
                }
 
                if (pDSLoop)
                {
                        if (isSelected(pDSLoop))
                        {       // a table or query belonging to the deleted 
data source is currently beeing displayed.
-                               
OSL_ENSURE(m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) 
== pDSLoop, "SbaTableQueryBrowser::elementRemoved: inconsistence (1)!");
+                               
OSL_ENSURE(m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed) 
== pDSLoop, "SbaTableQueryBrowser::elementRemoved: inconsistence (1)!");
                                unloadAndCleanup( sal_True );
                        }
                        else
                                OSL_ENSURE(
                                                (NULL == m_pCurrentlyDisplayed)
-                                       ||      
(m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) != 
pDSLoop), "SbaTableQueryBrowser::elementRemoved: inconsistence (2)!");
+                                       ||      
(m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed) != 
pDSLoop), "SbaTableQueryBrowser::elementRemoved: inconsistence (2)!");
 
                        // look for user data to delete
                        SvTreeEntryList* pList = 
m_pTreeModel->GetChildList(pDSLoop);
@@ -2604,14 +2665,14 @@
                                SvLBoxEntry* pEntryLoop = 
static_cast<SvLBoxEntry*>(pList->First());
                                while (pEntryLoop)
                                {
-                                       DBTreeListModel::DBTreeListUserData* 
pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pEntryLoop->GetUserData());
+                                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pEntryLoop->GetUserData());
                                        pEntryLoop->SetUserData(NULL);
                                        delete pData;
                                        pEntryLoop = 
static_cast<SvLBoxEntry*>(pList->Next());
                                }
                        }
                        // remove the entry. This should remove all children, 
too.
-                       DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pDSLoop->GetUserData());
+                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pDSLoop->GetUserData());
                        pDSLoop->SetUserData(NULL);
                        delete pData;
                        m_pTreeModel->Remove(pDSLoop);
@@ -2645,7 +2706,7 @@
                        SvLBoxEntry* pTemp = m_pCurrentlyDisplayed;
                        unloadAndCleanup( sal_False ); // don't dispose the 
connection
 
-                       DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pTemp->GetUserData());
+                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pTemp->GetUserData());
                        if (pData)
                        {
                                if ( etTableOrView == pData->eType )
@@ -2665,9 +2726,9 @@
                        SvLBoxEntry* pChild = 
m_pTreeModel->FirstChild(pContainer);
                        while(pChild)
                        {
-                               if 
(m_pTreeView->getListBox()->GetEntryText(pChild) == aName)
+                               if 
(m_pTreeView->getListBox().GetEntryText(pChild) == aName)
                                {
-                                       DBTreeListModel::DBTreeListUserData* 
pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pChild->GetUserData());
+                                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pChild->GetUserData());
                                        if (pData)
                                        {
                                                if ( etTableOrView == 
pData->eType )
@@ -2735,7 +2796,7 @@
 
        if ( _pDSEntry )
        {
-               DBTreeListModel::DBTreeListUserData* pTreeListData = 
static_cast< DBTreeListModel::DBTreeListUserData* >( _pDSEntry->GetUserData() );
+               DBTreeListUserData* pTreeListData = static_cast< 
DBTreeListUserData* >( _pDSEntry->GetUserData() );
                if ( pTreeListData )
             impl_releaseConnection( pTreeListData->xConnection );
        }
@@ -2748,7 +2809,7 @@
        DBG_ASSERT( impl_isDataSourceEntry( _pDSEntry ), 
"SbaTableQueryBrowser::closeConnection: invalid entry (not top-level)!");
 
        // if one of the entries of the given DS is displayed currently, unload 
the form
-       if (m_pCurrentlyDisplayed && 
(m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) == 
_pDSEntry))
+       if (m_pCurrentlyDisplayed && 
(m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed) == 
_pDSEntry))
                unloadAndCleanup(_bDisposeConnection);
 
        // collapse the query/table container
@@ -2756,21 +2817,21 @@
        {
                SvLBoxEntry* pElements = m_pTreeModel->FirstChild(pContainers);
                if ( pElements )
-                       m_pTreeView->getListBox()->Collapse(pContainers);
-               m_pTreeView->getListBox()->EnableExpandHandler(pContainers);
+                       m_pTreeView->getListBox().Collapse(pContainers);
+               m_pTreeView->getListBox().EnableExpandHandler(pContainers);
                // and delete their children (they are connection-relative)
                for (; pElements; )
                {
                        SvLBoxEntry* pRemove = pElements;
                        pElements= m_pTreeModel->NextSibling(pElements);
-                       DBTreeListModel::DBTreeListUserData* pData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pRemove->GetUserData());
+                       DBTreeListUserData* pData = 
static_cast<DBTreeListUserData*>(pRemove->GetUserData());
                        pRemove->SetUserData(NULL);
                        delete pData;
                        m_pTreeModel->Remove(pRemove);
                }
        }
        // collapse the entry itself
-       m_pTreeView->getListBox()->Collapse(_pDSEntry);
+       m_pTreeView->getListBox().Collapse(_pDSEntry);
 
        // dispose/reset the connection
        if ( _bDisposeConnection )
@@ -2784,7 +2845,7 @@
                // nothing to do
                return;
 
-       SvLBoxEntry* pDSEntry = 
m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed);
+       SvLBoxEntry* pDSEntry = 
m_pTreeView->getListBox().GetRootLevelParent(m_pCurrentlyDisplayed);
 
        // de-select the path for the currently displayed table/query
        if (m_pCurrentlyDisplayed)
@@ -3006,7 +3067,7 @@
                implAddDatasource( sInitialDataSourceName,
             aDBImage, sQueriesName, aQueriesImage, sTablesName, aTablesImage, 
xConnection
         );
-               m_pTreeView->getListBox()->Expand( 
m_pTreeView->getListBox()->First() );
+               m_pTreeView->getListBox().Expand( 
m_pTreeView->getListBox().First() );
     }
     else
                initializeTreeModel();
@@ -3088,10 +3149,10 @@
 // 
-----------------------------------------------------------------------------
 sal_Bool SbaTableQueryBrowser::ensureConnection(SvLBoxEntry* _pAnyEntry, 
SharedConnection& _rConnection)
 {
-       SvLBoxEntry* pDSEntry = 
m_pTreeView->getListBox()->GetRootLevelParent(_pAnyEntry);
-       DBTreeListModel::DBTreeListUserData* pDSData =
+       SvLBoxEntry* pDSEntry = 
m_pTreeView->getListBox().GetRootLevelParent(_pAnyEntry);
+       DBTreeListUserData* pDSData =
                                pDSEntry
-                       ?       
static_cast<DBTreeListModel::DBTreeListUserData*>(pDSEntry->GetUserData())
+                       ?       
static_cast<DBTreeListUserData*>(pDSEntry->GetUserData())
                        :       NULL;
 
        return ensureConnection( pDSEntry, pDSData, _rConnection );
@@ -3110,10 +3171,10 @@
 // 
-----------------------------------------------------------------------------
 sal_Bool SbaTableQueryBrowser::getExistentConnectionFor( SvLBoxEntry* 
_pAnyEntry, SharedConnection& _rConnection )
 {
-       SvLBoxEntry* pDSEntry = m_pTreeView->getListBox()->GetRootLevelParent( 
_pAnyEntry );
-       DBTreeListModel::DBTreeListUserData* pDSData =
+       SvLBoxEntry* pDSEntry = m_pTreeView->getListBox().GetRootLevelParent( 
_pAnyEntry );
+       DBTreeListUserData* pDSData =
                                pDSEntry
-                       ?       static_cast< 
DBTreeListModel::DBTreeListUserData* >( pDSEntry->GetUserData() )
+                       ?       static_cast< DBTreeListUserData* >( 
pDSEntry->GetUserData() )
                        :       NULL;
        if ( pDSData )
                _rConnection = pDSData->xConnection;
@@ -3134,7 +3195,7 @@
     DBG_ASSERT( impl_isDataSourceEntry( _pDSEntry ), 
"SbaTableQueryBrowser::ensureConnection: this entry does not denote a data 
source!" );
        if(_pDSEntry)
        {
-               DBTreeListModel::DBTreeListUserData* pTreeListData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pDSData);
+               DBTreeListUserData* pTreeListData = 
static_cast<DBTreeListUserData*>(pDSData);
                ::rtl::OUString aDSName = GetEntryText(_pDSEntry);
 
                if ( pTreeListData )
@@ -3183,7 +3244,7 @@
                        // every other container should be placed _before_ the 
bookmark container
                        return -1;
 
-               const String sLeft = 
m_pTreeView->getListBox()->GetEntryText(pLHS);
+               const String sLeft = 
m_pTreeView->getListBox().GetEntryText(pLHS);
 
                EntryType eLeft = etTableContainer;
                if (String(ModuleRes(RID_STR_TABLES_CONTAINER)) == sLeft)
@@ -3191,11 +3252,17 @@
                else if (String(ModuleRes(RID_STR_QUERIES_CONTAINER)) == sLeft)
                        eLeft = etQueryContainer;
 
-               return  eLeft < eRight
-                       ?       COMPARE_LESS
-                       :               eLeft == eRight
-                               ?       COMPARE_EQUAL
-                               :       COMPARE_GREATER;
+        if ( eLeft == eRight )
+            return COMPARE_EQUAL;
+
+        if ( ( eLeft == etTableContainer ) && ( eRight == etQueryContainer ) )
+            return COMPARE_GREATER;
+
+        if ( ( eLeft == etQueryContainer ) && ( eRight == etTableContainer ) )
+            return COMPARE_LESS;
+
+        OSL_ENSURE( false, "SbaTableQueryBrowser::OnTreeEntryCompare: 
unexpected case!" );
+        return COMPARE_EQUAL;
        }
 
        SvLBoxString* pLeftTextItem = 
static_cast<SvLBoxString*>(pLHS->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
@@ -3227,6 +3294,10 @@
 // 
-----------------------------------------------------------------------------
 void SbaTableQueryBrowser::implAdministrate( SvLBoxEntry* _pApplyTo )
 {
+    OSL_PRECOND( _pApplyTo, "SbaTableQueryBrowser::implAdministrate: illegal 
entry!" );
+    if ( !_pApplyTo )
+        return;
+
        try
        {
                // get the desktop object
@@ -3237,8 +3308,8 @@
                {
                        // the initial selection
                        SvLBoxEntry* pTopLevelSelected = _pApplyTo;
-                       while (pTopLevelSelected && 
m_pTreeView->getListBox()->GetParent(pTopLevelSelected))
-                               pTopLevelSelected = 
m_pTreeView->getListBox()->GetParent(pTopLevelSelected);
+                       while (pTopLevelSelected && 
m_pTreeView->getListBox().GetParent(pTopLevelSelected))
+                               pTopLevelSelected = 
m_pTreeView->getListBox().GetParent(pTopLevelSelected);
                        ::rtl::OUString sInitialSelection;
                        if (pTopLevelSelected)
                                sInitialSelection = getDataSourceAcessor( 
pTopLevelSelected );
@@ -3280,7 +3351,7 @@
 // 
-----------------------------------------------------------------------------
 sal_Bool SbaTableQueryBrowser::requestQuickHelp( const SvLBoxEntry* _pEntry, 
String& _rText ) const
 {
-       const DBTreeListModel::DBTreeListUserData* pData = static_cast< const 
DBTreeListModel::DBTreeListUserData* >( _pEntry->GetUserData() );
+       const DBTreeListUserData* pData = static_cast< const 
DBTreeListUserData* >( _pEntry->GetUserData() );
     if ( ( pData->eType == etDatasource ) && pData->sAccessor.Len() )
     {
         _rText = ::svt::OFileNotation( pData->sAccessor ).get( 
::svt::OFileNotation::N_SYSTEM );
@@ -3290,144 +3361,69 @@
 }
 
 // 
-----------------------------------------------------------------------------
-sal_Bool SbaTableQueryBrowser::requestContextMenu( const CommandEvent& _rEvent 
)
+PopupMenu* SbaTableQueryBrowser::getContextMenu( Control& _rControl ) const
 {
-    ::Point aPosition;
-       SvLBoxEntry* pEntry = NULL;
-       SvLBoxEntry* pOldSelection = NULL;
-       if (_rEvent.IsMouseEvent())
-       {
-               aPosition = _rEvent.GetMousePosPixel();
-               // ensure that the entry which the user clicked at is selected
-               pEntry = m_pTreeView->getListBox()->GetEntry(aPosition);
-               if (pEntry && !m_pTreeView->getListBox()->IsSelected(pEntry))
-               {
-                       pOldSelection = 
m_pTreeView->getListBox()->FirstSelected();
-                       m_pTreeView->getListBox()->lockAutoSelect();
-                       m_pTreeView->getListBox()->Select(pEntry);
-                       m_pTreeView->getListBox()->unlockAutoSelect();
-               }
-       }
-       else
-       {
-               // use the center of the current entry
-               pEntry = m_pTreeView->getListBox()->GetCurEntry();
-               OSL_ENSURE(pEntry,"No current entry!");
-               aPosition = m_pTreeView->getListBox()->GetEntryPosition(pEntry);
-               aPosition.X() += 
m_pTreeView->getListBox()->GetOutputSizePixel().Width() / 2;
-               aPosition.Y() += m_pTreeView->getListBox()->GetEntryHeight() / 
2;
-       }
-
-       // disable entries according to the currently selected entry
-
-       // does the datasource which the selected entry belongs to has an open 
connection ?
-       SvLBoxEntry* pDSEntry = NULL;
-       DBTreeListModel::DBTreeListUserData* pDSData = NULL;
-       DBTreeListModel::DBTreeListUserData* pEntryData = NULL;
-       if(pEntry)
-       {
-               pDSEntry = 
m_pTreeView->getListBox()->GetRootLevelParent(pEntry);
-               pDSData =       pDSEntry
-                               ?       
static_cast<DBTreeListModel::DBTreeListUserData*>(pDSEntry->GetUserData())
-                               :       NULL;
-               pEntryData = 
static_cast<DBTreeListModel::DBTreeListUserData*>(pEntry->GetUserData());
-       }
-
-
-       EntryType eType = pEntryData ? pEntryData->eType : etUnknown;
-
-       ModuleRes nMenuRes( MENU_BROWSER_DEFAULTCONTEXT );
-       PopupMenu aContextMenu( nMenuRes );
-       PopupMenu* pDynamicSubMenu = NULL;
-
-       // enable menu entries
-       if (!pDSData || !pDSData->xConnection.is())
-       {
-               aContextMenu.EnableItem(ID_TREE_CLOSE_CONN, sal_False);
-       }
-       aContextMenu.EnableItem(SID_COPY,       sal_False);
+    OSL_PRECOND( &m_pTreeView->getListBox() == &_rControl,
+        "SbaTableQueryBrowser::getContextMenu: where does this come from?" );
+    if ( &m_pTreeView->getListBox() != &_rControl )
+        return NULL;
 
-    ::utl::OConfigurationTreeRoot aConfig( 
::utl::OConfigurationTreeRoot::createWithServiceFactory( getORB(),
-        ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 
"/org.openoffice.Office.DataAccess/ApplicationIntegration/InstalledFeatures/Common"
 ) ) ) );
-    sal_Bool bHaveEditDatabase( sal_True );
-    OSL_VERIFY( aConfig.getNodeValue( ::rtl::OUString( 
RTL_CONSTASCII_USTRINGPARAM( "EditDatabaseFromDataSourceView" ) ) ) >>= 
bHaveEditDatabase );
-       aContextMenu.EnableItem( ID_TREE_EDIT_DATABASE, bHaveEditDatabase );
-
-       if ( pEntry )
-       {
+    return new PopupMenu( ModuleRes( MENU_BROWSER_DEFAULTCONTEXT ) );
+}
 
-               switch (eType)
-               {
-                       // 1. for tables/views
-                       case etTableContainer:
-                       case etTableOrView:
-                       {
-                               aContextMenu.EnableItem( SID_COPY, 
etTableOrView == eType );
-                       }
-                       break;
+// 
-----------------------------------------------------------------------------
+IController& SbaTableQueryBrowser::getCommandController()
+{
+    return *this;
+}
 
-                       // 3. for queries
-                       case etQueryContainer:
-                       case etQuery:
-                       {
-                               // 3.2 actions on existing queries
-                               aContextMenu.EnableItem( SID_COPY, etQuery == 
eType );
-                       }
-                       break;
-            case etDatasource:
-            case etUnknown:
-                break;
-               }
-       }
+// 
-----------------------------------------------------------------------------
+::cppu::OInterfaceContainerHelper* 
SbaTableQueryBrowser::getContextMenuInterceptors()
+{
+    return &m_aContextMenuInterceptors;
+}
 
-       if (!getORB().is())
-               // no ORB -> no administration dialog
-               aContextMenu.EnableItem(ID_TREE_EDIT_DATABASE, sal_False);
+// 
-----------------------------------------------------------------------------
+Any SbaTableQueryBrowser::getCurrentSelection( Control& _rControl ) const
+{
+    OSL_PRECOND( &m_pTreeView->getListBox() == &_rControl,
+        "SbaTableQueryBrowser::getCurrentSelection: where does this come 
from?" );
 
-       // no disabled entries
-       aContextMenu.RemoveDisabledEntries();
+    if ( &m_pTreeView->getListBox() != &_rControl )
+        return Any();
 
-       USHORT nPos = aContextMenu.Execute(m_pTreeView->getListBox(), 
aPosition);
+    SvLBoxEntry* pSelected = m_pTreeView->getListBox().FirstSelected();
+    if ( !pSelected )
+        return Any();
 
-       delete pDynamicSubMenu;
-       pDynamicSubMenu = NULL;
+    OSL_ENSURE( m_pTreeView->getListBox().NextSelected( pSelected ) == NULL,
+        "SbaTableQueryBrowser::getCurrentSelection: single-selection is 
expected here!" );
 
-       // restore the old selection
-       if (pOldSelection)
-       {
-               m_pTreeView->getListBox()->lockAutoSelect();
-               m_pTreeView->getListBox()->Select(pOldSelection);
-               m_pTreeView->getListBox()->unlockAutoSelect();
-       }
+    NamedDatabaseObject aSelectedObject;
+       DBTreeListUserData* pData = static_cast< DBTreeListUserData* >( 
pSelected->GetUserData() );
+    aSelectedObject.Type = static_cast< sal_Int32 >( pData->eType );
 
-       switch (nPos)
+    switch ( aSelectedObject.Type )
        {
-               case ID_TREE_EDIT_DATABASE:
-                       implAdministrate(pEntry);
-                       break;
-
-               case ID_TREE_CLOSE_CONN:
-                       openHelpAgent(HID_DSBROWSER_DISCONNECTING);
-                       closeConnection(pDSEntry);
+    case DatabaseObject::QUERY:
+    case DatabaseObject::TABLE:
+        aSelectedObject.Name = m_pTreeView->getListBox().GetEntryText( 
pSelected );
                        break;
 
-               case SID_COPY:
-               {
-                       TransferableHelper* pTransfer = implCopyObject( pEntry, 
(etQuery == eType) ? CommandType::QUERY : CommandType::TABLE );
-                       Reference< XTransferable> aEnsureDelete = pTransfer;
-
-                       if (pTransfer)
-                               pTransfer->CopyToClipboard(getView());
-               }
+    case DatabaseObjectContainer::DATA_SOURCE:
+    case DatabaseObjectContainer::QUERIES:
+    case DatabaseObjectContainer::TABLES:
+        aSelectedObject.Name = getDataSourceAcessor( pSelected );
                break;
 
-        case ID_TREE_ADMINISTRATE:
-            ::svx::administrateDatabaseRegistration( getView() );
+    default:
+        OSL_ENSURE( false, "SbaTableQueryBrowser::getCurrentSelection: invalid 
(unexpected) object type!" );
             break;
        }
 
-       return sal_True;        // handled
+    return makeAny( aSelectedObject );
 }
+
 // 
-----------------------------------------------------------------------------
 sal_Bool SbaTableQueryBrowser::implGetQuerySignature( ::rtl::OUString& 
_rCommand, sal_Bool& _bEscapeProcessing )
 {
@@ -3510,7 +3506,7 @@
 {
        sal_Bool bRet = sal_False;
        if ( m_pTreeView )
-               bRet = 
m_pTreeView->getListBox()->GetBackground().GetColor().IsDark();
+               bRet = 
m_pTreeView->getListBox().GetBackground().GetColor().IsDark();
        return bRet;
 }
 // 
-----------------------------------------------------------------------------
@@ -3543,7 +3539,7 @@
                SvLBoxEntry* pContainer = 
m_pTreeModel->GetParent(m_pCurrentlyDisplayed);
                // get the entry for the datasource
                SvLBoxEntry* pConnection = m_pTreeModel->GetParent(pContainer);
-               ::rtl::OUString sName = 
m_pTreeView->getListBox()->GetEntryText(m_pCurrentlyDisplayed);
+               ::rtl::OUString sName = 
m_pTreeView->getListBox().GetEntryText(m_pCurrentlyDisplayed);
                sTitle = GetEntryText( pConnection );
                INetURLObject aURL(sTitle);
                if ( aURL.GetProtocol() != INET_PROT_NOT_VALID )
@@ -3603,6 +3599,19 @@
     return xScripts;
 }
 
+//------------------------------------------------------------------------------
+void SAL_CALL SbaTableQueryBrowser::registerContextMenuInterceptor( const 
Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException)
+{
+    if ( _Interceptor.is() )
+        m_aContextMenuInterceptors.addInterface( _Interceptor );
+}
+
+//------------------------------------------------------------------------------
+void SAL_CALL SbaTableQueryBrowser::releaseContextMenuInterceptor( const 
Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException)
+{
+    m_aContextMenuInterceptors.removeInterface( _Interceptor );
+}
+
 // .........................................................................
 }      // namespace dbaui
 // .........................................................................




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to