Files
libreoffice/dbaccess/source/ui/control/RelationControl.cxx

700 lines
24 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-06-14 17:39:53 +01:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "RelationControl.hxx"
#include <svtools/editbrowsebox.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <tools/diagnose_ex.h>
#include <vcl/builderfactory.hxx>
#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"
migrate to boost::gettext * all .ui files go from <interface> to <interface domain="MODULE"> e.g. vcl * all .src files go away and the english source strings folded into the .hrc as NC_("context", "source string") * ResMgr is dropped in favour of std::locale imbued by boost::locale::generator pointed at matching MODULE .mo files * UIConfig translations are folded into the module .mo, so e.g. UIConfig_cui goes from l10n target to normal one, so the res/lang.zips of UI files go away * translation via Translation::get(hrc-define-key, imbued-std::locale) * python can now be translated with its inbuilt gettext support (we keep the name strings.hrc there to keep finding the .hrc file uniform) so magic numbers can go away there * java and starbasic components can be translated via the pre-existing css.resource.StringResourceWithLocation mechanism * en-US res files go away, their strings are now the .hrc keys in the source code * remaining .res files are replaced by .mo files * in .res/.ui-lang-zip files, the old scheme missing translations of strings results in inserting the english original so something can be found, now the standard fallback of using the english original from the source key is used, so partial translations shrink dramatically in size * extract .hrc strings with hrcex which backs onto xgettext -C --add-comments --keyword=NC_:1c,2 --from-code=UTF-8 --no-wrap * extract .ui strings with uiex which backs onto xgettext --add-comments --no-wrap * qtz for gettext translations is generated at runtime as ascii-ified crc32 of content + "|" + msgid * [API CHANGE] remove deprecated binary .res resouce loader related uno apis com::sun::star::resource::OfficeResourceLoader com::sun::star::resource::XResourceBundleLoader com::sun::star::resource::XResourceBundle when translating strings via uno apis com.sun.star.resource.StringResourceWithLocation can continue to be used Change-Id: Ia2594a2672b7301d9c3421fdf31b6cfe7f3f8d0a
2017-06-11 20:56:30 +01:00
#include "strings.hrc"
#include "helpids.h"
2011-02-03 00:33:36 +01:00
#include <osl/diagnose.h>
#include <vector>
#include <utility>
using std::pair;
using std::make_pair;
2002-02-18 12:35:32 +00:00
2002-02-06 13:31:05 +00:00
#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;
VclPtr< ::svt::ListBoxControl> m_pListCell;
TTableConnectionData::value_type m_pConnData;
2002-02-06 13:31:05 +00:00
OTableListBoxControl* m_pBoxControl;
long m_nDataPos;
Reference< XPropertySet> m_xSourceDef;
Reference< XPropertySet> m_xDestDef;
enum opcode { DELETE, INSERT, MODIFY };
typedef std::vector< pair < opcode, pair < OConnectionLineDataVec::size_type, OConnectionLineDataVec::size_type> > > ops_type;
ops_type m_ops;
void fillListBox(const Reference< XPropertySet>& _xDest);
2002-02-06 13:31:05 +00:00
/** returns the column id for the editbrowsebox
@param _nColId
the column id SOURCE_COLUMN or DEST_COLUMN
@return the current column id either SOURCE_COLUMN or DEST_COLUMN depends on the connection data
*/
sal_uInt16 getColumnIdent( sal_uInt16 _nColId ) const;
public:
explicit ORelationControl(vcl::Window *pParent);
void SetController(OTableListBoxControl* pController)
{
m_pBoxControl = pController;
}
2002-02-06 13:31:05 +00:00
/** 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);
2002-02-06 13:31:05 +00:00
/** allows to access the connection data from outside
@return the connection data
*/
const TTableConnectionData::value_type& getData() const { return m_pConnData; }
2002-11-08 08:26:00 +00:00
void lateInit();
protected:
virtual ~ORelationControl() override { disposeOnce(); }
virtual void dispose() override { m_pListCell.disposeAndClear(); ORelationControl_Base::dispose(); }
virtual void Resize() override;
virtual Size GetOptimalSize() const override;
virtual bool PreNotify(NotifyEvent& rNEvt ) override;
virtual bool IsTabAllowed(bool bForward) const override;
void Init(const TTableConnectionData::value_type& _pConnData);
using ORelationControl_Base::Init;
virtual void InitController( ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol ) override;
virtual ::svt::CellController* GetController( long nRow, sal_uInt16 nCol ) override;
virtual void PaintCell( OutputDevice& rDev, const tools::Rectangle& rRect, sal_uInt16 nColId ) const override;
virtual bool SeekRow( long nRow ) override;
virtual bool SaveModified() override;
virtual OUString GetCellText( long nRow, sal_uInt16 nColId ) const override;
virtual void CellModified() override;
DECL_LINK( AsynchDeactivate, void*, void );
private:
DECL_LINK( AsynchActivate, void*, void );
};
// class ORelationControl
ORelationControl::ORelationControl(vcl::Window *pParent)
: EditBrowseBox(pParent,
EditBrowseBoxFlags::SMART_TAB_TRAVEL | EditBrowseBoxFlags::NO_HANDLE_COLUMN_CONTENT,
WB_TABSTOP | WB_BORDER,
BrowserMode::AUTOSIZE_LASTCOL)
, m_pBoxControl(nullptr)
, m_nDataPos(0)
, m_xSourceDef(nullptr)
, m_xDestDef(nullptr)
{
}
VCL_BUILDER_FACTORY(ORelationControl)
void ORelationControl::Init(const TTableConnectionData::value_type& _pConnData)
{
m_pConnData = _pConnData;
OSL_ENSURE(m_pConnData, "No data supplied!");
m_pConnData->normalizeLines();
2002-11-08 08:26:00 +00:00
}
2002-11-08 08:26:00 +00:00
void ORelationControl::lateInit()
{
if ( !m_pConnData.get() )
return;
m_xSourceDef = m_pConnData->getReferencingTable()->getTable();
m_xDestDef = m_pConnData->getReferencedTable()->getTable();
2002-02-06 13:31:05 +00:00
if ( ColCount() == 0 )
{
InsertDataColumn( SOURCE_COLUMN, m_pConnData->getReferencingTable()->GetWinName(), 100);
InsertDataColumn( DEST_COLUMN, m_pConnData->getReferencedTable()->GetWinName(), 100);
2012-04-13 14:39:59 +02:00
// If the Defs do not yet exits, we need to set them with SetSource-/-DestDef
m_pListCell.reset( VclPtr<ListBoxControl>::Create( &GetDataWindow() ) );
2002-02-06 13:31:05 +00:00
// set browse mode
SetMode( BrowserMode::COLUMNSELECTION |
BrowserMode::HLINES |
BrowserMode::VLINES |
BrowserMode::HIDECURSOR |
BrowserMode::HIDESELECT |
BrowserMode::AUTO_HSCROLL |
BrowserMode::AUTO_VSCROLL);
}
else
// not the first call
RowRemoved(0, GetRowCount());
RowInserted(0, m_pConnData->GetConnLineDataList().size() + 1); // add one extra row
}
void ORelationControl::Resize()
{
EditBrowseBox::Resize();
long nOutputWidth = GetOutputSizePixel().Width() - 1;
2002-02-06 13:31:05 +00:00
SetColumnWidth(1, (nOutputWidth / 2));
SetColumnWidth(2, (nOutputWidth / 2));
}
bool ORelationControl::PreNotify(NotifyEvent& rNEvt)
{
if (rNEvt.GetType() == MouseNotifyEvent::LOSEFOCUS && !HasChildPathFocus() )
PostUserEvent(LINK(this, ORelationControl, AsynchDeactivate), nullptr, true);
else if (rNEvt.GetType() == MouseNotifyEvent::GETFOCUS)
PostUserEvent(LINK(this, ORelationControl, AsynchActivate), nullptr, true);
2002-02-06 13:31:05 +00:00
return EditBrowseBox::PreNotify(rNEvt);
}
IMPL_LINK_NOARG(ORelationControl, AsynchActivate, void*, void)
{
ActivateCell();
}
IMPL_LINK_NOARG(ORelationControl, AsynchDeactivate, void*, void)
{
DeactivateCell();
}
bool ORelationControl::IsTabAllowed(bool bForward) const
{
long nRow = GetCurRow();
sal_uInt16 nCol = GetCurColumnId();
bool bRet = !( ( bForward && (nCol == DEST_COLUMN) && (nRow == GetRowCount() - 1))
2002-02-06 13:31:05 +00:00
|| (!bForward && (nCol == SOURCE_COLUMN) && (nRow == 0)));
2002-02-06 13:31:05 +00:00
return bRet && EditBrowseBox::IsTabAllowed(bForward);
}
bool ORelationControl::SaveModified()
{
long nRow = GetCurRow();
if ( nRow != BROWSER_ENDOFSELECTION )
2002-11-21 14:28:38 +00:00
{
OUString sFieldName(m_pListCell->GetSelectedEntry());
OConnectionLineDataVec& rLines = m_pConnData->GetConnLineDataList();
if ( rLines.size() <= static_cast<OConnectionLineDataVec::size_type>(nRow) )
{
rLines.push_back(new OConnectionLineData());
nRow = rLines.size() - 1;
// add new past-rLines row
m_ops.emplace_back(INSERT, make_pair(nRow+1, nRow+2));
}
OConnectionLineDataRef pConnLineData = rLines[nRow];
2002-11-21 14:28:38 +00:00
switch( getColumnIdent( GetCurColumnId() ) )
{
case SOURCE_COLUMN:
pConnLineData->SetSourceFieldName( sFieldName );
break;
case DEST_COLUMN:
pConnLineData->SetDestFieldName( sFieldName );
break;
}
// the modification we just did does *not* need to be registered in m_ops;
// it is already taken into account (by the codepath that called us)
//m_ops.push_back(make_pair(MODIFY, make_pair(nRow, nRow+1)));
}
const OConnectionLineDataVec::size_type oldSize = m_pConnData->GetConnLineDataList().size();
OConnectionLineDataVec::size_type line = m_pConnData->normalizeLines();
const OConnectionLineDataVec::size_type newSize = m_pConnData->GetConnLineDataList().size();
assert(newSize <= oldSize);
m_ops.emplace_back(MODIFY, make_pair(line, newSize));
m_ops.emplace_back(DELETE, make_pair(newSize, oldSize));
return 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;
}
OUString ORelationControl::GetCellText( long nRow, sal_uInt16 nColId ) const
{
OUString 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 )
{
OString sHelpId( HID_RELATIONDIALOG_LEFTFIELDCELL );
Reference< XPropertySet> xDef;
2002-11-08 08:26:00 +00:00
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;
}
2002-11-08 08:26:00 +00:00
if ( xDef.is() )
{
fillListBox(xDef);
OUString sName = GetCellText( nRow, nColumnId );
2002-11-08 08:26:00 +00:00
m_pListCell->SelectEntry( sName );
if ( m_pListCell->GetSelectedEntry() != sName )
{
m_pListCell->InsertEntry( sName );
m_pListCell->SelectEntry( sName );
}
m_pListCell->SetHelpId(sHelpId);
}
}
CellController* ORelationControl::GetController( long /*nRow*/, sal_uInt16 /*nColumnId*/ )
{
return new ListBoxCellController( m_pListCell.get() );
}
bool ORelationControl::SeekRow( long nRow )
{
m_nDataPos = nRow;
return true;
}
void ORelationControl::PaintCell( OutputDevice& rDev, const tools::Rectangle& rRect, sal_uInt16 nColumnId ) const
{
OUString aText = GetCellText( m_nDataPos, nColumnId );
Point aPos( rRect.TopLeft() );
Size aTextSize( GetDataWindow().GetTextWidth( aText ), GetDataWindow().GetTextHeight() );
if( aPos.X() < rRect.Left() || aPos.X() + aTextSize.Width() > rRect.Right() ||
aPos.Y() < rRect.Top() || aPos.Y() + aTextSize.Height() > rRect.Bottom() )
{
rDev.SetClipRegion(vcl::Region(rRect));
}
rDev.DrawText( aPos, aText );
if( rDev.IsClipRegion() )
rDev.SetClipRegion();
}
void ORelationControl::fillListBox(const Reference< XPropertySet>& _xDest)
{
m_pListCell->Clear();
try
{
2002-11-08 08:26:00 +00:00
if ( _xDest.is() )
{
//sal_Int32 nRows = GetRowCount();
Reference<XColumnsSupplier> xSup(_xDest,UNO_QUERY);
Reference<XNameAccess> xColumns = xSup->getColumns();
Sequence< OUString> aNames = xColumns->getElementNames();
const OUString* pIter = aNames.getConstArray();
const OUString* pEnd = pIter + aNames.getLength();
for(;pIter != pEnd;++pIter)
{
m_pListCell->InsertEntry( *pIter );
}
m_pListCell->InsertEntry(OUString(), 0);
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
void ORelationControl::setWindowTables(const OTableWindow* _pSource,const OTableWindow* _pDest)
{
2012-04-13 14:39:59 +02:00
// If I edit here, hide
bool bWasEditing = IsEditing();
2002-11-08 08:26:00 +00:00
if ( bWasEditing )
DeactivateCell();
2002-11-08 08:26:00 +00:00
if ( _pSource && _pDest )
{
m_xSourceDef = _pSource->GetTable();
2002-11-21 14:28:38 +00:00
SetColumnTitle(1, _pSource->GetName());
m_xDestDef = _pDest->GetTable();
2002-11-21 14:28:38 +00:00
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& rLines = m_pConnData->GetConnLineDataList();
for( const auto& rLine : rLines )
{
rLine.get()->Reset();
}
m_pConnData->setReferencingTable(_pSource->GetData());
m_pConnData->setReferencedTable(_pDest->GetData());
}
m_pConnData->normalizeLines();
}
2012-04-13 14:39:59 +02:00
// Repaint
Invalidate();
2002-11-08 08:26:00 +00:00
if ( bWasEditing )
{
GoToRow(0);
ActivateCell();
}
}
void ORelationControl::CellModified()
{
EditBrowseBox::CellModified();
SaveModified();
assert(m_pBoxControl);
m_pBoxControl->NotifyCellChange();
}
Size ORelationControl::GetOptimalSize() const
{
return LogicToPixel(Size(140, 80), MapUnit::MapAppFont);
}
// class OTableListBoxControl
OTableListBoxControl::OTableListBoxControl(VclBuilderContainer* _pParent,
const OJoinTableView::OTableWindowMap* _pTableMap,
IRelationControlInterface* _pParentDialog)
: m_pTableMap(_pTableMap)
, m_pParentDialog(_pParentDialog)
{
_pParent->get(m_pLeftTable, "table1");
_pParent->get(m_pRightTable, "table2");
_pParent->get(m_pRC_Tables, "relations");
m_pRC_Tables->SetController(this);
m_pRC_Tables->Init();
lateUIInit();
Link<ListBox&,void> aLink(LINK(this, OTableListBoxControl, OnTableChanged));
m_pLeftTable->SetSelectHdl(aLink);
m_pRightTable->SetSelectHdl(aLink);
}
OTableListBoxControl::~OTableListBoxControl()
{
}
void OTableListBoxControl::fillListBoxes()
{
2011-02-03 00:33:36 +01:00
OSL_ENSURE( !m_pTableMap->empty(), "OTableListBoxControl::fillListBoxes: no table window!");
OTableWindow* pInitialLeft = nullptr;
OTableWindow* pInitialRight = nullptr;
2012-04-13 14:39:59 +02:00
// Collect the names of all TabWins
OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
CWS-TOOLING: integrate CWS dbaperf2 2009-06-22 11:04:36 +0200 msc r273202 : #100000# fix to run this test 2009-06-22 09:41:04 +0200 msc r273200 : #100000# correct case 2009-06-22 09:02:42 +0200 msc r273199 : new SRB 2009-06-22 08:53:26 +0200 msc r273198 : #100000 2009-06-15 12:36:32 +0200 oj r272976 : test 2009-06-12 14:23:23 +0200 msc r272918 : #101587# unused feature was removed 2009-06-12 06:45:17 +0200 oj r272903 : use GUI instead of OS 2009-06-11 09:12:30 +0200 oj r272845 : remove unused dep 2009-06-11 09:11:09 +0200 oj r272844 : ColumnAliasInOrderBy not supported 2009-06-11 08:27:00 +0200 oj r272843 : CWS-TOOLING: rebase CWS dbaperf2 to trunk@272827 (milestone: DEV300:m50) 2009-06-10 15:30:17 +0200 msc r272822 : #100000 2009-06-10 15:27:40 +0200 msc r272820 : #102515# new function for the database type list 2009-06-10 15:26:09 +0200 msc r272818 : move file to dbaccess/tools/dbcreatetools.inc 2009-06-10 15:20:10 +0200 msc r272816 : #102515# new function for the database type list 2009-06-10 12:34:46 +0200 oj r272803 : #i101587# check extension 2009-06-10 11:53:45 +0200 oj r272800 : remove unused code 2009-06-09 09:57:25 +0200 oj r272752 : #i101587# EscapeDateTime moved into features section 2009-06-09 09:56:26 +0200 oj r272751 : enable finish 2009-06-08 11:50:37 +0200 oj r272726 : #i102588# move convert tzo saveDataSource 2009-06-05 11:54:20 +0200 jsk r272676 : #i102515# - NEW: Functions to retrieve Database names from API 2009-06-05 10:52:22 +0200 jsk r272671 : NEW: Functions to retrieve Database names from API 2009-06-05 09:36:54 +0200 oj r272666 : handle win and unx differently 2009-06-05 09:36:28 +0200 oj r272665 : handle win and unx differently 2009-06-04 13:41:56 +0200 oj r272625 : #i101268# make use of stringbuffer instead of oustring 2009-06-04 10:18:14 +0200 oj r272612 : add SAL_DLLPUBLIC_EXPORT 2009-05-28 10:56:33 +0200 oj r272381 : #i101587# create langpacks 2009-05-28 10:41:59 +0200 oj r272380 : #i101587# create langpacks 2009-05-28 10:29:30 +0200 oj r272379 : #i101587# create langpacks 2009-05-07 10:11:46 +0200 oj r271635 : fix compile warnings 2009-05-07 07:01:31 +0200 oj r271619 : change type from int32 to PathID 2009-05-07 06:53:19 +0200 oj r271618 : add all 2009-05-06 14:57:02 +0200 oj r271595 : add missing lib 2009-05-06 14:56:54 +0200 oj r271594 : no used anymore 2009-05-06 14:56:08 +0200 oj r271593 : no used anymore 2009-05-06 14:54:25 +0200 oj r271592 : no used anymore 2009-05-06 14:45:59 +0200 oj r271591 : add missing lib 2009-05-06 14:41:54 +0200 oj r271590 : change wnt 2009-05-06 14:22:21 +0200 oj r271589 : #i101587# use config for the drivers 2009-05-06 14:21:39 +0200 oj r271588 : #i101587# add new set for metadata and config data for driver 2009-05-06 14:19:36 +0200 oj r271587 : #i101587# handle metadata and props of driver 2009-05-06 10:11:11 +0200 oj r271570 : #i101587# correct wrong use of reference 2009-05-06 09:24:33 +0200 oj r271567 : #i101587# add new set for metadata 2009-05-06 08:52:06 +0200 oj r271563 : #i101587# add driver configuration 2009-05-06 08:51:04 +0200 oj r271562 : #i101587# add driver configuration 2009-05-04 10:24:41 +0200 oj r271442 : CWS-TOOLING: rebase CWS dbaperf2 to trunk@271427 (milestone: DEV300:m47) 2009-04-28 07:06:22 +0200 oj r271303 : compile error 2009-04-27 14:12:48 +0200 oj r271270 : #i101268# make use of stringbuffer instead of oustring 2009-04-27 14:12:27 +0200 oj r271269 : #i101268# make use of stringbuffer instead of oustring 2009-04-27 09:30:10 +0200 oj r271255 : use string buffer when possible 2009-04-24 11:56:01 +0200 oj r271207 : #i101268# remove end() call from loop 2009-04-23 14:24:03 +0200 oj r271171 : add dep 2009-04-23 13:25:25 +0200 oj r271164 : #i101268# add config entries for database drivers 2009-04-23 13:07:13 +0200 oj r271161 : #i101268# add config entries for database drivers 2009-04-23 13:06:33 +0200 oj r271160 : #i101268# add parent url pattern entry for driver node 2009-04-23 13:05:39 +0200 oj r271159 : #i101268# add config entry for driver node 2009-04-23 13:04:09 +0200 oj r271157 : #i101268# add config entry for driver node 2009-04-23 06:41:32 +0200 oj r271142 : #i101268# add new configuration file Drivers 2009-04-22 13:49:19 +0200 oj r271103 : convert EOL 2009-04-22 13:29:17 +0200 oj r271101 : #i101268# use of driver configuration entries for features and properties 2009-04-22 13:28:08 +0200 oj r271100 : #i101268# use of driver configuration entries for features and properties 2009-04-22 13:15:26 +0200 oj r271098 : #i101268# add new configuration file Drivers 2009-04-22 13:14:43 +0200 oj r271097 : #i101268# use of driver configuration entries for features and properties
2009-07-03 12:24:35 +00:00
OJoinTableView::OTableWindowMap::const_iterator aEnd = m_pTableMap->end();
for(;aIter != aEnd;++aIter)
{
m_pLeftTable->InsertEntry(aIter->first);
m_pRightTable->InsertEntry(aIter->first);
if (!pInitialLeft)
2002-11-07 13:06:21 +00:00
{
pInitialLeft = aIter->second;
2002-11-07 13:06:21 +00:00
m_strCurrentLeft = aIter->first;
}
else if (!pInitialRight)
2002-11-07 13:06:21 +00:00
{
pInitialRight = aIter->second;
2002-11-07 13:06:21 +00:00
m_strCurrentRight = aIter->first;
}
2010-11-29 23:29:33 +09:00
}
if ( !pInitialRight )
{
pInitialRight = pInitialLeft;
m_strCurrentRight = m_strCurrentLeft;
}
2012-04-13 14:39:59 +02:00
// The corresponding Defs for my Controls
m_pRC_Tables->setWindowTables(pInitialLeft,pInitialRight);
2012-04-13 14:39:59 +02:00
// The table selected in a ComboBox must not be available in the other
2002-02-06 13:31:05 +00:00
2002-11-08 08:26:00 +00:00
if ( m_pTableMap->size() > 2 )
{
m_pLeftTable->RemoveEntry(m_strCurrentRight);
m_pRightTable->RemoveEntry(m_strCurrentLeft);
}
2012-04-13 14:39:59 +02:00
// Select the first one on the left side and on the right side,
// select the second one
m_pLeftTable->SelectEntry(m_strCurrentLeft);
m_pRightTable->SelectEntry(m_strCurrentRight);
2002-11-08 08:26:00 +00:00
m_pLeftTable->GrabFocus();
}
IMPL_LINK( OTableListBoxControl, OnTableChanged, ListBox&, rListBox, void )
{
OUString strSelected(rListBox.GetSelectedEntry());
OTableWindow* pLeft = nullptr;
OTableWindow* pRight = nullptr;
2012-04-13 14:39:59 +02:00
// Special treatment: If there are only two tables, we need to switch the other one too when changing in a LB
2002-11-08 08:26:00 +00:00
if ( m_pTableMap->size() == 2 )
{
ListBox* pOther;
if (&rListBox == m_pLeftTable)
pOther = m_pRightTable;
else
pOther = m_pLeftTable;
pOther->SelectEntryPos(1 - pOther->GetSelectedEntryPos());
OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
OTableWindow* pFirst = aIter->second;
++aIter;
OTableWindow* pSecond = aIter->second;
if ( m_pLeftTable->GetSelectedEntry() == pFirst->GetName() )
{
pLeft = pFirst;
pRight = pSecond;
}
else
{
pLeft = pSecond;
pRight = pFirst;
}
}
else
{
2012-04-13 14:39:59 +02:00
// First we need the TableDef to the Table and with it the TabWin
OJoinTableView::OTableWindowMap::const_iterator aFind = m_pTableMap->find(strSelected);
OTableWindow* pLoop = nullptr;
if( aFind != m_pTableMap->end() )
pLoop = aFind->second;
OSL_ENSURE(pLoop != nullptr, "ORelationDialog::OnTableChanged: invalid ListBox entry!");
2012-04-13 14:39:59 +02:00
// We need to find strSelect, because we filled the ListBoxes with the table names with which we compare now
if (&rListBox == m_pLeftTable)
{
2012-04-13 14:39:59 +02:00
// Insert the previously selected Entry on the left side on the right side
m_pRightTable->InsertEntry(m_strCurrentLeft);
2012-04-13 14:39:59 +02:00
// Remove the currently selected Entry
m_pRightTable->RemoveEntry(strSelected);
m_strCurrentLeft = strSelected;
pLeft = pLoop;
OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_pRightTable->GetSelectedEntry());
OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
if ( aIter != m_pTableMap->end() )
pRight = aIter->second;
m_pLeftTable->GrabFocus();
}
else
{
2012-04-13 14:39:59 +02:00
// Insert the previously selected Entry on the right side on the left side
m_pLeftTable->InsertEntry(m_strCurrentRight);
2012-04-13 14:39:59 +02:00
// Remove the currently selected Entry
m_pLeftTable->RemoveEntry(strSelected);
m_strCurrentRight = strSelected;
pRight = pLoop;
OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_pLeftTable->GetSelectedEntry());
OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
if ( aIter != m_pTableMap->end() )
pLeft = aIter->second;
}
}
rListBox.GrabFocus();
m_pRC_Tables->setWindowTables(pLeft,pRight);
NotifyCellChange();
}
void OTableListBoxControl::NotifyCellChange()
{
2012-04-13 14:39:59 +02:00
// Enable/disable the OK button, depending on having a valid situation
TTableConnectionData::value_type pConnData = m_pRC_Tables->getData();
const OConnectionLineDataVec& rLines = pConnData->GetConnLineDataList();
bool bValid = !rLines.empty();
if (bValid)
{
OConnectionLineDataVec::const_iterator l(rLines.begin());
const OConnectionLineDataVec::const_iterator le(rLines.end());
for (; bValid && l!=le; ++l)
{
bValid = ! ((*l)->GetSourceFieldName().isEmpty() || (*l)->GetDestFieldName().isEmpty());
}
}
m_pParentDialog->setValid(bValid);
ORelationControl::ops_type::const_iterator i (m_pRC_Tables->m_ops.begin());
const ORelationControl::ops_type::const_iterator e (m_pRC_Tables->m_ops.end());
m_pRC_Tables->DeactivateCell();
for(; i != e; ++i)
{
switch(i->first)
{
case ORelationControl::DELETE:
m_pRC_Tables->RowRemoved(i->second.first, i->second.second - i->second.first);
break;
case ORelationControl::INSERT:
m_pRC_Tables->RowInserted(i->second.first, i->second.second - i->second.first);
break;
case ORelationControl::MODIFY:
for(OConnectionLineDataVec::size_type j = i->second.first; j < i->second.second; ++j)
m_pRC_Tables->RowModified(j);
break;
}
}
m_pRC_Tables->ActivateCell();
m_pRC_Tables->m_ops.clear();
}
void fillEntryAndDisable(ListBox& _rListBox,const OUString& _sEntry)
{
_rListBox.InsertEntry(_sEntry);
_rListBox.SelectEntryPos(0);
_rListBox.Disable();
}
void OTableListBoxControl::fillAndDisable(const TTableConnectionData::value_type& _pConnectionData)
{
fillEntryAndDisable(*m_pLeftTable, _pConnectionData->getReferencingTable()->GetWinName());
fillEntryAndDisable(*m_pRightTable, _pConnectionData->getReferencedTable()->GetWinName());
}
void OTableListBoxControl::Init(const TTableConnectionData::value_type& _pConnData)
{
m_pRC_Tables->Init(_pConnData);
}
void OTableListBoxControl::lateUIInit()
{
m_pRC_Tables->Show();
lateInit();
}
2002-11-08 08:26:00 +00:00
void OTableListBoxControl::lateInit()
{
m_pRC_Tables->lateInit();
}
void OTableListBoxControl::Disable()
{
m_pLeftTable->Disable();
m_pRightTable->Disable();
m_pRC_Tables->Disable();
}
void OTableListBoxControl::Invalidate()
{
m_pLeftTable->Invalidate();
m_pRightTable->Invalidate();
m_pRC_Tables->Invalidate();
}
void OTableListBoxControl::SaveModified()
{
m_pRC_Tables->SaveModified();
}
TTableWindowData::value_type OTableListBoxControl::getReferencingTable() const
{
return m_pRC_Tables->getData()->getReferencingTable();
}
void OTableListBoxControl::enableRelation(bool _bEnable)
{
if ( !_bEnable )
m_pRC_Tables->PostUserEvent(LINK(m_pRC_Tables, ORelationControl, AsynchDeactivate));
m_pRC_Tables->Enable(_bEnable);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */