diff options
Diffstat (limited to 'reportdesign/source/ui/dlg/Condition.cxx')
-rw-r--r-- | reportdesign/source/ui/dlg/Condition.cxx | 174 |
1 files changed, 144 insertions, 30 deletions
diff --git a/reportdesign/source/ui/dlg/Condition.cxx b/reportdesign/source/ui/dlg/Condition.cxx index 4632306d7b5e..3a216d81ea84 100644 --- a/reportdesign/source/ui/dlg/Condition.cxx +++ b/reportdesign/source/ui/dlg/Condition.cxx @@ -84,34 +84,144 @@ IMPL_LINK( ConditionField, OnFormula, Button*, _pClickedButton, void ) } } -ConditionColorWrapper::ConditionColorWrapper(Condition* pControl) - : mxControl(pControl) - , mnSlotId(0) +// TO-DO, this is yet another color selector, can it be replaced with SvxColorWindor/SvxColorToolBoxControl ? +#ifndef WB_NO_DIRECTSELECT +#define WB_NO_DIRECTSELECT ((WinBits)0x04000000) +#endif + +#define PALETTE_X 10 +#define PALETTE_Y 10 +#define PALETTE_SIZE (PALETTE_X * PALETTE_Y) +class OColorPopup : public FloatingWindow { + DECL_LINK( SelectHdl, ValueSet*, void ); + VclPtr<Condition> m_pCondition; + sal_uInt16 m_nSlotId; +public: + OColorPopup(vcl::Window* _pParent,Condition* _pCondition); + virtual ~OColorPopup() override; + virtual void dispose() override; + VclPtr<ValueSet> m_aColorSet; + + virtual void KeyInput( const KeyEvent& rKEvt ) override; + virtual void Resize() override; + + void StartSelection(); + void SetSlotId(sal_uInt16 _nSlotId); +}; + +OColorPopup::OColorPopup(vcl::Window* _pParent,Condition* _pCondition) +:FloatingWindow(_pParent, WinBits( WB_BORDER | WB_STDFLOATWIN | WB_3DLOOK|WB_DIALOGCONTROL )) +,m_pCondition(_pCondition) +,m_nSlotId(0) +,m_aColorSet( VclPtr<ValueSet>::Create(this, WinBits( WB_ITEMBORDER | WB_NAMEFIELD | WB_3DLOOK | WB_NO_DIRECTSELECT)) ) +{ + m_aColorSet->SetHelpId( HID_RPT_POPUP_COLOR_CTRL ); + SetHelpId( HID_RPT_POPUP_COLOR ); + const Size aSize12( 13, 13 ); + short i = 0; + XColorListRef pColorList( XColorList::CreateStdColorList() ); + long nCount = pColorList->Count(); + Color aColWhite( COL_WHITE ); + OUString aStrWhite( ModuleRes(STR_COLOR_WHITE) ); + + if ( nCount > PALETTE_SIZE ) + // Show scrollbar if more than PALLETTE_SIZE colors are available + m_aColorSet->SetStyle( m_aColorSet->GetStyle() | WB_VSCROLL ); + + for ( i = 0; i < nCount; i++ ) + { + const XColorEntry* pEntry = pColorList->GetColor(i); + m_aColorSet->InsertItem( i+1, pEntry->GetColor(), pEntry->GetName() ); + } + + while ( i < PALETTE_SIZE ) + { + // fill empty elements if less then PALLETTE_SIZE colors are available + m_aColorSet->InsertItem( i+1, aColWhite, aStrWhite ); + i++; + } + + m_aColorSet->SetSelectHdl( LINK( this, OColorPopup, SelectHdl ) ); + m_aColorSet->SetColCount( PALETTE_X ); + m_aColorSet->SetLineCount( PALETTE_Y ); + Size aSize = m_aColorSet->CalcWindowSizePixel( aSize12 ); + aSize.Width() += 4; + aSize.Height() += 4; + SetOutputSizePixel( aSize ); + m_aColorSet->Show(); +} + +OColorPopup::~OColorPopup() +{ + disposeOnce(); +} + +void OColorPopup::dispose() +{ + disposeBuilder(); + m_aColorSet.disposeAndClear(); + m_pCondition.clear(); + FloatingWindow::dispose(); +} + +void OColorPopup::KeyInput( const KeyEvent& rKEvt ) +{ + m_aColorSet->KeyInput(rKEvt); } -void ConditionColorWrapper::dispose() +void OColorPopup::Resize() { - mxControl.clear(); + Size aSize = GetOutputSizePixel(); + aSize.Width() -= 4; + aSize.Height() -= 4; + m_aColorSet->SetPosSizePixel( Point(2,2), aSize ); } -void ConditionColorWrapper::operator()(const OUString& /*rCommand*/, const NamedColor& rNamedColor) +void OColorPopup::StartSelection() { - mxControl->ApplyCommand(mnSlotId, rNamedColor.first); + m_aColorSet->StartSelection(); } +void OColorPopup::SetSlotId(sal_uInt16 _nSlotId) +{ + m_nSlotId = _nSlotId; + if ( SID_ATTR_CHAR_COLOR_BACKGROUND == _nSlotId || SID_BACKGROUND_COLOR == _nSlotId ) + { + m_aColorSet->SetStyle( m_aColorSet->GetStyle() | WB_NONEFIELD ); + m_aColorSet->SetText( OUString(ModuleRes( STR_TRANSPARENT )) ); + } +} + +IMPL_LINK_NOARG(OColorPopup, SelectHdl, ValueSet*, void) +{ + sal_uInt16 nItemId = m_aColorSet->GetSelectItemId(); + Color aColor( nItemId == 0 ? Color( COL_TRANSPARENT ) : m_aColorSet->GetItemColor( nItemId ) ); + + /* #i33380# Moved the following line above the Dispatch() calls. + This instance may be deleted in the meantime (i.e. when a dialog is opened + while in Dispatch()), accessing members will crash in this case. */ + m_aColorSet->SetNoSelection(); + + if ( IsInPopupMode() ) + EndPopupMode(); + + m_pCondition->ApplyCommand( m_nSlotId, aColor ); +} + + // = Condition Condition::Condition( vcl::Window* _pParent, IConditionalFormatAction& _rAction, ::rptui::OReportController& _rController ) - : VclHBox(_pParent) - , m_aColorWrapper(this) - , m_rController(_rController) - , m_rAction(_rAction) - , m_pBtnUpdaterFontColor(nullptr) - , m_pBtnUpdaterBackgroundColor(nullptr) - , m_nCondIndex(0) - , m_bInDestruction(false) + :VclHBox(_pParent) + ,m_rController( _rController ) + ,m_rAction( _rAction ) + ,m_pColorFloat(nullptr) + ,m_pBtnUpdaterFontColor(nullptr) + ,m_pBtnUpdaterBackgroundColor(nullptr) + ,m_nCondIndex( 0 ) + ,m_bInDestruction( false ) { m_pUIBuilder = new VclBuilder(this, getUIRootDir(), "modules/dbreport/ui/conditionwin.ui"); @@ -218,27 +328,31 @@ void Condition::dispose() m_pAddCondition.clear(); m_pRemoveCondition.clear(); m_pColorFloat.disposeAndClear(); - m_aColorWrapper.dispose(); disposeBuilder(); VclHBox::dispose(); } -IMPL_LINK(Condition, DropdownClick, ToolBox*, pToolBox, void) +IMPL_LINK_NOARG( Condition, DropdownClick, ToolBox*, void ) { sal_uInt16 nId( m_pActions->GetCurItemId() ); - m_pColorFloat.disposeAndClear(); - sal_uInt16 nSlotId(mapToolbarItemToSlotId(nId)); - m_aColorWrapper.SetSlotId(nSlotId); - m_pColorFloat = VclPtr<SvxColorWindow>::Create( - OUString() /*m_aCommandURL*/, - m_aPaletteManager, - m_aBorderColorStatus, - nSlotId, - nullptr, - pToolBox, - m_aColorWrapper); - - m_pColorFloat->StartPopupMode(pToolBox, FloatWinPopupFlags::GrabFocus); + if ( !m_pColorFloat ) + m_pColorFloat = VclPtr<OColorPopup>::Create(m_pActions,this); + + sal_uInt16 nTextId = 0; + if (nId == m_nFontColorId) + { + nTextId = STR_CHARCOLOR; + } + else if (nId == m_nBackgroundColorId) + { + nTextId = STR_CHARBACKGROUND; + } + if ( nTextId ) + m_pColorFloat->SetText(OUString(ModuleRes(nTextId))); + m_pColorFloat->SetSlotId(mapToolbarItemToSlotId(nId)); + m_pColorFloat->SetPosPixel(m_pActions->GetItemPopupPosition(nId,m_pColorFloat->GetSizePixel())); + m_pColorFloat->StartPopupMode(m_pActions); + m_pColorFloat->StartSelection(); } IMPL_LINK_NOARG( Condition, OnFormatAction, ToolBox*, void ) |