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

Generated by: LCOV version 1.10