summaryrefslogtreecommitdiff
path: root/reportdesign/source/ui/dlg/Condition.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'reportdesign/source/ui/dlg/Condition.cxx')
-rw-r--r--reportdesign/source/ui/dlg/Condition.cxx740
1 files changed, 740 insertions, 0 deletions
diff --git a/reportdesign/source/ui/dlg/Condition.cxx b/reportdesign/source/ui/dlg/Condition.cxx
new file mode 100644
index 000000000000..e3591ae03534
--- /dev/null
+++ b/reportdesign/source/ui/dlg/Condition.cxx
@@ -0,0 +1,740 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+#include "precompiled_reportdesign.hxx"
+
+#include "Condition.hxx"
+#include "UITools.hxx"
+#include "CondFormat.hxx"
+#include "CondFormat.hrc"
+#include "RptResId.hrc"
+#include "ReportController.hxx"
+#include "ModuleHelper.hxx"
+#include "ColorChanger.hxx"
+#include "RptResId.hrc"
+#include "helpids.hrc"
+#include "reportformula.hxx"
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/ui/XUIConfigurationManager.hpp>
+#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/ui/XImageManager.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/ui/ImageType.hpp>
+
+#define ITEMID_COLOR
+#define ITEMID_BRUSH
+#include <svx/tbcontrl.hxx>
+#include <svx/svxids.hrc>
+#include <svx/xtable.hxx>
+#include <svx/tbxcolorupdate.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <svtools/imgdef.hxx>
+#include <unotools/pathoptions.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/bmpacc.hxx>
+#include <tools/diagnose_ex.h>
+#include <rtl/ustrbuf.hxx>
+
+namespace rptui
+{
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+
+ConditionField::ConditionField( Condition* _pParent, const ResId& _rResId ) : Edit(_pParent,_rResId)
+,m_pParent(_pParent)
+,m_aFormula(this)
+{
+ m_pSubEdit = new Edit(this,0);
+ SetSubEdit(m_pSubEdit);
+ m_pSubEdit->EnableRTL( FALSE );
+ m_pSubEdit->SetPosPixel( Point() );
+
+ m_aFormula.SetText(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("...")));
+ m_aFormula.SetClickHdl( LINK( this, ConditionField, OnFormula ) );
+ m_aFormula.Show();
+ m_pSubEdit->Show();
+ Resize();
+}
+// -----------------------------------------------------------------------------
+ConditionField::~ConditionField()
+{
+ SetSubEdit(NULL);
+ delete m_pSubEdit;
+}
+// -----------------------------------------------------------------------------
+void ConditionField::Resize()
+{
+ Edit::Resize();
+ const Size aSize = GetOutputSizePixel();
+ const Size aButtonSize( LogicToPixel( Size( 12, 0 ), MAP_APPFONT ).Width(),aSize.Height());
+ const Point aButtonPos(aSize.Width() - aButtonSize.Width(), 0);
+ m_aFormula.SetPosSizePixel(aButtonPos,aButtonSize);
+ m_pSubEdit->SetPosSizePixel(Point(0,0),Size(aButtonPos.X() ,aSize.Height()));
+}
+// -----------------------------------------------------------------------------
+IMPL_LINK( ConditionField, OnFormula, Button*, /*_pClickedButton*/ )
+{
+ ::rtl::OUString sFormula(m_pSubEdit->GetText());
+ const sal_Int32 nLen = sFormula.getLength();
+ if ( nLen )
+ {
+ ReportFormula aFormula( sFormula );
+ sFormula = aFormula.getCompleteFormula();
+ } // if ( nLen )
+ uno::Reference< awt::XWindow> xInspectorWindow = VCLUnoHelper::GetInterface(this);
+ uno::Reference< beans::XPropertySet> xProp(m_pParent->getController().getRowSet(),uno::UNO_QUERY);
+ if ( rptui::openDialogFormula_nothrow( sFormula, m_pParent->getController().getContext(),xInspectorWindow,xProp ) )
+ {
+ ReportFormula aFormula( sFormula );
+ m_pSubEdit->SetText(aFormula.getUndecoratedContent());
+ }
+ return 0L;
+}
+//========================================================================
+// class SvxColorWindow_Impl --------------------------------------------------
+//========================================================================
+#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, void * );
+ Condition* m_pCondition;
+ USHORT m_nSlotId;
+public:
+ OColorPopup(Window* _pParent,Condition* _pCondition);
+ ValueSet m_aColorSet;
+
+ virtual void KeyInput( const KeyEvent& rKEvt );
+ virtual void Resize();
+
+ void StartSelection();
+ void SetSlotId(USHORT _nSlotId);
+};
+// -----------------------------------------------------------------------------
+OColorPopup::OColorPopup(Window* _pParent,Condition* _pCondition)
+:FloatingWindow(_pParent, WinBits( WB_BORDER | WB_STDFLOATWIN | WB_3DLOOK|WB_DIALOGCONTROL ))
+,m_pCondition(_pCondition)
+,m_nSlotId(0)
+,m_aColorSet( 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 );
+ ::std::auto_ptr<XColorTable> pColorTable(new XColorTable( SvtPathOptions().GetPalettePath() ));
+ short i = 0;
+ long nCount = pColorTable->Count();
+ XColorEntry* pEntry = NULL;
+ Color aColWhite( COL_WHITE );
+ String 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++ )
+ {
+ pEntry = pColorTable->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();
+}
+// -----------------------------------------------------------------------------
+void OColorPopup::KeyInput( const KeyEvent& rKEvt )
+{
+ m_aColorSet.KeyInput(rKEvt);
+}
+
+// -----------------------------------------------------------------------------
+void OColorPopup::Resize()
+{
+ Size aSize = GetOutputSizePixel();
+ aSize.Width() -= 4;
+ aSize.Height() -= 4;
+ m_aColorSet.SetPosSizePixel( Point(2,2), aSize );
+}
+
+// -----------------------------------------------------------------------------
+void OColorPopup::StartSelection()
+{
+ m_aColorSet.StartSelection();
+}
+// -----------------------------------------------------------------------------
+void OColorPopup::SetSlotId(USHORT _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( String(ModuleRes( STR_TRANSPARENT )) );
+ } // if ( SID_ATTR_CHAR_COLOR_BACKGROUND == theSlotId || SID_BACKGROUND_COLOR == theSlotId )
+}
+// -----------------------------------------------------------------------------
+IMPL_LINK( OColorPopup, SelectHdl, void *, EMPTYARG )
+{
+ USHORT nItemId = m_aColorSet.GetSelectItemId();
+ Color aColor( nItemId == 0 ? Color( COL_TRANSPARENT ) : m_aColorSet.GetItemColor( nItemId ) );
+
+ /* #i33380# DR 2004-09-03 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 );
+ return 0;
+}
+
+// =============================================================================
+// = Condition
+// =============================================================================
+// -----------------------------------------------------------------------------
+Condition::Condition( Window* _pParent, IConditionalFormatAction& _rAction, ::rptui::OReportController& _rController )
+ :Control(_pParent, ModuleRes(WIN_CONDITION))
+ ,m_rController( _rController )
+ ,m_rAction( _rAction )
+ ,m_aHeader(this, ModuleRes(FL_CONDITION_HEADER))
+ ,m_aConditionType(this, ModuleRes(LB_COND_TYPE))
+ ,m_aOperationList( this, ModuleRes(LB_OP))
+ ,m_aCondLHS(this, ModuleRes(ED_CONDITION_LHS))
+ ,m_aOperandGlue(this, ModuleRes(FT_AND))
+ ,m_aCondRHS(this, ModuleRes(ED_CONDITION_RHS))
+ ,m_aActions(this, ModuleRes(TB_FORMAT))
+ ,m_aPreview(this, ModuleRes(CRTL_FORMAT_PREVIEW))
+ ,m_aMoveUp( this, ModuleRes( BTN_MOVE_UP ) )
+ ,m_aMoveDown( this, ModuleRes( BTN_MOVE_DOWN ) )
+ ,m_aAddCondition( this, ModuleRes( BTN_ADD_CONDITION ) )
+ ,m_aRemoveCondition( this, ModuleRes( BTN_REMOVE_CONDITION ) )
+ ,m_pColorFloat(NULL)
+ ,m_pBtnUpdaterFontColor(NULL)
+ ,m_pBtnUpdaterBackgroundColor(NULL)
+ ,m_nCondIndex( 0 )
+ ,m_nLastKnownWindowWidth( -1 )
+ ,m_bInDestruction( false )
+{
+ m_aMoveUp.SetModeImage( ModuleRes( IMG_MOVE_UP_HC ), BMP_COLOR_HIGHCONTRAST );
+ m_aMoveDown.SetModeImage( ModuleRes( IMG_MOVE_DOWN_HC ), BMP_COLOR_HIGHCONTRAST );
+
+ FreeResource();
+ m_aActions.SetStyle(m_aActions.GetStyle()|WB_LINESPACING);
+ m_aCondLHS.GrabFocus();
+
+ m_aConditionType.SetSelectHdl( LINK( this, Condition, OnTypeSelected ) );
+
+ m_aOperationList.SetDropDownLineCount( 10 );
+ m_aOperationList.SetSelectHdl( LINK( this, Condition, OnOperationSelected ) );
+
+ m_aActions.SetSelectHdl(LINK(this, Condition, OnFormatAction));
+ m_aActions.SetDropdownClickHdl( LINK( this, Condition, DropdownClick ) );
+ setToolBox(&m_aActions);
+
+ m_aMoveUp.SetClickHdl( LINK( this, Condition, OnConditionAction ) );
+ m_aMoveDown.SetClickHdl( LINK( this, Condition, OnConditionAction ) );
+ m_aAddCondition.SetClickHdl( LINK( this, Condition, OnConditionAction ) );
+ m_aRemoveCondition.SetClickHdl( LINK( this, Condition, OnConditionAction ) );
+
+ m_aMoveUp.SetStyle( m_aMoveUp.GetStyle() | WB_NOPOINTERFOCUS );
+ m_aMoveDown.SetStyle( m_aMoveDown.GetStyle() | WB_NOPOINTERFOCUS );
+ m_aAddCondition.SetStyle( m_aMoveUp.GetStyle() | WB_NOPOINTERFOCUS | WB_CENTER | WB_VCENTER );
+ m_aRemoveCondition.SetStyle( m_aMoveDown.GetStyle() | WB_NOPOINTERFOCUS | WB_CENTER | WB_VCENTER );
+
+ Font aFont( m_aAddCondition.GetFont() );
+ aFont.SetWeight( WEIGHT_BOLD );
+ m_aAddCondition.SetFont( aFont );
+ m_aRemoveCondition.SetFont( aFont );
+
+ m_aOperandGlue.SetStyle( m_aOperandGlue.GetStyle() | WB_VCENTER );
+
+ m_aConditionType.SelectEntryPos( 0 );
+ m_aOperationList.SelectEntryPos( 0 );
+
+ // the toolbar got its site automatically, ensure that the preview is positioned
+ // right of it
+ Size aRelatedControls( LogicToPixel( Size( RELATED_CONTROLS, 0 ), MAP_APPFONT ) );
+ Point aToolbarPos( m_aActions.GetPosPixel() );
+ Size aToolbarSize( m_aActions.GetSizePixel() );
+ m_aPreview.SetPosSizePixel( aToolbarPos.X() + aToolbarSize.Width() + 2 * aRelatedControls.Width(),
+ 0, 0, 0, WINDOW_POSSIZE_X );
+
+ // ensure the toolbar is vertically centered, relative to the preview
+ Size aPreviewSize( m_aPreview.GetSizePixel() );
+ m_aActions.SetPosSizePixel( 0, aToolbarPos.Y() + ( aPreviewSize.Height() - aToolbarSize.Height() ) / 2, 0, 0, WINDOW_POSSIZE_Y );
+
+ m_pBtnUpdaterBackgroundColor = new ::svx::ToolboxButtonColorUpdater(
+ SID_BACKGROUND_COLOR, SID_BACKGROUND_COLOR, &m_aActions );
+ m_pBtnUpdaterFontColor = new ::svx::ToolboxButtonColorUpdater(
+ SID_ATTR_CHAR_COLOR2, SID_ATTR_CHAR_COLOR2, &m_aActions, TBX_UPDATER_MODE_CHAR_COLOR_NEW );
+
+ Show();
+
+ impl_layoutAll();
+
+ ConditionalExpressionFactory::getKnownConditionalExpressions( m_aConditionalExpressions );
+}
+
+// -----------------------------------------------------------------------------
+Condition::~Condition()
+{
+ m_bInDestruction = true;
+
+ delete m_pColorFloat;
+ delete m_pBtnUpdaterFontColor;
+ delete m_pBtnUpdaterBackgroundColor;
+}
+// -----------------------------------------------------------------------------
+IMPL_LINK( Condition, DropdownClick, ToolBox*, /*pToolBar*/ )
+{
+ USHORT nId( m_aActions.GetCurItemId() );
+ if ( !m_pColorFloat )
+ m_pColorFloat = new OColorPopup(&m_aActions,this);
+
+ USHORT nTextId = 0;
+ switch(nId)
+ {
+ case SID_ATTR_CHAR_COLOR2:
+ nTextId = STR_CHARCOLOR;
+ break;
+ case SID_BACKGROUND_COLOR:
+ nTextId = STR_CHARBACKGROUND;
+ break;
+ default:
+ break;
+ } // switch(nId)
+ if ( nTextId )
+ m_pColorFloat->SetText(String(ModuleRes(nTextId)));
+ m_pColorFloat->SetSlotId(nId);
+ m_pColorFloat->SetPosPixel(m_aActions.GetItemPopupPosition(nId,m_pColorFloat->GetSizePixel()));
+ m_pColorFloat->StartPopupMode(&m_aActions);
+ m_pColorFloat->StartSelection();
+
+ return 1;
+}
+//------------------------------------------------------------------
+IMPL_LINK( Condition, OnFormatAction, ToolBox*, /*NOTINTERESTEDIN*/ )
+{
+ Color aCol(COL_AUTO);
+ ApplyCommand(m_aActions.GetCurItemId(),aCol);
+ return 0L;
+}
+
+//------------------------------------------------------------------
+IMPL_LINK( Condition, OnConditionAction, Button*, _pClickedButton )
+{
+ if ( _pClickedButton == &m_aMoveUp )
+ m_rAction.moveConditionUp( getConditionIndex() );
+ else if ( _pClickedButton == &m_aMoveDown )
+ m_rAction.moveConditionDown( getConditionIndex() );
+ else if ( _pClickedButton == &m_aAddCondition )
+ m_rAction.addCondition( getConditionIndex() );
+ else if ( _pClickedButton == &m_aRemoveCondition )
+ m_rAction.deleteCondition( getConditionIndex() );
+ return 0L;
+}
+
+//------------------------------------------------------------------------------
+void Condition::ApplyCommand( USHORT _nCommandId, const ::Color& _rColor)
+{
+ if ( _nCommandId == SID_ATTR_CHAR_COLOR2 )
+ m_pBtnUpdaterFontColor->Update( _rColor );
+ else if ( _nCommandId == SID_BACKGROUND_COLOR )
+ m_pBtnUpdaterBackgroundColor->Update( _rColor );
+
+ m_rAction.applyCommand( m_nCondIndex, _nCommandId, _rColor );
+}
+//------------------------------------------------------------------------------
+ImageList Condition::getImageList(sal_Int16 _eBitmapSet,sal_Bool _bHiContast) const
+{
+ sal_Int16 nN = IMG_CONDFORMAT_DLG_SC;
+ sal_Int16 nH = IMG_CONDFORMAT_DLG_SCH;
+ if ( _eBitmapSet == SFX_SYMBOLS_SIZE_LARGE )
+ {
+ nN = IMG_CONDFORMAT_DLG_LC;
+ nH = IMG_CONDFORMAT_DLG_LCH;
+ }
+ return ImageList(ModuleRes( _bHiContast ? nH : nN ));
+}
+//------------------------------------------------------------------
+void Condition::resizeControls(const Size& _rDiff)
+{
+ // we use large images so we must change them
+ if ( _rDiff.Width() || _rDiff.Height() )
+ {
+ Point aPos = LogicToPixel( Point( 2*RELATED_CONTROLS , 0), MAP_APPFONT );
+ Invalidate();
+ }
+}
+// -----------------------------------------------------------------------------
+void Condition::Paint( const Rectangle& rRect )
+{
+ Control::Paint(rRect);
+
+ // draw border
+ const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+ ColorChanger aColors( this, rStyleSettings.GetShadowColor(), rStyleSettings.GetDialogColor() );
+ DrawRect( impl_getToolBarBorderRect() );
+}
+// -----------------------------------------------------------------------------
+void Condition::StateChanged( StateChangedType nType )
+{
+ Control::StateChanged( nType );
+
+ if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
+ {
+ // Check if we need to get new images for normal/high contrast mode
+ checkImageList();
+ }
+ else if ( nType == STATE_CHANGE_TEXT )
+ {
+ // The physical toolbar changed its outlook and shows another logical toolbar!
+ // We have to set the correct high contrast mode on the new tbx manager.
+ // pMgr->SetHiContrast( IsHiContrastMode() );
+ checkImageList();
+ }
+}
+// -----------------------------------------------------------------------------
+void Condition::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ Control::DataChanged( rDCEvt );
+
+ if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS ) ||
+ ( rDCEvt.GetType() == DATACHANGED_DISPLAY )) &&
+ ( rDCEvt.GetFlags() & SETTINGS_STYLE ))
+ {
+ // Check if we need to get new images for normal/high contrast mode
+ checkImageList();
+ }
+}
+
+// -----------------------------------------------------------------------------
+void Condition::GetFocus()
+{
+ Control::GetFocus();
+ if ( !m_bInDestruction )
+ m_aCondLHS.GrabFocus();
+}
+
+// -----------------------------------------------------------------------------
+void Condition::Resize()
+{
+ Control::Resize();
+ impl_layoutAll();
+}
+
+// -----------------------------------------------------------------------------
+Rectangle Condition::impl_getToolBarBorderRect() const
+{
+ const Point aToolbarPos( m_aActions.GetPosPixel() );
+ const Size aToolbarSize( m_aActions.GetSizePixel() );
+ const Size aRelatedControls = LogicToPixel( Size( RELATED_CONTROLS, RELATED_CONTROLS ), MAP_APPFONT );
+
+ Rectangle aBorderRect( aToolbarPos, aToolbarSize );
+ aBorderRect.Left() -= aRelatedControls.Width();
+ aBorderRect.Top() -= aRelatedControls.Height();
+ aBorderRect.Right() += aRelatedControls.Width();
+ aBorderRect.Bottom() += aRelatedControls.Height();
+
+ return aBorderRect;
+}
+
+// -----------------------------------------------------------------------------
+void Condition::impl_layoutAll()
+{
+ // if our width changed, resize/-position some controls
+ const Size aSize( GetOutputSizePixel() );
+ if ( aSize.Width() == m_nLastKnownWindowWidth )
+ return;
+
+ m_nLastKnownWindowWidth = aSize.Width();
+
+ const Size aRelatedControls( LogicToPixel( Size( RELATED_CONTROLS, RELATED_CONTROLS ), MAP_APPFONT ) );
+ const Size aUnrelatedControls( LogicToPixel( Size( UNRELATED_CONTROLS, 0 ), MAP_APPFONT ) );
+ const Point aRow1( LogicToPixel( Point( 0, ROW_1_POS ), MAP_APPFONT ) );
+ const Point aRow3( LogicToPixel( Point( 0, ROW_3_POS ), MAP_APPFONT ) );
+
+ // resize the header line
+ m_aHeader.SetPosSizePixel( 0, 0, aSize.Width() - 2 * aRelatedControls.Width(), 0, WINDOW_POSSIZE_WIDTH );
+
+ // position the up/down buttons
+ const Size aButtonSize( LogicToPixel( Size( IMAGE_BUTTON_WIDTH, IMAGE_BUTTON_HEIGHT ), MAP_APPFONT ) );
+ Point aButtonPos( aSize.Width() - aUnrelatedControls.Width() - aButtonSize.Width(), aRow1.Y() );
+ m_aMoveUp.SetPosSizePixel( aButtonPos.X(), aButtonPos.Y(), aButtonSize.Width(), aButtonSize.Height() );
+ aButtonPos.Move( 0, aButtonSize.Height() + aRelatedControls.Height() );
+ m_aMoveDown.SetPosSizePixel( aButtonPos.X(), aButtonPos.Y(), aButtonSize.Width(), aButtonSize.Height() );
+
+ // resize the preview
+ const long nNewPreviewRight = aButtonPos.X() - aRelatedControls.Width();
+
+ const Point aPreviewPos( m_aPreview.GetPosPixel() );
+ OSL_ENSURE( aPreviewPos.X() < nNewPreviewRight, "Condition::impl_layoutAll: being *that* small should not be allowed!" );
+ m_aPreview.SetPosSizePixel( 0, 0, nNewPreviewRight - aPreviewPos.X(), 0, WINDOW_POSSIZE_WIDTH );
+
+ // position the add/remove buttons
+ aButtonPos = Point( nNewPreviewRight - aButtonSize.Width(), aRow3.Y() );
+ m_aRemoveCondition.SetPosSizePixel( aButtonPos.X(), aButtonPos.Y(), aButtonSize.Width(), aButtonSize.Height() );
+ aButtonPos.Move( -( aButtonSize.Width() + aRelatedControls.Width() ), 0 );
+ m_aAddCondition.SetPosSizePixel( aButtonPos.X(), aButtonPos.Y(), aButtonSize.Width(), aButtonSize.Height() );
+
+ // layout the operands input controls
+ impl_layoutOperands();
+}
+
+// -----------------------------------------------------------------------------
+IMPL_LINK( Condition, OnTypeSelected, ListBox*, /*_pNotInterestedIn*/ )
+{
+ impl_layoutOperands();
+ return 0L;
+}
+
+// -----------------------------------------------------------------------------
+IMPL_LINK( Condition, OnOperationSelected, ListBox*, /*_pNotInterestedIn*/ )
+{
+ impl_layoutOperands();
+ return 0L;
+}
+
+// -----------------------------------------------------------------------------
+void Condition::impl_layoutOperands()
+{
+ const ConditionType eType( impl_getCurrentConditionType() );
+ const ComparisonOperation eOperation( impl_getCurrentComparisonOperation() );
+
+ const bool bIsExpression = ( eType == eExpression );
+ const bool bHaveRHS =
+ ( ( eType == eFieldValueComparison )
+ && ( ( eOperation == eBetween )
+ || ( eOperation == eNotBetween )
+ )
+ );
+
+ const Size aRelatedControls( LogicToPixel( Size( RELATED_CONTROLS, 0 ), MAP_APPFONT ) );
+ const Rectangle aPreviewRect( m_aPreview.GetPosPixel(), m_aPreview.GetSizePixel() );
+
+ // the "condition type" list box
+ const Rectangle aCondTypeRect( m_aConditionType.GetPosPixel(), m_aConditionType.GetSizePixel() );
+ const Point aOpListPos( aCondTypeRect.Right() + aRelatedControls.Width(), aCondTypeRect.Top() );
+ const Size aOpListSize( LogicToPixel( Size( COND_OP_WIDTH, 60 ), MAP_APPFONT ) );
+ m_aOperationList.SetPosSizePixel( aOpListPos.X(), aOpListPos.Y(),aOpListSize.Width(), aOpListSize.Height() );
+ m_aOperationList.Show( !bIsExpression );
+
+ // the LHS input field
+ Point aLHSPos( aOpListPos.X() + aOpListSize.Width() + aRelatedControls.Width(), aOpListPos.Y() );
+ if ( bIsExpression )
+ aLHSPos.X() = aOpListPos.X();
+ Size aLHSSize( LogicToPixel( Size( EDIT_WIDTH, EDIT_HEIGHT ), MAP_APPFONT ) );
+ if ( !bHaveRHS )
+ aLHSSize.Width() = aPreviewRect.Right() - aLHSPos.X();
+ m_aCondLHS.SetPosSizePixel( aLHSPos.X(), aLHSPos.Y(), aLHSSize.Width(), aLHSSize.Height() );
+
+ if ( bHaveRHS )
+ {
+ // the "and" text being the glue between LHS and RHS
+ const Point aOpGluePos( aLHSPos.X() + aLHSSize.Width() + aRelatedControls.Width(), aLHSPos.Y() );
+ const Size aOpGlueSize( m_aOperandGlue.GetTextWidth( m_aOperandGlue.GetText() ) + aRelatedControls.Width(), aLHSSize.Height() );
+ m_aOperandGlue.SetPosSizePixel( aOpGluePos.X(), aOpGluePos.Y(), aOpGlueSize.Width(), aOpGlueSize.Height() );
+
+ // the RHS input field
+ const Point aRHSPos( aOpGluePos.X() + aOpGlueSize.Width() + aRelatedControls.Width(), aOpGluePos.Y() );
+ const Size aRHSSize( aPreviewRect.Right() - aRHSPos.X(), aLHSSize.Height() );
+ m_aCondRHS.SetPosSizePixel( aRHSPos.X(), aRHSPos.Y(), aRHSSize.Width(), aRHSSize.Height() );
+ }
+
+ m_aOperandGlue.Show( bHaveRHS );
+ m_aCondRHS.Show( bHaveRHS );
+}
+
+// -----------------------------------------------------------------------------
+void Condition::impl_setCondition( const ::rtl::OUString& _rConditionFormula )
+{
+ // determine the condition's type and comparison operation
+ ConditionType eType( eFieldValueComparison );
+ ComparisonOperation eOperation( eBetween );
+
+ // LHS and RHS, matched below
+ ::rtl::OUString sLHS, sRHS;
+
+ if ( _rConditionFormula.getLength() )
+ {
+ // the unprefixed expression which forms the condition
+ ReportFormula aFormula( _rConditionFormula );
+ OSL_ENSURE( aFormula.getType() == ReportFormula::Expression, "Condition::setCondition: illegal formula!" );
+ ::rtl::OUString sExpression;
+ if ( aFormula.getType() == ReportFormula::Expression )
+ sExpression = aFormula.getExpression();
+ // as fallback, if the below matching does not succeed, assume
+ // the whole expression is the LHS
+ eType = eExpression;
+ sLHS = sExpression;
+
+ // the data field (or expression) to which our control is bound
+ const ReportFormula aFieldContentFormula( m_rAction.getDataField() );
+ const ::rtl::OUString sUnprefixedFieldContent( aFieldContentFormula.getBracketedFieldOrExpression() );
+
+ // check whether one of the Field Value Expression Factories recognizes the expression
+ for ( ConditionalExpressions::const_iterator exp = m_aConditionalExpressions.begin();
+ exp != m_aConditionalExpressions.end();
+ ++exp
+ )
+ {
+ if ( exp->second->matchExpression( sExpression, sUnprefixedFieldContent, sLHS, sRHS ) )
+ {
+ eType = eFieldValueComparison;
+ eOperation = exp->first;
+ break;
+ }
+ }
+ }
+
+ // update UI
+ m_aConditionType.SelectEntryPos( (USHORT)eType );
+ m_aOperationList.SelectEntryPos( (USHORT)eOperation );
+ m_aCondLHS.SetText( sLHS );
+ m_aCondRHS.SetText( sRHS );
+
+ // re-layout
+ impl_layoutOperands();
+}
+
+// -----------------------------------------------------------------------------
+void Condition::setCondition( const uno::Reference< report::XFormatCondition >& _rxCondition )
+{
+ OSL_PRECOND( _rxCondition.is(), "Condition::setCondition: empty condition object!" );
+ if ( !_rxCondition.is() )
+ return;
+
+ ::rtl::OUString sConditionFormula;
+ try
+ {
+ if ( _rxCondition.is() )
+ sConditionFormula = _rxCondition->getFormula();
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ impl_setCondition( sConditionFormula );
+ updateToolbar( _rxCondition.get() );
+}
+
+// -----------------------------------------------------------------------------
+void Condition::updateToolbar(const uno::Reference< report::XReportControlFormat >& _xReportControlFormat)
+{
+ OSL_ENSURE(_xReportControlFormat.is(),"XReportControlFormat is NULL!");
+ if ( _xReportControlFormat.is() )
+ {
+ USHORT nItemCount = m_aActions.GetItemCount();
+ for (USHORT j = 0; j< nItemCount; ++j)
+ {
+ USHORT nItemId = m_aActions.GetItemId(j);
+ m_aActions.CheckItem( nItemId, m_rController.isFormatCommandEnabled( nItemId, _xReportControlFormat ) );
+ }
+
+ try
+ {
+ Font aBaseFont( Application::GetDefaultDevice()->GetSettings().GetStyleSettings().GetAppFont() );
+ SvxFont aFont( VCLUnoHelper::CreateFont( _xReportControlFormat->getFontDescriptor(), aBaseFont ) );
+ aFont.SetHeight( OutputDevice::LogicToLogic( Size( 0, (sal_Int32)aFont.GetHeight() ), MAP_POINT, MAP_TWIP ).Height());
+ aFont.SetEmphasisMark( static_cast< FontEmphasisMark >( _xReportControlFormat->getControlTextEmphasis() ) );
+ aFont.SetRelief( static_cast< FontRelief >( _xReportControlFormat->getCharRelief() ) );
+ aFont.SetColor( _xReportControlFormat->getCharColor() );
+ m_aPreview.SetFont( aFont );
+ m_aPreview.SetBackColor( _xReportControlFormat->getControlBackground() );
+ m_aPreview.SetTextLineColor( Color( _xReportControlFormat->getCharUnderlineColor() ) );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ }
+}
+// -----------------------------------------------------------------------------
+void Condition::fillFormatCondition(const uno::Reference< report::XFormatCondition >& _xCondition)
+{
+ const ConditionType eType( impl_getCurrentConditionType() );
+ const ComparisonOperation eOperation( impl_getCurrentComparisonOperation() );
+
+ const ::rtl::OUString sLHS( m_aCondLHS.GetText() );
+ const ::rtl::OUString sRHS( m_aCondRHS.GetText() );
+
+ ::rtl::OUString sUndecoratedFormula( sLHS );
+
+ if ( eType == eFieldValueComparison )
+ {
+ ReportFormula aFieldContentFormula( m_rAction.getDataField() );
+ ::rtl::OUString sUnprefixedFieldContent( aFieldContentFormula.getBracketedFieldOrExpression() );
+
+ PConditionalExpression pFactory( m_aConditionalExpressions[ eOperation ] );
+ sUndecoratedFormula = pFactory->assembleExpression( sUnprefixedFieldContent, sLHS, sRHS );
+ }
+
+ ReportFormula aFormula( ReportFormula::Expression, sUndecoratedFormula );
+ _xCondition->setFormula( aFormula.getCompleteFormula() );
+}
+// -----------------------------------------------------------------------------
+void Condition::setConditionIndex( size_t _nCondIndex, size_t _nCondCount )
+{
+ m_nCondIndex = _nCondIndex;
+ String sHeader( ModuleRes( STR_NUMBERED_CONDITION ) );
+ sHeader.SearchAndReplaceAscii( "$number$", String::CreateFromInt32( _nCondIndex + 1 ) );
+ m_aHeader.SetText( sHeader );
+
+ m_aMoveUp.Enable( _nCondIndex > 0 );
+ OSL_PRECOND( _nCondCount > 0, "Condition::setConditionIndex: having no conditions at all is nonsense!" );
+ m_aMoveDown.Enable( _nCondIndex < _nCondCount - 1 );
+}
+
+// -----------------------------------------------------------------------------
+bool Condition::isEmpty() const
+{
+ return m_aCondLHS.GetText().Len() == 0;
+}
+
+// =============================================================================
+} // rptui
+// =============================================================================
+