summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/control/RelationControl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/control/RelationControl.cxx')
-rw-r--r--dbaccess/source/ui/control/RelationControl.cxx717
1 files changed, 717 insertions, 0 deletions
diff --git a/dbaccess/source/ui/control/RelationControl.cxx b/dbaccess/source/ui/control/RelationControl.cxx
new file mode 100644
index 000000000000..df2ac9b6e4b6
--- /dev/null
+++ b/dbaccess/source/ui/control/RelationControl.cxx
@@ -0,0 +1,717 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_dbaccess.hxx"
+#include "RelationControl.hxx"
+#include "RelationControl.hrc"
+
+#include <svtools/editbrowsebox.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <tools/diagnose_ex.h>
+#include "TableConnectionData.hxx"
+#include "TableConnection.hxx"
+#include "TableWindow.hxx"
+#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
+#include "UITools.hxx"
+#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include "RelControliFace.hxx"
+#include "dbu_control.hrc"
+#include "dbaccess_helpid.hrc"
+#include <osl/diagnose.h>
+
+#include <algorithm>
+
+#define SOURCE_COLUMN 1
+#define DEST_COLUMN 2
+
+namespace dbaui
+{
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::sdbc;
+ using namespace ::com::sun::star::sdbcx;
+ using namespace ::com::sun::star::container;
+ using namespace svt;
+
+ typedef ::svt::EditBrowseBox ORelationControl_Base;
+ class ORelationControl : public ORelationControl_Base
+ {
+ friend class OTableListBoxControl;
+
+ ::std::auto_ptr< ::svt::ListBoxControl> m_pListCell;
+ TTableConnectionData::value_type m_pConnData;
+ const OJoinTableView::OTableWindowMap* m_pTableMap;
+ OTableListBoxControl* m_pBoxControl;
+ long m_nDataPos;
+ Reference< XPropertySet> m_xSourceDef;
+ Reference< XPropertySet> m_xDestDef;
+
+
+ void fillListBox(const Reference< XPropertySet>& _xDest,long nRow,sal_uInt16 nColumnId);
+ /** returns the column id for the editbrowsebox
+ @param _nColId
+ the column id SOURCE_COLUMN or DEST_COLUMN
+
+ @return the current column id eihter SOURCE_COLUMN or DEST_COLUMN depends on the connection data
+ */
+ sal_uInt16 getColumnIdent( sal_uInt16 _nColId ) const;
+ public:
+ ORelationControl( OTableListBoxControl* pParent,const OJoinTableView::OTableWindowMap* _pTableMap );
+ virtual ~ORelationControl();
+
+ /** searches for a connection between these two tables
+ @param _pSource
+ the left table
+ @param _pDest
+ the right window
+ */
+ void setWindowTables(const OTableWindow* _pSource,const OTableWindow* _pDest);
+
+ /** allows to access the connection data from outside
+
+ @return rthe connection data
+ */
+ inline TTableConnectionData::value_type getData() const { return m_pConnData; }
+
+ void lateInit();
+
+ protected:
+ virtual void Resize();
+
+ virtual long PreNotify(NotifyEvent& rNEvt );
+
+ virtual sal_Bool IsTabAllowed(sal_Bool bForward) const;
+
+ virtual void Init(const TTableConnectionData::value_type& _pConnData);
+ virtual void Init() { ORelationControl_Base::Init(); }
+ virtual void InitController( ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol );
+ virtual ::svt::CellController* GetController( long nRow, sal_uInt16 nCol );
+ virtual void PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId ) const;
+ virtual sal_Bool SeekRow( long nRow );
+ virtual sal_Bool SaveModified();
+ virtual String GetCellText( long nRow, sal_uInt16 nColId ) const;
+
+ virtual void CellModified();
+
+ DECL_LINK( AsynchDeactivate, void* );
+ private:
+
+ DECL_LINK( AsynchActivate, void* );
+
+ };
+
+ //========================================================================
+ // class ORelationControl
+ //========================================================================
+ DBG_NAME(ORelationControl)
+ //------------------------------------------------------------------------
+ ORelationControl::ORelationControl( OTableListBoxControl* pParent ,const OJoinTableView::OTableWindowMap* _pTableMap)
+ :EditBrowseBox( pParent, EBBF_SMART_TAB_TRAVEL | EBBF_NOROWPICTURE, WB_TABSTOP | WB_BORDER | BROWSER_AUTOSIZE_LASTCOL)
+ ,m_pTableMap(_pTableMap)
+ ,m_pBoxControl(pParent)
+ ,m_xSourceDef( NULL )
+ ,m_xDestDef( NULL )
+ {
+ DBG_CTOR(ORelationControl,NULL);
+ }
+
+ //------------------------------------------------------------------------
+ ORelationControl::~ORelationControl()
+ {
+ DBG_DTOR(ORelationControl,NULL);
+ }
+
+ //------------------------------------------------------------------------
+ void ORelationControl::Init(const TTableConnectionData::value_type& _pConnData)
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+
+ m_pConnData = _pConnData;
+ OSL_ENSURE(m_pConnData, "No data supplied!");
+
+ m_pConnData->normalizeLines();
+ }
+ //------------------------------------------------------------------------------
+ void ORelationControl::lateInit()
+ {
+ if ( !m_pConnData.get() )
+ return;
+ m_xSourceDef = m_pConnData->getReferencingTable()->getTable();
+ m_xDestDef = m_pConnData->getReferencedTable()->getTable();
+
+ if ( ColCount() == 0 )
+ {
+ InsertDataColumn( SOURCE_COLUMN, m_pConnData->getReferencingTable()->GetWinName(), 100);
+ InsertDataColumn( DEST_COLUMN, m_pConnData->getReferencedTable()->GetWinName(), 100);
+ // wenn es die Defs noch nicht gibt, dann muessen sie noch mit SetSource-/-DestDef gesetzt werden !
+
+ m_pListCell.reset( new ListBoxControl( &GetDataWindow() ) );
+
+ //////////////////////////////////////////////////////////////////////
+ // set browse mode
+ SetMode( BROWSER_COLUMNSELECTION |
+ BROWSER_HLINESFULL |
+ BROWSER_VLINESFULL |
+ BROWSER_HIDECURSOR |
+ BROWSER_HIDESELECT |
+ BROWSER_AUTO_HSCROLL |
+ BROWSER_AUTO_VSCROLL);
+ }
+ else
+ // not the first call
+ RowRemoved(0, GetRowCount());
+
+ RowInserted(0, m_pConnData->GetConnLineDataList()->size() + 1, sal_True); // add one extra row
+ }
+ //------------------------------------------------------------------------------
+ void ORelationControl::Resize()
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ EditBrowseBox::Resize();
+ long nOutputWidth = GetOutputSizePixel().Width();
+ SetColumnWidth(1, (nOutputWidth / 2));
+ SetColumnWidth(2, (nOutputWidth / 2));
+ }
+
+ //------------------------------------------------------------------------------
+ long ORelationControl::PreNotify(NotifyEvent& rNEvt)
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ if (rNEvt.GetType() == EVENT_LOSEFOCUS && !HasChildPathFocus() )
+ PostUserEvent(LINK(this, ORelationControl, AsynchDeactivate));
+ else if (rNEvt.GetType() == EVENT_GETFOCUS)
+ PostUserEvent(LINK(this, ORelationControl, AsynchActivate));
+
+ return EditBrowseBox::PreNotify(rNEvt);
+ }
+
+ //------------------------------------------------------------------------------
+ IMPL_LINK(ORelationControl, AsynchActivate, void*, EMPTYARG)
+ {
+ ActivateCell();
+ return 0L;
+ }
+
+ //------------------------------------------------------------------------------
+ IMPL_LINK(ORelationControl, AsynchDeactivate, void*, EMPTYARG)
+ {
+ DeactivateCell();
+ return 0L;
+ }
+
+ //------------------------------------------------------------------------------
+ sal_Bool ORelationControl::IsTabAllowed(sal_Bool bForward) const
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ long nRow = GetCurRow();
+ sal_uInt16 nCol = GetCurColumnId();
+
+ sal_Bool bRet = !(( ( bForward && (nCol == DEST_COLUMN) && (nRow == GetRowCount() - 1)))
+ || (!bForward && (nCol == SOURCE_COLUMN) && (nRow == 0)));
+
+ return bRet && EditBrowseBox::IsTabAllowed(bForward);
+ }
+
+ //------------------------------------------------------------------------------
+ sal_Bool ORelationControl::SaveModified()
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ sal_Int32 nRow = GetCurRow();
+ if ( nRow != BROWSER_ENDOFSELECTION )
+ {
+ String sFieldName(m_pListCell->GetSelectEntry());
+ OConnectionLineDataVec* pLines = m_pConnData->GetConnLineDataList();
+ if ( pLines->size() <= static_cast<sal_uInt32>(nRow) )
+ {
+ pLines->push_back(new OConnectionLineData());
+ nRow = pLines->size() - 1;
+ }
+
+ OConnectionLineDataRef pConnLineData = (*pLines)[nRow];
+
+ switch( getColumnIdent( GetCurColumnId() ) )
+ {
+ case SOURCE_COLUMN:
+ pConnLineData->SetSourceFieldName( sFieldName );
+ break;
+ case DEST_COLUMN:
+ pConnLineData->SetDestFieldName( sFieldName );
+ break;
+ }
+ }
+
+ return sal_True;
+ }
+ //------------------------------------------------------------------------------
+ sal_uInt16 ORelationControl::getColumnIdent( sal_uInt16 _nColId ) const
+ {
+ sal_uInt16 nId = _nColId;
+ if ( m_pConnData->getReferencingTable() != m_pBoxControl->getReferencingTable() )
+ nId = ( _nColId == SOURCE_COLUMN) ? DEST_COLUMN : SOURCE_COLUMN;
+ return nId;
+ }
+
+ //------------------------------------------------------------------------------
+ String ORelationControl::GetCellText( long nRow, sal_uInt16 nColId ) const
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ String sText;
+ if ( m_pConnData->GetConnLineDataList()->size() > static_cast<size_t>(nRow) )
+ {
+ OConnectionLineDataRef pConnLineData = (*m_pConnData->GetConnLineDataList())[nRow];
+ switch( getColumnIdent( nColId ) )
+ {
+ case SOURCE_COLUMN:
+ sText = pConnLineData->GetSourceFieldName();
+ break;
+ case DEST_COLUMN:
+ sText = pConnLineData->GetDestFieldName();
+ break;
+ }
+ }
+ return sText;
+ }
+
+ //------------------------------------------------------------------------------
+ void ORelationControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+
+ rtl::OString sHelpId( HID_RELATIONDIALOG_LEFTFIELDCELL );
+
+ Reference< XPropertySet> xDef;
+ switch ( getColumnIdent(nColumnId) )
+ {
+ case SOURCE_COLUMN:
+ xDef = m_xSourceDef;
+ sHelpId = HID_RELATIONDIALOG_LEFTFIELDCELL;
+ break;
+ case DEST_COLUMN:
+ xDef = m_xDestDef;
+ sHelpId = HID_RELATIONDIALOG_RIGHTFIELDCELL;
+ break;
+ default:
+ // ?????????
+ break;
+ }
+
+ if ( xDef.is() )
+ {
+ fillListBox(xDef,nRow,nColumnId);
+ String sName = GetCellText( nRow, nColumnId );
+ m_pListCell->SelectEntry( sName );
+ if ( m_pListCell->GetSelectEntry() != sName )
+ {
+ m_pListCell->InsertEntry( sName );
+ m_pListCell->SelectEntry( sName );
+ }
+
+ m_pListCell->SetHelpId(sHelpId);
+ }
+ }
+
+ //------------------------------------------------------------------------------
+ CellController* ORelationControl::GetController( long /*nRow*/, sal_uInt16 /*nColumnId*/ )
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ return new ListBoxCellController( m_pListCell.get() );
+ }
+
+ //------------------------------------------------------------------------------
+ sal_Bool ORelationControl::SeekRow( long nRow )
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ m_nDataPos = nRow;
+ return sal_True;
+ }
+
+ //------------------------------------------------------------------------------
+ void ORelationControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ String aText =const_cast< ORelationControl*>(this)->GetCellText( m_nDataPos, nColumnId );
+
+ Point aPos( rRect.TopLeft() );
+ Size aTextSize( GetDataWindow().GetTextHeight(),GetDataWindow().GetTextWidth( aText ));
+
+ if( aPos.X() < rRect.Right() || aPos.X() + aTextSize.Width() > rRect.Right() ||
+ aPos.Y() < rRect.Top() || aPos.Y() + aTextSize.Height() > rRect.Bottom() )
+ rDev.SetClipRegion( rRect );
+
+ rDev.DrawText( aPos, aText );
+
+ if( rDev.IsClipRegion() )
+ rDev.SetClipRegion();
+ }
+ // -----------------------------------------------------------------------------
+ void ORelationControl::fillListBox(const Reference< XPropertySet>& _xDest,long /*_nRow*/,sal_uInt16 /*nColumnId*/)
+ {
+ m_pListCell->Clear();
+ try
+ {
+ if ( _xDest.is() )
+ {
+ //sal_Int32 nRows = GetRowCount();
+ Reference<XColumnsSupplier> xSup(_xDest,UNO_QUERY);
+ Reference<XNameAccess> xColumns = xSup->getColumns();
+ Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
+ const ::rtl::OUString* pIter = aNames.getConstArray();
+ const ::rtl::OUString* pEnd = pIter + aNames.getLength();
+ for(;pIter != pEnd;++pIter)
+ {
+ m_pListCell->InsertEntry( *pIter );
+ }
+ m_pListCell->InsertEntry(String(), 0);
+ }
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ }
+ // -----------------------------------------------------------------------------
+ void ORelationControl::setWindowTables(const OTableWindow* _pSource,const OTableWindow* _pDest)
+ {
+ // wenn ich hier gerade editiere, ausblenden
+ sal_Bool bWasEditing = IsEditing();
+ if ( bWasEditing )
+ DeactivateCell();
+
+ if ( _pSource && _pDest )
+ {
+ m_xSourceDef = _pSource->GetTable();
+ SetColumnTitle(1, _pSource->GetName());
+
+
+ m_xDestDef = _pDest->GetTable();
+ SetColumnTitle(2, _pDest->GetName());
+
+ const OJoinTableView* pView = _pSource->getTableView();
+ OTableConnection* pConn = pView->GetTabConn(_pSource,_pDest);
+ if ( pConn && !m_pConnData->GetConnLineDataList()->empty() )
+ {
+ m_pConnData->CopyFrom(*pConn->GetData());
+ m_pBoxControl->getContainer()->notifyConnectionChange();
+ }
+ else
+ {
+ // no connection found so we clear our data
+ OConnectionLineDataVec* pLines = m_pConnData->GetConnLineDataList();
+ ::std::for_each(pLines->begin(),
+ pLines->end(),
+ OUnaryRefFunctor<OConnectionLineData>( ::std::mem_fun(&OConnectionLineData::Reset))
+ );
+
+ m_pConnData->setReferencingTable(_pSource->GetData());
+ m_pConnData->setReferencedTable(_pDest->GetData());
+ }
+ m_pConnData->normalizeLines();
+
+ }
+ // neu zeichnen
+ Invalidate();
+
+ if ( bWasEditing )
+ {
+ GoToRow(0);
+ ActivateCell();
+ }
+ }
+ //------------------------------------------------------------------------
+ void ORelationControl::CellModified()
+ {
+ DBG_CHKTHIS(ORelationControl,NULL);
+ EditBrowseBox::CellModified();
+ SaveModified();
+ static_cast<OTableListBoxControl*>(GetParent())->NotifyCellChange();
+ }
+ //========================================================================
+ // class OTableListBoxControl
+DBG_NAME(OTableListBoxControl)
+
+//========================================================================
+
+OTableListBoxControl::OTableListBoxControl( Window* _pParent
+ ,const ResId& _rResId
+ ,const OJoinTableView::OTableWindowMap* _pTableMap
+ ,IRelationControlInterface* _pParentDialog)
+ : Window(_pParent,_rResId)
+ , m_aFL_InvolvedTables( this, ResId(FL_INVOLVED_TABLES,*_rResId.GetResMgr()))
+ , m_lmbLeftTable( this, ResId(LB_LEFT_TABLE,*_rResId.GetResMgr()))
+ , m_lmbRightTable( this, ResId(LB_RIGHT_TABLE,*_rResId.GetResMgr()))
+ , m_aFL_InvolvedFields( this, ResId(FL_INVOLVED_FIELDS,*_rResId.GetResMgr()))
+ , m_pTableMap(_pTableMap)
+ , m_pParentDialog(_pParentDialog)
+ {
+ m_pRC_Tables = new ORelationControl( this,m_pTableMap );
+ m_pRC_Tables->SetHelpId(HID_RELDLG_KEYFIELDS);
+ m_pRC_Tables->Init( );
+ m_pRC_Tables->SetZOrder(&m_lmbRightTable, WINDOW_ZORDER_BEHIND);
+
+ lateUIInit();
+
+ Link aLink(LINK(this, OTableListBoxControl, OnTableChanged));
+ m_lmbLeftTable.SetSelectHdl(aLink);
+ m_lmbRightTable.SetSelectHdl(aLink);
+
+ FreeResource();
+ DBG_CTOR(OTableListBoxControl,NULL);
+ }
+ // -----------------------------------------------------------------------------
+ OTableListBoxControl::~OTableListBoxControl()
+ {
+ ORelationControl* pTemp = m_pRC_Tables;
+ m_pRC_Tables = NULL;
+ delete pTemp;
+ DBG_DTOR(OTableListBoxControl,NULL);
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::fillListBoxes()
+ {
+ OSL_ENSURE( !m_pTableMap->empty(), "OTableListBoxControl::fillListBoxes: no table window!");
+ OTableWindow* pInitialLeft = NULL;
+ OTableWindow* pInitialRight = NULL;
+
+ // die Namen aller TabWins einsammeln
+ OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
+ OJoinTableView::OTableWindowMap::const_iterator aEnd = m_pTableMap->end();
+ for(;aIter != aEnd;++aIter)
+ {
+ m_lmbLeftTable.InsertEntry(aIter->first);
+ m_lmbRightTable.InsertEntry(aIter->first);
+
+ if (!pInitialLeft)
+ {
+ pInitialLeft = aIter->second;
+ m_strCurrentLeft = aIter->first;
+ }
+ else if (!pInitialRight)
+ {
+ pInitialRight = aIter->second;
+ m_strCurrentRight = aIter->first;
+ }
+ }
+
+ if ( !pInitialRight )
+ {
+ pInitialRight = pInitialLeft;
+ m_strCurrentRight = m_strCurrentLeft;
+ }
+
+ // die entsprechenden Defs an mein Controls
+ m_pRC_Tables->setWindowTables(pInitialLeft,pInitialRight);
+
+ // die in einer ComboBox ausgewaehlte Tabelle darf nicht in der anderen zur Verfuegung stehen
+
+ if ( m_pTableMap->size() > 2 )
+ {
+ m_lmbLeftTable.RemoveEntry(m_strCurrentRight);
+ m_lmbRightTable.RemoveEntry(m_strCurrentLeft);
+ }
+
+ // links das erste, rechts das zweite selektieren
+ m_lmbLeftTable.SelectEntry(m_strCurrentLeft);
+ m_lmbRightTable.SelectEntry(m_strCurrentRight);
+
+ m_lmbLeftTable.GrabFocus();
+ }
+ // -----------------------------------------------------------------------------
+ IMPL_LINK( OTableListBoxControl, OnTableChanged, ListBox*, pListBox )
+ {
+ String strSelected(pListBox->GetSelectEntry());
+ OTableWindow* pLeft = NULL;
+ OTableWindow* pRight = NULL;
+
+ // eine Sonderbehandlung : wenn es nur zwei Tabellen gibt, muss ich bei Wechsel in einer LB auch in der anderen umschalten
+ if ( m_pTableMap->size() == 2 )
+ {
+ ListBox* pOther;
+ if ( pListBox == &m_lmbLeftTable )
+ pOther = &m_lmbRightTable;
+ else
+ pOther = &m_lmbLeftTable;
+ pOther->SelectEntryPos(1 - pOther->GetSelectEntryPos());
+
+ OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
+ OTableWindow* pFirst = aIter->second;
+ ++aIter;
+ OTableWindow* pSecond = aIter->second;
+
+ if ( m_lmbLeftTable.GetSelectEntry() == String(pFirst->GetName()) )
+ {
+ pLeft = pFirst;
+ pRight = pSecond;
+ }
+ else
+ {
+ pLeft = pSecond;
+ pRight = pFirst;
+ }
+ }
+ else
+ {
+ // zuerst brauche ich die TableDef zur Tabelle, dazu das TabWin
+ OJoinTableView::OTableWindowMap::const_iterator aFind = m_pTableMap->find(strSelected);
+ OTableWindow* pLoop = NULL;
+ if( aFind != m_pTableMap->end() )
+ pLoop = aFind->second;
+ OSL_ENSURE(pLoop != NULL, "ORelationDialog::OnTableChanged : ungueltiger Eintrag in ListBox !");
+ // da ich die ListBoxen selber mit eben diesen Tabellennamen, mit denen ich sie jetzt vergleiche, gefuellt habe,
+ // MUSS ich strSelected finden
+ if (pListBox == &m_lmbLeftTable)
+ {
+ // den vorher links selektierten Eintrag wieder rein rechts
+ m_lmbRightTable.InsertEntry(m_strCurrentLeft);
+ // und den jetzt selektierten raus
+ m_lmbRightTable.RemoveEntry(strSelected);
+ m_strCurrentLeft = strSelected;
+
+ pLeft = pLoop;
+
+ OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_lmbRightTable.GetSelectEntry());
+ OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
+ if ( aIter != m_pTableMap->end() )
+ pRight = aIter->second;
+
+ m_lmbLeftTable.GrabFocus();
+ }
+ else
+ {
+ // den vorher rechts selektierten Eintrag wieder rein links
+ m_lmbLeftTable.InsertEntry(m_strCurrentRight);
+ // und den jetzt selektierten raus
+ m_lmbLeftTable.RemoveEntry(strSelected);
+ m_strCurrentRight = strSelected;
+
+ pRight = pLoop;
+ OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_lmbLeftTable.GetSelectEntry());
+ OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
+ if ( aIter != m_pTableMap->end() )
+ pLeft = aIter->second;
+ }
+ }
+
+ pListBox->GrabFocus();
+
+ m_pRC_Tables->setWindowTables(pLeft,pRight);
+
+ NotifyCellChange();
+ return 0;
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::NotifyCellChange()
+ {
+ // den Ok-Button en- oder disablen, je nachdem, ob ich eine gueltige Situation habe
+ TTableConnectionData::value_type pConnData = m_pRC_Tables->getData();
+ const OConnectionLineDataVec* pLines = pConnData->GetConnLineDataList();
+ m_pParentDialog->setValid(!pLines->empty());
+
+ if ( pLines->size() >= static_cast<sal_uInt32>(m_pRC_Tables->GetRowCount()) )
+ {
+ m_pRC_Tables->DeactivateCell();
+ m_pRC_Tables->RowInserted(m_pRC_Tables->GetRowCount(), pLines->size() - static_cast<sal_uInt32>(m_pRC_Tables->GetRowCount()) + 1, sal_True);
+ m_pRC_Tables->ActivateCell();
+ }
+ }
+ // -----------------------------------------------------------------------------
+ void fillEntryAndDisable(ListBox& _rListBox,const String& _sEntry)
+ {
+ _rListBox.InsertEntry(_sEntry);
+ _rListBox.SelectEntryPos(0);
+ _rListBox.Disable();
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::fillAndDisable(const TTableConnectionData::value_type& _pConnectionData)
+ {
+ fillEntryAndDisable(m_lmbLeftTable,_pConnectionData->getReferencingTable()->GetWinName());
+ fillEntryAndDisable(m_lmbRightTable,_pConnectionData->getReferencedTable()->GetWinName());
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::Init(const TTableConnectionData::value_type& _pConnData)
+ {
+ m_pRC_Tables->Init(_pConnData);
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::lateUIInit(Window* _pTableSeparator)
+ {
+ const sal_Int32 nDiff = LogicToPixel( Point(0,6), MAP_APPFONT ).Y();
+ Point aDlgPoint = LogicToPixel( Point(12,43), MAP_APPFONT );
+ if ( _pTableSeparator )
+ {
+ _pTableSeparator->SetZOrder(&m_lmbRightTable, WINDOW_ZORDER_BEHIND);
+ m_pRC_Tables->SetZOrder(_pTableSeparator, WINDOW_ZORDER_BEHIND);
+ _pTableSeparator->SetPosPixel(Point(0,m_aFL_InvolvedFields.GetPosPixel().Y()));
+ const Size aSize = _pTableSeparator->GetSizePixel();
+ aDlgPoint.Y() = _pTableSeparator->GetPosPixel().Y() + aSize.Height();
+ m_aFL_InvolvedFields.SetPosPixel(Point(m_aFL_InvolvedFields.GetPosPixel().X(),aDlgPoint.Y()));
+ aDlgPoint.Y() += nDiff + m_aFL_InvolvedFields.GetSizePixel().Height();
+ }
+ //////////////////////////////////////////////////////////////////////
+ // positing BrowseBox control
+ const Size aCurrentSize = GetSizePixel();
+ Size aDlgSize = LogicToPixel( Size(24,0), MAP_APPFONT );
+ aDlgSize.Width() = aCurrentSize.Width() - aDlgSize.Width();
+ aDlgSize.Height() = aCurrentSize.Height() - aDlgPoint.Y() - nDiff;
+
+ m_pRC_Tables->SetPosSizePixel( aDlgPoint, aDlgSize );
+ m_pRC_Tables->Show();
+
+ lateInit();
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::lateInit()
+ {
+ m_pRC_Tables->lateInit();
+ }
+ // -----------------------------------------------------------------------------
+ sal_Bool OTableListBoxControl::SaveModified()
+ {
+ sal_Bool bRet = m_pRC_Tables->SaveModified();
+ m_pRC_Tables->getData()->normalizeLines();
+ return bRet;
+ }
+ // -----------------------------------------------------------------------------
+ TTableWindowData::value_type OTableListBoxControl::getReferencingTable() const
+ {
+ return m_pRC_Tables->getData()->getReferencingTable();
+ }
+ // -----------------------------------------------------------------------------
+ void OTableListBoxControl::enableRelation(bool _bEnable)
+ {
+ if ( !_bEnable )
+ PostUserEvent(LINK(m_pRC_Tables, ORelationControl, AsynchDeactivate));
+ m_pRC_Tables->Enable(_bEnable);
+
+ }
+ // -----------------------------------------------------------------------------
+}
+// -----------------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */