23#include <svtools/strings.hrc>
36#include <osl/diagnose.h>
37#include <com/sun/star/util/AliasProgrammaticPair.hpp>
38#include <com/sun/star/ui/dialogs/AddressBookSourcePilot.hpp>
39#include <com/sun/star/beans/PropertyValue.hpp>
40#include <com/sun/star/beans/XPropertySet.hpp>
41#include <com/sun/star/sdb/DatabaseContext.hpp>
42#include <com/sun/star/sdb/XCompletedConnection.hpp>
43#include <com/sun/star/sdb/SQLContext.hpp>
44#include <com/sun/star/sdbc/SQLWarning.hpp>
45#include <com/sun/star/sdbc/XConnection.hpp>
46#include <com/sun/star/sdbc/XDataSource.hpp>
47#include <com/sun/star/task/InteractionHandler.hpp>
48#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
49#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
72 using namespace ::
utl;
79 OUString lcl_getSelectedDataSource(
const weld::ComboBox& dataSourceCombo )
82 if (dataSourceCombo.
find_text(selectedDataSource) == -1)
88 return selectedDataSource;
96 virtual ~IAssignmentData();
99 virtual OUString getDatasourceName()
const = 0;
102 virtual OUString getCommand()
const = 0;
105 virtual bool hasFieldAssignment(
const OUString& _rLogicalName) = 0;
107 virtual OUString getFieldAssignment(
const OUString& _rLogicalName) = 0;
110 virtual void setFieldAssignment(
const OUString& _rLogicalName,
const OUString& _rAssignment) = 0;
112 virtual void setDatasourceName(
const OUString& _rName) = 0;
113 virtual void setCommand(
const OUString& _rCommand) = 0;
118 IAssignmentData::~IAssignmentData()
127 class AssignmentTransientData :
public IAssignmentData
135 AssignmentTransientData(
136 OUString _aDataSourceName,
137 OUString _aTableName,
138 const Sequence< AliasProgrammaticPair >& _rFields
142 virtual OUString getDatasourceName()
const override;
143 virtual OUString getCommand()
const override;
145 virtual bool hasFieldAssignment(
const OUString& _rLogicalName)
override;
146 virtual OUString getFieldAssignment(
const OUString& _rLogicalName)
override;
147 virtual void setFieldAssignment(
const OUString& _rLogicalName,
const OUString& _rAssignment)
override;
149 virtual void setDatasourceName(
const OUString& _rName)
override;
150 virtual void setCommand(
const OUString& _rCommand)
override;
155 AssignmentTransientData::AssignmentTransientData(
156 OUString _aDataSourceName, OUString _aTableName,
157 const Sequence< AliasProgrammaticPair >& _rFields )
169 OUString aToken = sLogicalFieldNames.getToken(0,
';', nIndex);
170 aKnownNames.insert(aToken);
172 while ( nIndex >= 0);
175 for (
const AliasProgrammaticPair& rField : _rFields)
177 if ( aKnownNames.end() != aKnownNames.find( rField.ProgrammaticName ) )
179 m_aAliases[ rField.ProgrammaticName ] = rField.Alias;
183 SAL_WARN(
"svtools",
"AssignmentTransientData::AssignmentTransientData: unknown programmatic name: "
184 << rField.ProgrammaticName );
190 OUString AssignmentTransientData::getDatasourceName()
const
196 OUString AssignmentTransientData::getCommand()
const
202 bool AssignmentTransientData::hasFieldAssignment(
const OUString& _rLogicalName)
204 MapString2String::const_iterator aPos =
m_aAliases.find( _rLogicalName );
206 && ( !aPos->second.isEmpty() );
210 OUString AssignmentTransientData::getFieldAssignment(
const OUString& _rLogicalName)
213 MapString2String::const_iterator aPos =
m_aAliases.find( _rLogicalName );
215 sReturn = aPos->second;
221 void AssignmentTransientData::setFieldAssignment(
const OUString& _rLogicalName,
const OUString& _rAssignment)
227 void AssignmentTransientData::setDatasourceName(
const OUString&)
229 OSL_FAIL(
"AssignmentTransientData::setDatasourceName: cannot be implemented for transient data!" );
233 void AssignmentTransientData::setCommand(
const OUString&)
235 OSL_FAIL(
"AssignmentTransientData::setCommand: cannot be implemented for transient data!" );
243 class AssignmentPersistentData
245 ,
public IAssignmentData
251 css::uno::Any
getProperty(
const OUString& _rLocalName)
const;
253 OUString getStringProperty(
const char* _pLocalName)
const;
254 OUString getStringProperty(
const OUString& _rLocalName)
const;
256 void setStringProperty(
const char* _pLocalName,
const OUString& _rValue);
259 AssignmentPersistentData();
262 virtual OUString getDatasourceName()
const override;
263 virtual OUString getCommand()
const override;
265 virtual bool hasFieldAssignment(
const OUString& _rLogicalName)
override;
266 virtual OUString getFieldAssignment(
const OUString& _rLogicalName)
override;
267 virtual void setFieldAssignment(
const OUString& _rLogicalName,
const OUString& _rAssignment)
override;
269 virtual void setDatasourceName(
const OUString& _rName)
override;
270 virtual void setCommand(
const OUString& _rCommand)
override;
272 virtual void Notify(
const css::uno::Sequence<OUString>& aPropertyNames)
override;
276 void clearFieldAssignment(
const OUString& _rLogicalName);
281void AssignmentPersistentData::Notify(
const css::uno::Sequence<OUString>& )
285void AssignmentPersistentData::ImplCommit()
290 AssignmentPersistentData::AssignmentPersistentData()
291 :ConfigItem(
"Office.DataAccess/AddressBook")
293 const Sequence< OUString > aStoredNames = GetNodeNames(
"Fields");
297 bool AssignmentPersistentData::hasFieldAssignment(
const OUString& _rLogicalName)
303 OUString AssignmentPersistentData::getFieldAssignment(
const OUString& _rLogicalName)
305 OUString sAssignment;
306 if (hasFieldAssignment(_rLogicalName))
308 OUString sFieldPath =
"Fields/" + _rLogicalName +
"/AssignedFieldName";
309 sAssignment = getStringProperty(sFieldPath);
315 Any AssignmentPersistentData::getProperty(
const OUString& _rLocalName)
const
318 Sequence< Any > aValues =
const_cast<AssignmentPersistentData*
>(
this)->GetProperties(aProperties);
319 DBG_ASSERT(aValues.getLength() == 1,
"AssignmentPersistentData::getProperty: invalid sequence length!");
324 OUString AssignmentPersistentData::getStringProperty(
const OUString& _rLocalName)
const
332 OUString AssignmentPersistentData::getStringProperty(
const char* _pLocalName)
const
335 getProperty(OUString::createFromAscii(_pLocalName)) >>= sReturn;
340 void AssignmentPersistentData::setStringProperty(
const char* _pLocalName,
const OUString& _rValue)
342 Sequence< OUString > aNames { OUString::createFromAscii(_pLocalName) };
343 Sequence< Any > aValues{
Any(_rValue) };
344 PutProperties(aNames, aValues);
348 void AssignmentPersistentData::setFieldAssignment(
const OUString& _rLogicalName,
const OUString& _rAssignment)
350 if (_rAssignment.isEmpty())
352 if (hasFieldAssignment(_rLogicalName))
355 clearFieldAssignment(_rLogicalName);
361 OUString sDescriptionNodePath(
"Fields");
364 OUString sFieldElementNodePath = sDescriptionNodePath +
"/" + _rLogicalName;
366 Sequence< PropertyValue > aNewFieldDescription{
377 SetSetProperties(sDescriptionNodePath, aNewFieldDescription);
378 DBG_ASSERT(bSuccess,
"AssignmentPersistentData::setFieldAssignment: could not commit the changes a field!");
382 void AssignmentPersistentData::clearFieldAssignment(
const OUString& _rLogicalName)
384 if (!hasFieldAssignment(_rLogicalName))
388 Sequence< OUString > aNames(&_rLogicalName, 1);
389 ClearNodeElements(
"Fields", aNames);
393 OUString AssignmentPersistentData::getDatasourceName()
const
395 return getStringProperty(
"DataSourceName" );
399 OUString AssignmentPersistentData::getCommand()
const
401 return getStringProperty(
"Command" );
405 void AssignmentPersistentData::setDatasourceName(
const OUString& _rName)
407 setStringProperty(
"DataSourceName", _rName );
411 void AssignmentPersistentData::setCommand(
const OUString& _rCommand)
413 setStringProperty(
"Command", _rCommand );
445 :pFieldLabels{{
nullptr}}
448 ,bOddFieldNumber(
false)
449 ,bWorkingPersistent(
true )
450 ,pConfigData(
new AssignmentPersistentData )
456 :pFieldLabels{{
nullptr}}
458 ,m_xTransientDataSource( _rxTransientDS )
460 ,bOddFieldNumber(
false)
461 ,bWorkingPersistent(
false )
462 ,pConfigData(
new AssignmentTransientData( _rDataSourceName, _rTableName, _rFields ) )
472 AddressBookSourceDialog::AddressBookSourceDialog(
weld::Window* pParent,
474 : GenericDialogController(pParent,
"svt/ui/addresstemplatedialog.ui",
"AddressTemplateDialog")
475 , m_sNoFieldSelection(
SvtResId(STR_NO_FIELD_SELECTION))
482 AddressBookSourceDialog::AddressBookSourceDialog(
weld::Window* pParent,
const Reference< XComponentContext >& _rxORB,
483 const Reference< XDataSource >& _rxTransientDS,
const OUString& _rDataSourceName,
484 const OUString& _rTable,
const Sequence< AliasProgrammaticPair >& _rMapping )
485 : GenericDialogController(pParent,
"svt/ui/addresstemplatedialog.ui",
"AddressTemplateDialog")
486 , m_sNoFieldSelection(
SvtResId(STR_NO_FIELD_SELECTION))
488 ,
m_pImpl( new AddressBookSourceDialogData( _rxTransientDS, _rDataSourceName, _rTable, _rMapping ) )
493 void AddressBookSourceDialog::implConstruct()
496 m_xDatasource = m_xBuilder->weld_combo_box(
"datasource");
497 m_xAdministrateDatasources = m_xBuilder->weld_button(
"admin");
498 m_xTable = m_xBuilder->weld_combo_box(
"datatable");
499 m_xFieldScroller = m_xBuilder->weld_scrolled_window(
"scrollwindow",
true);
500 m_xGrid = m_xBuilder->weld_widget(
"grid");
504 for (sal_Int32 column=0; column<2; ++column)
507 m_pImpl->pFieldLabels[row * 2 + column] = m_xBuilder->weld_label(
"label" + OUString::number(row * 2 + column));
509 m_pImpl->pFields[row * 2 + column] = m_xBuilder->weld_combo_box(
"box" + OUString::number(row * 2 + column));
510 m_pImpl->pFields[row * 2 + column]->connect_changed(
LINK(
this, AddressBookSourceDialog, OnFieldSelect));
514 initializeDatasources();
558 for (
auto const& fieldLabel :
m_pImpl->aFieldLabels)
560 m_pImpl->pFieldLabels[0]->set_label(fieldLabel);
561 nLabelWidth = std::max(nLabelWidth,
m_pImpl->pFieldLabels[0]->get_preferred_size().Width());
565 for (sal_Int32 column=0; column<2; ++column)
567 m_pImpl->pFieldLabels[row * 2 + column]->set_size_request(nLabelWidth, -1);
568 m_pImpl->pFields[row * 2 + column]->set_size_request(nListBoxWidth, -1);
573 m_pImpl->bOddFieldNumber = (
m_pImpl->aFieldLabels.size() % 2) != 0;
575 m_pImpl->aFieldLabels.emplace_back();
578 sal_Int32 nOverallFieldPairs =
m_pImpl->aFieldLabels.size() / 2;
579 m_xFieldScroller->vadjustment_configure(0, 0, nOverallFieldPairs,
587 m_xFieldScroller->connect_vadjustment_changed(
LINK(
this, AddressBookSourceDialog, OnFieldScroll));
588 m_xAdministrateDatasources->connect_clicked(
LINK(
this, AddressBookSourceDialog, OnAdministrateDatasources));
589 m_xDatasource->set_entry_completion(
true);
590 m_xTable->set_entry_completion(
true);
591 m_xTable->connect_focus_in(
LINK(
this, AddressBookSourceDialog, OnComboGetFocus));
592 m_xDatasource->connect_focus_in(
LINK(
this, AddressBookSourceDialog, OnComboGetFocus));
593 m_xTable->connect_focus_out(
LINK(
this, AddressBookSourceDialog, OnComboLoseFocus));
594 m_xDatasource->connect_focus_out(
LINK(
this, AddressBookSourceDialog, OnComboLoseFocus));
595 m_xTable->connect_changed(
LINK(
this, AddressBookSourceDialog, OnComboSelect));
596 m_xDatasource->connect_changed(
LINK(
this, AddressBookSourceDialog, OnComboSelect));
597 m_xOKButton->connect_clicked(
LINK(
this, AddressBookSourceDialog, OnOkClicked));
602 m_xFieldScroller->set_size_request(-1, m_xGrid->get_preferred_size().Height());
603 m_xFieldScroller->vadjustment_set_value(0);
605 implScrollFields(0,
false,
false);
610 DBG_ASSERT(nAdjustedTokenCount ==
static_cast<sal_Int32
>(
m_pImpl->aFieldLabels.size()),
611 "AddressBookSourceDialog::AddressBookSourceDialog: inconsistence between logical and UI field names!");
612 m_pImpl->aLogicalFieldNames.reserve(nAdjustedTokenCount);
614 for (sal_Int32 i = 0;
i<nAdjustedTokenCount; ++
i)
615 m_pImpl->aLogicalFieldNames.push_back(sLogicalFieldNames.getToken(0,
';', nIdx));
622 if (
m_pImpl->bWorkingPersistent)
625 m_xAdministrateDatasources->hide();
628 void AddressBookSourceDialog::getFieldMapping(Sequence< AliasProgrammaticPair >& _rMapping)
const
630 _rMapping.realloc(
m_pImpl->aLogicalFieldNames.size() );
631 AliasProgrammaticPair* pPair = _rMapping.getArray();
633 for (
auto const& logicalFieldName :
m_pImpl->aLogicalFieldNames)
635 if (
m_pImpl->pConfigData->hasFieldAssignment(logicalFieldName) )
638 pPair->ProgrammaticName = logicalFieldName;
639 pPair->Alias =
m_pImpl->pConfigData->getFieldAssignment(logicalFieldName);
644 _rMapping.realloc( pPair - _rMapping.getArray() );
647 void AddressBookSourceDialog::loadConfiguration()
649 OUString
sName =
m_pImpl->pConfigData->getDatasourceName();
651 if(
aURL.GetProtocol() != INetProtocol::NotValid )
657 m_xDatasource->set_entry_text(sName);
658 m_xTable->set_entry_text(
m_pImpl->pConfigData->getCommand());
663 assert(
m_pImpl->aLogicalFieldNames.size() ==
m_pImpl->aFieldAssignments.size());
665 auto aAssignment =
m_pImpl->aFieldAssignments.begin();
666 for (
auto const& logicalFieldName :
m_pImpl->aLogicalFieldNames)
668 *aAssignment =
m_pImpl->pConfigData->getFieldAssignment(logicalFieldName);
673 AddressBookSourceDialog::~AddressBookSourceDialog()
677 void AddressBookSourceDialog::initializeDatasources()
679 if (!m_xDatabaseContext.is())
681 DBG_ASSERT(m_xORB.is(),
"AddressBookSourceDialog::initializeDatasources: no service factory!");
687 m_xDatabaseContext = DatabaseContext::create(m_xORB);
689 catch(
const Exception&) { }
690 if (!m_xDatabaseContext.is())
696 m_xDatasource->clear();
701 const css::uno::Sequence<OUString> aElementNames = m_xDatabaseContext->getElementNames();
702 for (
const OUString& rDatasourceName : aElementNames)
703 m_xDatasource->append_text(rDatasourceName);
707 TOOLS_WARN_EXCEPTION(
"svtools",
"AddressBookSourceDialog::initializeDatasources: caught an exception while asking for the data source names!");
713 implScrollFields(rScrollBar.vadjustment_get_value(),
true,
true);
716 void AddressBookSourceDialog::resetTables()
718 if (!m_xDatabaseContext.is())
724 m_xDatasource->save_value();
727 Reference< XInteractionHandler > xHandler;
731 InteractionHandler::createWithParent(m_xORB,
m_xDialog->GetXWindow()),
734 catch(
const Exception&) { }
742 OUString sOldTable = m_xTable->get_active_text();
746 m_xCurrentDatasourceTables=
nullptr;
749 Sequence< OUString > aTableNames;
753 Reference< XCompletedConnection > xDS;
754 if (
m_pImpl->bWorkingPersistent )
756 OUString sSelectedDS = lcl_getSelectedDataSource(*m_xDatasource);
760 if (
aURL.GetProtocol() != INetProtocol::NotValid || m_xDatabaseContext->hasByName(sSelectedDS) )
761 m_xDatabaseContext->getByName( sSelectedDS ) >>= xDS;
765 xDS.set(
m_pImpl->m_xTransientDataSource, css::uno::UNO_QUERY);
769 Reference< XConnection > xConn;
771 xConn = xDS->connectWithCompletion(xHandler);
774 Reference< XTablesSupplier > xSupplTables(xConn, UNO_QUERY);
775 if (xSupplTables.is())
777 m_xCurrentDatasourceTables = xSupplTables->getTables();
778 if (m_xCurrentDatasourceTables.is())
779 aTableNames = m_xCurrentDatasourceTables->getElementNames();
782 catch(
const SQLContext& e) { aException <<= e; }
783 catch(
const SQLWarning& e) { aException <<= e; }
784 catch(
const SQLException& e) { aException <<= e; }
787 OSL_FAIL(
"AddressBookSourceDialog::resetTables: could not retrieve the table!");
790 if (aException.hasValue())
792 Reference< XInteractionRequest > xRequest =
new OInteractionRequest(aException);
795 xHandler->handle(xRequest);
797 catch(Exception&) { }
801 bool bKnowOldTable =
false;
803 for (
const OUString& rTableName : std::as_const(aTableNames))
805 m_xTable->append_text(rTableName);
806 if (rTableName == sOldTable)
807 bKnowOldTable =
true;
813 m_xTable->set_entry_text(sOldTable);
818 void AddressBookSourceDialog::resetFields()
823 m_xDatasource->save_value();
825 OUString sSelectedTable = m_xTable->get_active_text();
826 Sequence< OUString > aColumnNames;
829 if (m_xCurrentDatasourceTables.is())
832 Reference< XColumnsSupplier > xSuppTableCols;
833 if (m_xCurrentDatasourceTables->hasByName(sSelectedTable))
835 m_xCurrentDatasourceTables->getByName(sSelectedTable),
836 css::uno::UNO_QUERY);
837 Reference< XNameAccess > xColumns;
838 if (xSuppTableCols.is())
839 xColumns = xSuppTableCols->getColumns();
841 aColumnNames = xColumns->getElementNames();
844 catch (
const Exception&)
846 OSL_FAIL(
"AddressBookSourceDialog::resetFields: could not retrieve the table columns!");
851 ::std::set< OUString > aColumnNameSet(std::cbegin(aColumnNames), std::cend(aColumnNames));
853 std::vector<OUString>::iterator aInitialSelection =
m_pImpl->aFieldAssignments.begin() +
m_pImpl->nFieldScrollPos;
855 OUString sSaveSelection;
866 pListbox->
set_id(0, OUString::number(i));
869 for (
const OUString& rColumnName : std::as_const(aColumnNames))
872 if (!aInitialSelection->isEmpty() && (aColumnNameSet.end() != aColumnNameSet.find(*aInitialSelection)))
877 if (aColumnNameSet.end() != aColumnNameSet.find(sSaveSelection))
886 for (
auto & fieldAssignment :
m_pImpl->aFieldAssignments)
887 if (!fieldAssignment.isEmpty())
888 if (aColumnNameSet.end() == aColumnNameSet.find(fieldAssignment))
889 fieldAssignment.clear();
895 sal_Int32 nListBoxIndex = rListbox.get_id(0).toInt32();
897 "AddressBookSourceDialog::OnFieldScroll: invalid list box entry!");
900 if (0 == rListbox.get_active())
902 m_pImpl->aFieldAssignments[
m_pImpl->nFieldScrollPos * 2 + nListBoxIndex].clear();
905 m_pImpl->aFieldAssignments[
m_pImpl->nFieldScrollPos * 2 + nListBoxIndex] = rListbox.get_active_text();
909 void AddressBookSourceDialog::implScrollFields(sal_Int32 _nPos,
bool _bAdjustFocus,
bool _bAdjustScrollbar)
911 if (_nPos ==
m_pImpl->nFieldScrollPos)
917 auto pLeftLabelControl =
m_pImpl->pFieldLabels.begin();
918 auto pRightLabelControl = pLeftLabelControl+1;
919 auto pLeftColumnLabel =
m_pImpl->aFieldLabels.cbegin() + 2 *
_nPos;
920 auto pRightColumnLabel = pLeftColumnLabel + 1;
923 auto pLeftListControl =
m_pImpl->pFields.begin();
924 auto pRightListControl = pLeftListControl + 1;
927 sal_Int32 nOldFocusRow = -1;
928 sal_Int32 nOldFocusColumn = 0;
931 auto pLeftAssignment =
m_pImpl->aFieldAssignments.cbegin() + 2 *
_nPos;
932 auto pRightAssignment = pLeftAssignment + 1;
937 if ((*pLeftListControl)->has_focus())
942 else if ((*pRightListControl)->has_focus())
949 (*pLeftLabelControl)->set_label(*pLeftColumnLabel);
950 (*pRightLabelControl)->set_label(*pRightColumnLabel);
958 bool bHideRightColumn = pRightColumnLabel->isEmpty();
959 (*pRightLabelControl)->set_visible(!bHideRightColumn);
960 (*pRightListControl)->set_visible(!bHideRightColumn);
962 implSelectField(pLeftListControl->get(), *pLeftAssignment);
963 implSelectField(pRightListControl->get(), *pRightAssignment);
969 pLeftLabelControl += 2;
970 pRightLabelControl += 2;
971 pLeftColumnLabel += 2;
972 pRightColumnLabel += 2;
974 pLeftListControl += 2;
975 pRightListControl += 2;
976 pLeftAssignment += 2;
977 pRightAssignment += 2;
981 if (_bAdjustFocus && (nOldFocusRow >= 0))
985 sal_Int32 nNewFocusRow = nOldFocusRow + nDelta;
987 nNewFocusRow = std::min(nNewFocusRow, sal_Int32(
FIELD_PAIRS_VISIBLE - 1), ::std::less< sal_Int32 >());
988 nNewFocusRow = std::max(nNewFocusRow, sal_Int32(0), ::std::less< sal_Int32 >());
990 m_pImpl->pFields[nNewFocusRow * 2 + nOldFocusColumn]->grab_focus();
995 if (_bAdjustScrollbar)
996 m_xFieldScroller->vadjustment_set_value(
m_pImpl->nFieldScrollPos);
999 void AddressBookSourceDialog::implSelectField(
weld::ComboBox* pBox,
const OUString& rText)
1001 if (!rText.isEmpty())
1012 loadConfiguration();
1016 if ( !
m_pImpl->bWorkingPersistent )
1018 m_pImpl->pFields[0]->grab_focus();
1023 if (&rBox == m_xDatasource.get())
1039 if (&rBox == m_xDatasource.get())
1048 OUString sSelectedDS = lcl_getSelectedDataSource(*m_xDatasource);
1049 if (
m_pImpl->bWorkingPersistent )
1051 m_pImpl->pConfigData->setDatasourceName(sSelectedDS);
1052 m_pImpl->pConfigData->setCommand(m_xTable->get_active_text());
1056 assert(
m_pImpl->aLogicalFieldNames.size() ==
m_pImpl->aFieldAssignments.size());
1059 auto aAssignment =
m_pImpl->aFieldAssignments.cbegin();
1060 for (
auto const& logicalFieldName :
m_pImpl->aLogicalFieldNames)
1062 m_pImpl->pConfigData->setFieldAssignment(logicalFieldName, *aAssignment);
1075 xAdminDialog = AddressBookSourcePilot::createWithParent(m_xORB,
m_xDialog->GetXWindow());
1078 if (!xAdminDialog.is())
1087 if ( xAdminDialog->execute() ==
RET_OK )
1093 xProp->getPropertyValue(
"DataSourceName") >>=
sName;
1096 if(
aURL.GetProtocol() != INetProtocol::NotValid )
1101 m_xDatasource->append_text(
sName);
1102 m_pImpl->pConfigData.reset(
new AssignmentPersistentData );
1103 loadConfiguration();
1111 OSL_FAIL(
"AddressBookSourceDialog::OnAdministrateDatasources: an error occurred while executing the administration dialog!");
PropertiesInfo aProperties
StringBag m_aStoredFields
MapString2String m_aAliases
#define FIELD_CONTROLS_VISIBLE
#define FIELD_PAIRS_VISIBLE
Reference< XExecutableDialog > m_xDialog
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
OUString get(NOTATION _eOutputNotation) const
virtual void Notify(const css::uno::Sequence< OUString > &aPropertyNames)=0
virtual void ImplCommit()=0
bool get_value_changed_from_saved() const
virtual int find_text(const OUString &rStr) const=0
virtual OUString get_active_text() const=0
virtual void set_id(int row, const OUString &rId)=0
virtual void set_active(int pos)=0
void append_text(const OUString &rStr)
void set_active_text(const OUString &rStr)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
std::unique_ptr< weld::Button > m_xOKButton
#define LINK(Instance, Class, Member)
#define SAL_WARN(area, stream)
std::set< OUString > StringBag
std::map< OUString, OUString > MapString2String
sal_Int32 getTokenCount(std::string_view rIn, char cTok)
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
IMPL_LINK(AsyncPickerAction, OnActionDone, void *, pEmptyArg, void)
std::set< OUString > StringBag
IMPL_LINK_NOARG(OCommonPicker, OnCancelPicker, void *, void)
std::map< OUString, OUString > MapString2String
IMPL_STATIC_LINK(AddressBookSourceDialog, OnComboGetFocus, weld::Widget &, rBox, void)
SVX_DLLPUBLIC OUString getProperty(css::uno::Reference< css::beans::XPropertyContainer > const &rxPropertyContainer, OUString const &rName)
void VCL_DLLPUBLIC ShowServiceNotAvailableError(weld::Widget *pParent, std::u16string_view rServiceName, bool bError)
constexpr OUStringLiteral STR_LOGICAL_FIELD_NAMES
AddressBookSourceDialogData(const AddressBookSourceDialogData &)=delete
Reference< XDataSource > m_xTransientDataSource
when working transient, we need the data source
bool bWorkingPersistent
indicates that we're working with the real persistent configuration
AddressBookSourceDialogData()
std::vector< OUString > aFieldAssignments
std::unique_ptr< IAssignmentData > pConfigData
bool bOddFieldNumber
indicates that we've an odd field number. This member is for efficiency only, it's redundant.
std::vector< OUString > aFieldLabels
the strings to use as labels for the field selection listboxes
std::array< std::unique_ptr< weld::ComboBox >, FIELD_PAIRS_VISIBLE *2 > pFields
sal_Int32 nFieldScrollPos
current scroll pos in the field list
std::array< std::unique_ptr< weld::Label >, FIELD_PAIRS_VISIBLE *2 > pFieldLabels
AddressBookSourceDialogData(const Reference< XDataSource > &_rxTransientDS, const OUString &_rDataSourceName, const OUString &_rTableName, const Sequence< AliasProgrammaticPair > &_rFields)
std::vector< OUString > aLogicalFieldNames
the logical field names
OUString SvtResId(TranslateId aId)