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: */
|