1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #include "precompiled_reportdesign.hxx" 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski #include "CondFormat.hxx" 26*b1cdbd2cSJim Jagielski #include "CondFormat.hrc" 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski #include "uistrings.hrc" 29*b1cdbd2cSJim Jagielski #include "RptResId.hrc" 30*b1cdbd2cSJim Jagielski #include "rptui_slotid.hrc" 31*b1cdbd2cSJim Jagielski #include "ModuleHelper.hxx" 32*b1cdbd2cSJim Jagielski #include "helpids.hrc" 33*b1cdbd2cSJim Jagielski #include "UITools.hxx" 34*b1cdbd2cSJim Jagielski #include "uistrings.hrc" 35*b1cdbd2cSJim Jagielski #include "ReportController.hxx" 36*b1cdbd2cSJim Jagielski #include "Condition.hxx" 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 39*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 40*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp> 41*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski #include <svx/globlmn.hrc> 44*b1cdbd2cSJim Jagielski #include <svx/svxids.hrc> 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx> 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx> 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski #include <tools/debug.hxx> 51*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx> 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski #include <algorithm> 56*b1cdbd2cSJim Jagielski #include "UndoActions.hxx" 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski // ............................................................................. 59*b1cdbd2cSJim Jagielski namespace rptui 60*b1cdbd2cSJim Jagielski { 61*b1cdbd2cSJim Jagielski // ............................................................................. 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 64*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 65*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW; 66*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY; 67*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 68*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::IllegalArgumentException; 69*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence; 70*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::PropertyValue; 71*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 72*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 73*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::report; 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski //======================================================================== 76*b1cdbd2cSJim Jagielski // UpdateLocker 77*b1cdbd2cSJim Jagielski //======================================================================== 78*b1cdbd2cSJim Jagielski class UpdateLocker 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski Window& m_rWindow; 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski public: UpdateLocker(Window & _rWindow)83*b1cdbd2cSJim Jagielski UpdateLocker( Window& _rWindow ) 84*b1cdbd2cSJim Jagielski :m_rWindow( _rWindow ) 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski _rWindow.SetUpdateMode( sal_False ); 87*b1cdbd2cSJim Jagielski } ~UpdateLocker()88*b1cdbd2cSJim Jagielski ~UpdateLocker() 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski m_rWindow.SetUpdateMode( sal_True ); 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski }; 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski //======================================================================== 95*b1cdbd2cSJim Jagielski // class ConditionalFormattingDialog 96*b1cdbd2cSJim Jagielski //======================================================================== DBG_NAME(rpt_ConditionalFormattingDialog)97*b1cdbd2cSJim Jagielski DBG_NAME(rpt_ConditionalFormattingDialog) 98*b1cdbd2cSJim Jagielski ConditionalFormattingDialog::ConditionalFormattingDialog( 99*b1cdbd2cSJim Jagielski Window* _pParent, const Reference< XReportControlModel >& _rxFormatConditions, ::rptui::OReportController& _rController ) 100*b1cdbd2cSJim Jagielski :ModalDialog( _pParent, ModuleRes(RID_CONDFORMAT) ) 101*b1cdbd2cSJim Jagielski ,m_aConditionPlayground( this, ModuleRes( WND_COND_PLAYGROUND ) ) 102*b1cdbd2cSJim Jagielski ,m_aSeparator(this, ModuleRes(FL_SEPARATOR1)) 103*b1cdbd2cSJim Jagielski ,m_aPB_OK(this, ModuleRes(PB_OK)) 104*b1cdbd2cSJim Jagielski ,m_aPB_CANCEL(this, ModuleRes(PB_CANCEL)) 105*b1cdbd2cSJim Jagielski ,m_aPB_Help(this, ModuleRes(PB_HELP)) 106*b1cdbd2cSJim Jagielski ,m_aCondScroll( this, ModuleRes( SB_ALL_CONDITIONS ) ) 107*b1cdbd2cSJim Jagielski ,m_rController( _rController ) 108*b1cdbd2cSJim Jagielski ,m_xFormatConditions( _rxFormatConditions ) 109*b1cdbd2cSJim Jagielski ,m_bDeletingCondition( false ) 110*b1cdbd2cSJim Jagielski { 111*b1cdbd2cSJim Jagielski DBG_CTOR(rpt_ConditionalFormattingDialog,NULL); 112*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xFormatConditions.is(), "ConditionalFormattingDialog::ConditionalFormattingDialog: ReportControlModel is NULL -> Prepare for GPF!" ); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski m_xCopy.set( m_xFormatConditions->createClone(), UNO_QUERY_THROW ); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski m_aCondScroll.SetScrollHdl( LINK( this, ConditionalFormattingDialog, OnScroll ) ); 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski impl_initializeConditions(); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski FreeResource(); 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ ~ConditionalFormattingDialog()124*b1cdbd2cSJim Jagielski ConditionalFormattingDialog::~ConditionalFormattingDialog() 125*b1cdbd2cSJim Jagielski { 126*b1cdbd2cSJim Jagielski m_aConditions.clear(); 127*b1cdbd2cSJim Jagielski DBG_DTOR(rpt_ConditionalFormattingDialog,NULL); 128*b1cdbd2cSJim Jagielski } 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_updateConditionIndicies()131*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_updateConditionIndicies() 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski sal_Int32 nIndex = 0; 134*b1cdbd2cSJim Jagielski for ( Conditions::const_iterator cond = m_aConditions.begin(); 135*b1cdbd2cSJim Jagielski cond != m_aConditions.end(); 136*b1cdbd2cSJim Jagielski ++cond, ++nIndex 137*b1cdbd2cSJim Jagielski ) 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski (*cond)->setConditionIndex( nIndex, impl_getConditionCount() ); 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_conditionCountChanged()144*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_conditionCountChanged() 145*b1cdbd2cSJim Jagielski { 146*b1cdbd2cSJim Jagielski if ( m_aConditions.empty() ) 147*b1cdbd2cSJim Jagielski impl_addCondition_nothrow( 0 ); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski impl_updateScrollBarRange(); 150*b1cdbd2cSJim Jagielski impl_updateConditionIndicies(); 151*b1cdbd2cSJim Jagielski impl_layoutAll(); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- addCondition(size_t _nAddAfterIndex)155*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::addCondition( size_t _nAddAfterIndex ) 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski OSL_PRECOND( _nAddAfterIndex < impl_getConditionCount(), "ConditionalFormattingDialog::addCondition: illegal condition index!" ); 158*b1cdbd2cSJim Jagielski impl_addCondition_nothrow( _nAddAfterIndex + 1 ); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- deleteCondition(size_t _nCondIndex)162*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::deleteCondition( size_t _nCondIndex ) 163*b1cdbd2cSJim Jagielski { 164*b1cdbd2cSJim Jagielski impl_deleteCondition_nothrow( _nCondIndex ); 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_addCondition_nothrow(size_t _nNewCondIndex)168*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_addCondition_nothrow( size_t _nNewCondIndex ) 169*b1cdbd2cSJim Jagielski { 170*b1cdbd2cSJim Jagielski UpdateLocker aLockUpdates( *this ); 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski try 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski if ( _nNewCondIndex > (size_t)m_xCopy->getCount() ) 175*b1cdbd2cSJim Jagielski throw IllegalArgumentException(); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski Reference< XFormatCondition > xCond = m_xCopy->createFormatCondition(); 178*b1cdbd2cSJim Jagielski ::comphelper::copyProperties(m_xCopy.get(),xCond.get()); 179*b1cdbd2cSJim Jagielski m_xCopy->insertByIndex( _nNewCondIndex, makeAny( xCond ) ); 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski ConditionPtr pCon( new Condition( &m_aConditionPlayground, *this, m_rController ) ); 182*b1cdbd2cSJim Jagielski pCon->setCondition( xCond ); 183*b1cdbd2cSJim Jagielski m_aConditions.insert( m_aConditions.begin() + _nNewCondIndex, pCon ); 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski pCon->SetPosSizePixel( 0, 0, impl_getConditionWidth(), 0, WINDOW_POSSIZE_WIDTH ); 186*b1cdbd2cSJim Jagielski } 187*b1cdbd2cSJim Jagielski catch( const Exception& ) 188*b1cdbd2cSJim Jagielski { 189*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski impl_conditionCountChanged(); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski impl_ensureConditionVisible( _nNewCondIndex ); 195*b1cdbd2cSJim Jagielski } 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_focusCondition(size_t _nCondIndex)198*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_focusCondition( size_t _nCondIndex ) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCondIndex < impl_getConditionCount(), 201*b1cdbd2cSJim Jagielski "ConditionalFormattingDialog::impl_focusCondition: illegal index!" ); 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski impl_ensureConditionVisible( _nCondIndex ); 204*b1cdbd2cSJim Jagielski m_aConditions[ _nCondIndex ]->GrabFocus(); 205*b1cdbd2cSJim Jagielski } 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_deleteCondition_nothrow(size_t _nCondIndex)208*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_deleteCondition_nothrow( size_t _nCondIndex ) 209*b1cdbd2cSJim Jagielski { 210*b1cdbd2cSJim Jagielski UpdateLocker aLockUpdates( *this ); 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCondIndex < impl_getConditionCount(), 213*b1cdbd2cSJim Jagielski "ConditionalFormattingDialog::impl_deleteCondition_nothrow: illegal index!" ); 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski bool bLastCondition = ( impl_getConditionCount() == 1 ); 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski bool bSetNewFocus = false; 218*b1cdbd2cSJim Jagielski size_t nNewFocusIndex( _nCondIndex ); 219*b1cdbd2cSJim Jagielski try 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski if ( !bLastCondition ) 222*b1cdbd2cSJim Jagielski m_xCopy->removeByIndex( _nCondIndex ); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski Conditions::iterator pos = m_aConditions.begin() + _nCondIndex; 225*b1cdbd2cSJim Jagielski if ( bLastCondition ) 226*b1cdbd2cSJim Jagielski { 227*b1cdbd2cSJim Jagielski Reference< XFormatCondition > xFormatCondition( m_xCopy->getByIndex( 0 ), UNO_QUERY_THROW ); 228*b1cdbd2cSJim Jagielski xFormatCondition->setFormula( ::rtl::OUString() ); 229*b1cdbd2cSJim Jagielski (*pos)->setCondition( xFormatCondition ); 230*b1cdbd2cSJim Jagielski } 231*b1cdbd2cSJim Jagielski else 232*b1cdbd2cSJim Jagielski { 233*b1cdbd2cSJim Jagielski bSetNewFocus = (*pos)->HasChildPathFocus(); 234*b1cdbd2cSJim Jagielski m_bDeletingCondition = true; 235*b1cdbd2cSJim Jagielski m_aConditions.erase( pos ); 236*b1cdbd2cSJim Jagielski m_bDeletingCondition = false; 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski if ( bSetNewFocus ) 240*b1cdbd2cSJim Jagielski { 241*b1cdbd2cSJim Jagielski if ( nNewFocusIndex >= impl_getConditionCount() ) 242*b1cdbd2cSJim Jagielski nNewFocusIndex = impl_getConditionCount() - 1; 243*b1cdbd2cSJim Jagielski } 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski catch( const Exception& ) 246*b1cdbd2cSJim Jagielski { 247*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 248*b1cdbd2cSJim Jagielski } 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski impl_conditionCountChanged(); 251*b1cdbd2cSJim Jagielski if ( bSetNewFocus ) 252*b1cdbd2cSJim Jagielski impl_focusCondition( nNewFocusIndex ); 253*b1cdbd2cSJim Jagielski } 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_moveCondition_nothrow(size_t _nCondIndex,bool _bMoveUp)256*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_moveCondition_nothrow( size_t _nCondIndex, bool _bMoveUp ) 257*b1cdbd2cSJim Jagielski { 258*b1cdbd2cSJim Jagielski size_t nOldConditionIndex( _nCondIndex ); 259*b1cdbd2cSJim Jagielski size_t nNewConditionIndex( _bMoveUp ? _nCondIndex - 1 : _nCondIndex + 1 ); 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski // do this in two steps, so we don't become inconsistent if any of the UNO actions fails 262*b1cdbd2cSJim Jagielski Any aMovedCondition; 263*b1cdbd2cSJim Jagielski ConditionPtr pMovedCondition; 264*b1cdbd2cSJim Jagielski try 265*b1cdbd2cSJim Jagielski { 266*b1cdbd2cSJim Jagielski aMovedCondition = m_xCopy->getByIndex( (sal_Int32)nOldConditionIndex ); 267*b1cdbd2cSJim Jagielski m_xCopy->removeByIndex( (sal_Int32)nOldConditionIndex ); 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski Conditions::iterator aRemovePos( m_aConditions.begin() + nOldConditionIndex ); 270*b1cdbd2cSJim Jagielski pMovedCondition = *aRemovePos; 271*b1cdbd2cSJim Jagielski m_aConditions.erase( aRemovePos ); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski catch( const Exception& ) 274*b1cdbd2cSJim Jagielski { 275*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 276*b1cdbd2cSJim Jagielski return; 277*b1cdbd2cSJim Jagielski } 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski try 280*b1cdbd2cSJim Jagielski { 281*b1cdbd2cSJim Jagielski m_xCopy->insertByIndex( (sal_Int32)nNewConditionIndex, aMovedCondition ); 282*b1cdbd2cSJim Jagielski m_aConditions.insert( m_aConditions.begin() + nNewConditionIndex, pMovedCondition ); 283*b1cdbd2cSJim Jagielski } 284*b1cdbd2cSJim Jagielski catch( const Exception& ) 285*b1cdbd2cSJim Jagielski { 286*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski // at least the two swapped conditions need to know their new index 290*b1cdbd2cSJim Jagielski impl_updateConditionIndicies(); 291*b1cdbd2cSJim Jagielski 292*b1cdbd2cSJim Jagielski // re-layout all conditions 293*b1cdbd2cSJim Jagielski Point aDummy; 294*b1cdbd2cSJim Jagielski impl_layoutConditions( aDummy ); 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski // ensure the moved condition is visible 297*b1cdbd2cSJim Jagielski impl_ensureConditionVisible( nNewConditionIndex ); 298*b1cdbd2cSJim Jagielski } 299*b1cdbd2cSJim Jagielski 300*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_getConditionWidth() const301*b1cdbd2cSJim Jagielski long ConditionalFormattingDialog::impl_getConditionWidth() const 302*b1cdbd2cSJim Jagielski { 303*b1cdbd2cSJim Jagielski const Size aDialogSize( GetOutputSizePixel() ); 304*b1cdbd2cSJim Jagielski const Size aScrollBarWidth( LogicToPixel( Size( SCROLLBAR_WIDTH + UNRELATED_CONTROLS, 0 ), MAP_APPFONT ) ); 305*b1cdbd2cSJim Jagielski return aDialogSize.Width() - aScrollBarWidth.Width(); 306*b1cdbd2cSJim Jagielski } 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- 309*b1cdbd2cSJim Jagielski IMPL_LINK( ConditionalFormattingDialog, OnScroll, ScrollBar*, /*_pNotInterestedIn*/ ) 310*b1cdbd2cSJim Jagielski { 311*b1cdbd2cSJim Jagielski size_t nFirstCondIndex( impl_getFirstVisibleConditionIndex() ); 312*b1cdbd2cSJim Jagielski size_t nFocusCondIndex = impl_getFocusedConditionIndex( nFirstCondIndex ); 313*b1cdbd2cSJim Jagielski 314*b1cdbd2cSJim Jagielski Point aDummy; 315*b1cdbd2cSJim Jagielski impl_layoutConditions( aDummy ); 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski if ( nFocusCondIndex < nFirstCondIndex ) 318*b1cdbd2cSJim Jagielski impl_focusCondition( nFirstCondIndex ); 319*b1cdbd2cSJim Jagielski else if ( nFocusCondIndex >= nFirstCondIndex + MAX_CONDITIONS ) 320*b1cdbd2cSJim Jagielski impl_focusCondition( nFirstCondIndex + MAX_CONDITIONS - 1 ); 321*b1cdbd2cSJim Jagielski 322*b1cdbd2cSJim Jagielski return 0; 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_layoutConditions(Point & _out_rBelowLastVisible)326*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_layoutConditions( Point& _out_rBelowLastVisible ) 327*b1cdbd2cSJim Jagielski { 328*b1cdbd2cSJim Jagielski // position the condition's playground 329*b1cdbd2cSJim Jagielski long nConditionWidth = impl_getConditionWidth(); 330*b1cdbd2cSJim Jagielski long nConditionHeight = LogicToPixel( Size( 0, CONDITION_HEIGHT ), MAP_APPFONT ).Height(); 331*b1cdbd2cSJim Jagielski size_t nVisibleConditions = ::std::min( impl_getConditionCount(), MAX_CONDITIONS ); 332*b1cdbd2cSJim Jagielski Size aPlaygroundSize( nConditionWidth, nVisibleConditions * nConditionHeight ); 333*b1cdbd2cSJim Jagielski m_aConditionPlayground.SetSizePixel( aPlaygroundSize ); 334*b1cdbd2cSJim Jagielski _out_rBelowLastVisible = Point( 0, aPlaygroundSize.Height() ); 335*b1cdbd2cSJim Jagielski 336*b1cdbd2cSJim Jagielski // position the single conditions 337*b1cdbd2cSJim Jagielski Point aConditionPos( 0, -1 * nConditionHeight * impl_getFirstVisibleConditionIndex() ); 338*b1cdbd2cSJim Jagielski for ( Conditions::const_iterator cond = m_aConditions.begin(); 339*b1cdbd2cSJim Jagielski cond != m_aConditions.end(); 340*b1cdbd2cSJim Jagielski ++cond 341*b1cdbd2cSJim Jagielski ) 342*b1cdbd2cSJim Jagielski { 343*b1cdbd2cSJim Jagielski (*cond)->SetPosSizePixel( aConditionPos.X(), aConditionPos.Y(), nConditionWidth, nConditionHeight ); 344*b1cdbd2cSJim Jagielski aConditionPos.Move( 0, nConditionHeight ); 345*b1cdbd2cSJim Jagielski } 346*b1cdbd2cSJim Jagielski } 347*b1cdbd2cSJim Jagielski 348*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_layoutAll()349*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_layoutAll() 350*b1cdbd2cSJim Jagielski { 351*b1cdbd2cSJim Jagielski // condition's positions 352*b1cdbd2cSJim Jagielski Point aPos; 353*b1cdbd2cSJim Jagielski impl_layoutConditions( aPos ); 354*b1cdbd2cSJim Jagielski 355*b1cdbd2cSJim Jagielski // scrollbar size and visibility 356*b1cdbd2cSJim Jagielski m_aCondScroll.SetPosSizePixel( 0, 0, 0, aPos.Y(), WINDOW_POSSIZE_HEIGHT ); 357*b1cdbd2cSJim Jagielski if ( !impl_needScrollBar() ) 358*b1cdbd2cSJim Jagielski // normalize the position, so it can, in all situations, be used as top index 359*b1cdbd2cSJim Jagielski m_aCondScroll.SetThumbPos( 0 ); 360*b1cdbd2cSJim Jagielski 361*b1cdbd2cSJim Jagielski // the separator and the buttons below it 362*b1cdbd2cSJim Jagielski aPos += LogicToPixel( Point( 0 , RELATED_CONTROLS ), MAP_APPFONT ); 363*b1cdbd2cSJim Jagielski m_aSeparator.SetPosSizePixel( 0, aPos.Y(), 0, 0, WINDOW_POSSIZE_Y ); 364*b1cdbd2cSJim Jagielski 365*b1cdbd2cSJim Jagielski aPos += LogicToPixel( Point( 0 , UNRELATED_CONTROLS ), MAP_APPFONT ); 366*b1cdbd2cSJim Jagielski Window* pWindows[] = { &m_aPB_OK, &m_aPB_CANCEL, &m_aPB_Help }; 367*b1cdbd2cSJim Jagielski for ( size_t i= 0; i < sizeof(pWindows)/sizeof(pWindows[0]); ++i ) 368*b1cdbd2cSJim Jagielski { 369*b1cdbd2cSJim Jagielski pWindows[i]->SetPosSizePixel( 0, aPos.Y(), 0, 0, WINDOW_POSSIZE_Y ); 370*b1cdbd2cSJim Jagielski } 371*b1cdbd2cSJim Jagielski 372*b1cdbd2cSJim Jagielski aPos += LogicToPixel( Point( 0, BUTTON_HEIGHT + RELATED_CONTROLS ), MAP_APPFONT ); 373*b1cdbd2cSJim Jagielski SetPosSizePixel( 0, 0, 0, aPos.Y(), WINDOW_POSSIZE_HEIGHT ); 374*b1cdbd2cSJim Jagielski } 375*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_initializeConditions()376*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_initializeConditions() 377*b1cdbd2cSJim Jagielski { 378*b1cdbd2cSJim Jagielski try 379*b1cdbd2cSJim Jagielski { 380*b1cdbd2cSJim Jagielski sal_Int32 nCount = m_xCopy->getCount(); 381*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < nCount ; ++i ) 382*b1cdbd2cSJim Jagielski { 383*b1cdbd2cSJim Jagielski ConditionPtr pCon( new Condition( &m_aConditionPlayground, *this, m_rController ) ); 384*b1cdbd2cSJim Jagielski Reference< XFormatCondition > xCond( m_xCopy->getByIndex(i), UNO_QUERY ); 385*b1cdbd2cSJim Jagielski pCon->setCondition( xCond ); 386*b1cdbd2cSJim Jagielski pCon->updateToolbar( xCond.get() ); 387*b1cdbd2cSJim Jagielski m_aConditions.push_back( pCon ); 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski } 390*b1cdbd2cSJim Jagielski catch(Exception&) 391*b1cdbd2cSJim Jagielski { 392*b1cdbd2cSJim Jagielski OSL_ENSURE(0,"Can not access format condition!"); 393*b1cdbd2cSJim Jagielski } 394*b1cdbd2cSJim Jagielski 395*b1cdbd2cSJim Jagielski impl_conditionCountChanged(); 396*b1cdbd2cSJim Jagielski } 397*b1cdbd2cSJim Jagielski 398*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- applyCommand(size_t _nCondIndex,sal_uInt16 _nCommandId,const::Color _aColor)399*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::applyCommand( size_t _nCondIndex, sal_uInt16 _nCommandId, const ::Color _aColor ) 400*b1cdbd2cSJim Jagielski { 401*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCommandId, "ConditionalFormattingDialog::applyCommand: illegal command id!" ); 402*b1cdbd2cSJim Jagielski try 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski Reference< XReportControlFormat > xReportControlFormat( m_xCopy->getByIndex( _nCondIndex ), UNO_QUERY_THROW ); 405*b1cdbd2cSJim Jagielski 406*b1cdbd2cSJim Jagielski Sequence< PropertyValue > aArgs(3); 407*b1cdbd2cSJim Jagielski 408*b1cdbd2cSJim Jagielski aArgs[0].Name = REPORTCONTROLFORMAT; 409*b1cdbd2cSJim Jagielski aArgs[0].Value <<= xReportControlFormat; 410*b1cdbd2cSJim Jagielski 411*b1cdbd2cSJim Jagielski aArgs[1].Name = CURRENT_WINDOW; 412*b1cdbd2cSJim Jagielski aArgs[1].Value <<= VCLUnoHelper::GetInterface(this); 413*b1cdbd2cSJim Jagielski 414*b1cdbd2cSJim Jagielski aArgs[2].Name = PROPERTY_FONTCOLOR; 415*b1cdbd2cSJim Jagielski aArgs[2].Value <<= (sal_uInt32)_aColor.GetColor(); 416*b1cdbd2cSJim Jagielski 417*b1cdbd2cSJim Jagielski // we use this way to create undo actions 418*b1cdbd2cSJim Jagielski m_rController.executeUnChecked(_nCommandId,aArgs); 419*b1cdbd2cSJim Jagielski m_aConditions[ _nCondIndex ]->updateToolbar(xReportControlFormat); 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski catch( Exception& ) 422*b1cdbd2cSJim Jagielski { 423*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 424*b1cdbd2cSJim Jagielski } 425*b1cdbd2cSJim Jagielski } 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- moveConditionUp(size_t _nCondIndex)428*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::moveConditionUp( size_t _nCondIndex ) 429*b1cdbd2cSJim Jagielski { 430*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCondIndex > 0, "ConditionalFormattingDialog::moveConditionUp: cannot move up the first condition!" ); 431*b1cdbd2cSJim Jagielski if ( _nCondIndex > 0 ) 432*b1cdbd2cSJim Jagielski impl_moveCondition_nothrow( _nCondIndex, true ); 433*b1cdbd2cSJim Jagielski } 434*b1cdbd2cSJim Jagielski 435*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- moveConditionDown(size_t _nCondIndex)436*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::moveConditionDown( size_t _nCondIndex ) 437*b1cdbd2cSJim Jagielski { 438*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCondIndex < impl_getConditionCount(), "ConditionalFormattingDialog::moveConditionDown: cannot move down the last condition!" ); 439*b1cdbd2cSJim Jagielski if ( _nCondIndex < impl_getConditionCount() ) 440*b1cdbd2cSJim Jagielski impl_moveCondition_nothrow( _nCondIndex, false ); 441*b1cdbd2cSJim Jagielski } 442*b1cdbd2cSJim Jagielski 443*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- getDataField() const444*b1cdbd2cSJim Jagielski ::rtl::OUString ConditionalFormattingDialog::getDataField() const 445*b1cdbd2cSJim Jagielski { 446*b1cdbd2cSJim Jagielski ::rtl::OUString sDataField; 447*b1cdbd2cSJim Jagielski try 448*b1cdbd2cSJim Jagielski { 449*b1cdbd2cSJim Jagielski sDataField = m_xFormatConditions->getDataField(); 450*b1cdbd2cSJim Jagielski } 451*b1cdbd2cSJim Jagielski catch( const Exception& ) 452*b1cdbd2cSJim Jagielski { 453*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 454*b1cdbd2cSJim Jagielski } 455*b1cdbd2cSJim Jagielski return sDataField; 456*b1cdbd2cSJim Jagielski } 457*b1cdbd2cSJim Jagielski 458*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- Execute()459*b1cdbd2cSJim Jagielski short ConditionalFormattingDialog::Execute() 460*b1cdbd2cSJim Jagielski { 461*b1cdbd2cSJim Jagielski short nRet = ModalDialog::Execute(); 462*b1cdbd2cSJim Jagielski if ( nRet == RET_OK ) 463*b1cdbd2cSJim Jagielski { 464*b1cdbd2cSJim Jagielski const String sUndoAction( ModuleRes( RID_STR_UNDO_CONDITIONAL_FORMATTING ) ); 465*b1cdbd2cSJim Jagielski const UndoContext aUndoContext( m_rController.getUndoManager(), sUndoAction ); 466*b1cdbd2cSJim Jagielski try 467*b1cdbd2cSJim Jagielski { 468*b1cdbd2cSJim Jagielski sal_Int32 j(0), i(0);; 469*b1cdbd2cSJim Jagielski for ( Conditions::const_iterator cond = m_aConditions.begin(); 470*b1cdbd2cSJim Jagielski cond != m_aConditions.end(); 471*b1cdbd2cSJim Jagielski ++cond, ++i 472*b1cdbd2cSJim Jagielski ) 473*b1cdbd2cSJim Jagielski { 474*b1cdbd2cSJim Jagielski Reference< XFormatCondition > xCond( m_xCopy->getByIndex(i), UNO_QUERY_THROW ); 475*b1cdbd2cSJim Jagielski (*cond)->fillFormatCondition( xCond ); 476*b1cdbd2cSJim Jagielski 477*b1cdbd2cSJim Jagielski if ( (*cond)->isEmpty() ) 478*b1cdbd2cSJim Jagielski continue; 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski Reference< XFormatCondition > xNewCond; 481*b1cdbd2cSJim Jagielski sal_Bool bAppend = j >= m_xFormatConditions->getCount(); 482*b1cdbd2cSJim Jagielski if ( bAppend ) 483*b1cdbd2cSJim Jagielski { 484*b1cdbd2cSJim Jagielski xNewCond = m_xFormatConditions->createFormatCondition(); 485*b1cdbd2cSJim Jagielski m_xFormatConditions->insertByIndex( i, makeAny( xNewCond ) ); 486*b1cdbd2cSJim Jagielski } 487*b1cdbd2cSJim Jagielski else 488*b1cdbd2cSJim Jagielski xNewCond.set( m_xFormatConditions->getByIndex(j), UNO_QUERY ); 489*b1cdbd2cSJim Jagielski ++j; 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski ::comphelper::copyProperties(xCond.get(),xNewCond.get()); 492*b1cdbd2cSJim Jagielski } 493*b1cdbd2cSJim Jagielski 494*b1cdbd2cSJim Jagielski for ( sal_Int32 k = m_xFormatConditions->getCount()-1; k >= j; --k ) 495*b1cdbd2cSJim Jagielski m_xFormatConditions->removeByIndex(k); 496*b1cdbd2cSJim Jagielski 497*b1cdbd2cSJim Jagielski ::comphelper::copyProperties( m_xCopy.get(), m_xFormatConditions.get() ); 498*b1cdbd2cSJim Jagielski } 499*b1cdbd2cSJim Jagielski catch ( const Exception& ) 500*b1cdbd2cSJim Jagielski { 501*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 502*b1cdbd2cSJim Jagielski nRet = RET_NO; 503*b1cdbd2cSJim Jagielski } 504*b1cdbd2cSJim Jagielski } 505*b1cdbd2cSJim Jagielski return nRet; 506*b1cdbd2cSJim Jagielski } 507*b1cdbd2cSJim Jagielski 508*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- PreNotify(NotifyEvent & _rNEvt)509*b1cdbd2cSJim Jagielski long ConditionalFormattingDialog::PreNotify( NotifyEvent& _rNEvt ) 510*b1cdbd2cSJim Jagielski { 511*b1cdbd2cSJim Jagielski switch ( _rNEvt.GetType() ) 512*b1cdbd2cSJim Jagielski { 513*b1cdbd2cSJim Jagielski case EVENT_KEYINPUT: 514*b1cdbd2cSJim Jagielski { 515*b1cdbd2cSJim Jagielski const KeyEvent* pKeyEvent( _rNEvt.GetKeyEvent() ); 516*b1cdbd2cSJim Jagielski const KeyCode& rKeyCode = pKeyEvent->GetKeyCode(); 517*b1cdbd2cSJim Jagielski if ( rKeyCode.IsMod1() && rKeyCode.IsMod2() ) 518*b1cdbd2cSJim Jagielski { 519*b1cdbd2cSJim Jagielski if ( rKeyCode.GetCode() == 0x0508 ) // - 520*b1cdbd2cSJim Jagielski { 521*b1cdbd2cSJim Jagielski impl_deleteCondition_nothrow( impl_getFocusedConditionIndex( 0 ) ); 522*b1cdbd2cSJim Jagielski return 1; 523*b1cdbd2cSJim Jagielski } 524*b1cdbd2cSJim Jagielski if ( rKeyCode.GetCode() == 0x0507 ) // + 525*b1cdbd2cSJim Jagielski { 526*b1cdbd2cSJim Jagielski impl_addCondition_nothrow( impl_getFocusedConditionIndex( impl_getConditionCount() - 1 ) + 1 ); 527*b1cdbd2cSJim Jagielski return 1; 528*b1cdbd2cSJim Jagielski } 529*b1cdbd2cSJim Jagielski } 530*b1cdbd2cSJim Jagielski } 531*b1cdbd2cSJim Jagielski break; 532*b1cdbd2cSJim Jagielski case EVENT_GETFOCUS: 533*b1cdbd2cSJim Jagielski { 534*b1cdbd2cSJim Jagielski if ( m_bDeletingCondition ) 535*b1cdbd2cSJim Jagielski break; 536*b1cdbd2cSJim Jagielski 537*b1cdbd2cSJim Jagielski const Window* pGetFocusWindow( _rNEvt.GetWindow() ); 538*b1cdbd2cSJim Jagielski 539*b1cdbd2cSJim Jagielski // determine whether the new focus window is part of an (currently invisible) condition 540*b1cdbd2cSJim Jagielski const Window* pConditionCandidate = pGetFocusWindow->GetParent(); 541*b1cdbd2cSJim Jagielski const Window* pPlaygroundCandidate = pConditionCandidate ? pConditionCandidate->GetParent() : NULL; 542*b1cdbd2cSJim Jagielski while ( ( pPlaygroundCandidate ) 543*b1cdbd2cSJim Jagielski && ( pPlaygroundCandidate != this ) 544*b1cdbd2cSJim Jagielski && ( pPlaygroundCandidate != &m_aConditionPlayground ) 545*b1cdbd2cSJim Jagielski ) 546*b1cdbd2cSJim Jagielski { 547*b1cdbd2cSJim Jagielski pConditionCandidate = pConditionCandidate->GetParent(); 548*b1cdbd2cSJim Jagielski pPlaygroundCandidate = pConditionCandidate ? pConditionCandidate->GetParent() : NULL; 549*b1cdbd2cSJim Jagielski } 550*b1cdbd2cSJim Jagielski if ( pPlaygroundCandidate == &m_aConditionPlayground ) 551*b1cdbd2cSJim Jagielski { 552*b1cdbd2cSJim Jagielski impl_ensureConditionVisible( dynamic_cast< const Condition& >( *pConditionCandidate ).getConditionIndex() ); 553*b1cdbd2cSJim Jagielski } 554*b1cdbd2cSJim Jagielski } 555*b1cdbd2cSJim Jagielski break; 556*b1cdbd2cSJim Jagielski } 557*b1cdbd2cSJim Jagielski 558*b1cdbd2cSJim Jagielski return ModalDialog::PreNotify( _rNEvt ); 559*b1cdbd2cSJim Jagielski } 560*b1cdbd2cSJim Jagielski 561*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_getFirstVisibleConditionIndex() const562*b1cdbd2cSJim Jagielski size_t ConditionalFormattingDialog::impl_getFirstVisibleConditionIndex() const 563*b1cdbd2cSJim Jagielski { 564*b1cdbd2cSJim Jagielski return (size_t)m_aCondScroll.GetThumbPos(); 565*b1cdbd2cSJim Jagielski } 566*b1cdbd2cSJim Jagielski 567*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_getLastVisibleConditionIndex() const568*b1cdbd2cSJim Jagielski size_t ConditionalFormattingDialog::impl_getLastVisibleConditionIndex() const 569*b1cdbd2cSJim Jagielski { 570*b1cdbd2cSJim Jagielski return ::std::min( impl_getFirstVisibleConditionIndex() + MAX_CONDITIONS, impl_getConditionCount() ) - 1; 571*b1cdbd2cSJim Jagielski } 572*b1cdbd2cSJim Jagielski 573*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_getFocusedConditionIndex(sal_Int32 _nFallBackIfNone) const574*b1cdbd2cSJim Jagielski size_t ConditionalFormattingDialog::impl_getFocusedConditionIndex( sal_Int32 _nFallBackIfNone ) const 575*b1cdbd2cSJim Jagielski { 576*b1cdbd2cSJim Jagielski size_t nIndex( 0 ); 577*b1cdbd2cSJim Jagielski for ( Conditions::const_iterator cond = m_aConditions.begin(); 578*b1cdbd2cSJim Jagielski cond != m_aConditions.end(); 579*b1cdbd2cSJim Jagielski ++cond, ++nIndex 580*b1cdbd2cSJim Jagielski ) 581*b1cdbd2cSJim Jagielski { 582*b1cdbd2cSJim Jagielski if ( (*cond)->HasChildPathFocus() ) 583*b1cdbd2cSJim Jagielski return nIndex; 584*b1cdbd2cSJim Jagielski } 585*b1cdbd2cSJim Jagielski return _nFallBackIfNone; 586*b1cdbd2cSJim Jagielski } 587*b1cdbd2cSJim Jagielski 588*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_updateScrollBarRange()589*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_updateScrollBarRange() 590*b1cdbd2cSJim Jagielski { 591*b1cdbd2cSJim Jagielski long nMax = ( impl_getConditionCount() > MAX_CONDITIONS ) ? impl_getConditionCount() - MAX_CONDITIONS + 1 : 0; 592*b1cdbd2cSJim Jagielski 593*b1cdbd2cSJim Jagielski m_aCondScroll.SetRangeMin( 0 ); 594*b1cdbd2cSJim Jagielski m_aCondScroll.SetRangeMax( nMax ); 595*b1cdbd2cSJim Jagielski m_aCondScroll.SetVisibleSize( 1 ); 596*b1cdbd2cSJim Jagielski } 597*b1cdbd2cSJim Jagielski 598*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_scrollTo(size_t _nTopCondIndex)599*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_scrollTo( size_t _nTopCondIndex ) 600*b1cdbd2cSJim Jagielski { 601*b1cdbd2cSJim Jagielski OSL_PRECOND( _nTopCondIndex + MAX_CONDITIONS <= impl_getConditionCount(), 602*b1cdbd2cSJim Jagielski "ConditionalFormattingDialog::impl_scrollTo: illegal index!" ); 603*b1cdbd2cSJim Jagielski m_aCondScroll.SetThumbPos( _nTopCondIndex ); 604*b1cdbd2cSJim Jagielski OnScroll( &m_aCondScroll ); 605*b1cdbd2cSJim Jagielski } 606*b1cdbd2cSJim Jagielski 607*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- impl_ensureConditionVisible(size_t _nCondIndex)608*b1cdbd2cSJim Jagielski void ConditionalFormattingDialog::impl_ensureConditionVisible( size_t _nCondIndex ) 609*b1cdbd2cSJim Jagielski { 610*b1cdbd2cSJim Jagielski OSL_PRECOND( _nCondIndex < impl_getConditionCount(), 611*b1cdbd2cSJim Jagielski "ConditionalFormattingDialog::impl_ensureConditionVisible: illegal index!" ); 612*b1cdbd2cSJim Jagielski 613*b1cdbd2cSJim Jagielski if ( _nCondIndex < impl_getFirstVisibleConditionIndex() ) 614*b1cdbd2cSJim Jagielski impl_scrollTo( _nCondIndex ); 615*b1cdbd2cSJim Jagielski else if ( _nCondIndex > impl_getLastVisibleConditionIndex() ) 616*b1cdbd2cSJim Jagielski impl_scrollTo( _nCondIndex - MAX_CONDITIONS + 1 ); 617*b1cdbd2cSJim Jagielski } 618*b1cdbd2cSJim Jagielski 619*b1cdbd2cSJim Jagielski // ............................................................................. 620*b1cdbd2cSJim Jagielski } // rptui 621*b1cdbd2cSJim Jagielski // ............................................................................. 622