1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include "precompiled_reportdesign.hxx"
24 #include "AddField.hxx"
25 #include "UITools.hxx"
26 #include <svx/dbaexchange.hxx>
27 #include <svx/svdpagv.hxx>
28 #include <com/sun/star/sdb/CommandType.hpp>
29 #include <com/sun/star/util/URL.hpp>
30 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
31 #include <com/sun/star/util/URL.hpp>
32 #include <com/sun/star/i18n/XCollator.hpp>
33 
34 #include <vcl/waitobj.hxx>
35 #include <vcl/svapp.hxx>
36 #include <tools/diagnose_ex.h>
37 #include <comphelper/stl_types.hxx>
38 #include "rptui_slotid.hrc"
39 
40 #include <connectivity/dbtools.hxx>
41 #include "helpids.hrc"
42 #include "RptResId.hrc"
43 #include "CondFormat.hrc"
44 #include "ModuleHelper.hxx"
45 #include "uistrings.hrc"
46 #include "ColumnInfo.hxx"
47 
48 #include <comphelper/property.hxx>
49 #include <svtools/imgdef.hxx>
50 
51 namespace rptui
52 {
53 const long STD_WIN_SIZE_X = 180;
54 const long STD_WIN_SIZE_Y = 320;
55 
56 const long LISTBOX_BORDER = 2;
57 
58 using namespace ::com::sun::star;
59 using namespace sdbc;
60 using namespace sdb;
61 using namespace uno;
62 using namespace datatransfer;
63 using namespace beans;
64 using namespace lang;
65 using namespace container;
66 using namespace ::svx;
67 
68 class OAddFieldWindowListBox	: public SvTreeListBox
69 {
70 	OAddFieldWindow*                    m_pTabWin;
71 
72     OAddFieldWindowListBox(const OAddFieldWindowListBox&);
73     void operator =(const OAddFieldWindowListBox&);
74 protected:
75 //	virtual void Command( const CommandEvent& rEvt );
76 
77 public:
78 	OAddFieldWindowListBox( OAddFieldWindow* _pParent );
79 	virtual ~OAddFieldWindowListBox();
80 
81 	sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
82 	sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
83 
84     uno::Sequence< beans::PropertyValue > getSelectedFieldDescriptors();
85 
86 protected:
87 	// DragSourceHelper
88 	virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel );
89 
90 private:
91     using SvTreeListBox::ExecuteDrop;
92 };
93 // -----------------------------------------------------------------------------
94 uno::Sequence< beans::PropertyValue > OAddFieldWindowListBox::getSelectedFieldDescriptors()
95 {
96     uno::Sequence< beans::PropertyValue > aArgs(GetSelectionCount());
97     sal_Int32 i = 0;
98 	SvLBoxEntry* pSelected = FirstSelected();
99 	while( pSelected )
100 	{
101 		// build a descriptor for the currently selected field
102         ::svx::ODataAccessDescriptor aDescriptor;
103         m_pTabWin->fillDescriptor(pSelected,aDescriptor);
104         aArgs[i++].Value <<= aDescriptor.createPropertyValueSequence();
105         pSelected = NextSelected(pSelected);
106 	}
107     return aArgs;
108 }
109 //==================================================================
110 // class OAddFieldWindowListBox
111 //==================================================================
112 DBG_NAME( rpt_OAddFieldWindowListBox );
113 //------------------------------------------------------------------------------
114 OAddFieldWindowListBox::OAddFieldWindowListBox( OAddFieldWindow* _pParent )
115 	:SvTreeListBox( _pParent, WB_TABSTOP|WB_BORDER|WB_SORT )
116 	,m_pTabWin( _pParent )
117 {
118 	DBG_CTOR( rpt_OAddFieldWindowListBox,NULL);
119 	SetHelpId( HID_RPT_FIELD_SEL );
120     SetSelectionMode(MULTIPLE_SELECTION);
121     SetDragDropMode( 0xFFFF );
122 	SetHighlightRange( );
123 }
124 
125 //------------------------------------------------------------------------------
126 OAddFieldWindowListBox::~OAddFieldWindowListBox()
127 {
128 	DBG_DTOR( rpt_OAddFieldWindowListBox,NULL);
129 }
130 
131 //------------------------------------------------------------------------------
132 sal_Int8 OAddFieldWindowListBox::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
133 {
134 	return DND_ACTION_NONE;
135 }
136 
137 //------------------------------------------------------------------------------
138 sal_Int8 OAddFieldWindowListBox::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
139 {
140 	return DND_ACTION_NONE;
141 }
142 
143 //------------------------------------------------------------------------------
144 void OAddFieldWindowListBox::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ )
145 {
146 	if ( GetSelectionCount() < 1 )
147 		// no drag without a field
148 		return;
149 
150     OMultiColumnTransferable* pDataContainer = new OMultiColumnTransferable(getSelectedFieldDescriptors());
151     Reference< XTransferable> xEnsureDelete = pDataContainer;
152 
153 	EndSelection();
154 	pDataContainer->StartDrag( this, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
155 }
156 //========================================================================
157 // class OAddFieldWindow
158 //========================================================================
159 DBG_NAME( rpt_OAddFieldWindow );
160 //-----------------------------------------------------------------------
161 OAddFieldWindow::OAddFieldWindow(Window* pParent
162                                  ,const uno::Reference< beans::XPropertySet >& _xRowSet
163                                  )
164 			:FloatingWindow(pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE))
165 			,::comphelper::OPropertyChangeListener(m_aMutex)
166             ,::comphelper::OContainerListener(m_aMutex)
167             ,m_xRowSet(_xRowSet)
168             ,m_aActions(this,ModuleRes(RID_TB_SORTING))
169             ,m_pListBox(new OAddFieldWindowListBox( this ))
170             ,m_aFixedLine(this, ModuleRes(ADDFIELD_FL_HELP_SEPARATOR) )
171             ,m_aHelpText(this, ModuleRes(ADDFIELD_HELP_FIELD) )
172             ,m_aInsertButton(this, WB_TABSTOP|WB_CENTER)
173 			,m_nCommandType(0)
174             ,m_bEscapeProcessing(sal_False)
175 			,m_pChangeListener(NULL)
176 			,m_pContainerListener(NULL)
177 {
178 	DBG_CTOR( rpt_OAddFieldWindow,NULL);
179 	SetHelpId( HID_RPT_FIELD_SEL_WIN );
180 	SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetFaceColor()) );
181     SetMinOutputSizePixel(Size(STD_WIN_SIZE_X,STD_WIN_SIZE_Y));
182 
183     m_aActions.SetStyle(m_aActions.GetStyle()|WB_LINESPACING);
184     m_aActions.SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetFaceColor()) );
185 
186     m_aActions.SetSelectHdl(LINK(this, OAddFieldWindow, OnSortAction));
187     setToolBox(&m_aActions);
188     m_aActions.CheckItem(SID_FM_SORTUP);
189     m_aActions.EnableItem(SID_ADD_CONTROL_PAIR, sal_False);
190 
191     m_pListBox->SetDoubleClickHdl(LINK( this, OAddFieldWindow, OnDoubleClickHdl ) );
192     m_pListBox->SetSelectHdl(LINK( this, OAddFieldWindow, OnSelectHdl ) );
193     m_pListBox->SetDeselectHdl(LINK( this, OAddFieldWindow, OnSelectHdl ) );
194     m_pListBox->SetDoubleClickHdl(LINK( this, OAddFieldWindow, OnDoubleClickHdl ) );
195 	m_pListBox->Show();
196     const String sTitle(ModuleRes(RID_STR_INSERT));
197     m_aInsertButton.SetText(sTitle);
198     m_aInsertButton.SetClickHdl(LINK( this, OAddFieldWindow, OnDoubleClickHdl ) );
199     m_aInsertButton.Show();
200 
201     m_aFixedLine.SetControlBackground( GetSettings().GetStyleSettings().GetFaceColor() );
202     m_aHelpText.SetControlBackground( GetSettings().GetStyleSettings().GetFaceColor() );
203 
204     SetSizePixel(Size(STD_WIN_SIZE_X,STD_WIN_SIZE_Y));
205     //Show();
206 
207     if ( m_xRowSet.is() )
208     {
209         try
210         {
211             // be notified when the settings of report definition change
212 	        m_pChangeListener = new ::comphelper::OPropertyChangeMultiplexer( this, m_xRowSet );
213 	        m_pChangeListener->addProperty( PROPERTY_COMMAND );
214 	        m_pChangeListener->addProperty( PROPERTY_COMMANDTYPE );
215 	        m_pChangeListener->addProperty( PROPERTY_ESCAPEPROCESSING );
216 	        m_pChangeListener->addProperty( PROPERTY_FILTER );
217         }
218         catch( const Exception& )
219         {
220     	    DBG_UNHANDLED_EXCEPTION();
221         }
222     }
223 }
224 
225 //-----------------------------------------------------------------------
226 OAddFieldWindow::~OAddFieldWindow()
227 {
228     if ( m_pListBox.get() )
229     {
230         SvLBoxTreeList*	pModel = m_pListBox->GetModel();
231         sal_uLong nCount = pModel->GetEntryCount();
232         for(sal_uLong i = 0; i< nCount;++i)
233         {
234             delete static_cast<ColumnInfo*>(pModel->GetEntry(i)->GetUserData());
235         }
236     }
237 	if (m_pChangeListener.is())
238 		m_pChangeListener->dispose();
239     if ( m_pContainerListener.is() )
240         m_pContainerListener->dispose();
241 	DBG_DTOR( rpt_OAddFieldWindow,NULL);
242 }
243 
244 //-----------------------------------------------------------------------
245 void OAddFieldWindow::GetFocus()
246 {
247 	if ( m_pListBox.get() )
248 		m_pListBox->GrabFocus();
249 	else
250 		FloatingWindow::GetFocus();
251 }
252 //-----------------------------------------------------------------------
253 uno::Sequence< beans::PropertyValue > OAddFieldWindow::getSelectedFieldDescriptors()
254 {
255     return m_pListBox->getSelectedFieldDescriptors();
256 }
257 
258 //-----------------------------------------------------------------------
259 long OAddFieldWindow::PreNotify( NotifyEvent& _rNEvt )
260 {
261 	if ( EVENT_KEYINPUT == _rNEvt.GetType() )
262 	{
263 		const KeyCode& rKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode();
264 		if ( ( 0 == rKeyCode.GetModifier() ) && ( KEY_RETURN == rKeyCode.GetCode() ) )
265 		{
266 			if ( m_aCreateLink.IsSet() )
267             {
268                 m_aCreateLink.Call(this);
269 				return 1;
270             }
271 		}
272 	}
273 
274 	return FloatingWindow::PreNotify( _rNEvt );
275 }
276 //-----------------------------------------------------------------------
277 void OAddFieldWindow::_propertyChanged( const beans::PropertyChangeEvent& _evt ) throw( uno::RuntimeException )
278 {
279     OSL_ENSURE( _evt.Source == m_xRowSet, "OAddFieldWindow::_propertyChanged: where did this come from?" );
280 	(void)_evt;
281 	Update();
282 }
283 
284 //-----------------------------------------------------------------------
285 namespace
286 {
287     void lcl_addToList( OAddFieldWindowListBox& _rListBox, const uno::Sequence< ::rtl::OUString >& _rEntries )
288     {
289 		const ::rtl::OUString* pEntries = _rEntries.getConstArray();
290 		sal_Int32 nEntries = _rEntries.getLength();
291 		for ( sal_Int32 i = 0; i < nEntries; ++i, ++pEntries )
292 			_rListBox.InsertEntry( *pEntries,NULL,sal_False,LIST_APPEND,new ColumnInfo(*pEntries) );
293     }
294     void lcl_addToList( OAddFieldWindowListBox& _rListBox, const uno::Reference< container::XNameAccess>& i_xColumns )
295     {
296         uno::Sequence< ::rtl::OUString > aEntries = i_xColumns->getElementNames();
297 		const ::rtl::OUString* pEntries = aEntries.getConstArray();
298 		sal_Int32 nEntries = aEntries.getLength();
299 		for ( sal_Int32 i = 0; i < nEntries; ++i, ++pEntries )
300         {
301             uno::Reference< beans::XPropertySet> xColumn(i_xColumns->getByName(*pEntries),UNO_QUERY_THROW);
302             ::rtl::OUString sLabel;
303             if ( xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_LABEL) )
304                 xColumn->getPropertyValue(PROPERTY_LABEL) >>= sLabel;
305             if ( sLabel.getLength() )
306 			    _rListBox.InsertEntry( sLabel,NULL,sal_False,LIST_APPEND,new ColumnInfo(*pEntries,sLabel) );
307             else
308                 _rListBox.InsertEntry( *pEntries,NULL,sal_False,LIST_APPEND,new ColumnInfo(*pEntries,sLabel) );
309         }
310     }
311 }
312 
313 //-----------------------------------------------------------------------
314 void OAddFieldWindow::Update()
315 {
316     if ( m_pContainerListener.is() )
317         m_pContainerListener->dispose();
318     m_pContainerListener = NULL;
319     m_xColumns.clear();
320 
321     try
322     {
323         // ListBox loeschen
324 	    m_pListBox->Clear();
325         const sal_uInt16 nItemCount = m_aActions.GetItemCount();
326         for (sal_uInt16 j = 0; j< nItemCount; ++j)
327         {
328             m_aActions.EnableItem(m_aActions.GetItemId(j),sal_False);
329         }
330 
331 	    String aTitle(ModuleRes(RID_STR_FIELDSELECTION));
332 	    SetText(aTitle);
333         if ( m_xRowSet.is() )
334         {
335             ::rtl::OUString sCommand( m_aCommandName );
336             sal_Int32       nCommandType( m_nCommandType );
337             sal_Bool        bEscapeProcessing( m_bEscapeProcessing );
338             ::rtl::OUString sFilter( m_sFilter );
339 
340             OSL_VERIFY( m_xRowSet->getPropertyValue( PROPERTY_COMMAND ) >>= sCommand );
341             OSL_VERIFY( m_xRowSet->getPropertyValue( PROPERTY_COMMANDTYPE ) >>= nCommandType );
342             OSL_VERIFY( m_xRowSet->getPropertyValue( PROPERTY_ESCAPEPROCESSING ) >>= bEscapeProcessing );
343             OSL_VERIFY( m_xRowSet->getPropertyValue( PROPERTY_FILTER ) >>= sFilter );
344 
345 	        m_aCommandName	= sCommand;
346 	        m_nCommandType 	= nCommandType;
347             m_bEscapeProcessing = bEscapeProcessing;
348             m_sFilter = sFilter;
349 
350             // add the columns to the list
351             uno::Reference< sdbc::XConnection> xCon = getConnection();
352 	        if ( xCon.is() && m_aCommandName.getLength() )
353 			    m_xColumns = dbtools::getFieldsByCommandDescriptor( xCon, GetCommandType(), GetCommand(), m_xHoldAlive );
354             if ( m_xColumns.is() )
355             {
356                 lcl_addToList( *m_pListBox, m_xColumns );
357                 uno::Reference< container::XContainer> xContainer(m_xColumns,uno::UNO_QUERY);
358                 if ( xContainer.is() )
359                     m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer);
360             }
361 
362             // add the parameter columns to the list
363             uno::Reference< ::com::sun::star::sdbc::XRowSet > xRowSet(m_xRowSet,uno::UNO_QUERY);
364             Sequence< ::rtl::OUString > aParamNames( getParameterNames( xRowSet ) );
365             lcl_addToList( *m_pListBox, aParamNames );
366 
367             // set title
368 	        aTitle.AppendAscii(" ");
369 	        aTitle += m_aCommandName.getStr();
370 	        SetText( aTitle );
371             if ( m_aCommandName.getLength() )
372             {
373                 for (sal_uInt16 i = 0; i < nItemCount; ++i)
374                 {
375                     m_aActions.EnableItem(m_aActions.GetItemId(i));
376                 }
377             }
378                 OnSelectHdl(NULL);
379         }
380     }
381     catch( const Exception& )
382     {
383         DBG_UNHANDLED_EXCEPTION();
384     }
385 }
386 
387 //-----------------------------------------------------------------------
388 void OAddFieldWindow::Resize()
389 {
390 	FloatingWindow::Resize();
391 
392 	const Size aWindowSize( GetOutputSizePixel() );
393 
394 
395     const Size aRelated(LogicToPixel( Size( RELATED_CONTROLS, RELATED_CONTROLS ), MAP_APPFONT ));
396     const Size aFixedTextSize(LogicToPixel( Size( FIXEDTEXT_WIDTH, FIXEDTEXT_HEIGHT ), MAP_APPFONT ));
397 
398     // ToolBar
399     Size aToolbarSize( m_aActions.GetSizePixel() );
400     Point aToolbarPos( aRelated.Width(), aRelated.Height());
401     m_aActions.SetPosPixel(Point(aToolbarPos.X(), aToolbarPos.Y()));
402 
403     Size aLBSize( aWindowSize );
404 	aLBSize.Width()  -= ( 2 * aRelated.Width() );
405 
406     // help text
407     const Size aHelpTextSize = m_aHelpText.CalcMinimumSize(aLBSize.Width());
408 
409     // ListBox
410 	Point aLBPos( aRelated.Width(), aRelated.Height() + aToolbarSize.Height() + aRelated.Height() );
411 
412 	aLBSize.Height() -= aToolbarSize.Height();   //         Toolbar
413 	aLBSize.Height() -= (6*aRelated.Height());   //         6 * gap
414     aLBSize.Height() -= aFixedTextSize.Height(); //         fixed line
415     aLBSize.Height() -= aHelpTextSize.Height();  //         help text
416 	m_pListBox->SetPosSizePixel( aLBPos, aLBSize );
417 
418     // FixedLine
419 	Size aFLSize( aLBSize.Width(),aFixedTextSize.Height() );
420     Point aFLPos( aRelated.Width(), aLBPos.Y() + aLBSize.Height() + aRelated.Height());
421     m_aFixedLine.SetPosSizePixel( aFLPos, aFLSize );
422 
423     // Help text
424     Point aFTPos( aRelated.Width(), aFLPos.Y() + aFLSize.Height() + aRelated.Height() );
425     m_aHelpText.SetPosSizePixel( aFTPos, aHelpTextSize );
426 }
427 // -----------------------------------------------------------------------------
428 uno::Reference< sdbc::XConnection> OAddFieldWindow::getConnection() const
429 {
430     return uno::Reference< sdbc::XConnection>(m_xRowSet->getPropertyValue( PROPERTY_ACTIVECONNECTION ),uno::UNO_QUERY);
431 }
432 // -----------------------------------------------------------------------------
433 void OAddFieldWindow::fillDescriptor(SvLBoxEntry* _pSelected,::svx::ODataAccessDescriptor& _rDescriptor)
434 {
435     if ( _pSelected && m_xColumns.is() )
436     {
437         uno::Reference<container::XChild> xChild(getConnection(),uno::UNO_QUERY);
438         if ( xChild.is( ) )
439         {
440             uno::Reference<sdb::XDocumentDataSource> xDocument( xChild->getParent(), uno::UNO_QUERY );
441             if ( xDocument.is() )
442             {
443                 uno::Reference<frame::XModel> xModel(xDocument->getDatabaseDocument(),uno::UNO_QUERY);
444                 if ( xModel.is() )
445                     _rDescriptor[ daDatabaseLocation ] <<= xModel->getURL();
446             } // if ( xDocument.is() )
447         }
448 
449         _rDescriptor[ ::svx::daCommand ]            <<= GetCommand();
450         _rDescriptor[ ::svx::daCommandType ]        <<= GetCommandType();
451         _rDescriptor[ ::svx::daEscapeProcessing ]   <<= GetEscapeProcessing();
452         _rDescriptor[ ::svx::daConnection ]         <<= getConnection();
453 
454         ColumnInfo* pInfo = static_cast<ColumnInfo*>(_pSelected->GetUserData());
455         // ::rtl::OUString sColumnName = m_pListBox->GetEntryText( _pSelected );
456         _rDescriptor[ ::svx::daColumnName ]         <<= pInfo->sColumnName;
457         if ( m_xColumns->hasByName( pInfo->sColumnName ) )
458             _rDescriptor[ ::svx::daColumnObject ] <<= m_xColumns->getByName(pInfo->sColumnName);
459     }
460 }
461 // -----------------------------------------------------------------------------
462 void OAddFieldWindow::_elementInserted( const container::ContainerEvent& _rEvent )  throw(::com::sun::star::uno::RuntimeException)
463 {
464     if ( m_pListBox.get() )
465     {
466         ::rtl::OUString sName;
467         if ( (_rEvent.Accessor >>= sName) && m_xColumns->hasByName(sName) )
468         {
469             uno::Reference< beans::XPropertySet> xColumn(m_xColumns->getByName(sName),UNO_QUERY_THROW);
470             ::rtl::OUString sLabel;
471             if ( xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_LABEL) )
472                 xColumn->getPropertyValue(PROPERTY_LABEL) >>= sLabel;
473             if ( sLabel.getLength() )
474 			    m_pListBox->InsertEntry( sLabel,NULL,sal_False,LIST_APPEND,new ColumnInfo(sName,sLabel) );
475             else
476                 m_pListBox->InsertEntry( sName,NULL,sal_False,LIST_APPEND,new ColumnInfo(sName,sLabel) );
477         }
478     }
479 }
480 // -----------------------------------------------------------------------------
481 void OAddFieldWindow::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
482 {
483     if ( m_pListBox.get() )
484     {
485         m_pListBox->Clear();
486         if ( m_xColumns.is() )
487             lcl_addToList( *m_pListBox, m_xColumns );
488     }
489 }
490 // -----------------------------------------------------------------------------
491 void OAddFieldWindow::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
492 {
493 }
494 // -----------------------------------------------------------------------------
495 IMPL_LINK( OAddFieldWindow, OnSelectHdl, void* ,/*_pAddFieldDlg*/)
496 {
497     m_aActions.EnableItem(SID_ADD_CONTROL_PAIR, ( m_pListBox.get() && m_pListBox->GetSelectionCount() > 0 ));
498 
499     return 0L;
500 }
501 // -----------------------------------------------------------------------------
502 IMPL_LINK( OAddFieldWindow, OnDoubleClickHdl, void* ,/*_pAddFieldDlg*/)
503 {
504     if ( m_aCreateLink.IsSet() )
505         m_aCreateLink.Call(this);
506 
507     return 0L;
508 }
509 //------------------------------------------------------------------------------
510 ImageList OAddFieldWindow::getImageList(sal_Int16 _eBitmapSet,sal_Bool _bHiContast) const
511 {
512     sal_Int16 nN = IMG_ADDFIELD_DLG_SC;
513     sal_Int16 nH = IMG_ADDFIELD_DLG_SCH;
514     if ( _eBitmapSet == SFX_SYMBOLS_SIZE_LARGE )
515     {
516         nN = IMG_ADDFIELD_DLG_LC;
517         nH = IMG_ADDFIELD_DLG_LCH;
518     }
519     return ImageList(ModuleRes( _bHiContast ? nH : nN ));
520 }
521 //------------------------------------------------------------------
522 void OAddFieldWindow::resizeControls(const Size& _rDiff)
523 {
524     // we use large images so we must change them
525     if ( _rDiff.Width() || _rDiff.Height() )
526     {
527         Invalidate();
528     }
529 }
530 //------------------------------------------------------------------
531 IMPL_LINK( OAddFieldWindow, OnSortAction, ToolBox*, /*NOTINTERESTEDIN*/ )
532 {
533     const sal_uInt16 nCurItem = m_aActions.GetCurItemId();
534     if ( SID_ADD_CONTROL_PAIR == nCurItem )
535         OnDoubleClickHdl(NULL);
536     else
537     {
538         if ( SID_FM_REMOVE_FILTER_SORT == nCurItem || !m_aActions.IsItemChecked(nCurItem) )
539         {
540             const sal_uInt16 nItemCount = m_aActions.GetItemCount();
541             for (sal_uInt16 j = 0; j< nItemCount; ++j)
542             {
543                 const sal_uInt16 nItemId = m_aActions.GetItemId(j);
544                 if ( nCurItem != nItemId )
545                     m_aActions.CheckItem(nItemId,sal_False);
546             }
547             SvSortMode eSortMode = SortNone;
548             if ( SID_FM_REMOVE_FILTER_SORT != nCurItem )
549             {
550                 m_aActions.CheckItem(nCurItem,!m_aActions.IsItemChecked(nCurItem));
551                 if ( m_aActions.IsItemChecked(SID_FM_SORTUP) )
552                     eSortMode = SortAscending;
553                 else if ( m_aActions.IsItemChecked(SID_FM_SORTDOWN) )
554                     eSortMode = SortDescending;
555             } // if ( SID_FM_REMOVE_FILTER_SORT != nCurItem )
556 
557             m_pListBox->GetModel()->SetSortMode(eSortMode);
558             if ( SID_FM_REMOVE_FILTER_SORT == nCurItem )
559                 Update();
560 
561             m_pListBox->GetModel()->Resort();
562         }
563     }
564     return 0L;
565 }
566 // -----------------------------------------------------------------------------
567 // =============================================================================
568 } // namespace rptui
569 // =============================================================================
570 
571