LCOV - code coverage report
Current view: top level - reportdesign/source/ui/dlg - GroupsSorting.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 757 0.0 %
Date: 2014-04-14 Functions: 0 66 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : #include "GroupsSorting.hxx"
      20             : #include "GroupsSorting.hrc"
      21             : #include <connectivity/dbtools.hxx>
      22             : #include <svtools/editbrowsebox.hxx>
      23             : #include <svtools/imgdef.hxx>
      24             : #include <com/sun/star/beans/XPropertySet.hpp>
      25             : #include <com/sun/star/container/XContainerListener.hpp>
      26             : #include <com/sun/star/report/GroupOn.hpp>
      27             : #include <com/sun/star/sdbc/DataType.hpp>
      28             : 
      29             : #include <tools/debug.hxx>
      30             : #include "RptResId.hrc"
      31             : #include "rptui_slotid.hrc"
      32             : #include "ModuleHelper.hxx"
      33             : #include "helpids.hrc"
      34             : #include "GroupExchange.hxx"
      35             : #include "UITools.hxx"
      36             : #include "UndoActions.hxx"
      37             : #include "uistrings.hrc"
      38             : #include "ReportController.hxx"
      39             : #include "ColumnInfo.hxx"
      40             : 
      41             : #include <cppuhelper/implbase1.hxx>
      42             : #include <comphelper/property.hxx>
      43             : #include <vcl/mnemonic.hxx>
      44             : #include <vcl/msgbox.hxx>
      45             : #include <vcl/settings.hxx>
      46             : 
      47             : #include <algorithm>
      48             : 
      49             : #include <cppuhelper/bootstrap.hxx>
      50             : 
      51             : #define HANDLE_ID           0
      52             : #define FIELD_EXPRESSION    1
      53             : #define GROUPS_START_LEN    5
      54             : #define NO_GROUP            -1
      55             : 
      56             : namespace rptui
      57             : {
      58             : using namespace ::com::sun::star;
      59             : using namespace svt;
      60             : using namespace ::comphelper;
      61             : 
      62           0 :     void lcl_addToList_throw( ComboBoxControl& _rListBox, ::std::vector<ColumnInfo>& o_aColumnList,const uno::Reference< container::XNameAccess>& i_xColumns )
      63             :     {
      64           0 :         uno::Sequence< OUString > aEntries = i_xColumns->getElementNames();
      65           0 :         const OUString* pEntries = aEntries.getConstArray();
      66           0 :         sal_Int32 nEntries = aEntries.getLength();
      67           0 :         for ( sal_Int32 i = 0; i < nEntries; ++i, ++pEntries )
      68             :         {
      69           0 :             uno::Reference< beans::XPropertySet> xColumn(i_xColumns->getByName(*pEntries),uno::UNO_QUERY_THROW);
      70           0 :             OUString sLabel;
      71           0 :             if ( xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_LABEL) )
      72           0 :                 xColumn->getPropertyValue(PROPERTY_LABEL) >>= sLabel;
      73           0 :             o_aColumnList.push_back( ColumnInfo(*pEntries,sLabel) );
      74           0 :             if ( !sLabel.isEmpty() )
      75           0 :                 _rListBox.InsertEntry( sLabel );
      76             :             else
      77           0 :                 _rListBox.InsertEntry( *pEntries );
      78           0 :         }
      79           0 :     }
      80             : 
      81             : typedef ::svt::EditBrowseBox OFieldExpressionControl_Base;
      82             : typedef ::cppu::WeakImplHelper1< container::XContainerListener > TContainerListenerBase;
      83             : class OFieldExpressionControl : public TContainerListenerBase
      84             :                                ,public OFieldExpressionControl_Base
      85             : {
      86             :     ::osl::Mutex                    m_aMutex;
      87             :     ::std::vector<sal_Int32>        m_aGroupPositions;
      88             :     ::std::vector<ColumnInfo>       m_aColumnInfo;
      89             :     ::svt::ComboBoxControl*         m_pComboCell;
      90             :     sal_Int32                       m_nDataPos;
      91             :     sal_Int32                       m_nCurrentPos;
      92             :     sal_uLong                           m_nPasteEvent;
      93             :     sal_uLong                           m_nDeleteEvent;
      94             :     OGroupsSortingDialog*           m_pParent;
      95             :     bool                            m_bIgnoreEvent;
      96             : 
      97             :     void fillListBox(const uno::Reference< beans::XPropertySet>& _xDest,long nRow,sal_uInt16 nColumnId);
      98             :     sal_Bool SaveModified(bool _bAppend);
      99             : 
     100             :     OFieldExpressionControl(const OFieldExpressionControl&); // NO COPY
     101             :     void operator =(const OFieldExpressionControl&);         // NO ASSIGN
     102             : public:
     103             :     OFieldExpressionControl( OGroupsSortingDialog* _pParent,const ResId& _rResId);
     104             :     virtual ~OFieldExpressionControl();
     105             : 
     106             :     // XEventListener
     107             :     virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
     108             :     // XContainerListener
     109             :     virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     110             :     virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     111             :     virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     112             : 
     113             :     void        fillColumns(const uno::Reference< container::XNameAccess>& _xColumns);
     114             :     void        lateInit();
     115             :     sal_Bool    IsDeleteAllowed( );
     116             :     void        DeleteRows();
     117             :     void        cut();
     118             :     void        copy();
     119             :     void        paste();
     120             : 
     121           0 :     inline sal_Int32   getGroupPosition(sal_Int32 _nRow) const { return _nRow != BROWSER_ENDOFSELECTION ? m_aGroupPositions[_nRow] : sal_Int32(NO_GROUP); }
     122             : 
     123           0 :     inline ::svt::ComboBoxControl*  getExpressionControl() const { return m_pComboCell; }
     124             : 
     125             :     /** returns the sequence with the selected groups
     126             :     */
     127             :     uno::Sequence<uno::Any> fillSelectedGroups();
     128             : 
     129             :     /** move groups given by _aGroups
     130             :     */
     131             :     void moveGroups(const uno::Sequence<uno::Any>& _aGroups,sal_Int32 _nRow,sal_Bool _bSelect = sal_True);
     132             : 
     133             :     virtual bool CursorMoving(long nNewRow, sal_uInt16 nNewCol) SAL_OVERRIDE;
     134             :     using OFieldExpressionControl_Base::GetRowCount;
     135             : protected:
     136             :     virtual bool IsTabAllowed(bool bForward) const SAL_OVERRIDE;
     137             : 
     138             :     virtual void InitController( ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol ) SAL_OVERRIDE;
     139             :     virtual ::svt::CellController* GetController( long nRow, sal_uInt16 nCol ) SAL_OVERRIDE;
     140             :     virtual void PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId ) const SAL_OVERRIDE;
     141             :     virtual bool SeekRow( long nRow ) SAL_OVERRIDE;
     142             :     virtual bool SaveModified() SAL_OVERRIDE;
     143             :     virtual OUString GetCellText( long nRow, sal_uInt16 nColId ) const SAL_OVERRIDE;
     144             :     virtual RowStatus GetRowStatus(long nRow) const SAL_OVERRIDE;
     145             : 
     146             :     virtual void KeyInput(const KeyEvent& rEvt) SAL_OVERRIDE;
     147             :     virtual void Command( const CommandEvent& rEvt ) SAL_OVERRIDE;
     148             : 
     149             :     // D&D
     150             :     virtual void     StartDrag( sal_Int8 nAction, const Point& rPosPixel ) SAL_OVERRIDE;
     151             :     virtual sal_Int8 AcceptDrop( const BrowserAcceptDropEvent& rEvt ) SAL_OVERRIDE;
     152             :     virtual sal_Int8 ExecuteDrop( const BrowserExecuteDropEvent& rEvt ) SAL_OVERRIDE;
     153             : 
     154             :     using BrowseBox::AcceptDrop;
     155             :     using BrowseBox::ExecuteDrop;
     156             : 
     157             : private:
     158             : 
     159             :     DECL_LINK( DelayedPaste, void* );
     160             :     DECL_LINK( CBChangeHdl,ComboBox*);
     161             : 
     162             :     void InsertRows( long nRow );
     163             : 
     164             : public:
     165             :     DECL_LINK( DelayedDelete, void* );
     166             : 
     167             : };
     168             : 
     169             : // class OFieldExpressionControl
     170             : 
     171             : 
     172           0 : OFieldExpressionControl::OFieldExpressionControl( OGroupsSortingDialog* _pParent,const ResId& _rResId )
     173             :     :EditBrowseBox( _pParent, _rResId,EBBF_NONE, WB_TABSTOP | BROWSER_COLUMNSELECTION | BROWSER_MULTISELECTION | BROWSER_AUTOSIZE_LASTCOL |
     174             :                                   BROWSER_KEEPSELECTION | BROWSER_HLINESFULL | BROWSER_VLINESFULL)
     175             :     ,m_aGroupPositions(GROUPS_START_LEN,-1)
     176             :     ,m_pComboCell(NULL)
     177             :     ,m_nDataPos(-1)
     178             :     ,m_nCurrentPos(-1)
     179             :     ,m_nPasteEvent(0)
     180             :     ,m_nDeleteEvent(0)
     181             :     ,m_pParent(_pParent)
     182           0 :     ,m_bIgnoreEvent(false)
     183             : {
     184           0 :     SetBorderStyle(WINDOW_BORDER_MONO);
     185           0 : }
     186             : 
     187             : 
     188           0 : OFieldExpressionControl::~OFieldExpressionControl()
     189             : {
     190           0 :     acquire();
     191           0 :     uno::Reference< report::XGroups > xGroups = m_pParent->getGroups();
     192           0 :     xGroups->removeContainerListener(this);
     193             : 
     194             :     // delete events from queue
     195           0 :     if( m_nPasteEvent )
     196           0 :         Application::RemoveUserEvent( m_nPasteEvent );
     197           0 :     if( m_nDeleteEvent )
     198           0 :         Application::RemoveUserEvent( m_nDeleteEvent );
     199             : 
     200           0 :     delete m_pComboCell;
     201           0 : }
     202             : 
     203           0 : uno::Sequence<uno::Any> OFieldExpressionControl::fillSelectedGroups()
     204             : {
     205           0 :     uno::Sequence<uno::Any> aList;
     206           0 :     ::std::vector<uno::Any> vClipboardList;
     207           0 :     vClipboardList.reserve(GetSelectRowCount());
     208             : 
     209           0 :     uno::Reference<report::XGroups> xGroups = m_pParent->getGroups();
     210           0 :     sal_Int32 nCount = xGroups->getCount();
     211           0 :     if ( nCount >= 1 )
     212             :     {
     213           0 :         for( long nIndex=FirstSelectedRow(); nIndex >= 0 ; nIndex=NextSelectedRow() )
     214             :         {
     215             :             try
     216             :             {
     217           0 :                 if ( m_aGroupPositions[nIndex] != NO_GROUP )
     218             :                 {
     219           0 :                     uno::Reference< report::XGroup> xOrgGroup(xGroups->getByIndex(m_aGroupPositions[nIndex]),uno::UNO_QUERY);
     220             :                     /*uno::Reference< report::XGroup> xCopy = xGroups->createGroup();
     221             :                     ::comphelper::copyProperties(xOrgGroup.get(),xCopy.get());*/
     222           0 :                     vClipboardList.push_back( uno::makeAny(xOrgGroup) );
     223             :                 }
     224             :             }
     225           0 :             catch(uno::Exception&)
     226             :             {
     227             :                 OSL_FAIL("Can not access group!");
     228             :             }
     229             :         }
     230           0 :         if ( !vClipboardList.empty() )
     231           0 :             aList = uno::Sequence< uno::Any >(&vClipboardList[0], vClipboardList.size());
     232             :     }
     233           0 :     return aList;
     234             : }
     235             : 
     236           0 : void OFieldExpressionControl::StartDrag( sal_Int8 /*_nAction*/ , const Point& /*_rPosPixel*/ )
     237             : {
     238           0 :     if ( m_pParent && !m_pParent->isReadOnly( ) )
     239             :     {
     240           0 :         uno::Sequence<uno::Any> aClipboardList = fillSelectedGroups();
     241             : 
     242           0 :         if( aClipboardList.getLength() )
     243             :         {
     244           0 :             OGroupExchange* pData = new OGroupExchange(aClipboardList);
     245           0 :             uno::Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
     246           0 :             pData->StartDrag(this, DND_ACTION_MOVE );
     247           0 :         }
     248             :     }
     249           0 : }
     250             : 
     251           0 : sal_Int8 OFieldExpressionControl::AcceptDrop( const BrowserAcceptDropEvent& rEvt )
     252             : {
     253           0 :     sal_Int8 nAction = DND_ACTION_NONE;
     254           0 :     if ( IsEditing() )
     255             :     {
     256           0 :         sal_Int32 nPos = m_pComboCell->GetSelectEntryPos();
     257           0 :         if ( COMBOBOX_ENTRY_NOTFOUND != nPos || !m_pComboCell->GetText().isEmpty() )
     258           0 :             SaveModified();
     259           0 :         DeactivateCell();
     260             :     }
     261           0 :     if ( IsDropFormatSupported( OGroupExchange::getReportGroupId() ) && m_pParent->getGroups()->getCount() > 1 && rEvt.GetWindow() == &GetDataWindow() )
     262             :     {
     263           0 :         nAction = DND_ACTION_MOVE;
     264             :     }
     265           0 :     return nAction;
     266             : }
     267             : 
     268           0 : sal_Int8 OFieldExpressionControl::ExecuteDrop( const BrowserExecuteDropEvent& rEvt )
     269             : {
     270           0 :     sal_Int8 nAction = DND_ACTION_NONE;
     271           0 :     if ( IsDropFormatSupported( OGroupExchange::getReportGroupId() ) )
     272             :     {
     273           0 :         sal_Int32   nRow = GetRowAtYPosPixel(rEvt.maPosPixel.Y(), false);
     274           0 :         SetNoSelection();
     275             : 
     276           0 :         TransferableDataHelper aDropped( rEvt.maDropEvent.Transferable );
     277           0 :         uno::Any aDrop = aDropped.GetAny(OGroupExchange::getReportGroupId());
     278           0 :         uno::Sequence< uno::Any > aGroups;
     279           0 :         aDrop >>= aGroups;
     280           0 :         if ( aGroups.getLength() )
     281             :         {
     282           0 :             moveGroups(aGroups,nRow);
     283           0 :             nAction = DND_ACTION_MOVE;
     284           0 :         }
     285             :     }
     286           0 :     return nAction;
     287             : }
     288             : 
     289           0 : void OFieldExpressionControl::moveGroups(const uno::Sequence<uno::Any>& _aGroups,sal_Int32 _nRow,sal_Bool _bSelect)
     290             : {
     291           0 :     if ( _aGroups.getLength() )
     292             :     {
     293           0 :         m_bIgnoreEvent = true;
     294             :         {
     295           0 :             sal_Int32 nRow = _nRow;
     296           0 :             const OUString sUndoAction(ModuleRes(RID_STR_UNDO_MOVE_GROUP));
     297           0 :             const UndoContext aUndoContext( m_pParent->m_pController->getUndoManager(), sUndoAction );
     298             : 
     299           0 :             uno::Reference< report::XGroups> xGroups = m_pParent->getGroups();
     300           0 :             const uno::Any* pIter = _aGroups.getConstArray();
     301           0 :             const uno::Any* pEnd  = pIter + _aGroups.getLength();
     302           0 :             for(;pIter != pEnd;++pIter)
     303             :             {
     304           0 :                 uno::Reference< report::XGroup> xGroup(*pIter,uno::UNO_QUERY);
     305           0 :                 if ( xGroup.is() )
     306             :                 {
     307           0 :                     uno::Sequence< beans::PropertyValue > aArgs(1);
     308           0 :                     aArgs[0].Name = PROPERTY_GROUP;
     309           0 :                     aArgs[0].Value <<= xGroup;
     310             :                     // we use this way to create undo actions
     311           0 :                     m_pParent->m_pController->executeChecked(SID_GROUP_REMOVE,aArgs);
     312           0 :                     aArgs.realloc(2);
     313           0 :                     if ( nRow > xGroups->getCount() )
     314           0 :                         nRow = xGroups->getCount();
     315           0 :                     if ( _bSelect )
     316           0 :                         SelectRow(nRow);
     317           0 :                     aArgs[1].Name = PROPERTY_POSITIONY;
     318           0 :                     aArgs[1].Value <<= nRow;
     319           0 :                     m_pParent->m_pController->executeChecked(SID_GROUP_APPEND,aArgs);
     320           0 :                     ++nRow;
     321             :                 }
     322           0 :             }
     323             :         }
     324           0 :         m_bIgnoreEvent = false;
     325           0 :         Invalidate();
     326             :     }
     327           0 : }
     328             : 
     329           0 : void OFieldExpressionControl::fillColumns(const uno::Reference< container::XNameAccess>& _xColumns)
     330             : {
     331           0 :     m_pComboCell->Clear();
     332           0 :     if ( _xColumns.is() )
     333           0 :         lcl_addToList_throw(*m_pComboCell,m_aColumnInfo,_xColumns);
     334           0 : }
     335             : 
     336           0 : void OFieldExpressionControl::lateInit()
     337             : {
     338           0 :     uno::Reference< report::XGroups > xGroups = m_pParent->getGroups();
     339           0 :     sal_Int32 nGroupsCount = xGroups->getCount();
     340           0 :     m_aGroupPositions.resize(::std::max<sal_Int32>(nGroupsCount,sal_Int32(GROUPS_START_LEN)),NO_GROUP);
     341           0 :     ::std::vector<sal_Int32>::iterator aIter = m_aGroupPositions.begin();
     342           0 :     for (sal_Int32 i = 0; i < nGroupsCount; ++i,++aIter)
     343           0 :         *aIter = i;
     344             : 
     345           0 :     if ( ColCount() == 0 )
     346             :     {
     347           0 :         Font aFont( GetDataWindow().GetFont() );
     348           0 :         aFont.SetWeight( WEIGHT_NORMAL );
     349           0 :         GetDataWindow().SetFont( aFont );
     350             : 
     351             :         // Font fuer die Ueberschriften auf Light setzen
     352           0 :         aFont = GetFont();
     353           0 :         aFont.SetWeight( WEIGHT_LIGHT );
     354           0 :         SetFont(aFont);
     355             : 
     356           0 :         InsertHandleColumn(static_cast<sal_uInt16>(GetTextWidth(OUString('0')) * 4)/*, sal_True */);
     357           0 :         InsertDataColumn( FIELD_EXPRESSION, OUString(ModuleRes(STR_RPT_EXPRESSION)), 100);
     358             : 
     359           0 :         m_pComboCell = new ComboBoxControl( &GetDataWindow() );
     360           0 :         m_pComboCell->SetSelectHdl(LINK(this,OFieldExpressionControl,CBChangeHdl));
     361           0 :         m_pComboCell->SetHelpId(HID_RPT_FIELDEXPRESSION);
     362             : 
     363           0 :         Control* pControls[] = {m_pComboCell};
     364           0 :         for (size_t i = 0; i < sizeof(pControls)/sizeof(pControls[0]); ++i)
     365             :         {
     366           0 :             pControls[i]->SetGetFocusHdl(LINK(m_pParent, OGroupsSortingDialog, OnControlFocusGot));
     367           0 :             pControls[i]->SetLoseFocusHdl(LINK(m_pParent, OGroupsSortingDialog, OnControlFocusLost));
     368             :         }
     369             : 
     370             : 
     371             :         // set browse mode
     372             :         BrowserMode nMode(BROWSER_COLUMNSELECTION | BROWSER_MULTISELECTION  | BROWSER_KEEPSELECTION |
     373           0 :                           BROWSER_HLINESFULL | BROWSER_VLINESFULL       | BROWSER_AUTOSIZE_LASTCOL | BROWSER_AUTO_VSCROLL | BROWSER_AUTO_HSCROLL);
     374           0 :         if( m_pParent->isReadOnly() )
     375           0 :             nMode |= BROWSER_HIDECURSOR;
     376           0 :         SetMode(nMode);
     377           0 :         xGroups->addContainerListener(this);
     378             :     }
     379             :     else
     380             :         // not the first call
     381           0 :         RowRemoved(0, GetRowCount());
     382             : 
     383           0 :     RowInserted(0, m_aGroupPositions.size(), true);
     384           0 : }
     385             : 
     386             : 
     387           0 : IMPL_LINK( OFieldExpressionControl, CBChangeHdl, ComboBox*, /*pComboBox*/ )
     388             : {
     389             : 
     390           0 :     SaveModified();
     391           0 :     return 0L;
     392             : }
     393             : 
     394             : 
     395           0 : bool OFieldExpressionControl::IsTabAllowed(bool /*bForward*/) const
     396             : {
     397           0 :     return false;
     398             : }
     399             : 
     400             : 
     401           0 : bool OFieldExpressionControl::SaveModified()
     402             : {
     403           0 :     return SaveModified(true);
     404             : }
     405             : 
     406           0 : sal_Bool OFieldExpressionControl::SaveModified(bool _bAppendRow)
     407             : {
     408           0 :     sal_Int32 nRow = GetCurRow();
     409           0 :     if ( nRow != BROWSER_ENDOFSELECTION )
     410             :     {
     411           0 :         sal_Bool bAppend = sal_False;
     412             :         try
     413             :         {
     414           0 :             uno::Reference< report::XGroup> xGroup;
     415           0 :             if ( m_aGroupPositions[nRow] == NO_GROUP )
     416             :             {
     417           0 :                 bAppend = sal_True;
     418           0 :                 OUString sUndoAction(ModuleRes(RID_STR_UNDO_APPEND_GROUP));
     419           0 :                 m_pParent->m_pController->getUndoManager().EnterListAction( sUndoAction, OUString() );
     420           0 :                 xGroup = m_pParent->getGroups()->createGroup();
     421           0 :                 xGroup->setHeaderOn(sal_True);
     422             : 
     423           0 :                 uno::Sequence< beans::PropertyValue > aArgs(2);
     424           0 :                 aArgs[0].Name = PROPERTY_GROUP;
     425           0 :                 aArgs[0].Value <<= xGroup;
     426             :                 // find position where to insert the new group
     427           0 :                 sal_Int32 nGroupPos = 0;
     428           0 :                 ::std::vector<sal_Int32>::iterator aIter = m_aGroupPositions.begin();
     429           0 :                 ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.begin() + nRow;
     430           0 :                 for(;aIter != aEnd;++aIter)
     431           0 :                     if ( *aIter != NO_GROUP )
     432           0 :                         nGroupPos = *aIter + 1;
     433           0 :                 aArgs[1].Name = PROPERTY_POSITIONY;
     434           0 :                 aArgs[1].Value <<= nGroupPos;
     435           0 :                 m_bIgnoreEvent = true;
     436           0 :                 m_pParent->m_pController->executeChecked(SID_GROUP_APPEND,aArgs);
     437           0 :                 m_bIgnoreEvent = false;
     438             :                 OSL_ENSURE(*aIter == NO_GROUP ,"Illegal iterator!");
     439           0 :                 *aIter++ = nGroupPos;
     440             : 
     441           0 :                 aEnd  = m_aGroupPositions.end();
     442           0 :                 for(;aIter != aEnd;++aIter)
     443           0 :                     if ( *aIter != NO_GROUP )
     444           0 :                         ++*aIter;
     445             :             }
     446             :             else
     447           0 :                 xGroup = m_pParent->getGroup(m_aGroupPositions[nRow]);
     448           0 :             if ( xGroup.is() )
     449             :             {
     450           0 :                 sal_Int32 nPos = m_pComboCell->GetSelectEntryPos();
     451           0 :                 OUString sExpression;
     452           0 :                 if ( COMBOBOX_ENTRY_NOTFOUND == nPos )
     453           0 :                     sExpression = m_pComboCell->GetText();
     454             :                 else
     455             :                 {
     456           0 :                     sExpression = m_aColumnInfo[nPos].sColumnName;
     457             :                 }
     458           0 :                 xGroup->setExpression( sExpression );
     459             : 
     460           0 :                 ::rptui::adjustSectionName(xGroup,nPos);
     461             : 
     462           0 :                 if ( bAppend )
     463           0 :                     m_pParent->m_pController->getUndoManager().LeaveListAction();
     464             :             }
     465             : 
     466           0 :             if ( Controller() )
     467           0 :                 Controller()->ClearModified();
     468           0 :             if ( _bAppendRow && GetRowCount() == m_pParent->getGroups()->getCount() )
     469             :             {
     470           0 :                 RowInserted( GetRowCount()-1);
     471           0 :                 m_aGroupPositions.push_back(NO_GROUP);
     472             :             }
     473             : 
     474           0 :             GoToRow(nRow);
     475           0 :             m_pParent->DisplayData(nRow);
     476             :         }
     477           0 :         catch(uno::Exception&)
     478             :         {
     479             :             OSL_FAIL("OFieldExpressionControl::SaveModified: Exception caught!");
     480             :         }
     481             :     }
     482             : 
     483           0 :     return sal_True;
     484             : }
     485             : 
     486           0 : OUString OFieldExpressionControl::GetCellText( long nRow, sal_uInt16 /*nColId*/ ) const
     487             : {
     488           0 :     OUString sText;
     489           0 :     if ( nRow != BROWSER_ENDOFSELECTION && m_aGroupPositions[nRow] != NO_GROUP )
     490             :     {
     491             :         try
     492             :         {
     493           0 :             uno::Reference< report::XGroup> xGroup = m_pParent->getGroup(m_aGroupPositions[nRow]);
     494           0 :             OUString sExpression = xGroup->getExpression();
     495             : 
     496           0 :             for(::std::vector<ColumnInfo>::const_iterator aIter = m_aColumnInfo.begin(); aIter != m_aColumnInfo.end();++aIter)
     497             :             {
     498           0 :                 if ( aIter->sColumnName == sExpression )
     499             :                 {
     500           0 :                     if ( !aIter->sLabel.isEmpty() )
     501           0 :                         sExpression = aIter->sLabel;
     502           0 :                     break;
     503             :                 }
     504             :             }
     505           0 :             sText = sExpression;
     506             :         }
     507           0 :         catch (const uno::Exception&)
     508             :         {
     509             :             OSL_FAIL("Exception caught while getting expression value from the group");
     510             :         }
     511             :     }
     512           0 :     return sText;
     513             : }
     514             : 
     515             : 
     516           0 : void OFieldExpressionControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
     517             : {
     518             : 
     519           0 :     m_pComboCell->SetText( GetCellText( nRow, nColumnId ) );
     520           0 : }
     521             : 
     522           0 : bool OFieldExpressionControl::CursorMoving(long nNewRow, sal_uInt16 nNewCol)
     523             : {
     524             : 
     525           0 :     if (!EditBrowseBox::CursorMoving(nNewRow, nNewCol))
     526           0 :         return false;
     527           0 :     m_nDataPos = nNewRow;
     528           0 :     long nOldDataPos = GetCurRow();
     529           0 :     InvalidateStatusCell( m_nDataPos );
     530           0 :     InvalidateStatusCell( nOldDataPos );
     531             : 
     532           0 :     m_pParent->SaveData( nOldDataPos );
     533           0 :     m_pParent->DisplayData( m_nDataPos );
     534           0 :     return true;
     535             : }
     536             : 
     537           0 : CellController* OFieldExpressionControl::GetController( long /*nRow*/, sal_uInt16 /*nColumnId*/ )
     538             : {
     539           0 :     ComboBoxCellController* pCellController = new ComboBoxCellController( m_pComboCell );
     540           0 :     pCellController->GetComboBox().SetReadOnly(!m_pParent->m_pController->isEditable());
     541           0 :     return pCellController;
     542             : }
     543             : 
     544             : 
     545           0 : bool OFieldExpressionControl::SeekRow( long _nRow )
     546             : {
     547             :     // die Basisklasse braucht den Aufruf, da sie sich dort merkt, welche Zeile gepainted wird
     548           0 :     EditBrowseBox::SeekRow(_nRow);
     549           0 :     m_nCurrentPos = _nRow;
     550           0 :     return true;
     551             : }
     552             : 
     553             : 
     554           0 : void OFieldExpressionControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
     555             : {
     556           0 :     OUString aText  =const_cast< OFieldExpressionControl*>(this)->GetCellText( m_nCurrentPos, nColumnId );
     557             : 
     558           0 :     Point aPos( rRect.TopLeft() );
     559           0 :     Size aTextSize( GetDataWindow().GetTextHeight(),GetDataWindow().GetTextWidth( aText ));
     560             : 
     561           0 :     if( aPos.X() < rRect.Right() || aPos.X() + aTextSize.Width() > rRect.Right() ||
     562           0 :         aPos.Y() < rRect.Top() || aPos.Y() + aTextSize.Height() > rRect.Bottom() )
     563           0 :         rDev.SetClipRegion(Region(rRect));
     564             : 
     565           0 :     rDev.DrawText( aPos, aText );
     566             : 
     567           0 :     if( rDev.IsClipRegion() )
     568           0 :         rDev.SetClipRegion();
     569           0 : }
     570             : 
     571           0 : EditBrowseBox::RowStatus OFieldExpressionControl::GetRowStatus(long nRow) const
     572             : {
     573           0 :     if (nRow >= 0 && nRow == m_nDataPos)
     574           0 :         return EditBrowseBox::CURRENT;
     575           0 :     if ( nRow != BROWSER_ENDOFSELECTION && nRow < static_cast<long>(m_aGroupPositions.size()) && m_aGroupPositions[nRow] != NO_GROUP )
     576             :     {
     577             :         try
     578             :         {
     579           0 :             uno::Reference< report::XGroup> xGroup = m_pParent->getGroup(m_aGroupPositions[nRow]);
     580           0 :             return (xGroup->getHeaderOn() || xGroup->getFooterOn())? EditBrowseBox::HEADERFOOTER : EditBrowseBox::CLEAN;
     581             :         }
     582           0 :         catch(uno::Exception&)
     583             :         {
     584             :             OSL_FAIL("Exception cathced while try to get a group!");
     585             :         }
     586             :     }
     587           0 :     return EditBrowseBox::CLEAN;
     588             : }
     589             : //  XEventListener
     590             : 
     591           0 : void SAL_CALL OFieldExpressionControl::disposing(const lang::EventObject& /*e*/) throw( uno::RuntimeException, std::exception )
     592             : {
     593           0 : }
     594             : 
     595             : // XContainerListener
     596             : 
     597           0 : void SAL_CALL OFieldExpressionControl::elementInserted(const container::ContainerEvent& evt) throw(uno::RuntimeException, std::exception)
     598             : {
     599           0 :     if ( m_bIgnoreEvent )
     600           0 :         return;
     601           0 :     SolarMutexGuard aSolarGuard;
     602           0 :     ::osl::MutexGuard aGuard( m_aMutex );
     603           0 :     sal_Int32 nGroupPos = 0;
     604           0 :     if ( evt.Accessor >>= nGroupPos )
     605             :     {
     606           0 :         if ( nGroupPos >= GetRowCount() )
     607             :         {
     608           0 :             sal_Int32 nAddedRows = nGroupPos - GetRowCount();
     609           0 :             RowInserted(nAddedRows);
     610           0 :             for (sal_Int32 i = 0; i < nAddedRows; ++i)
     611           0 :                 m_aGroupPositions.push_back(NO_GROUP);
     612           0 :             m_aGroupPositions[nGroupPos] = nGroupPos;
     613             :         }
     614             :         else
     615             :         {
     616           0 :             ::std::vector<sal_Int32>::iterator aFind = m_aGroupPositions.begin()+ nGroupPos;
     617           0 :             if ( aFind == m_aGroupPositions.end() )
     618           0 :                 aFind = ::std::find(m_aGroupPositions.begin(),m_aGroupPositions.end(),NO_GROUP);
     619             : 
     620           0 :             if ( aFind != m_aGroupPositions.end() )
     621             :             {
     622           0 :                 if ( *aFind != NO_GROUP )
     623           0 :                     aFind = m_aGroupPositions.insert(aFind,nGroupPos);
     624             :                 else
     625           0 :                     *aFind = nGroupPos;
     626             : 
     627           0 :                 ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.end();
     628           0 :                 for(++aFind;aFind != aEnd;++aFind)
     629           0 :                     if ( *aFind != NO_GROUP )
     630           0 :                         ++*aFind;
     631             :             }
     632             :         }
     633           0 :         Invalidate();
     634           0 :     }
     635             : }
     636             : 
     637           0 : void SAL_CALL OFieldExpressionControl::elementReplaced(const container::ContainerEvent& /*evt*/) throw(uno::RuntimeException, std::exception)
     638             : {
     639           0 : }
     640             : 
     641           0 : void SAL_CALL OFieldExpressionControl::elementRemoved(const container::ContainerEvent& evt) throw(uno::RuntimeException, std::exception)
     642             : {
     643           0 :     SolarMutexGuard aSolarGuard;
     644           0 :     ::osl::MutexGuard aGuard( m_aMutex );
     645             : 
     646           0 :     if ( m_bIgnoreEvent )
     647           0 :         return;
     648             : 
     649           0 :     sal_Int32 nGroupPos = 0;
     650           0 :     if ( evt.Accessor >>= nGroupPos )
     651             :     {
     652           0 :         ::std::vector<sal_Int32>::iterator aFind = ::std::find(m_aGroupPositions.begin(),m_aGroupPositions.end(),nGroupPos);
     653           0 :         if ( aFind != m_aGroupPositions.end() )
     654             :         {
     655           0 :             *aFind = NO_GROUP;
     656           0 :             ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.end();
     657           0 :             for(++aFind;aFind != aEnd;++aFind)
     658           0 :                 if ( *aFind != NO_GROUP )
     659           0 :                     --*aFind;
     660           0 :             Invalidate();
     661             :         }
     662           0 :     }
     663             : }
     664             : 
     665           0 : sal_Bool OFieldExpressionControl::IsDeleteAllowed( )
     666             : {
     667           0 :     return !m_pParent->isReadOnly() && GetSelectRowCount() > 0;
     668             : }
     669             : 
     670           0 : void OFieldExpressionControl::KeyInput( const KeyEvent& rEvt )
     671             : {
     672           0 :     if (IsDeleteAllowed())
     673             :     {
     674           0 :         if (rEvt.GetKeyCode().GetCode() == KEY_DELETE &&    // Delete rows
     675           0 :             !rEvt.GetKeyCode().IsShift() &&
     676           0 :             !rEvt.GetKeyCode().IsMod1())
     677             :         {
     678           0 :             DeleteRows();
     679           0 :             return;
     680             :         }
     681             :     }
     682           0 :     EditBrowseBox::KeyInput(rEvt);
     683             : }
     684             : 
     685           0 : void OFieldExpressionControl::Command(const CommandEvent& rEvt)
     686             : {
     687           0 :     switch (rEvt.GetCommand())
     688             :     {
     689             :         case COMMAND_CONTEXTMENU:
     690             :         {
     691           0 :             if (!rEvt.IsMouseEvent())
     692             :             {
     693           0 :                 EditBrowseBox::Command(rEvt);
     694           0 :                 return;
     695             :             }
     696             : 
     697           0 :             sal_uInt16 nColId = GetColumnAtXPosPixel(rEvt.GetMousePosPixel().X());
     698             : 
     699           0 :             if ( nColId == HANDLE_ID )
     700             :             {
     701           0 :                 PopupMenu aContextMenu(ModuleRes(RID_GROUPSROWPOPUPMENU));
     702           0 :                 sal_Bool bEnable = sal_False;
     703           0 :                 long nIndex = FirstSelectedRow();
     704           0 :                 while( nIndex >= 0 && !bEnable )
     705             :                 {
     706           0 :                     if ( m_aGroupPositions[nIndex] != NO_GROUP )
     707           0 :                         bEnable = sal_True;
     708           0 :                     nIndex = NextSelectedRow();
     709             :                 }
     710           0 :                 aContextMenu.EnableItem( SID_DELETE, IsDeleteAllowed() && bEnable );
     711           0 :                 switch (aContextMenu.Execute(this, rEvt.GetMousePosPixel()))
     712             :                 {
     713             :                     case SID_CUT:
     714           0 :                         cut();
     715           0 :                         break;
     716             :                     case SID_COPY:
     717           0 :                         copy();
     718           0 :                         break;
     719             :                     case SID_PASTE:
     720           0 :                         paste();
     721           0 :                         break;
     722             : 
     723             :                     case SID_DELETE:
     724           0 :                         if( m_nDeleteEvent )
     725           0 :                             Application::RemoveUserEvent( m_nDeleteEvent );
     726           0 :                         m_nDeleteEvent = Application::PostUserEvent( LINK(this, OFieldExpressionControl, DelayedDelete) );
     727           0 :                         break;
     728             :                     default:
     729           0 :                         break;
     730           0 :                 }
     731             :             }
     732             :             // run through
     733             :         }
     734             :         default:
     735           0 :             EditBrowseBox::Command(rEvt);
     736             :     }
     737             : 
     738             : }
     739             : 
     740           0 : void OFieldExpressionControl::DeleteRows()
     741             : {
     742             : 
     743           0 :     sal_Bool bIsEditing = IsEditing();
     744           0 :     if (bIsEditing)
     745             :     {
     746           0 :         DeactivateCell();
     747             :     }
     748           0 :     long nIndex = FirstSelectedRow();
     749           0 :     if (nIndex == -1)
     750             :     {
     751           0 :         nIndex = GetCurRow();
     752             :     }
     753           0 :     bool bFirstTime = true;
     754             : 
     755           0 :     long nOldDataPos = nIndex;
     756           0 :     uno::Sequence< beans::PropertyValue > aArgs(1);
     757           0 :     aArgs[0].Name = PROPERTY_GROUP;
     758           0 :     m_bIgnoreEvent = true;
     759           0 :     while( nIndex >= 0 )
     760             :     {
     761           0 :         if ( m_aGroupPositions[nIndex] != NO_GROUP )
     762             :         {
     763           0 :             if ( bFirstTime )
     764             :             {
     765           0 :                 bFirstTime = false;
     766           0 :                 OUString sUndoAction(ModuleRes(RID_STR_UNDO_REMOVE_SELECTION));
     767           0 :                 m_pParent->m_pController->getUndoManager().EnterListAction( sUndoAction, OUString() );
     768             :             }
     769             : 
     770           0 :             sal_Int32 nGroupPos = m_aGroupPositions[nIndex];
     771           0 :             uno::Reference< report::XGroup> xGroup = m_pParent->getGroup(nGroupPos);
     772           0 :             aArgs[0].Value <<= xGroup;
     773             :             // we use this way to create undo actions
     774           0 :             m_pParent->m_pController->executeChecked(SID_GROUP_REMOVE,aArgs);
     775             : 
     776           0 :             ::std::vector<sal_Int32>::iterator aFind = ::std::find(m_aGroupPositions.begin(),m_aGroupPositions.end(),nGroupPos);
     777           0 :             if (aFind != m_aGroupPositions.end())
     778             :             {
     779           0 :                 *aFind = NO_GROUP;
     780           0 :                 ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.end();
     781           0 :                 for(++aFind;aFind != aEnd;++aFind)
     782           0 :                     if ( *aFind != NO_GROUP )
     783           0 :                         --*aFind;
     784           0 :             }
     785             :         }
     786           0 :         nIndex = NextSelectedRow();
     787             :     }
     788             : 
     789           0 :     if ( !bFirstTime )
     790           0 :         m_pParent->m_pController->getUndoManager().LeaveListAction();
     791             : 
     792           0 :     m_nDataPos = GetCurRow();
     793           0 :     InvalidateStatusCell( nOldDataPos );
     794           0 :     InvalidateStatusCell( m_nDataPos );
     795           0 :     ActivateCell();
     796           0 :     m_pParent->DisplayData( m_nDataPos );
     797           0 :     m_bIgnoreEvent = false;
     798           0 :     Invalidate();
     799           0 : }
     800             : 
     801             : 
     802           0 : void OFieldExpressionControl::cut()
     803             : {
     804           0 :     copy();
     805           0 :     DeleteRows();
     806           0 : }
     807             : 
     808             : 
     809           0 : void OFieldExpressionControl::copy()
     810             : {
     811             : 
     812             :     // set to the right row and save it
     813           0 :     m_pParent->SaveData( m_nDataPos );
     814             : 
     815           0 :     uno::Sequence<uno::Any> aClipboardList = fillSelectedGroups();
     816             : 
     817           0 :     if( aClipboardList.getLength() )
     818             :     {
     819           0 :         OGroupExchange* pData = new OGroupExchange(aClipboardList);
     820           0 :         uno::Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
     821           0 :         pData->CopyToClipboard(GetParent());
     822           0 :     }
     823           0 : }
     824             : 
     825             : 
     826           0 : void OFieldExpressionControl::paste()
     827             : {
     828           0 :     TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
     829           0 :     if(aTransferData.HasFormat(OGroupExchange::getReportGroupId()))
     830             :     {
     831           0 :         if( m_nPasteEvent )
     832           0 :             Application::RemoveUserEvent( m_nPasteEvent );
     833           0 :         m_nPasteEvent = Application::PostUserEvent( LINK(this, OFieldExpressionControl, DelayedPaste) );
     834           0 :     }
     835           0 : }
     836             : 
     837           0 : IMPL_LINK( OFieldExpressionControl, DelayedPaste, void*,  )
     838             : {
     839           0 :     m_nPasteEvent = 0;
     840             : 
     841           0 :     sal_Int32 nPastePosition = GetSelectRowCount() ? FirstSelectedRow() : GetCurRow();
     842             : 
     843           0 :     InsertRows( nPastePosition );
     844           0 :     SetNoSelection();
     845           0 :     GoToRow( nPastePosition );
     846             : 
     847           0 :     return 0;
     848             : }
     849             : 
     850           0 : IMPL_LINK( OFieldExpressionControl, DelayedDelete, void*,  )
     851             : {
     852           0 :     m_nDeleteEvent = 0;
     853           0 :     DeleteRows();
     854           0 :     return 0;
     855             : }
     856             : 
     857           0 : void OFieldExpressionControl::InsertRows( long nRow )
     858             : {
     859             : 
     860           0 :     sal_Int32 nSize = 0;
     861             : 
     862             :     // get rows from clipboard
     863           0 :     TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
     864           0 :     if(aTransferData.HasFormat(OGroupExchange::getReportGroupId()))
     865             :     {
     866           0 :         datatransfer::DataFlavor aFlavor;
     867           0 :         SotExchange::GetFormatDataFlavor(OGroupExchange::getReportGroupId(), aFlavor);
     868           0 :         uno::Sequence< uno::Any > aGroups;
     869             : 
     870           0 :         if( (aTransferData.GetAny(aFlavor) >>= aGroups) && aGroups.getLength() )
     871             :         {
     872           0 :             m_bIgnoreEvent = false;
     873             :             {
     874           0 :                 const OUString sUndoAction(ModuleRes(RID_STR_UNDO_APPEND_GROUP));
     875           0 :                 const UndoContext aUndoContext( m_pParent->m_pController->getUndoManager(), sUndoAction );
     876             : 
     877           0 :                 uno::Reference<report::XGroups> xGroups = m_pParent->getGroups();
     878           0 :                 sal_Int32 nGroupPos = 0;
     879           0 :                 ::std::vector<sal_Int32>::iterator aIter = m_aGroupPositions.begin();
     880           0 :                 ::std::vector<sal_Int32>::size_type nRowPos = static_cast< ::std::vector<sal_Int32>::size_type >(nRow);
     881           0 :                 if ( nRowPos < m_aGroupPositions.size() )
     882             :                 {
     883           0 :                     ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.begin() + nRowPos;
     884           0 :                     for(;aIter != aEnd;++aIter)
     885             :                     {
     886           0 :                         if ( *aIter != NO_GROUP )
     887           0 :                             nGroupPos = *aIter;
     888             :                     }
     889             :                 }
     890           0 :                 for(sal_Int32 i=0;i < aGroups.getLength();++i,++nSize)
     891             :                 {
     892           0 :                     uno::Sequence< beans::PropertyValue > aArgs(2);
     893           0 :                     aArgs[0].Name = PROPERTY_GROUP;
     894           0 :                     aArgs[0].Value = aGroups[i];
     895           0 :                     aArgs[1].Name = PROPERTY_POSITIONY;
     896           0 :                     aArgs[1].Value <<= nGroupPos;
     897           0 :                     m_pParent->m_pController->executeChecked(SID_GROUP_APPEND,aArgs);
     898             : 
     899           0 :                     ::std::vector<sal_Int32>::iterator aInsertPos = m_aGroupPositions.insert(aIter,nGroupPos);
     900           0 :                     ++aInsertPos;
     901           0 :                     aIter = aInsertPos;
     902           0 :                     ::std::vector<sal_Int32>::iterator aEnd  = m_aGroupPositions.end();
     903           0 :                     for(;aInsertPos != aEnd;++aInsertPos)
     904           0 :                         if ( *aInsertPos != NO_GROUP )
     905           0 :                             ++*aInsertPos;
     906           0 :                 }
     907             :             }
     908           0 :             m_bIgnoreEvent = true;
     909           0 :         }
     910             :     }
     911             : 
     912           0 :     RowInserted( nRow, nSize, true );
     913           0 : }
     914             : 
     915             : 
     916             : 
     917             : // class OGroupsSortingDialog
     918             : 
     919           0 : OGroupsSortingDialog::OGroupsSortingDialog( Window* _pParent
     920             :                                            ,sal_Bool _bReadOnly
     921             :                                            ,OReportController* _pController)
     922             :     : FloatingWindow( _pParent, ModuleRes(RID_GROUPS_SORTING) )
     923             :     ,OPropertyChangeListener(m_aMutex)
     924             :     ,m_aFL2(this, ModuleRes(FL_SEPARATOR2) )
     925             :     ,m_aMove(this, ModuleRes(FT_MOVELABEL) )
     926             :     ,m_aToolBox(this, ModuleRes(TB_TOOLBOX) )
     927             : 
     928             :     ,m_aFL3(this, ModuleRes(FL_SEPARATOR3) )
     929             :     ,m_aOrder(this, ModuleRes(FT_ORDER) )
     930             :     ,m_aOrderLst(this, ModuleRes(LST_ORDER) )
     931             :     ,m_aHeader(this, ModuleRes(FT_HEADER) )
     932             :     ,m_aHeaderLst(this, ModuleRes(LST_HEADERLST) )
     933             :     ,m_aFooter(this, ModuleRes(FT_FOOTER) )
     934             :     ,m_aFooterLst(this, ModuleRes(LST_FOOTERLST) )
     935             :     ,m_aGroupOn(this, ModuleRes(FT_GROUPON) )
     936             :     ,m_aGroupOnLst(this, ModuleRes(LST_GROUPONLST) )
     937             :     ,m_aGroupInterval(this, ModuleRes(FT_GROUPINTERVAL) )
     938             :     ,m_aGroupIntervalEd(this, ModuleRes(ED_GROUPINTERVALLST) )
     939             :     ,m_aKeepTogether(this, ModuleRes(FT_KEEPTOGETHER) )
     940             :     ,m_aKeepTogetherLst(this, ModuleRes(LST_KEEPTOGETHERLST) )
     941             :     ,m_aFL(this, ModuleRes(FL_SEPARATOR1) )
     942             :     ,m_aHelpWindow(this, ModuleRes(HELP_FIELD) )
     943           0 :     ,m_pFieldExpression( new OFieldExpressionControl(this,ModuleRes(WND_CONTROL)))
     944             :     ,m_pController(_pController)
     945             :     ,m_pCurrentGroupListener(NULL)
     946           0 :     ,m_xGroups(m_pController->getReportDefinition()->getGroups())
     947           0 :     ,m_bReadOnly(_bReadOnly)
     948             : {
     949             : 
     950           0 :     Control* pControlsLst[] = { &m_aHeaderLst, &m_aFooterLst, &m_aGroupOnLst, &m_aKeepTogetherLst, &m_aOrderLst, &m_aGroupIntervalEd};
     951           0 :     for (size_t i = 0; i < sizeof (pControlsLst) / sizeof (pControlsLst[0]); ++i)
     952             :     {
     953           0 :         pControlsLst[i]->SetGetFocusHdl(LINK(this, OGroupsSortingDialog, OnControlFocusGot));
     954           0 :         pControlsLst[i]->SetLoseFocusHdl(LINK(this, OGroupsSortingDialog, OnControlFocusLost));
     955           0 :         pControlsLst[i]->Show(true);
     956             :     }
     957             : 
     958           0 :     for (size_t i = 0; i < (sizeof (pControlsLst) / sizeof (pControlsLst[0])) - 1; ++i)
     959           0 :         static_cast<ListBox*>(pControlsLst[i])->SetSelectHdl(LINK(this,OGroupsSortingDialog,LBChangeHdl));
     960             : 
     961             :     Control* pControls[]    = { &m_aHeader, &m_aFooter, &m_aGroupOn, &m_aGroupInterval, &m_aKeepTogether, &m_aOrder
     962           0 :                                 , &m_aMove,&m_aFL2};
     963           0 :     sal_Int32 nMaxTextWidth = 0;
     964           0 :     MnemonicGenerator aMnemonicGenerator;
     965           0 :     for (size_t i = 0; i < sizeof (pControlsLst) / sizeof (pControlsLst[0]); ++i)
     966           0 :         aMnemonicGenerator.RegisterMnemonic( pControls[i]->GetText() );
     967             : 
     968           0 :     for (size_t i = 0; i < sizeof (pControlsLst) / sizeof (pControlsLst[0]); ++i)
     969             :     {
     970           0 :         pControls[i]->Show(true);
     971           0 :         OUString sText = pControls[i]->GetText();
     972           0 :         OUString sNewText = aMnemonicGenerator.CreateMnemonic(sText);
     973           0 :         if ( sText != sNewText )
     974           0 :             pControls[i]->SetText(sNewText);
     975           0 :         sal_Int32 nTextWidth = GetTextWidth(sNewText);
     976           0 :         nMaxTextWidth = ::std::max<sal_Int32>(nTextWidth,nMaxTextWidth);
     977           0 :     }
     978             : 
     979           0 :     Size aSize(UNRELATED_CONTROLS, PAGE_HEIGHT);
     980           0 :     Size aSpace = LogicToPixel( aSize, MAP_APPFONT );
     981           0 :     Size aOutSize(nMaxTextWidth + m_aHeader.GetSizePixel().Width() + 3*aSpace.Width(),aSpace.Height());
     982           0 :     SetMinOutputSizePixel(aOutSize);
     983           0 :     SetOutputSizePixel(aOutSize);
     984             : 
     985           0 :     m_pReportListener = new OPropertyChangeMultiplexer(this,m_pController->getReportDefinition().get());
     986           0 :     m_pReportListener->addProperty(PROPERTY_COMMAND);
     987           0 :     m_pReportListener->addProperty(PROPERTY_COMMANDTYPE);
     988             : 
     989           0 :     m_pFieldExpression->lateInit();
     990           0 :     fillColumns();
     991           0 :     m_pFieldExpression->Show();
     992             : 
     993           0 :     m_aHelpWindow.SetControlBackground( GetSettings().GetStyleSettings().GetFaceColor() );
     994             : 
     995           0 :     m_pFieldExpression->SetZOrder(&m_aFL2, WINDOW_ZORDER_BEHIND);
     996             : 
     997           0 :     m_aMove.SetZOrder(m_pFieldExpression, WINDOW_ZORDER_BEHIND);
     998           0 :     m_aToolBox.SetStyle(m_aToolBox.GetStyle()|WB_LINESPACING);
     999           0 :     m_aToolBox.SetSelectHdl(LINK(this, OGroupsSortingDialog, OnFormatAction));
    1000           0 :     m_aToolBox.SetImageListProvider(this);
    1001           0 :     setToolBox(&m_aToolBox);
    1002             : 
    1003           0 :     checkButtons(0);
    1004           0 :     Resize();
    1005             : 
    1006           0 :     FreeResource();
    1007           0 : }
    1008             : 
    1009             : 
    1010           0 : OGroupsSortingDialog::~OGroupsSortingDialog()
    1011             : {
    1012           0 :     delete m_pFieldExpression;
    1013           0 :     m_xColumns.clear();
    1014           0 :     m_pReportListener->dispose();
    1015           0 :     if ( m_pCurrentGroupListener.is() )
    1016           0 :         m_pCurrentGroupListener->dispose();
    1017           0 : }
    1018             : 
    1019           0 : sal_Bool OGroupsSortingDialog::isReadOnly( ) const
    1020             : {
    1021           0 :     return m_bReadOnly;
    1022             : }
    1023             : 
    1024           0 : void OGroupsSortingDialog::UpdateData( )
    1025             : {
    1026           0 :     m_pFieldExpression->Invalidate();
    1027           0 :     long nCurRow = m_pFieldExpression->GetCurRow();
    1028           0 :     m_pFieldExpression->DeactivateCell();
    1029           0 :     m_pFieldExpression->ActivateCell(nCurRow, m_pFieldExpression->GetCurColumnId());
    1030           0 :     DisplayData(nCurRow);
    1031           0 : }
    1032             : 
    1033           0 : void OGroupsSortingDialog::DisplayData( sal_Int32 _nRow )
    1034             : {
    1035           0 :     sal_Int32 nGroupPos = m_pFieldExpression->getGroupPosition(_nRow);
    1036           0 :     sal_Bool bEmpty = nGroupPos == NO_GROUP;
    1037           0 :     m_aHeaderLst.Enable(!bEmpty);
    1038           0 :     m_aFooterLst.Enable(!bEmpty);
    1039           0 :     m_aGroupOnLst.Enable(!bEmpty);
    1040           0 :     m_aGroupIntervalEd.Enable(!bEmpty);
    1041           0 :     m_aKeepTogetherLst.Enable(!bEmpty);
    1042           0 :     m_aOrderLst.Enable(!bEmpty);
    1043             : 
    1044           0 :     m_aFL3.Enable(!bEmpty);
    1045           0 :     m_aHeader.Enable(!bEmpty);
    1046           0 :     m_aFooter.Enable(!bEmpty);
    1047           0 :     m_aGroupOn.Enable(!bEmpty);
    1048           0 :     m_aGroupInterval.Enable(!bEmpty);
    1049           0 :     m_aKeepTogether.Enable(!bEmpty);
    1050           0 :     m_aOrder.Enable(!bEmpty);
    1051             : 
    1052           0 :     checkButtons(_nRow);
    1053             : 
    1054           0 :     if ( m_pCurrentGroupListener.is() )
    1055           0 :         m_pCurrentGroupListener->dispose();
    1056           0 :     m_pCurrentGroupListener = NULL;
    1057           0 :     if ( !bEmpty && nGroupPos != NO_GROUP )
    1058             :     {
    1059           0 :         uno::Reference< report::XGroup> xGroup = getGroup(nGroupPos);
    1060             : 
    1061           0 :         m_pCurrentGroupListener = new OPropertyChangeMultiplexer(this,xGroup.get());
    1062           0 :         m_pCurrentGroupListener->addProperty(PROPERTY_HEADERON);
    1063           0 :         m_pCurrentGroupListener->addProperty(PROPERTY_FOOTERON);
    1064             : 
    1065           0 :         displayGroup(xGroup);
    1066             :     }
    1067           0 : }
    1068             : 
    1069           0 : void OGroupsSortingDialog::SaveData( sal_Int32 _nRow)
    1070             : {
    1071           0 :     sal_Int32 nGroupPos = m_pFieldExpression->getGroupPosition(_nRow);
    1072           0 :     if ( nGroupPos == NO_GROUP )
    1073           0 :         return;
    1074             : 
    1075           0 :     uno::Reference< report::XGroup> xGroup = getGroup(nGroupPos);
    1076           0 :     if ( m_aHeaderLst.GetSavedValue() != m_aHeaderLst.GetSelectEntryPos() )
    1077           0 :         xGroup->setHeaderOn( m_aHeaderLst.GetSelectEntryPos() == 0 );
    1078           0 :     if ( m_aFooterLst.GetSavedValue() != m_aFooterLst.GetSelectEntryPos() )
    1079           0 :         xGroup->setFooterOn( m_aFooterLst.GetSelectEntryPos() == 0 );
    1080           0 :     if ( m_aKeepTogetherLst.GetSavedValue() != m_aKeepTogetherLst.GetSelectEntryPos() )
    1081           0 :         xGroup->setKeepTogether( m_aKeepTogetherLst.GetSelectEntryPos() );
    1082           0 :     if ( m_aGroupOnLst.GetSavedValue() != m_aGroupOnLst.GetSelectEntryPos() )
    1083             :     {
    1084           0 :         sal_Int16 nGroupOn = static_cast<sal_Int16>(reinterpret_cast<sal_IntPtr>(m_aGroupOnLst.GetEntryData(m_aGroupOnLst.GetSelectEntryPos())));
    1085           0 :         xGroup->setGroupOn( nGroupOn );
    1086             :     }
    1087           0 :     if ( m_aGroupIntervalEd.GetSavedValue().toInt32() != m_aGroupIntervalEd.GetValue() )
    1088             :     {
    1089           0 :         xGroup->setGroupInterval( static_cast<sal_Int32>(m_aGroupIntervalEd.GetValue()) );
    1090           0 :         m_aGroupIntervalEd.SaveValue();
    1091             :     }
    1092           0 :     if ( m_aOrderLst.GetSavedValue() != m_aOrderLst.GetSelectEntryPos() )
    1093           0 :         xGroup->setSortAscending( m_aOrderLst.GetSelectEntryPos() == 0 );
    1094             : 
    1095           0 :     ListBox* pControls[] = { &m_aHeaderLst,&m_aFooterLst,&m_aGroupOnLst,&m_aKeepTogetherLst,&m_aOrderLst};
    1096           0 :     for (size_t i = 0; i < sizeof(pControls)/sizeof(pControls[0]); ++i)
    1097           0 :         pControls[i]->SaveValue();
    1098             : }
    1099             : 
    1100             : 
    1101           0 : sal_Int32 OGroupsSortingDialog::getColumnDataType(const OUString& _sColumnName)
    1102             : {
    1103           0 :     sal_Int32 nDataType = sdbc::DataType::VARCHAR;
    1104             :     try
    1105             :     {
    1106           0 :         if ( !m_xColumns.is() )
    1107           0 :             fillColumns();
    1108           0 :         if ( m_xColumns.is() && m_xColumns->hasByName(_sColumnName) )
    1109             :         {
    1110           0 :             uno::Reference< beans::XPropertySet> xColumn(m_xColumns->getByName(_sColumnName),uno::UNO_QUERY);
    1111           0 :             if ( xColumn.is() )
    1112           0 :                 xColumn->getPropertyValue(PROPERTY_TYPE) >>= nDataType;
    1113             :         }
    1114             :     }
    1115           0 :     catch(uno::Exception&)
    1116             :     {
    1117             :         OSL_FAIL("Eception caught while getting the type of a column");
    1118             :     }
    1119             : 
    1120           0 :     return nDataType;
    1121             : }
    1122             : 
    1123           0 : IMPL_LINK(OGroupsSortingDialog, OnControlFocusGot, Control*, pControl )
    1124             : {
    1125           0 :     if ( m_pFieldExpression && m_pFieldExpression->getExpressionControl() )
    1126             :     {
    1127           0 :         Control* pControls[] = { m_pFieldExpression->getExpressionControl(),&m_aHeaderLst,&m_aFooterLst,&m_aGroupOnLst,&m_aGroupIntervalEd,&m_aKeepTogetherLst,&m_aOrderLst};
    1128           0 :         for (size_t i = 0; i < sizeof(pControls)/sizeof(pControls[0]); ++i)
    1129             :         {
    1130           0 :             if ( pControl == pControls[i] )
    1131             :             {
    1132           0 :                 ListBox* pListBox = dynamic_cast< ListBox* >( pControl );
    1133           0 :                 if ( pListBox )
    1134           0 :                     pListBox->SaveValue();
    1135           0 :                 NumericField* pNumericField = dynamic_cast< NumericField* >( pControl );
    1136           0 :                 if ( pNumericField )
    1137           0 :                     pNumericField->SaveValue();
    1138           0 :                 showHelpText(static_cast<sal_uInt16>(i+STR_RPT_HELP_FIELD));
    1139           0 :                 break;
    1140             :             }
    1141             :         }
    1142             :     }
    1143           0 :     return 0L;
    1144             : }
    1145             : 
    1146           0 : IMPL_LINK(OGroupsSortingDialog, OnControlFocusLost, Control*, pControl )
    1147             : {
    1148           0 :     if ( m_pFieldExpression && pControl == &m_aGroupIntervalEd )
    1149             :     {
    1150           0 :         if ( m_aGroupIntervalEd.IsModified() )
    1151           0 :             SaveData(m_pFieldExpression->GetCurRow());
    1152             :     }
    1153           0 :     return 0L;
    1154             : }
    1155             : 
    1156           0 : IMPL_LINK( OGroupsSortingDialog, OnFormatAction, ToolBox*, /*NOTINTERESTEDIN*/ )
    1157             : {
    1158             : 
    1159           0 :     sal_uInt16 nCommand = m_aToolBox.GetCurItemId();
    1160             : 
    1161           0 :     if ( m_pFieldExpression )
    1162             :     {
    1163           0 :         long nIndex = m_pFieldExpression->GetCurrRow();
    1164           0 :         sal_Int32 nGroupPos = m_pFieldExpression->getGroupPosition(nIndex);
    1165           0 :         uno::Sequence<uno::Any> aClipboardList;
    1166           0 :         if ( nIndex >= 0 && nGroupPos != NO_GROUP )
    1167             :         {
    1168           0 :             aClipboardList.realloc(1);
    1169           0 :             aClipboardList[0] = m_xGroups->getByIndex(nGroupPos);
    1170             :         }
    1171           0 :         if ( nCommand == SID_RPT_GROUPSORT_MOVE_UP )
    1172             :         {
    1173           0 :             --nIndex;
    1174             :         }
    1175           0 :         if ( nCommand == SID_RPT_GROUPSORT_MOVE_DOWN )
    1176             :         {
    1177           0 :             ++nIndex;
    1178             :         }
    1179           0 :         if ( nCommand == SID_RPT_GROUPSORT_DELETE )
    1180             :         {
    1181           0 :             Application::PostUserEvent( LINK(m_pFieldExpression, OFieldExpressionControl, DelayedDelete) );
    1182             :         }
    1183             :         else
    1184             :         {
    1185           0 :             if ( nIndex >= 0 && aClipboardList.getLength() )
    1186             :             {
    1187           0 :                 m_pFieldExpression->SetNoSelection();
    1188           0 :                 m_pFieldExpression->moveGroups(aClipboardList,nIndex,sal_False);
    1189           0 :                 m_pFieldExpression->DeactivateCell();
    1190           0 :                 m_pFieldExpression->GoToRow(nIndex);
    1191           0 :                 m_pFieldExpression->ActivateCell(nIndex, m_pFieldExpression->GetCurColumnId());
    1192           0 :                 DisplayData(nIndex);
    1193             :             }
    1194           0 :         }
    1195             :     }
    1196           0 :     return 1L;
    1197             : }
    1198             : 
    1199           0 : IMPL_LINK( OGroupsSortingDialog, LBChangeHdl, ListBox*, pListBox )
    1200             : {
    1201           0 :     if ( pListBox->GetSavedValue() != pListBox->GetSelectEntryPos() )
    1202             :     {
    1203           0 :         sal_Int32 nRow = m_pFieldExpression->GetCurRow();
    1204           0 :         sal_Int32 nGroupPos = m_pFieldExpression->getGroupPosition(nRow);
    1205           0 :         if ( pListBox != &m_aHeaderLst && pListBox != &m_aFooterLst)
    1206             :         {
    1207           0 :             if ( pListBox->GetSavedValue() != pListBox->GetSelectEntryPos() )
    1208           0 :                 SaveData(nRow);
    1209           0 :             if ( pListBox == &m_aGroupOnLst )
    1210           0 :                 m_aGroupIntervalEd.Enable( pListBox->GetSelectEntryPos() != 0 );
    1211             :         }
    1212           0 :         else if ( nGroupPos != NO_GROUP )
    1213             :         {
    1214           0 :             uno::Reference< report::XGroup> xGroup = getGroup(nGroupPos);
    1215           0 :             uno::Sequence< beans::PropertyValue > aArgs(2);
    1216           0 :             aArgs[1].Name = PROPERTY_GROUP;
    1217           0 :             aArgs[1].Value <<= xGroup;
    1218             : 
    1219           0 :             if ( &m_aHeaderLst  == pListBox )
    1220           0 :                 aArgs[0].Name = PROPERTY_HEADERON;
    1221             :             else
    1222           0 :                 aArgs[0].Name = PROPERTY_FOOTERON;
    1223             : 
    1224           0 :             aArgs[0].Value <<= pListBox->GetSelectEntryPos() == 0;
    1225           0 :             m_pController->executeChecked(&m_aHeaderLst  == pListBox ? SID_GROUPHEADER : SID_GROUPFOOTER,aArgs);
    1226           0 :             m_pFieldExpression->InvalidateHandleColumn();
    1227             :         }
    1228             :     }
    1229           0 :     return 1L;
    1230             : }
    1231             : 
    1232           0 : void OGroupsSortingDialog::showHelpText(sal_uInt16 _nResId)
    1233             : {
    1234           0 :     m_aHelpWindow.SetText(OUString(ModuleRes(_nResId)));
    1235           0 : }
    1236             : 
    1237           0 : void OGroupsSortingDialog::_propertyChanged(const beans::PropertyChangeEvent& _rEvent) throw( uno::RuntimeException)
    1238             : {
    1239           0 :     uno::Reference< report::XGroup > xGroup(_rEvent.Source,uno::UNO_QUERY);
    1240           0 :     if ( xGroup.is() )
    1241           0 :         displayGroup(xGroup);
    1242             :     else
    1243           0 :         fillColumns();
    1244           0 : }
    1245             : 
    1246           0 : void OGroupsSortingDialog::fillColumns()
    1247             : {
    1248           0 :     m_xColumns = m_pController->getColumns();
    1249           0 :     m_pFieldExpression->fillColumns(m_xColumns);
    1250           0 : }
    1251             : 
    1252           0 : void OGroupsSortingDialog::displayGroup(const uno::Reference<report::XGroup>& _xGroup)
    1253             : {
    1254           0 :     m_aHeaderLst.SelectEntryPos(_xGroup->getHeaderOn() ? 0 : 1 );
    1255           0 :     m_aFooterLst.SelectEntryPos(_xGroup->getFooterOn() ? 0 : 1 );
    1256           0 :     sal_Int32 nDataType = getColumnDataType(_xGroup->getExpression());
    1257             : 
    1258             :     // first clear whole group on list
    1259           0 :     while(m_aGroupOnLst.GetEntryCount() > 1 )
    1260             :     {
    1261           0 :         m_aGroupOnLst.RemoveEntry(1);
    1262             :     }
    1263             : 
    1264           0 :     switch(nDataType)
    1265             :     {
    1266             :         case sdbc::DataType::LONGVARCHAR:
    1267             :         case sdbc::DataType::VARCHAR:
    1268             :         case sdbc::DataType::CHAR:
    1269           0 :             m_aGroupOnLst.InsertEntry(OUString(ModuleRes(STR_RPT_PREFIXCHARS)));
    1270           0 :             m_aGroupOnLst.SetEntryData(1,reinterpret_cast<void*>(report::GroupOn::PREFIX_CHARACTERS));
    1271           0 :             break;
    1272             :         case sdbc::DataType::DATE:
    1273             :         case sdbc::DataType::TIME:
    1274             :         case sdbc::DataType::TIMESTAMP:
    1275             :             {
    1276           0 :                 sal_uInt16 nIds[] = { STR_RPT_YEAR, STR_RPT_QUARTER,STR_RPT_MONTH,STR_RPT_WEEK,STR_RPT_DAY,STR_RPT_HOUR,STR_RPT_MINUTE };
    1277           0 :                 for (sal_uInt16 i = 0; i < sizeof (nIds) / sizeof (nIds[0]); ++i)
    1278             :                 {
    1279           0 :                     m_aGroupOnLst.InsertEntry(OUString(ModuleRes(nIds[i])));
    1280           0 :                     m_aGroupOnLst.SetEntryData(i+1,reinterpret_cast<void*>(i+2));
    1281             :                 }
    1282             :             }
    1283           0 :             break;
    1284             :         default:
    1285           0 :             m_aGroupOnLst.InsertEntry(OUString(ModuleRes(STR_RPT_INTERVAL)));
    1286           0 :             m_aGroupOnLst.SetEntryData(1,reinterpret_cast<void*>(report::GroupOn::INTERVAL));
    1287           0 :             break;
    1288             :     }
    1289           0 :     sal_Int32 nPos = 0;
    1290           0 :     switch(_xGroup->getGroupOn())
    1291             :     {
    1292             :         case report::GroupOn::DEFAULT:
    1293           0 :             nPos = 0;
    1294           0 :             break;
    1295             :         case report::GroupOn::PREFIX_CHARACTERS:
    1296           0 :             nPos = 1;
    1297           0 :             break;
    1298             :         case report::GroupOn::YEAR:
    1299           0 :             nPos = 1;
    1300           0 :             break;
    1301             :         case report::GroupOn::QUARTAL:
    1302           0 :             nPos = 2;
    1303           0 :             break;
    1304             :         case report::GroupOn::MONTH:
    1305           0 :             nPos = 3;
    1306           0 :             break;
    1307             :         case report::GroupOn::WEEK:
    1308           0 :             nPos = 4;
    1309           0 :             break;
    1310             :         case report::GroupOn::DAY:
    1311           0 :             nPos = 5;
    1312           0 :             break;
    1313             :         case report::GroupOn::HOUR:
    1314           0 :             nPos = 6;
    1315           0 :             break;
    1316             :         case report::GroupOn::MINUTE:
    1317           0 :             nPos = 7;
    1318           0 :             break;
    1319             :         case report::GroupOn::INTERVAL:
    1320           0 :             nPos = 1;
    1321           0 :             break;
    1322             :         default:
    1323           0 :             nPos = 0;
    1324             :     }
    1325           0 :     m_aGroupOnLst.SelectEntryPos(nPos);
    1326           0 :     m_aGroupIntervalEd.SetText(OUString::number(_xGroup->getGroupInterval()));
    1327           0 :     m_aGroupIntervalEd.SaveValue();
    1328           0 :     m_aGroupIntervalEd.Enable( nPos != 0 );
    1329           0 :     m_aKeepTogetherLst.SelectEntryPos(_xGroup->getKeepTogether());
    1330           0 :     m_aOrderLst.SelectEntryPos(_xGroup->getSortAscending() ? 0 : 1);
    1331             : 
    1332           0 :     ListBox* pControls[] = { &m_aHeaderLst,&m_aFooterLst,&m_aGroupOnLst,&m_aKeepTogetherLst,&m_aOrderLst};
    1333           0 :     for (size_t i = 0; i < sizeof(pControls)/sizeof(pControls[0]); ++i)
    1334           0 :         pControls[i]->SaveValue();
    1335             : 
    1336           0 :     ListBox* pControlsLst2[] = { &m_aHeaderLst, &m_aFooterLst,  &m_aGroupOnLst, &m_aKeepTogetherLst,&m_aOrderLst};
    1337           0 :     sal_Bool bReadOnly = !m_pController->isEditable();
    1338           0 :     for (size_t i = 0; i < sizeof(pControlsLst2)/sizeof(pControlsLst2[0]); ++i)
    1339           0 :         pControlsLst2[i]->SetReadOnly(bReadOnly);
    1340           0 :     m_aGroupIntervalEd.SetReadOnly(bReadOnly);
    1341           0 : }
    1342             : 
    1343           0 : void OGroupsSortingDialog::Resize()
    1344             : {
    1345           0 :     Window::Resize();
    1346           0 :     Size aTotalOutputSize = GetOutputSizePixel();
    1347           0 :     Size aSpace = LogicToPixel( Size( UNRELATED_CONTROLS, UNRELATED_CONTROLS ), MAP_APPFONT );
    1348           0 :     m_pFieldExpression->SetSizePixel(Size(aTotalOutputSize.Width() - 2*aSpace.Width(),m_pFieldExpression->GetSizePixel().Height()));
    1349             : 
    1350           0 :     Control* pControlsLst[] = { &m_aHeaderLst,  &m_aFooterLst,  &m_aGroupOnLst, &m_aGroupIntervalEd,&m_aKeepTogetherLst,&m_aOrderLst};
    1351           0 :     Control* pControls[]    = { &m_aHeader,     &m_aFooter,     &m_aGroupOn,    &m_aGroupInterval,  &m_aKeepTogether,   &m_aOrder};
    1352           0 :     sal_Int32 nMaxTextWidth = 0;
    1353           0 :     for (size_t i = 0; i < sizeof (pControlsLst) / sizeof (pControlsLst[0]); ++i)
    1354             :     {
    1355           0 :         nMaxTextWidth = ::std::max<sal_Int32>(static_cast<sal_Int32>(GetTextWidth(pControls[i]->GetText())),nMaxTextWidth);
    1356             :     }
    1357             : 
    1358           0 :     for (size_t i = 0; i < sizeof (pControlsLst) / sizeof (pControlsLst[0]); ++i)
    1359             :     {
    1360           0 :         pControls[i]->SetSizePixel(Size(nMaxTextWidth,pControls[i]->GetSizePixel().Height()));
    1361           0 :         Point aPos = pControls[i]->GetPosPixel();
    1362           0 :         aPos.X() += nMaxTextWidth + aSpace.Width();
    1363           0 :         aPos.Y() = pControlsLst[i]->GetPosPixel().Y();
    1364             : 
    1365           0 :         pControlsLst[i]->SetPosSizePixel(aPos,Size(aTotalOutputSize.Width() - aPos.X() - aSpace.Width(),pControlsLst[i]->GetSizePixel().Height()));
    1366             :     }
    1367             : 
    1368           0 :     m_aFL.SetSizePixel(Size(aTotalOutputSize.Width() - aSpace.Width(),m_aFL.GetSizePixel().Height()));
    1369           0 :     m_aFL2.SetSizePixel(Size(aTotalOutputSize.Width() - aSpace.Width(),m_aFL2.GetSizePixel().Height()));
    1370           0 :     m_aFL3.SetSizePixel(Size(aTotalOutputSize.Width() - aSpace.Width(),m_aFL3.GetSizePixel().Height()));
    1371           0 :     sal_Int32 nPos = aTotalOutputSize.Width() - aSpace.Width() - m_aToolBox.GetSizePixel().Width();
    1372           0 :     m_aToolBox.SetPosPixel(Point(nPos,m_aToolBox.GetPosPixel().Y()));
    1373             : 
    1374           0 :     Point aHelpPos = m_aHelpWindow.GetPosPixel();
    1375           0 :     m_aHelpWindow.SetSizePixel(Size(aTotalOutputSize.Width() - aHelpPos.X(),aTotalOutputSize.Height() - aHelpPos.Y()));
    1376           0 : }
    1377             : 
    1378           0 : void OGroupsSortingDialog::checkButtons(sal_Int32 _nRow)
    1379             : {
    1380           0 :     sal_Int32 nGroupCount = m_xGroups->getCount();
    1381           0 :     sal_Int32 nRowCount = m_pFieldExpression->GetRowCount();
    1382           0 :     sal_Bool bEnabled = nGroupCount > 1;
    1383             : 
    1384           0 :     if (bEnabled && _nRow > 0 )
    1385             :     {
    1386           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_MOVE_UP, true);
    1387             :     }
    1388             :     else
    1389             :     {
    1390           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_MOVE_UP, false);
    1391             :     }
    1392           0 :     if (bEnabled && _nRow < (nRowCount - 1) )
    1393             :     {
    1394           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_MOVE_DOWN, true);
    1395             :     }
    1396             :     else
    1397             :     {
    1398           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_MOVE_DOWN, false);
    1399             :     }
    1400             : 
    1401           0 :     sal_Int32 nGroupPos = m_pFieldExpression->getGroupPosition(_nRow);
    1402           0 :     if ( nGroupPos != NO_GROUP )
    1403             :     {
    1404           0 :         sal_Bool bEnableDelete = nGroupCount > 0;
    1405           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_DELETE, bEnableDelete);
    1406             :     }
    1407             :     else
    1408             :     {
    1409           0 :         m_aToolBox.EnableItem(SID_RPT_GROUPSORT_DELETE, false);
    1410             :     }
    1411           0 : }
    1412             : 
    1413           0 : ImageList OGroupsSortingDialog::getImageList(sal_Int16 _eBitmapSet) const
    1414             : {
    1415           0 :     sal_Int16 nN = IMG_CONDFORMAT_DLG_SC;
    1416           0 :     if ( _eBitmapSet == SFX_SYMBOLS_SIZE_LARGE )
    1417           0 :         nN = IMG_CONDFORMAT_DLG_LC;
    1418           0 :     return ImageList(ModuleRes( nN ));
    1419             : }
    1420             : 
    1421             : 
    1422           0 : void OGroupsSortingDialog::resizeControls(const Size& _rDiff)
    1423             : {
    1424             :     // we use large images so we must change them
    1425           0 :     if ( _rDiff.Width() || _rDiff.Height() )
    1426             :     {
    1427           0 :         Invalidate();
    1428             :     }
    1429           0 : }
    1430             : 
    1431             : 
    1432             : // load the images
    1433           0 : ImageList OGroupsSortingDialog::getImageList(vcl::ImageListType) SAL_THROW (( com::sun::star::lang::IllegalArgumentException ))
    1434             : {
    1435           0 :     return ImageList(ModuleRes(IMGLST_GROUPSORT_DLG_SC));
    1436             : }
    1437             : 
    1438             : 
    1439             : } // rptui
    1440             : 
    1441             : 
    1442             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10