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