diff options
Diffstat (limited to 'cui/source/options/connpooloptions.cxx')
-rw-r--r-- | cui/source/options/connpooloptions.cxx | 507 |
1 files changed, 507 insertions, 0 deletions
diff --git a/cui/source/options/connpooloptions.cxx b/cui/source/options/connpooloptions.cxx new file mode 100644 index 000000000000..76bbafa54faa --- /dev/null +++ b/cui/source/options/connpooloptions.cxx @@ -0,0 +1,507 @@ +/************************************************************************* + * + * 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_cui.hxx" + +#include "connpooloptions.hxx" +#include "connpooloptions.hrc" +#include <svtools/editbrowsebox.hxx> +#include <vcl/field.hxx> +#include "connpoolsettings.hxx" +#include <svl/eitem.hxx> +#include <cuires.hrc> +#include "helpid.hrc" +#include <dialmgr.hxx> + +//........................................................................ +namespace offapp +{ +//........................................................................ + + //==================================================================== + //= DriverListControl + //==================================================================== + typedef ::svt::EditBrowseBox DriverListControl_Base; + class DriverListControl : public DriverListControl_Base + { + using Window::Update; + protected: + DriverPoolingSettings m_aSavedSettings; + DriverPoolingSettings m_aSettings; + DriverPoolingSettings::const_iterator m_aSeekRow; + + String m_sYes; + String m_sNo; + + Link m_aRowChangeHandler; + + public: + DriverListControl( Window* _pParent, const ResId& _rId); + + virtual void Init(); + void Update(const DriverPoolingSettings& _rSettings); + virtual String GetCellText( long nRow, USHORT nColId ) const; + + // the handler will be called with a DriverPoolingSettings::const_iterator as parameter, + // or NULL if no valid current row exists + void SetRowChangeHandler(const Link& _rHdl) { m_aRowChangeHandler = _rHdl; } + Link GetRowChangeHandler() const { return m_aRowChangeHandler; } + + const DriverPooling* getCurrentRow() const; + DriverPooling* getCurrentRow(); + void updateCurrentRow(); + + const DriverPoolingSettings& getSettings() const { return m_aSettings; } + + void saveValue() { m_aSavedSettings = m_aSettings; } + sal_Bool isModified() const; + + protected: + virtual void InitController( ::svt::CellControllerRef& rController, long nRow, USHORT nCol ); + virtual ::svt::CellController* GetController( long nRow, USHORT nCol ); + + virtual void PaintCell( OutputDevice& rDev, const Rectangle& rRect, USHORT nColId ) const; + + virtual BOOL SeekRow( long nRow ); + virtual BOOL SaveModified(); + + virtual sal_Bool IsTabAllowed(sal_Bool _bForward) const; + + virtual void StateChanged( StateChangedType nStateChange ); + + virtual void CursorMoved(); + + protected: + virtual sal_uInt32 GetTotalCellWidth(long nRow, USHORT nColId); + + + private: + String implGetCellText(DriverPoolingSettings::const_iterator _rPos, sal_uInt16 _nColId) const; + }; + + //-------------------------------------------------------------------- + DriverListControl::DriverListControl( Window* _pParent, const ResId& _rId) +// :DriverListControl_Base(_pParent, _rId, DBBF_NOROWPICTURE, BROWSER_AUTO_VSCROLL | BROWSER_AUTO_HSCROLL | BROWSER_COLUMNSELECTION | BROWSER_HLINESFULL | BROWSER_VLINESFULL | BROWSER_HIDESELECT | BROWSER_CURSOR_WO_FOCUS) + :DriverListControl_Base(_pParent, _rId, EBBF_NOROWPICTURE, BROWSER_AUTO_VSCROLL | BROWSER_AUTO_HSCROLL | BROWSER_HIDECURSOR | BROWSER_AUTOSIZE_LASTCOL) + ,m_aSeekRow(m_aSettings.end()) + ,m_sYes(ResId(STR_YES,*_rId.GetResMgr())) + ,m_sNo(ResId(STR_NO,*_rId.GetResMgr())) + { + SetStyle((GetStyle() & ~WB_HSCROLL) | WB_AUTOHSCROLL); + + SetUniqueId(UID_OFA_CONNPOOL_DRIVERLIST_BACK); + GetDataWindow().SetHelpId(HID_OFA_CONNPOOL_DRIVERLIST); + } + + //-------------------------------------------------------------------- + sal_Bool DriverListControl::IsTabAllowed(sal_Bool /*_bForward*/) const + { + // no travinling within the fields via RETURN and TAB + return sal_False; + } + + //-------------------------------------------------------------------- + sal_Bool DriverListControl::isModified() const + { + if (m_aSettings.size() != m_aSavedSettings.size()) + return sal_True; + + DriverPoolingSettings::const_iterator aCurrent = m_aSettings.begin(); + DriverPoolingSettings::const_iterator aCurrentEnd = m_aSettings.end(); + DriverPoolingSettings::const_iterator aSaved = m_aSavedSettings.begin(); + for (;aCurrent != aCurrentEnd; ++aCurrent, ++aSaved) + { + if (*aCurrent != *aSaved) + return sal_True; + } + + return sal_False; + } + + //-------------------------------------------------------------------- + void DriverListControl::Init() + { + DriverListControl_Base::Init(); + + Size aColWidth = LogicToPixel(Size(160, 0), MAP_APPFONT); + InsertDataColumn(1, String(CUI_RES(STR_DRIVER_NAME)), aColWidth.Width()); + aColWidth = LogicToPixel(Size(30, 0), MAP_APPFONT); + InsertDataColumn(2, String(CUI_RES(STR_POOLED_FLAG)), aColWidth.Width()); + aColWidth = LogicToPixel(Size(60, 0), MAP_APPFONT); + InsertDataColumn(3, String(CUI_RES(STR_POOL_TIMEOUT)), aColWidth.Width()); + // Attention: the resource of the string is local to the resource of the enclosing dialog! + } + + //-------------------------------------------------------------------- + void DriverListControl::CursorMoved() + { + DriverListControl_Base::CursorMoved(); + + // call the row change handler + if ( m_aRowChangeHandler.IsSet() ) + { + if ( GetCurRow() >= 0 ) + { // == -1 may happen in case the browse box has just been cleared + m_aRowChangeHandler.Call( getCurrentRow() ); + } + } + } + + //-------------------------------------------------------------------- + const DriverPooling* DriverListControl::getCurrentRow() const + { + OSL_ENSURE( ( GetCurRow() < m_aSettings.size() ) && ( GetCurRow() >= 0 ), + "DriverListControl::getCurrentRow: invalid current row!"); + + if ( ( GetCurRow() >= 0 ) && ( GetCurRow() < m_aSettings.size() ) ) + return &(*(m_aSettings.begin() + GetCurRow())); + + return NULL; + } + + //-------------------------------------------------------------------- + DriverPooling* DriverListControl::getCurrentRow() + { + OSL_ENSURE( ( GetCurRow() < m_aSettings.size() ) && ( GetCurRow() >= 0 ), + "DriverListControl::getCurrentRow: invalid current row!"); + + if ( ( GetCurRow() >= 0 ) && ( GetCurRow() < m_aSettings.size() ) ) + return &(*(m_aSettings.begin() + GetCurRow())); + + return NULL; + } + + //-------------------------------------------------------------------- + void DriverListControl::updateCurrentRow() + { + Window::Invalidate( GetRowRectPixel( GetCurRow() ), INVALIDATE_UPDATE ); + } + + //-------------------------------------------------------------------- + void DriverListControl::Update(const DriverPoolingSettings& _rSettings) + { + m_aSettings = _rSettings; + + SetUpdateMode(sal_False); + RowRemoved(0, GetRowCount()); + RowInserted(0, m_aSettings.size()); + SetUpdateMode(sal_True); + + ActivateCell(1, 0); + } + + //-------------------------------------------------------------------- + sal_uInt32 DriverListControl::GetTotalCellWidth(long nRow, USHORT nColId) + { + return GetDataWindow().GetTextWidth(GetCellText(nRow, nColId)); + } + + //-------------------------------------------------------------------- + String DriverListControl::implGetCellText(DriverPoolingSettings::const_iterator _rPos, sal_uInt16 _nColId) const + { + OSL_ENSURE(_rPos < m_aSettings.end(), "DriverListControl::implGetCellText: invalid position!"); + + String sReturn; + switch (_nColId) + { + case 1: + sReturn = _rPos->sName; + break; + case 2: + sReturn = _rPos->bEnabled ? m_sYes : m_sNo; + break; + case 3: + if (_rPos->bEnabled) + sReturn = String::CreateFromInt32(_rPos->nTimeoutSeconds); + break; + default: + OSL_ENSURE(sal_False, "DriverListControl::implGetCellText: invalid column id!"); + } + return sReturn; + } + + //-------------------------------------------------------------------- + void DriverListControl::StateChanged( StateChangedType nStateChange ) + { + if (STATE_CHANGE_ENABLE == nStateChange) + Window::Invalidate(INVALIDATE_UPDATE); + DriverListControl_Base::StateChanged( nStateChange ); + } + + //-------------------------------------------------------------------- + String DriverListControl::GetCellText( long nRow, USHORT nColId ) const + { + String sReturn; + if (nRow > m_aSettings.size()) + { + OSL_ENSURE(sal_False, "DriverListControl::GetCellText: don't ask me for such rows!"); + } + else + { + sReturn = implGetCellText(m_aSettings.begin() + nRow, nColId); + } + return sReturn; + } + + //-------------------------------------------------------------------- + void DriverListControl::InitController( ::svt::CellControllerRef& rController, long nRow, USHORT nCol ) + { + rController->GetWindow().SetText(GetCellText(nRow, nCol)); + } + + //-------------------------------------------------------------------- + ::svt::CellController* DriverListControl::GetController( long /*nRow*/, USHORT /*nCol*/ ) + { + return NULL; + } + + //-------------------------------------------------------------------- + BOOL DriverListControl::SaveModified() + { + return TRUE; + } + + //-------------------------------------------------------------------- + BOOL DriverListControl::SeekRow( long _nRow ) + { + DriverListControl_Base::SeekRow(_nRow); + + if (_nRow < m_aSettings.size()) + m_aSeekRow = m_aSettings.begin() + _nRow; + else + m_aSeekRow = m_aSettings.end(); + + return m_aSeekRow != m_aSettings.end(); + } + + //-------------------------------------------------------------------- + void DriverListControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, USHORT nColId ) const + { + OSL_ENSURE(m_aSeekRow != m_aSettings.end(), "DriverListControl::PaintCell: invalid row!"); + + if (m_aSeekRow != m_aSettings.end()) + { + rDev.SetClipRegion(rRect); + + sal_uInt16 nStyle = TEXT_DRAW_CLIP; + if (!IsEnabled()) + nStyle |= TEXT_DRAW_DISABLE; + switch (nColId) + { + case 1: nStyle |= TEXT_DRAW_LEFT; break; + case 2: + case 3: nStyle |= TEXT_DRAW_CENTER; break; + } + + rDev.DrawText(rRect, implGetCellText(m_aSeekRow, nColId), nStyle); + + rDev.SetClipRegion(); + } + } + + //==================================================================== + //= ConnectionPoolOptionsPage + //==================================================================== + //-------------------------------------------------------------------- + ConnectionPoolOptionsPage::ConnectionPoolOptionsPage(Window* _pParent, const SfxItemSet& _rAttrSet) + :SfxTabPage(_pParent, CUI_RES(RID_OFAPAGE_CONNPOOLOPTIONS ), _rAttrSet) + ,m_aFrame (this, CUI_RES(FL_POOLING)) + ,m_aEnablePooling (this, CUI_RES(CB_POOL_CONNS)) + ,m_aDriversLabel (this, CUI_RES(FT_DRIVERS)) + ,m_pDriverList(new DriverListControl(this, CUI_RES(CTRL_DRIVER_LIST))) + ,m_aDriverLabel (this, CUI_RES(FT_DRIVERLABEL)) + ,m_aDriver (this, CUI_RES(FT_DRIVER)) + ,m_aDriverPoolingEnabled(this, CUI_RES(CB_DRIVERPOOLING)) + ,m_aTimeoutLabel (this, CUI_RES(FT_TIMEOUT)) + ,m_aTimeout (this, CUI_RES(NF_TIMEOUT)) + { + m_pDriverList->Init(); + m_pDriverList->Show(); + + FreeResource(); + + m_aEnablePooling.SetClickHdl( LINK(this, ConnectionPoolOptionsPage, OnEnabledDisabled) ); + m_aDriverPoolingEnabled.SetClickHdl( LINK(this, ConnectionPoolOptionsPage, OnEnabledDisabled) ); + + m_pDriverList->SetRowChangeHandler( LINK(this, ConnectionPoolOptionsPage, OnDriverRowChanged) ); + } + + //-------------------------------------------------------------------- + SfxTabPage* ConnectionPoolOptionsPage::Create(Window* _pParent, const SfxItemSet& _rAttrSet) + { + return new ConnectionPoolOptionsPage(_pParent, _rAttrSet); + } + + //-------------------------------------------------------------------- + ConnectionPoolOptionsPage::~ConnectionPoolOptionsPage() + { + delete m_pDriverList; + } + + //-------------------------------------------------------------------- + void ConnectionPoolOptionsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool /*_bFromReset*/) + { + // the enabled flag + SFX_ITEMSET_GET( _rSet, pEnabled, SfxBoolItem, SID_SB_POOLING_ENABLED, sal_True ); + OSL_ENSURE(pEnabled, "ConnectionPoolOptionsPage::implInitControls: missing the Enabled item!"); + m_aEnablePooling.Check(pEnabled ? pEnabled->GetValue() : sal_True); + + m_aEnablePooling.SaveValue(); + + // the settings for the single drivers + SFX_ITEMSET_GET( _rSet, pDriverSettings, DriverPoolingSettingsItem, SID_SB_DRIVER_TIMEOUTS, sal_True ); + if (pDriverSettings) + m_pDriverList->Update(pDriverSettings->getSettings()); + else + { + OSL_ENSURE(sal_False, "ConnectionPoolOptionsPage::implInitControls: missing the DriverTimeouts item!"); + m_pDriverList->Update(DriverPoolingSettings()); + } + m_pDriverList->saveValue(); + + // reflect the new settings + OnEnabledDisabled(&m_aEnablePooling); + } + + //-------------------------------------------------------------------- + long ConnectionPoolOptionsPage::Notify( NotifyEvent& _rNEvt ) + { + if (EVENT_LOSEFOCUS == _rNEvt.GetType()) + if (m_aTimeout.IsWindowOrChild(_rNEvt.GetWindow())) + commitTimeoutField(); + + return SfxTabPage::Notify(_rNEvt); + } + + //-------------------------------------------------------------------- + BOOL ConnectionPoolOptionsPage::FillItemSet(SfxItemSet& _rSet) + { + commitTimeoutField(); + + sal_Bool bModified = sal_False; + // the enabled flag + if (m_aEnablePooling.GetSavedValue() != m_aEnablePooling.IsChecked()) + { + _rSet.Put(SfxBoolItem(SID_SB_POOLING_ENABLED, m_aEnablePooling.IsChecked()), SID_SB_POOLING_ENABLED); + bModified = sal_True; + } + + // the settings for the single drivers + if (m_pDriverList->isModified()) + { + _rSet.Put(DriverPoolingSettingsItem(SID_SB_DRIVER_TIMEOUTS, m_pDriverList->getSettings()), SID_SB_DRIVER_TIMEOUTS); + bModified = sal_True; + } + + return bModified; + } + + //-------------------------------------------------------------------- + void ConnectionPoolOptionsPage::ActivatePage( const SfxItemSet& _rSet) + { + SfxTabPage::ActivatePage(_rSet); + implInitControls(_rSet, sal_False); + } + + //-------------------------------------------------------------------- + void ConnectionPoolOptionsPage::Reset(const SfxItemSet& _rSet) + { + implInitControls(_rSet, sal_True); + } + + //-------------------------------------------------------------------- + IMPL_LINK( ConnectionPoolOptionsPage, OnDriverRowChanged, const void*, _pRowIterator ) + { + sal_Bool bValidRow = (NULL != _pRowIterator); + m_aDriverPoolingEnabled.Enable(bValidRow && m_aEnablePooling.IsChecked()); + m_aTimeoutLabel.Enable(bValidRow); + m_aTimeout.Enable(bValidRow); + + if (!bValidRow) + { // positioned on an invalid row + m_aDriver.SetText(String()); + } + else + { + const DriverPooling *pDriverPos = static_cast<const DriverPooling*>(_pRowIterator); + + m_aDriver.SetText(pDriverPos->sName); + m_aDriverPoolingEnabled.Check(pDriverPos->bEnabled); + m_aTimeout.SetText(String::CreateFromInt32(pDriverPos->nTimeoutSeconds)); + + OnEnabledDisabled(&m_aDriverPoolingEnabled); + } + + return 0L; + } + + //-------------------------------------------------------------------- + void ConnectionPoolOptionsPage::commitTimeoutField() + { + if (DriverPooling* pCurrentDriver = m_pDriverList->getCurrentRow()) + { + pCurrentDriver->nTimeoutSeconds = static_cast<long>(m_aTimeout.GetValue()); + m_pDriverList->updateCurrentRow(); + } + } + + //-------------------------------------------------------------------- + IMPL_LINK( ConnectionPoolOptionsPage, OnEnabledDisabled, const CheckBox*, _pCheckBox ) + { + sal_Bool bGloballyEnabled = m_aEnablePooling.IsChecked(); + sal_Bool bLocalDriverChanged = &m_aDriverPoolingEnabled == _pCheckBox; + + if (&m_aEnablePooling == _pCheckBox) + { + m_aDriversLabel.Enable(bGloballyEnabled); + m_pDriverList->Enable(bGloballyEnabled); + m_aDriverLabel.Enable(bGloballyEnabled); + m_aDriver.Enable(bGloballyEnabled); + m_aDriverPoolingEnabled.Enable(bGloballyEnabled); + } + else + OSL_ENSURE(bLocalDriverChanged, "ConnectionPoolOptionsPage::OnEnabledDisabled: where did this come from?"); + + m_aTimeoutLabel.Enable(bGloballyEnabled && m_aDriverPoolingEnabled.IsChecked()); + m_aTimeout.Enable(bGloballyEnabled && m_aDriverPoolingEnabled.IsChecked()); + + if (bLocalDriverChanged) + { + // update the list + m_pDriverList->getCurrentRow()->bEnabled = m_aDriverPoolingEnabled.IsChecked(); + m_pDriverList->updateCurrentRow(); + } + + return 0L; + } + +//........................................................................ +} // namespace offapp +//........................................................................ + + |