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]
