1*96de5490SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*96de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*96de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*96de5490SAndrew Rist * distributed with this work for additional information 6*96de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*96de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*96de5490SAndrew Rist * "License"); you may not use this file except in compliance 9*96de5490SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*96de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*96de5490SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*96de5490SAndrew Rist * software distributed under the License is distributed on an 15*96de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*96de5490SAndrew Rist * KIND, either express or implied. See the License for the 17*96de5490SAndrew Rist * specific language governing permissions and limitations 18*96de5490SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*96de5490SAndrew Rist *************************************************************/ 21*96de5490SAndrew Rist 22*96de5490SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "RelationTableView.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include "JoinExchange.hxx" 31cdf0e10cSrcweir 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <comphelper/extract.hxx> 34cdf0e10cSrcweir 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include "browserids.hxx" 37cdf0e10cSrcweir 38cdf0e10cSrcweir 39cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 40cdf0e10cSrcweir 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <com/sun/star/sdbc/XConnection.hpp> 43cdf0e10cSrcweir 44cdf0e10cSrcweir 45cdf0e10cSrcweir #include <com/sun/star/sdbcx/XKeysSupplier.hpp> 46cdf0e10cSrcweir 47cdf0e10cSrcweir 48cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 49cdf0e10cSrcweir 50cdf0e10cSrcweir 51cdf0e10cSrcweir #include <com/sun/star/sdbcx/KeyType.hpp> 52cdf0e10cSrcweir 53cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp> 54cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 55cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 56cdf0e10cSrcweir #include "dbustrings.hrc" 57cdf0e10cSrcweir #include <connectivity/dbtools.hxx> 58cdf0e10cSrcweir #include <comphelper/sequence.hxx> 59cdf0e10cSrcweir #include <tools/debug.hxx> 60cdf0e10cSrcweir #include "dbaccess_helpid.hrc" 61cdf0e10cSrcweir #include "RelationDesignView.hxx" 62cdf0e10cSrcweir #include "JoinController.hxx" 63cdf0e10cSrcweir #include "TableWindow.hxx" 64cdf0e10cSrcweir #include "TableWindowData.hxx" 65cdf0e10cSrcweir #include "RTableConnection.hxx" 66cdf0e10cSrcweir #include "RTableConnectionData.hxx" 67cdf0e10cSrcweir #include "RelationDlg.hxx" 68cdf0e10cSrcweir #include "sqlmessage.hxx" 69cdf0e10cSrcweir #include "dbu_rel.hrc" 70cdf0e10cSrcweir #include "UITools.hxx" 71cdf0e10cSrcweir #include <connectivity/dbexception.hxx> 72cdf0e10cSrcweir #include "RTableWindow.hxx" 73cdf0e10cSrcweir #include "JAccess.hxx" 74cdf0e10cSrcweir #include <svl/undo.hxx> 75cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 76cdf0e10cSrcweir 77cdf0e10cSrcweir using namespace dbaui; 78cdf0e10cSrcweir using namespace ::dbtools; 79cdf0e10cSrcweir using namespace ::com::sun::star; 80cdf0e10cSrcweir using namespace ::com::sun::star::uno; 81cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 82cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx; 83cdf0e10cSrcweir using namespace ::com::sun::star::beans; 84cdf0e10cSrcweir using namespace ::com::sun::star::container; 85cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 86cdf0e10cSrcweir 87cdf0e10cSrcweir //================================================================== 88cdf0e10cSrcweir // class ORelationTableView 89cdf0e10cSrcweir //================================================================== 90cdf0e10cSrcweir DBG_NAME(ORelationTableView) 91cdf0e10cSrcweir //------------------------------------------------------------------------ 92cdf0e10cSrcweir ORelationTableView::ORelationTableView( Window* pParent, ORelationDesignView* pView ) 93cdf0e10cSrcweir :OJoinTableView( pParent, pView ) 94cdf0e10cSrcweir , ::comphelper::OContainerListener(m_aMutex) 95cdf0e10cSrcweir ,m_pExistingConnection(NULL) 96cdf0e10cSrcweir ,m_bInRemove(false) 97cdf0e10cSrcweir 98cdf0e10cSrcweir { 99cdf0e10cSrcweir DBG_CTOR(ORelationTableView,NULL); 100cdf0e10cSrcweir SetHelpId(HID_CTL_RELATIONTAB); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir //------------------------------------------------------------------------ 104cdf0e10cSrcweir ORelationTableView::~ORelationTableView() 105cdf0e10cSrcweir { 106cdf0e10cSrcweir DBG_DTOR(ORelationTableView,NULL); 107cdf0e10cSrcweir if ( m_pContainerListener.is() ) 108cdf0e10cSrcweir m_pContainerListener->dispose(); 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir //------------------------------------------------------------------------ 112cdf0e10cSrcweir void ORelationTableView::ReSync() 113cdf0e10cSrcweir { 114cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 115cdf0e10cSrcweir if ( !m_pContainerListener.is() ) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir Reference< XConnection> xConnection = m_pView->getController().getConnection(); 118cdf0e10cSrcweir Reference< XTablesSupplier > xTableSupp( xConnection, UNO_QUERY_THROW ); 119cdf0e10cSrcweir Reference< XNameAccess > xTables = xTableSupp->getTables(); 120cdf0e10cSrcweir Reference< XContainer> xContainer(xTables,uno::UNO_QUERY); 121cdf0e10cSrcweir if ( xContainer.is() ) 122cdf0e10cSrcweir m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer); 123cdf0e10cSrcweir } 124cdf0e10cSrcweir // Es kann sein, dass in der DB Tabellen ausgeblendet wurden, die eigentlich Bestandteil einer Relation sind. Oder eine Tabelle 125cdf0e10cSrcweir // befand sich im Layout (durchaus ohne Relation), existiert aber nicht mehr. In beiden Faellen wird das Anlegen des TabWins schief 126cdf0e10cSrcweir // gehen, und alle solchen TabWinDatas oder darauf bezogenen ConnDatas muss ich dann loeschen. 127cdf0e10cSrcweir ::std::vector< ::rtl::OUString> arrInvalidTables; 128cdf0e10cSrcweir 129cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 130cdf0e10cSrcweir // create and insert windows 131cdf0e10cSrcweir TTableWindowData* pTabWinDataList = m_pView->getController().getTableWindowData(); 132cdf0e10cSrcweir TTableWindowData::reverse_iterator aIter = pTabWinDataList->rbegin(); 133cdf0e10cSrcweir for(;aIter != pTabWinDataList->rend();++aIter) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir TTableWindowData::value_type pData = *aIter; 136cdf0e10cSrcweir OTableWindow* pTabWin = createWindow(pData); 137cdf0e10cSrcweir 138cdf0e10cSrcweir if (!pTabWin->Init()) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir // das Initialisieren ging schief, dass heisst, dieses TabWin steht nicht zur Verfuegung, also muss ich es inklusive 141cdf0e10cSrcweir // seiner Daten am Dokument aufraeumen 142cdf0e10cSrcweir pTabWin->clearListBox(); 143cdf0e10cSrcweir delete pTabWin; 144cdf0e10cSrcweir arrInvalidTables.push_back(pData->GetTableName()); 145cdf0e10cSrcweir 146cdf0e10cSrcweir pTabWinDataList->erase( ::std::remove(pTabWinDataList->begin(),pTabWinDataList->end(),*aIter) ,pTabWinDataList->end()); 147cdf0e10cSrcweir continue; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir (*GetTabWinMap())[pData->GetComposedName()] = pTabWin; // am Anfang einfuegen, da ich die DataList ja rueckwaerts durchlaufe 151cdf0e10cSrcweir // wenn in den Daten keine Position oder Groesse steht -> Default 152cdf0e10cSrcweir if (!pData->HasPosition() && !pData->HasSize()) 153cdf0e10cSrcweir SetDefaultTabWinPosSize(pTabWin); 154cdf0e10cSrcweir 155cdf0e10cSrcweir pTabWin->Show(); 156cdf0e10cSrcweir } 157cdf0e10cSrcweir 158cdf0e10cSrcweir // Verbindungen einfuegen 159cdf0e10cSrcweir TTableConnectionData* pTabConnDataList = m_pView->getController().getTableConnectionData(); 160cdf0e10cSrcweir TTableConnectionData::reverse_iterator aConIter = pTabConnDataList->rbegin(); 161cdf0e10cSrcweir 162cdf0e10cSrcweir for(;aConIter != pTabConnDataList->rend();++aConIter) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir ORelationTableConnectionData* pTabConnData = static_cast<ORelationTableConnectionData*>(aConIter->get()); 165cdf0e10cSrcweir if ( !arrInvalidTables.empty() ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir // gibt es die beiden Tabellen zur Connection ? 168cdf0e10cSrcweir ::rtl::OUString strTabExistenceTest = pTabConnData->getReferencingTable()->GetTableName(); 169cdf0e10cSrcweir sal_Bool bInvalid = ::std::find(arrInvalidTables.begin(),arrInvalidTables.end(),strTabExistenceTest) != arrInvalidTables.end(); 170cdf0e10cSrcweir strTabExistenceTest = pTabConnData->getReferencedTable()->GetTableName(); 171cdf0e10cSrcweir bInvalid = bInvalid || ::std::find(arrInvalidTables.begin(),arrInvalidTables.end(),strTabExistenceTest) != arrInvalidTables.end(); 172cdf0e10cSrcweir 173cdf0e10cSrcweir if (bInvalid) 174cdf0e10cSrcweir { // nein -> Pech gehabt, die Connection faellt weg 175cdf0e10cSrcweir pTabConnDataList->erase( ::std::remove(pTabConnDataList->begin(),pTabConnDataList->end(),*aConIter),pTabConnDataList->end() ); 176cdf0e10cSrcweir continue; 177cdf0e10cSrcweir } 178cdf0e10cSrcweir } // if ( !arrInvalidTables.empty() ) 179cdf0e10cSrcweir 180cdf0e10cSrcweir addConnection( new ORelationTableConnection(this, *aConIter), sal_False ); // don't add the data again 181cdf0e10cSrcweir } 182cdf0e10cSrcweir 183cdf0e10cSrcweir if ( !GetTabWinMap()->empty() ) 184cdf0e10cSrcweir GetTabWinMap()->begin()->second->GrabFocus(); 185cdf0e10cSrcweir } 186cdf0e10cSrcweir //------------------------------------------------------------------------------ 187cdf0e10cSrcweir sal_Bool ORelationTableView::IsAddAllowed() 188cdf0e10cSrcweir { 189cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 190cdf0e10cSrcweir 191cdf0e10cSrcweir return !m_pView->getController().isReadOnly(); 192cdf0e10cSrcweir } 193cdf0e10cSrcweir //------------------------------------------------------------------------ 194cdf0e10cSrcweir void ORelationTableView::AddConnection(const OJoinExchangeData& jxdSource, const OJoinExchangeData& jxdDest) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 197cdf0e10cSrcweir // Aus selektierten Feldnamen LineDataObject setzen 198cdf0e10cSrcweir // check if relation already exists 199cdf0e10cSrcweir OTableWindow* pSourceWin = jxdSource.pListBox->GetTabWin(); 200cdf0e10cSrcweir OTableWindow* pDestWin = jxdDest.pListBox->GetTabWin(); 201cdf0e10cSrcweir 202cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aIter = getTableConnections()->begin(); 203cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aEnd = getTableConnections()->end(); 204cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir OTableConnection* pFirst = *aIter; 207cdf0e10cSrcweir if((pFirst->GetSourceWin() == pSourceWin && pFirst->GetDestWin() == pDestWin) || 208cdf0e10cSrcweir (pFirst->GetSourceWin() == pDestWin && pFirst->GetDestWin() == pSourceWin)) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir m_pExistingConnection = pFirst; 211cdf0e10cSrcweir break; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir // insert table connection into view 215cdf0e10cSrcweir 216cdf0e10cSrcweir TTableConnectionData::value_type pTabConnData(new ORelationTableConnectionData(pSourceWin->GetData(), 217cdf0e10cSrcweir pDestWin->GetData())); 218cdf0e10cSrcweir 219cdf0e10cSrcweir // die Namen der betroffenen Felder 220cdf0e10cSrcweir ::rtl::OUString sSourceFieldName = jxdSource.pListBox->GetEntryText(jxdSource.pEntry); 221cdf0e10cSrcweir ::rtl::OUString sDestFieldName = jxdDest.pListBox->GetEntryText(jxdDest.pEntry); 222cdf0e10cSrcweir 223cdf0e10cSrcweir // die Anzahl der PKey-Felder in der Quelle 224cdf0e10cSrcweir const Reference< XNameAccess> xPrimaryKeyColumns = getPrimaryKeyColumns_throw(pSourceWin->GetData()->getTable()); 225cdf0e10cSrcweir bool bAskUser = xPrimaryKeyColumns.is() && Reference< XIndexAccess>(xPrimaryKeyColumns,UNO_QUERY)->getCount() > 1; 226cdf0e10cSrcweir 227cdf0e10cSrcweir pTabConnData->SetConnLine( 0, sSourceFieldName, sDestFieldName ); 228cdf0e10cSrcweir 229cdf0e10cSrcweir if ( bAskUser || m_pExistingConnection ) 230cdf0e10cSrcweir m_pCurrentlyTabConnData = pTabConnData; // this implies that we ask the user what to do 231cdf0e10cSrcweir else 232cdf0e10cSrcweir { 233cdf0e10cSrcweir try 234cdf0e10cSrcweir { 235cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 236cdf0e10cSrcweir // Daten der Datenbank uebergeben 237cdf0e10cSrcweir if( pTabConnData->Update() ) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 240cdf0e10cSrcweir // UI-Object in ConnListe eintragen 241cdf0e10cSrcweir addConnection( new ORelationTableConnection( this, pTabConnData ) ); 242cdf0e10cSrcweir } 243cdf0e10cSrcweir } 244cdf0e10cSrcweir catch(const SQLException&) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir throw; 247cdf0e10cSrcweir } 248cdf0e10cSrcweir catch(const Exception&) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir OSL_ENSURE(0,"ORelationTableView::AddConnection: Exception oocured!"); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir } 253cdf0e10cSrcweir } 254cdf0e10cSrcweir 255cdf0e10cSrcweir 256cdf0e10cSrcweir //------------------------------------------------------------------------ 257cdf0e10cSrcweir void ORelationTableView::ConnDoubleClicked( OTableConnection* pConnection ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 260cdf0e10cSrcweir ORelationDialog aRelDlg( this, pConnection->GetData() ); 261cdf0e10cSrcweir switch (aRelDlg.Execute()) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir case RET_OK: 264cdf0e10cSrcweir // successfully updated 265cdf0e10cSrcweir pConnection->UpdateLineList(); 266cdf0e10cSrcweir // The connection references 1 ConnData and n ConnLines, each ConnData references n LineDatas, each Line exactly 1 LineData 267cdf0e10cSrcweir // As the Dialog and the ConnData->Update may have changed the LineDatas we have to restore the consistent state 268cdf0e10cSrcweir break; 269cdf0e10cSrcweir 270cdf0e10cSrcweir case RET_NO: 271cdf0e10cSrcweir // tried at least one update, but did not succeed -> the original connection is lost 272cdf0e10cSrcweir RemoveConnection( pConnection ,sal_True); 273cdf0e10cSrcweir break; 274cdf0e10cSrcweir 275cdf0e10cSrcweir case RET_CANCEL: 276cdf0e10cSrcweir // no break, as nothing happened and we don't need the code below 277cdf0e10cSrcweir return; 278cdf0e10cSrcweir 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir Invalidate(INVALIDATE_NOCHILDREN); 282cdf0e10cSrcweir } 283cdf0e10cSrcweir 284cdf0e10cSrcweir //------------------------------------------------------------------------------ 285cdf0e10cSrcweir void ORelationTableView::AddNewRelation() 286cdf0e10cSrcweir { 287cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 288cdf0e10cSrcweir 289cdf0e10cSrcweir TTableConnectionData::value_type pNewConnData( new ORelationTableConnectionData() ); 290cdf0e10cSrcweir ORelationDialog aRelDlg(this, pNewConnData, sal_True); 291cdf0e10cSrcweir 292cdf0e10cSrcweir sal_Bool bSuccess = (aRelDlg.Execute() == RET_OK); 293cdf0e10cSrcweir if (bSuccess) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir // already updated by the dialog 296cdf0e10cSrcweir // dem Dokument bekanntgeben 297cdf0e10cSrcweir addConnection( new ORelationTableConnection(this, pNewConnData) ); 298cdf0e10cSrcweir } 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir //------------------------------------------------------------------------------ 302cdf0e10cSrcweir bool ORelationTableView::RemoveConnection( OTableConnection* pConn ,sal_Bool /*_bDelete*/) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 305cdf0e10cSrcweir ORelationTableConnectionData* pTabConnData = (ORelationTableConnectionData*)pConn->GetData().get(); 306cdf0e10cSrcweir try 307cdf0e10cSrcweir { 308cdf0e10cSrcweir if ( m_bInRemove || pTabConnData->DropRelation()) 309cdf0e10cSrcweir return OJoinTableView::RemoveConnection( pConn ,sal_True); 310cdf0e10cSrcweir } 311cdf0e10cSrcweir catch(SQLException& e) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir getDesignView()->getController().showError(SQLExceptionInfo(e)); 314cdf0e10cSrcweir } 315cdf0e10cSrcweir catch(Exception&) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir OSL_ENSURE(0,"ORelationTableView::RemoveConnection: Something other than SQLException occured!"); 318cdf0e10cSrcweir } 319cdf0e10cSrcweir return false; 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir //------------------------------------------------------------------------------ 323cdf0e10cSrcweir void ORelationTableView::AddTabWin(const ::rtl::OUString& _rComposedName, const ::rtl::OUString& rWinName, sal_Bool /*bNewTable*/) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir DBG_CHKTHIS(ORelationTableView,NULL); 326cdf0e10cSrcweir OSL_ENSURE(_rComposedName.getLength(),"There must be a table name supplied!"); 327cdf0e10cSrcweir OJoinTableView::OTableWindowMap::iterator aIter = GetTabWinMap()->find(_rComposedName); 328cdf0e10cSrcweir 329cdf0e10cSrcweir if(aIter != GetTabWinMap()->end()) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir aIter->second->SetZOrder(NULL, WINDOW_ZORDER_FIRST); 332cdf0e10cSrcweir aIter->second->GrabFocus(); 333cdf0e10cSrcweir EnsureVisible(aIter->second); 334cdf0e10cSrcweir // no new one 335cdf0e10cSrcweir return; 336cdf0e10cSrcweir } 337cdf0e10cSrcweir 338cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 339cdf0e10cSrcweir // Neue Datenstruktur in DocShell eintragen 340cdf0e10cSrcweir TTableWindowData::value_type pNewTabWinData(createTableWindowData( _rComposedName, rWinName,rWinName )); 341cdf0e10cSrcweir pNewTabWinData->ShowAll(sal_False); 342cdf0e10cSrcweir 343cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 344cdf0e10cSrcweir // Neues Fenster in Fensterliste eintragen 345cdf0e10cSrcweir OTableWindow* pNewTabWin = createWindow( pNewTabWinData ); 346cdf0e10cSrcweir if(pNewTabWin->Init()) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir m_pView->getController().getTableWindowData()->push_back( pNewTabWinData); 349cdf0e10cSrcweir // when we already have a table with this name insert the full qualified one instead 350cdf0e10cSrcweir (*GetTabWinMap())[_rComposedName] = pNewTabWin; 351cdf0e10cSrcweir 352cdf0e10cSrcweir SetDefaultTabWinPosSize( pNewTabWin ); 353cdf0e10cSrcweir pNewTabWin->Show(); 354cdf0e10cSrcweir 355cdf0e10cSrcweir modified(); 356cdf0e10cSrcweir 357cdf0e10cSrcweir if ( m_pAccessible ) 358cdf0e10cSrcweir m_pAccessible->notifyAccessibleEvent( AccessibleEventId::CHILD, 359cdf0e10cSrcweir Any(), 360cdf0e10cSrcweir makeAny(pNewTabWin->GetAccessible())); 361cdf0e10cSrcweir } 362cdf0e10cSrcweir else 363cdf0e10cSrcweir { 364cdf0e10cSrcweir pNewTabWin->clearListBox(); 365cdf0e10cSrcweir delete pNewTabWin; 366cdf0e10cSrcweir } 367cdf0e10cSrcweir } 368cdf0e10cSrcweir // ----------------------------------------------------------------------------- 369cdf0e10cSrcweir void ORelationTableView::RemoveTabWin( OTableWindow* pTabWin ) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir OSQLWarningBox aDlg( this, ModuleRes( STR_QUERY_REL_DELETE_WINDOW ), WB_YES_NO | WB_DEF_YES ); 372cdf0e10cSrcweir if ( m_bInRemove || aDlg.Execute() == RET_YES ) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir m_pView->getController().ClearUndoManager(); 375cdf0e10cSrcweir OJoinTableView::RemoveTabWin( pTabWin ); 376cdf0e10cSrcweir 377cdf0e10cSrcweir m_pView->getController().InvalidateFeature(SID_RELATION_ADD_RELATION); 378cdf0e10cSrcweir m_pView->getController().InvalidateFeature(ID_BROWSER_UNDO); 379cdf0e10cSrcweir m_pView->getController().InvalidateFeature(ID_BROWSER_REDO); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir } 382cdf0e10cSrcweir 383cdf0e10cSrcweir // ----------------------------------------------------------------------------- 384cdf0e10cSrcweir void ORelationTableView::lookForUiActivities() 385cdf0e10cSrcweir { 386cdf0e10cSrcweir if(m_pExistingConnection) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir String sTitle(ModuleRes(STR_RELATIONDESIGN)); 389cdf0e10cSrcweir sTitle.Erase(0,3); 390cdf0e10cSrcweir OSQLMessageBox aDlg(this,ModuleRes(STR_QUERY_REL_EDIT_RELATION),String(),0); 391cdf0e10cSrcweir aDlg.SetText(sTitle); 392cdf0e10cSrcweir aDlg.RemoveButton(aDlg.GetButtonId(0)); 393cdf0e10cSrcweir aDlg.AddButton( ModuleRes(STR_QUERY_REL_EDIT), BUTTONID_OK, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON); 394cdf0e10cSrcweir aDlg.AddButton( ModuleRes(STR_QUERY_REL_CREATE), BUTTONID_YES, 0); 395cdf0e10cSrcweir aDlg.AddButton(BUTTON_CANCEL,BUTTONID_CANCEL,0); 396cdf0e10cSrcweir sal_uInt16 nRet = aDlg.Execute(); 397cdf0e10cSrcweir if( nRet == RET_CANCEL) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir m_pCurrentlyTabConnData.reset(); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir else if ( nRet == RET_OK ) // EDIT 402cdf0e10cSrcweir { 403cdf0e10cSrcweir ConnDoubleClicked(m_pExistingConnection); 404cdf0e10cSrcweir m_pCurrentlyTabConnData.reset(); 405cdf0e10cSrcweir } 406cdf0e10cSrcweir m_pExistingConnection = NULL; 407cdf0e10cSrcweir } 408cdf0e10cSrcweir if(m_pCurrentlyTabConnData) 409cdf0e10cSrcweir { 410cdf0e10cSrcweir ORelationDialog aRelDlg( this, m_pCurrentlyTabConnData ); 411cdf0e10cSrcweir if (aRelDlg.Execute() == RET_OK) 412cdf0e10cSrcweir { 413cdf0e10cSrcweir // already updated by the dialog 414cdf0e10cSrcweir addConnection( new ORelationTableConnection( this, m_pCurrentlyTabConnData ) ); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir m_pCurrentlyTabConnData.reset(); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir } 419cdf0e10cSrcweir 420cdf0e10cSrcweir // ----------------------------------------------------------------------------- 421cdf0e10cSrcweir OTableWindow* ORelationTableView::createWindow(const TTableWindowData::value_type& _pData) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir return new ORelationTableWindow(this,_pData); 424cdf0e10cSrcweir } 425cdf0e10cSrcweir // ----------------------------------------------------------------------------- 426cdf0e10cSrcweir bool ORelationTableView::allowQueries() const 427cdf0e10cSrcweir { 428cdf0e10cSrcweir return false; 429cdf0e10cSrcweir } 430cdf0e10cSrcweir // ----------------------------------------------------------------------------- 431cdf0e10cSrcweir void ORelationTableView::_elementInserted( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir 434cdf0e10cSrcweir } 435cdf0e10cSrcweir // ----------------------------------------------------------------------------- 436cdf0e10cSrcweir void ORelationTableView::_elementRemoved( const container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir m_bInRemove = true; 439cdf0e10cSrcweir ::rtl::OUString sName; 440cdf0e10cSrcweir if ( _rEvent.Accessor >>= sName ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir OTableWindow* pTableWindow = GetTabWindow(sName); 443cdf0e10cSrcweir if ( pTableWindow ) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir m_pView->getController().ClearUndoManager(); 446cdf0e10cSrcweir OJoinTableView::RemoveTabWin( pTableWindow ); 447cdf0e10cSrcweir 448cdf0e10cSrcweir m_pView->getController().InvalidateFeature(SID_RELATION_ADD_RELATION); 449cdf0e10cSrcweir m_pView->getController().InvalidateFeature(ID_BROWSER_UNDO); 450cdf0e10cSrcweir m_pView->getController().InvalidateFeature(ID_BROWSER_REDO); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir } // if ( _rEvent.Accessor >>= sName ) 453cdf0e10cSrcweir m_bInRemove = false; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir // ----------------------------------------------------------------------------- 456cdf0e10cSrcweir void ORelationTableView::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir } 459cdf0e10cSrcweir 460