1cde9e8dcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3cde9e8dcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4cde9e8dcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5cde9e8dcSAndrew Rist  * distributed with this work for additional information
6cde9e8dcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7cde9e8dcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8cde9e8dcSAndrew Rist  * "License"); you may not use this file except in compliance
9cde9e8dcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cde9e8dcSAndrew Rist  *
11cde9e8dcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cde9e8dcSAndrew Rist  *
13cde9e8dcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14cde9e8dcSAndrew Rist  * software distributed under the License is distributed on an
15cde9e8dcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16cde9e8dcSAndrew Rist  * KIND, either express or implied.  See the License for the
17cde9e8dcSAndrew Rist  * specific language governing permissions and limitations
18cde9e8dcSAndrew Rist  * under the License.
19cde9e8dcSAndrew Rist  *
20cde9e8dcSAndrew Rist  *************************************************************/
21cde9e8dcSAndrew Rist 
22cde9e8dcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_chart2.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // header for class SvNumberformat
28cdf0e10cSrcweir #ifndef _ZFORMAT_HXX
29cdf0e10cSrcweir #ifndef _ZFORLIST_DECLARE_TABLE
30cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir #include <svl/zformat.hxx>
33cdf0e10cSrcweir #endif
34cdf0e10cSrcweir // header for SvNumberFormatter
35cdf0e10cSrcweir #include <svl/zforlist.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "DataBrowser.hxx"
38cdf0e10cSrcweir #include "DataBrowserModel.hxx"
39cdf0e10cSrcweir #include "Strings.hrc"
40cdf0e10cSrcweir #include "ContainerHelper.hxx"
41cdf0e10cSrcweir #include "DataSeriesHelper.hxx"
42cdf0e10cSrcweir #include "DiagramHelper.hxx"
43cdf0e10cSrcweir #include "ChartModelHelper.hxx"
44cdf0e10cSrcweir #include "CommonConverters.hxx"
45cdf0e10cSrcweir #include "macros.hxx"
46cdf0e10cSrcweir #include "NumberFormatterWrapper.hxx"
47cdf0e10cSrcweir #include "servicenames_charttypes.hxx"
48cdf0e10cSrcweir #include "ResId.hxx"
49cdf0e10cSrcweir #include "Bitmaps.hrc"
50cdf0e10cSrcweir #include "Bitmaps_HC.hrc"
51cdf0e10cSrcweir #include "HelpIds.hrc"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <vcl/fixed.hxx>
54cdf0e10cSrcweir #include <vcl/image.hxx>
55cdf0e10cSrcweir #include <vcl/msgbox.hxx>
56cdf0e10cSrcweir #include <rtl/math.hxx>
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #include <com/sun/star/util/XCloneable.hpp>
59cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp>
60cdf0e10cSrcweir #include <com/sun/star/chart2/XChartType.hpp>
61cdf0e10cSrcweir 
62cdf0e10cSrcweir #include <com/sun/star/container/XIndexReplace.hpp>
63cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormats.hpp>
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #include <algorithm>
66cdf0e10cSrcweir #include <functional>
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #define SELECT_IMAGE(name,hc) Image( SchResId( hc ? name ## _HC : name ))
69cdf0e10cSrcweir 
70cdf0e10cSrcweir /*  BROWSER_COLUMNSELECTION :  single cells may be selected rather than only
71cdf0e10cSrcweir                                entire rows
72cdf0e10cSrcweir     BROWSER_(H|V)LINES :       show horizontal or vertical grid-lines
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     BROWSER_AUTO_(H|V)SCROLL : scroll automated horizontally or vertically when
75cdf0e10cSrcweir                                cursor is moved beyond the edge of the dialog
76cdf0e10cSrcweir     BROWSER_HIGHLIGHT_NONE :   Do not mark the current row with selection color
77cdf0e10cSrcweir                                (usually blue)
78cdf0e10cSrcweir 
79cdf0e10cSrcweir  */
80cdf0e10cSrcweir #define BROWSER_STANDARD_FLAGS  \
81cdf0e10cSrcweir     BROWSER_COLUMNSELECTION | \
82cdf0e10cSrcweir     BROWSER_HLINES | BROWSER_VLINES | \
83cdf0e10cSrcweir     BROWSER_AUTO_HSCROLL | BROWSER_AUTO_VSCROLL | \
84cdf0e10cSrcweir     BROWSER_HIGHLIGHT_NONE
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // BROWSER_HIDECURSOR would prevent flickering in edit fields, but navigating
87cdf0e10cSrcweir // with shift up/down, and entering non-editable cells would be problematic,
88cdf0e10cSrcweir // e.g.  the first cell, or when being in read-only mode
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 
91cdf0e10cSrcweir using namespace ::com::sun::star;
92cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
93cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
94cdf0e10cSrcweir using ::rtl::OUString;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir using namespace ::svt;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir namespace
99cdf0e10cSrcweir {
lcl_getRowInData(long nRow)100cdf0e10cSrcweir sal_Int32 lcl_getRowInData( long nRow )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir     return static_cast< sal_Int32 >( nRow );
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
lcl_getColumnInData(sal_uInt16 nCol)105cdf0e10cSrcweir sal_Int32 lcl_getColumnInData( sal_uInt16 nCol )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir     return static_cast< sal_Int32 >( nCol ) - 1;
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir } // anonymous namespace
111cdf0e10cSrcweir 
112cdf0e10cSrcweir // --------------------------------------------------------------------------------
113cdf0e10cSrcweir 
114cdf0e10cSrcweir namespace chart
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 
117cdf0e10cSrcweir // ----------------------------------------
118cdf0e10cSrcweir namespace impl
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 
121cdf0e10cSrcweir class SeriesHeaderEdit : public Edit
122cdf0e10cSrcweir {
123cdf0e10cSrcweir public:
124cdf0e10cSrcweir     SeriesHeaderEdit( Window * pParent );
125cdf0e10cSrcweir     virtual ~SeriesHeaderEdit();
126cdf0e10cSrcweir     virtual void MouseButtonDown( const MouseEvent& rMEvt );
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     void setStartColumn( sal_Int32 nStartColumn );
129cdf0e10cSrcweir     sal_Int32 getStartColumn() const;
130cdf0e10cSrcweir     void SetShowWarningBox( bool bShowWarning = true );
131cdf0e10cSrcweir 
132cdf0e10cSrcweir private:
133cdf0e10cSrcweir     sal_Int32 m_nStartColumn;
134cdf0e10cSrcweir     bool m_bShowWarningBox;
135cdf0e10cSrcweir };
136cdf0e10cSrcweir 
SeriesHeaderEdit(Window * pParent)137cdf0e10cSrcweir SeriesHeaderEdit::SeriesHeaderEdit( Window * pParent ) :
138cdf0e10cSrcweir         Edit( pParent ),
139cdf0e10cSrcweir         m_nStartColumn( 0 ),
140cdf0e10cSrcweir         m_bShowWarningBox( false )
141cdf0e10cSrcweir {}
~SeriesHeaderEdit()142cdf0e10cSrcweir SeriesHeaderEdit::~SeriesHeaderEdit()
143cdf0e10cSrcweir {}
144cdf0e10cSrcweir 
setStartColumn(sal_Int32 nStartColumn)145cdf0e10cSrcweir void SeriesHeaderEdit::setStartColumn( sal_Int32 nStartColumn )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     m_nStartColumn = nStartColumn;
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
getStartColumn() const150cdf0e10cSrcweir sal_Int32 SeriesHeaderEdit::getStartColumn() const
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     return m_nStartColumn;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
SetShowWarningBox(bool bShowWarning)155cdf0e10cSrcweir void SeriesHeaderEdit::SetShowWarningBox( bool bShowWarning )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir     m_bShowWarningBox = bShowWarning;
158cdf0e10cSrcweir }
159cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)160cdf0e10cSrcweir void SeriesHeaderEdit::MouseButtonDown( const MouseEvent& rMEvt )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir     Edit::MouseButtonDown( rMEvt );
163cdf0e10cSrcweir 
164cdf0e10cSrcweir     if( m_bShowWarningBox )
165cdf0e10cSrcweir         WarningBox( this, WinBits( WB_OK ),
166cdf0e10cSrcweir                     String( SchResId( STR_INVALID_NUMBER ))).Execute();
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
169cdf0e10cSrcweir class SeriesHeader
170cdf0e10cSrcweir {
171cdf0e10cSrcweir public:
172cdf0e10cSrcweir     explicit SeriesHeader( Window * pParent );
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     void SetColor( const Color & rCol );
175cdf0e10cSrcweir     void SetPos( const Point & rPos );
176cdf0e10cSrcweir     void SetWidth( sal_Int32 nWidth );
177cdf0e10cSrcweir     void SetChartType( const Reference< chart2::XChartType > & xChartType,
178cdf0e10cSrcweir                        bool bSwapXAndYAxis,
179cdf0e10cSrcweir                        bool bIsHighContrast );
180cdf0e10cSrcweir     void SetSeriesName( const String & rName );
181cdf0e10cSrcweir     void SetRange( sal_Int32 nStartCol, sal_Int32 nEndCol );
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     void SetPixelPosX( sal_Int32 nPos );
184cdf0e10cSrcweir     void SetPixelWidth( sal_Int32 nWidth );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     sal_Int32 GetStartColumn() const;
187cdf0e10cSrcweir     sal_Int32 GetEndColumn() const;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     static sal_Int32 GetRelativeAppFontXPosForNameField();
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     void Show();
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     /** call this before destroying the class.  This notifies the listeners to
194cdf0e10cSrcweir         changes of the edit field for the series name.
195cdf0e10cSrcweir      */
196cdf0e10cSrcweir     void applyChanges();
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 	void SetGetFocusHdl( const Link& rLink );
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	void SetEditChangedHdl( const Link & rLink );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir     bool HasFocus() const;
203cdf0e10cSrcweir 
204cdf0e10cSrcweir private:
205cdf0e10cSrcweir     ::boost::shared_ptr< FixedImage >        m_spSymbol;
206cdf0e10cSrcweir     ::boost::shared_ptr< SeriesHeaderEdit >  m_spSeriesName;
207cdf0e10cSrcweir     ::boost::shared_ptr< FixedText >         m_spColorBar;
208cdf0e10cSrcweir     OutputDevice *                           m_pDevice;
209cdf0e10cSrcweir     Link                                     m_aChangeLink;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     void notifyChanges();
212cdf0e10cSrcweir     DECL_LINK( SeriesNameChanged, void * );
213cdf0e10cSrcweir     DECL_LINK( SeriesNameEdited, void * );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     /// @param bHC </sal_True> for hight-contrast image
216cdf0e10cSrcweir     static Image GetChartTypeImage(
217cdf0e10cSrcweir         const Reference< chart2::XChartType > & xChartType,
218cdf0e10cSrcweir         bool bSwapXAndYAxis,
219cdf0e10cSrcweir         bool bHC );
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     sal_Int32 m_nStartCol, m_nEndCol;
222cdf0e10cSrcweir     sal_Int32 m_nWidth;
223cdf0e10cSrcweir     Point     m_aPos;
224cdf0e10cSrcweir     bool      m_bSeriesNameChangePending;
225cdf0e10cSrcweir };
226cdf0e10cSrcweir 
SeriesHeader(Window * pParent)227cdf0e10cSrcweir SeriesHeader::SeriesHeader( Window * pParent ) :
228cdf0e10cSrcweir         m_spSymbol( new FixedImage( pParent, WB_NOBORDER )),
229cdf0e10cSrcweir         m_spSeriesName( new SeriesHeaderEdit( pParent )),
230cdf0e10cSrcweir         m_spColorBar( new FixedText( pParent, WB_NOBORDER )),
231cdf0e10cSrcweir         m_pDevice( pParent ),
232cdf0e10cSrcweir         m_nStartCol( 0 ),
233cdf0e10cSrcweir         m_nEndCol( 0 ),
234cdf0e10cSrcweir         m_nWidth( 42 ),
235cdf0e10cSrcweir         m_aPos( 0, 22 ),
236cdf0e10cSrcweir         m_bSeriesNameChangePending( false )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     m_spSeriesName->EnableUpdateData( 4 * EDIT_UPDATEDATA_TIMEOUT ); // define is in vcl/edit.hxx
239cdf0e10cSrcweir     m_spSeriesName->SetUpdateDataHdl( LINK( this, SeriesHeader, SeriesNameChanged ));
240cdf0e10cSrcweir     m_spSeriesName->SetModifyHdl( LINK( this, SeriesHeader, SeriesNameEdited ));
241cdf0e10cSrcweir     m_spSeriesName->SetHelpId( HID_SCH_DATA_SERIES_LABEL );
242cdf0e10cSrcweir     Show();
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
notifyChanges()245cdf0e10cSrcweir void SeriesHeader::notifyChanges()
246cdf0e10cSrcweir {
247cdf0e10cSrcweir     if( m_aChangeLink.IsSet())
248cdf0e10cSrcweir 		m_aChangeLink.Call( m_spSeriesName.get());
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     m_bSeriesNameChangePending = false;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
applyChanges()253cdf0e10cSrcweir void SeriesHeader::applyChanges()
254cdf0e10cSrcweir {
255cdf0e10cSrcweir     if( m_bSeriesNameChangePending )
256cdf0e10cSrcweir     {
257cdf0e10cSrcweir         notifyChanges();
258cdf0e10cSrcweir     }
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
SetColor(const Color & rCol)261cdf0e10cSrcweir void SeriesHeader::SetColor( const Color & rCol )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     m_spColorBar->SetControlBackground( rCol );
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
266cdf0e10cSrcweir const sal_Int32 nSymbolHeight = 10;
267cdf0e10cSrcweir const sal_Int32 nSymbolDistance = 2;
268cdf0e10cSrcweir 
GetRelativeAppFontXPosForNameField()269cdf0e10cSrcweir sal_Int32 SeriesHeader::GetRelativeAppFontXPosForNameField()
270cdf0e10cSrcweir {
271cdf0e10cSrcweir     return nSymbolHeight + nSymbolDistance;
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
SetPos(const Point & rPos)274cdf0e10cSrcweir void SeriesHeader::SetPos( const Point & rPos )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir     m_aPos = rPos;
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     // chart type symbol
279cdf0e10cSrcweir     Point aPos( rPos );
280cdf0e10cSrcweir     aPos.setY( aPos.getY() + nSymbolDistance );
281cdf0e10cSrcweir     Size aSize( nSymbolHeight, nSymbolHeight );
282cdf0e10cSrcweir     m_spSymbol->SetPosPixel( m_pDevice->LogicToPixel( aPos, MAP_APPFONT ));
283cdf0e10cSrcweir     m_spSymbol->SetSizePixel( m_pDevice->LogicToPixel( aSize, MAP_APPFONT ));
284cdf0e10cSrcweir     aPos.setY( aPos.getY() - nSymbolDistance );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir     // series name edit field
287cdf0e10cSrcweir     aPos.setX( aPos.getX() + nSymbolHeight + nSymbolDistance );
288cdf0e10cSrcweir     aSize.setWidth( m_nWidth - nSymbolHeight - nSymbolDistance );
289cdf0e10cSrcweir     sal_Int32 nHeight = 12;
290cdf0e10cSrcweir     aSize.setHeight( nHeight );
291cdf0e10cSrcweir     m_spSeriesName->SetPosPixel( m_pDevice->LogicToPixel( aPos, MAP_APPFONT ));
292cdf0e10cSrcweir     m_spSeriesName->SetSizePixel( m_pDevice->LogicToPixel( aSize, MAP_APPFONT ));
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     // color bar
295cdf0e10cSrcweir     aPos.setX( rPos.getX() + 1 );
296cdf0e10cSrcweir     aPos.setY( aPos.getY() + nHeight + 2 );
297cdf0e10cSrcweir     nHeight = 3;
298cdf0e10cSrcweir     aSize.setWidth( m_nWidth - 1 );
299cdf0e10cSrcweir     aSize.setHeight( nHeight );
300cdf0e10cSrcweir     m_spColorBar->SetPosPixel( m_pDevice->LogicToPixel( aPos, MAP_APPFONT ));
301cdf0e10cSrcweir     m_spColorBar->SetSizePixel( m_pDevice->LogicToPixel( aSize, MAP_APPFONT ));
302cdf0e10cSrcweir }
303cdf0e10cSrcweir 
SetWidth(sal_Int32 nWidth)304cdf0e10cSrcweir void SeriesHeader::SetWidth( sal_Int32 nWidth )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     m_nWidth = nWidth;
307cdf0e10cSrcweir     SetPos( m_aPos );
308cdf0e10cSrcweir }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 
SetPixelPosX(sal_Int32 nPos)311cdf0e10cSrcweir void SeriesHeader::SetPixelPosX( sal_Int32 nPos )
312cdf0e10cSrcweir {
313cdf0e10cSrcweir     Point aPos( m_pDevice->LogicToPixel( m_aPos, MAP_APPFONT ));
314cdf0e10cSrcweir     aPos.setX( nPos );
315cdf0e10cSrcweir     SetPos( m_pDevice->PixelToLogic( aPos, MAP_APPFONT ));
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
SetPixelWidth(sal_Int32 nWidth)318cdf0e10cSrcweir void SeriesHeader::SetPixelWidth( sal_Int32 nWidth )
319cdf0e10cSrcweir {
320cdf0e10cSrcweir     SetWidth( m_pDevice->PixelToLogic( Size( nWidth, 0 ), MAP_APPFONT ).getWidth());
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
SetChartType(const Reference<chart2::XChartType> & xChartType,bool bSwapXAndYAxis,bool bIsHighContrast)323cdf0e10cSrcweir void SeriesHeader::SetChartType(
324cdf0e10cSrcweir     const Reference< chart2::XChartType > & xChartType,
325cdf0e10cSrcweir     bool bSwapXAndYAxis,
326cdf0e10cSrcweir     bool bIsHighContrast )
327cdf0e10cSrcweir {
328cdf0e10cSrcweir     m_spSymbol->SetImage( GetChartTypeImage( xChartType, bSwapXAndYAxis, bIsHighContrast ));
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
SetSeriesName(const String & rName)331cdf0e10cSrcweir void SeriesHeader::SetSeriesName( const String & rName )
332cdf0e10cSrcweir {
333cdf0e10cSrcweir     m_spSeriesName->SetText( rName );
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
SetRange(sal_Int32 nStartCol,sal_Int32 nEndCol)336cdf0e10cSrcweir void SeriesHeader::SetRange( sal_Int32 nStartCol, sal_Int32 nEndCol )
337cdf0e10cSrcweir {
338cdf0e10cSrcweir     m_nStartCol = nStartCol;
339cdf0e10cSrcweir     m_nEndCol = (nEndCol > nStartCol) ? nEndCol : nStartCol;
340cdf0e10cSrcweir     m_spSeriesName->setStartColumn( nStartCol );
341cdf0e10cSrcweir }
342cdf0e10cSrcweir 
GetStartColumn() const343cdf0e10cSrcweir sal_Int32 SeriesHeader::GetStartColumn() const
344cdf0e10cSrcweir {
345cdf0e10cSrcweir     return m_nStartCol;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
GetEndColumn() const348cdf0e10cSrcweir sal_Int32 SeriesHeader::GetEndColumn() const
349cdf0e10cSrcweir {
350cdf0e10cSrcweir     return m_nEndCol;
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
Show()353cdf0e10cSrcweir void SeriesHeader::Show()
354cdf0e10cSrcweir {
355cdf0e10cSrcweir     m_spSymbol->Show();
356cdf0e10cSrcweir     m_spSeriesName->Show();
357cdf0e10cSrcweir     m_spColorBar->Show();
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
SetEditChangedHdl(const Link & rLink)360cdf0e10cSrcweir void SeriesHeader::SetEditChangedHdl( const Link & rLink )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir     m_aChangeLink = rLink;
363cdf0e10cSrcweir }
364cdf0e10cSrcweir 
IMPL_LINK(SeriesHeader,SeriesNameChanged,void *,EMPTYARG)365cdf0e10cSrcweir IMPL_LINK( SeriesHeader, SeriesNameChanged, void * , EMPTYARG )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir     notifyChanges();
368cdf0e10cSrcweir     return 0;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
IMPL_LINK(SeriesHeader,SeriesNameEdited,void *,EMPTYARG)371cdf0e10cSrcweir IMPL_LINK( SeriesHeader, SeriesNameEdited, void * , EMPTYARG )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir     m_bSeriesNameChangePending = true;
374cdf0e10cSrcweir     return 0;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
SetGetFocusHdl(const Link & rLink)377cdf0e10cSrcweir void SeriesHeader::SetGetFocusHdl( const Link& rLink )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     m_spSeriesName->SetGetFocusHdl( rLink );
380cdf0e10cSrcweir }
381cdf0e10cSrcweir 
HasFocus() const382cdf0e10cSrcweir bool SeriesHeader::HasFocus() const
383cdf0e10cSrcweir {
384cdf0e10cSrcweir     return m_spSeriesName->HasFocus();
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
GetChartTypeImage(const Reference<chart2::XChartType> & xChartType,bool bSwapXAndYAxis,bool bHC)387cdf0e10cSrcweir Image SeriesHeader::GetChartTypeImage(
388cdf0e10cSrcweir     const Reference< chart2::XChartType > & xChartType,
389cdf0e10cSrcweir     bool bSwapXAndYAxis,
390cdf0e10cSrcweir     bool bHC )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir     Image aResult;
393cdf0e10cSrcweir     if( !xChartType.is())
394cdf0e10cSrcweir         return aResult;
395cdf0e10cSrcweir     OUString aChartTypeName( xChartType->getChartType());
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_AREA ))
398cdf0e10cSrcweir     {
399cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_AREA, bHC );
400cdf0e10cSrcweir     }
401cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_COLUMN ))
402cdf0e10cSrcweir     {
403cdf0e10cSrcweir         if( bSwapXAndYAxis )
404cdf0e10cSrcweir             aResult = SELECT_IMAGE( IMG_TYPE_BAR, bHC );
405cdf0e10cSrcweir         else
406cdf0e10cSrcweir             aResult = SELECT_IMAGE( IMG_TYPE_COLUMN, bHC );
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_LINE ))
409cdf0e10cSrcweir     {
410cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_LINE, bHC );
411cdf0e10cSrcweir     }
412cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_SCATTER ))
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_XY, bHC );
415cdf0e10cSrcweir     }
416cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_PIE ))
417cdf0e10cSrcweir     {
418cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_PIE, bHC );
419cdf0e10cSrcweir     }
420cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_NET )
421cdf0e10cSrcweir           || aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_FILLED_NET ) )
422cdf0e10cSrcweir     {
423cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_NET, bHC );
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK ))
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         // @todo: correct image for candle-stick type
428cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_STOCK, bHC );
429cdf0e10cSrcweir     }
430cdf0e10cSrcweir     else if( aChartTypeName.equals( CHART2_SERVICE_NAME_CHARTTYPE_BUBBLE ))
431cdf0e10cSrcweir     {
432cdf0e10cSrcweir         aResult = SELECT_IMAGE( IMG_TYPE_BUBBLE, bHC );
433cdf0e10cSrcweir     }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     return aResult;
436cdf0e10cSrcweir }
437cdf0e10cSrcweir 
438cdf0e10cSrcweir struct applyChangesFunctor : public ::std::unary_function< ::boost::shared_ptr< SeriesHeader >, void >
439cdf0e10cSrcweir {
operator ()chart::impl::applyChangesFunctor440cdf0e10cSrcweir     void operator() ( ::boost::shared_ptr< SeriesHeader > spHeader )
441cdf0e10cSrcweir     {
442cdf0e10cSrcweir         spHeader->applyChanges();
443cdf0e10cSrcweir     }
444cdf0e10cSrcweir };
445cdf0e10cSrcweir 
446cdf0e10cSrcweir } // namespace impl
447cdf0e10cSrcweir // ----------------------------------------
448cdf0e10cSrcweir 
449cdf0e10cSrcweir namespace
450cdf0e10cSrcweir {
451cdf0e10cSrcweir 
452cdf0e10cSrcweir /** returns false, if no header as the focus.
453cdf0e10cSrcweir 
454cdf0e10cSrcweir     If a header has the focus, true is returned and the index of the header
455cdf0e10cSrcweir     with focus is set at pIndex if pOutIndex is not 0.
456cdf0e10cSrcweir */
lcl_SeriesHeaderHasFocus(const::std::vector<::boost::shared_ptr<::chart::impl::SeriesHeader>> & rSeriesHeader,sal_Int32 * pOutIndex=0)457cdf0e10cSrcweir bool lcl_SeriesHeaderHasFocus(
458cdf0e10cSrcweir     const ::std::vector< ::boost::shared_ptr< ::chart::impl::SeriesHeader > > & rSeriesHeader,
459cdf0e10cSrcweir     sal_Int32 * pOutIndex = 0 )
460cdf0e10cSrcweir {
461cdf0e10cSrcweir     sal_Int32 nIndex = 0;
462cdf0e10cSrcweir     for( ::std::vector< ::boost::shared_ptr< ::chart::impl::SeriesHeader > >::const_iterator aIt( rSeriesHeader.begin());
463cdf0e10cSrcweir          aIt != rSeriesHeader.end(); ++aIt, ++nIndex )
464cdf0e10cSrcweir     {
465cdf0e10cSrcweir         if( (*aIt)->HasFocus())
466cdf0e10cSrcweir         {
467cdf0e10cSrcweir             if( pOutIndex )
468cdf0e10cSrcweir                 *pOutIndex = nIndex;
469cdf0e10cSrcweir             return true;
470cdf0e10cSrcweir         }
471cdf0e10cSrcweir     }
472cdf0e10cSrcweir     return false;
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
lcl_getColumnInDataOrHeader(sal_uInt16 nCol,const::std::vector<::boost::shared_ptr<::chart::impl::SeriesHeader>> & rSeriesHeader)475cdf0e10cSrcweir sal_Int32 lcl_getColumnInDataOrHeader(
476cdf0e10cSrcweir     sal_uInt16 nCol, const ::std::vector< ::boost::shared_ptr< ::chart::impl::SeriesHeader > > & rSeriesHeader )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir     sal_Int32 nColIdx = 0;
479cdf0e10cSrcweir     bool bHeaderHasFocus( lcl_SeriesHeaderHasFocus( rSeriesHeader, &nColIdx ));
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     if( bHeaderHasFocus )
482cdf0e10cSrcweir         nColIdx = lcl_getColumnInData( static_cast< sal_uInt16 >( rSeriesHeader[nColIdx]->GetStartColumn()));
483cdf0e10cSrcweir     else
484cdf0e10cSrcweir         nColIdx = lcl_getColumnInData( nCol );
485cdf0e10cSrcweir 
486cdf0e10cSrcweir     return nColIdx;
487cdf0e10cSrcweir }
488cdf0e10cSrcweir 
489cdf0e10cSrcweir } // anonymous namespace
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 
DataBrowser(Window * pParent,const ResId & rId,bool bLiveUpdate)492cdf0e10cSrcweir DataBrowser::DataBrowser( Window* pParent, const ResId& rId, bool bLiveUpdate ) :
493cdf0e10cSrcweir 	::svt::EditBrowseBox( pParent, rId, EBBF_SMART_TAB_TRAVEL | EBBF_HANDLE_COLUMN_TEXT, BROWSER_STANDARD_FLAGS ),
494cdf0e10cSrcweir 	m_nSeekRow( 0 ),
495cdf0e10cSrcweir     m_bIsReadOnly( false ),
496cdf0e10cSrcweir     m_bIsDirty( false ),
497cdf0e10cSrcweir     m_bLiveUpdate( bLiveUpdate ),
498cdf0e10cSrcweir     m_bDataValid( true ),
499cdf0e10cSrcweir     m_aNumberEditField( & EditBrowseBox::GetDataWindow(), WB_NOBORDER ),
500cdf0e10cSrcweir     m_aTextEditField( & EditBrowseBox::GetDataWindow(), WB_NOBORDER ),
501cdf0e10cSrcweir     m_rNumberEditController( new ::svt::FormattedFieldCellController( & m_aNumberEditField )),
502cdf0e10cSrcweir     m_rTextEditController( new ::svt::EditCellController( & m_aTextEditField ))
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     double fNan;
505cdf0e10cSrcweir     ::rtl::math::setNan( & fNan );
506cdf0e10cSrcweir     m_aNumberEditField.SetDefaultValue( fNan );
507cdf0e10cSrcweir     m_aNumberEditField.TreatAsNumber( sal_True );
508cdf0e10cSrcweir     RenewTable();
509cdf0e10cSrcweir     SetClean();
510cdf0e10cSrcweir }
511cdf0e10cSrcweir 
~DataBrowser()512cdf0e10cSrcweir DataBrowser::~DataBrowser()
513cdf0e10cSrcweir {
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
MayInsertRow() const516cdf0e10cSrcweir bool DataBrowser::MayInsertRow() const
517cdf0e10cSrcweir {
518cdf0e10cSrcweir     return ! IsReadOnly()
519cdf0e10cSrcweir         && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders ));
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
MayInsertColumn() const522cdf0e10cSrcweir bool DataBrowser::MayInsertColumn() const
523cdf0e10cSrcweir {
524cdf0e10cSrcweir     return ! IsReadOnly();
525cdf0e10cSrcweir }
526cdf0e10cSrcweir 
MayDeleteRow() const527cdf0e10cSrcweir bool DataBrowser::MayDeleteRow() const
528cdf0e10cSrcweir {
529cdf0e10cSrcweir     return ! IsReadOnly()
530cdf0e10cSrcweir         && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders ))
531cdf0e10cSrcweir         && ( GetCurRow() >= 0 )
532cdf0e10cSrcweir         && ( GetRowCount() > 1 );
533cdf0e10cSrcweir }
534cdf0e10cSrcweir 
MayDeleteColumn() const535cdf0e10cSrcweir bool DataBrowser::MayDeleteColumn() const
536cdf0e10cSrcweir {
537cdf0e10cSrcweir     // if a series header has the focus
538cdf0e10cSrcweir     if( lcl_SeriesHeaderHasFocus( m_aSeriesHeaders ))
539cdf0e10cSrcweir         return true;
540cdf0e10cSrcweir 
541cdf0e10cSrcweir     return ! IsReadOnly()
542cdf0e10cSrcweir         && ( GetCurColumnId() > 1 )
543cdf0e10cSrcweir         && ( ColCount() > 2 );
544cdf0e10cSrcweir }
545cdf0e10cSrcweir 
MaySwapRows() const546cdf0e10cSrcweir bool DataBrowser::MaySwapRows() const
547cdf0e10cSrcweir {
548cdf0e10cSrcweir     return ! IsReadOnly()
549cdf0e10cSrcweir         && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders ))
550cdf0e10cSrcweir         && ( GetCurRow() >= 0 )
551cdf0e10cSrcweir         && ( GetCurRow() < GetRowCount() - 1 );
552cdf0e10cSrcweir }
553cdf0e10cSrcweir 
MaySwapColumns() const554cdf0e10cSrcweir bool DataBrowser::MaySwapColumns() const
555cdf0e10cSrcweir {
556cdf0e10cSrcweir     // if a series header (except the last one) has the focus
557cdf0e10cSrcweir     {
558cdf0e10cSrcweir         sal_Int32 nColIndex(0);
559cdf0e10cSrcweir         if( lcl_SeriesHeaderHasFocus( m_aSeriesHeaders, &nColIndex ))
560cdf0e10cSrcweir             return (static_cast< sal_uInt32 >( nColIndex ) < (m_aSeriesHeaders.size() - 1));
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     sal_Int32 nColIdx = lcl_getColumnInDataOrHeader( GetCurColumnId(), m_aSeriesHeaders );
564cdf0e10cSrcweir     return ! IsReadOnly()
565cdf0e10cSrcweir         && ( nColIdx > 0 )
566cdf0e10cSrcweir         && ( nColIdx < ColCount()-2 )
567cdf0e10cSrcweir         && m_apDataBrowserModel.get()
568cdf0e10cSrcweir         && !m_apDataBrowserModel->isCategoriesColumn( nColIdx );
569cdf0e10cSrcweir }
570cdf0e10cSrcweir 
clearHeaders()571cdf0e10cSrcweir void DataBrowser::clearHeaders()
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     ::std::for_each( m_aSeriesHeaders.begin(), m_aSeriesHeaders.end(), impl::applyChangesFunctor());
574cdf0e10cSrcweir     m_aSeriesHeaders.clear();
575cdf0e10cSrcweir }
576cdf0e10cSrcweir 
RenewTable()577cdf0e10cSrcweir void DataBrowser::RenewTable()
578cdf0e10cSrcweir {
579cdf0e10cSrcweir     if( ! m_apDataBrowserModel.get())
580cdf0e10cSrcweir         return;
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     long   nOldRow     = GetCurRow();
583cdf0e10cSrcweir     sal_uInt16 nOldColId   = GetCurColumnId();
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 	sal_Bool bLastUpdateMode = GetUpdateMode();
586cdf0e10cSrcweir 	SetUpdateMode( sal_False );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     if( IsModified() )
589cdf0e10cSrcweir         SaveModified();
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     DeactivateCell();
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     RemoveColumns();
594cdf0e10cSrcweir     RowRemoved( 1, GetRowCount() );
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     // for row numbers
597cdf0e10cSrcweir 	InsertHandleColumn( static_cast< sal_uInt16 >(
598cdf0e10cSrcweir                             GetDataWindow().LogicToPixel( Size( 42, 0 )).getWidth() ));
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     OUString aDefaultSeriesName( ::chart::SchResId::getResString( STR_COLUMN_LABEL ));
601cdf0e10cSrcweir     replaceParamterInString( aDefaultSeriesName, C2U("%COLUMNNUMBER"), OUString::valueOf( sal_Int32(24) ) );
602cdf0e10cSrcweir     sal_Int32 nColumnWidth = GetDataWindow().GetTextWidth( aDefaultSeriesName )
603cdf0e10cSrcweir         + GetDataWindow().LogicToPixel( Point( 4 + impl::SeriesHeader::GetRelativeAppFontXPosForNameField(), 0 ), MAP_APPFONT ).X();
604cdf0e10cSrcweir     sal_Int32 nColumnCount = m_apDataBrowserModel->getColumnCount();
605cdf0e10cSrcweir     // nRowCount is a member of a base class
606cdf0e10cSrcweir     sal_Int32 nRowCountLocal = m_apDataBrowserModel->getMaxRowCount();
607cdf0e10cSrcweir     for( sal_Int32 nColIdx=1; nColIdx<=nColumnCount; ++nColIdx )
608cdf0e10cSrcweir     {
609cdf0e10cSrcweir         InsertDataColumn( static_cast< sal_uInt16 >( nColIdx ), GetColString( nColIdx ), nColumnWidth );
610cdf0e10cSrcweir     }
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     RowInserted( 1, nRowCountLocal );
613cdf0e10cSrcweir     GoToRow( ::std::min( nOldRow, GetRowCount() - 1 ));
614cdf0e10cSrcweir     GoToColumnId( ::std::min( nOldColId, static_cast< sal_uInt16 >( ColCount() - 1 )));
615cdf0e10cSrcweir 
616cdf0e10cSrcweir     Window * pWin = this->GetParent();
617cdf0e10cSrcweir     if( !pWin )
618cdf0e10cSrcweir         pWin = this;
619cdf0e10cSrcweir 
620cdf0e10cSrcweir     // fill series headers
621cdf0e10cSrcweir     clearHeaders();
622cdf0e10cSrcweir     const DataBrowserModel::tDataHeaderVector& aHeaders( m_apDataBrowserModel->getDataHeaders());
623cdf0e10cSrcweir     Link aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
624cdf0e10cSrcweir     Link aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
625cdf0e10cSrcweir     bool bIsHighContrast = pWin ? (pWin->GetSettings().GetStyleSettings().GetHighContrastMode()) : false;
626cdf0e10cSrcweir 
627cdf0e10cSrcweir     for( DataBrowserModel::tDataHeaderVector::const_iterator aIt( aHeaders.begin());
628cdf0e10cSrcweir          aIt != aHeaders.end(); ++aIt )
629cdf0e10cSrcweir     {
630cdf0e10cSrcweir         ::boost::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( pWin ));
631cdf0e10cSrcweir         Reference< beans::XPropertySet > xSeriesProp( aIt->m_xDataSeries, uno::UNO_QUERY );
632cdf0e10cSrcweir         sal_Int32 nColor = 0;
633cdf0e10cSrcweir         // @todo: Set "DraftColor", i.e. interpolated colors for gradients, bitmaps, etc.
634cdf0e10cSrcweir         if( xSeriesProp.is() &&
635cdf0e10cSrcweir             ( xSeriesProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Color"))) >>= nColor ))
636cdf0e10cSrcweir             spHeader->SetColor( Color( nColor ));
637cdf0e10cSrcweir         spHeader->SetChartType( aIt->m_xChartType, aIt->m_bSwapXAndYAxis, bIsHighContrast );
638cdf0e10cSrcweir         spHeader->SetSeriesName(
639cdf0e10cSrcweir             String( DataSeriesHelper::getDataSeriesLabel(
640cdf0e10cSrcweir                         aIt->m_xDataSeries,
641cdf0e10cSrcweir                         (aIt->m_xChartType.is() ?
642cdf0e10cSrcweir                          aIt->m_xChartType->getRoleOfSequenceForSeriesLabel() :
643cdf0e10cSrcweir                          OUString( RTL_CONSTASCII_USTRINGPARAM("values-y"))))));
644cdf0e10cSrcweir         // index is 1-based, as 0 is for the column that contains the row-numbers
645cdf0e10cSrcweir         spHeader->SetRange( aIt->m_nStartColumn + 1, aIt->m_nEndColumn + 1 );
646cdf0e10cSrcweir         spHeader->SetGetFocusHdl( aFocusLink );
647cdf0e10cSrcweir         spHeader->SetEditChangedHdl( aSeriesHeaderChangedLink );
648cdf0e10cSrcweir         m_aSeriesHeaders.push_back( spHeader );
649cdf0e10cSrcweir     }
650cdf0e10cSrcweir 
651cdf0e10cSrcweir     ImplAdjustHeaderControls();
652cdf0e10cSrcweir     SetDirty();
653cdf0e10cSrcweir 	SetUpdateMode( bLastUpdateMode );
654cdf0e10cSrcweir     ActivateCell();
655cdf0e10cSrcweir     Invalidate();
656cdf0e10cSrcweir }
657cdf0e10cSrcweir 
GetColString(sal_Int32 nColumnId) const658cdf0e10cSrcweir String DataBrowser::GetColString( sal_Int32 nColumnId ) const
659cdf0e10cSrcweir {
660cdf0e10cSrcweir     OSL_ASSERT( m_apDataBrowserModel.get());
661cdf0e10cSrcweir     if( nColumnId > 0 )
662cdf0e10cSrcweir         return String( m_apDataBrowserModel->getRoleOfColumn( static_cast< sal_Int32 >( nColumnId ) - 1 ));
663cdf0e10cSrcweir     return String();
664cdf0e10cSrcweir }
665cdf0e10cSrcweir 
GetRowString(sal_Int32 nRow) const666cdf0e10cSrcweir String DataBrowser::GetRowString( sal_Int32 nRow ) const
667cdf0e10cSrcweir {
668cdf0e10cSrcweir 	return String::CreateFromInt32( nRow + 1 );
669cdf0e10cSrcweir }
670cdf0e10cSrcweir 
GetCellText(long nRow,sal_uInt16 nColumnId) const671cdf0e10cSrcweir String DataBrowser::GetCellText( long nRow, sal_uInt16 nColumnId ) const
672cdf0e10cSrcweir {
673cdf0e10cSrcweir 	String aResult;
674cdf0e10cSrcweir 
675cdf0e10cSrcweir 	if( nColumnId == 0 )
676cdf0e10cSrcweir 	{
677cdf0e10cSrcweir 		aResult = GetRowString( static_cast< sal_Int32 >( nRow ));
678cdf0e10cSrcweir 	}
679cdf0e10cSrcweir 	else if( nRow >= 0 &&
680cdf0e10cSrcweir              m_apDataBrowserModel.get())
681cdf0e10cSrcweir 	{
682cdf0e10cSrcweir         sal_Int32 nColIndex = static_cast< sal_Int32 >( nColumnId ) - 1;
683cdf0e10cSrcweir 
684cdf0e10cSrcweir         if( m_apDataBrowserModel->getCellType( nColIndex, nRow ) == DataBrowserModel::NUMBER )
685cdf0e10cSrcweir         {
686cdf0e10cSrcweir             double fData( m_apDataBrowserModel->getCellNumber( nColIndex, nRow ));
687cdf0e10cSrcweir             sal_Int32 nLabelColor;
688cdf0e10cSrcweir             bool bColorChanged = false;
689cdf0e10cSrcweir 
690cdf0e10cSrcweir             if( ! ::rtl::math::isNan( fData ) &&
691cdf0e10cSrcweir                 m_spNumberFormatterWrapper.get() )
692cdf0e10cSrcweir                 aResult = String( m_spNumberFormatterWrapper->getFormattedString(
693cdf0e10cSrcweir                                       GetNumberFormatKey( nRow, nColumnId ),
694cdf0e10cSrcweir                                       fData, nLabelColor, bColorChanged ));
695cdf0e10cSrcweir         }
696cdf0e10cSrcweir         else if( m_apDataBrowserModel->getCellType( nColIndex, nRow ) == DataBrowserModel::TEXTORDATE )
697cdf0e10cSrcweir         {
698cdf0e10cSrcweir             uno::Any aAny = m_apDataBrowserModel->getCellAny( nColIndex, nRow );
699cdf0e10cSrcweir             OUString aText;
700cdf0e10cSrcweir             double fDouble=0.0;
701cdf0e10cSrcweir             if( aAny>>=aText )
702cdf0e10cSrcweir                 aResult = aText;
703cdf0e10cSrcweir             else if( aAny>>=fDouble )
704cdf0e10cSrcweir             {
705cdf0e10cSrcweir                 sal_Int32 nLabelColor;
706cdf0e10cSrcweir                 bool bColorChanged = false;
707cdf0e10cSrcweir                 sal_Int32 nDateNumberFormat = DiagramHelper::getDateNumberFormat( Reference< util::XNumberFormatsSupplier >( m_xChartDoc, uno::UNO_QUERY) );
708cdf0e10cSrcweir                 if( ! ::rtl::math::isNan( fDouble ) && m_spNumberFormatterWrapper.get() )
709cdf0e10cSrcweir                     aResult = String( m_spNumberFormatterWrapper->getFormattedString(
710cdf0e10cSrcweir                         nDateNumberFormat, fDouble, nLabelColor, bColorChanged ));
711cdf0e10cSrcweir             }
712cdf0e10cSrcweir         }
713cdf0e10cSrcweir         else
714cdf0e10cSrcweir         {
715cdf0e10cSrcweir             OSL_ASSERT( m_apDataBrowserModel->getCellType( nColIndex, nRow ) == DataBrowserModel::TEXT );
716cdf0e10cSrcweir             aResult = m_apDataBrowserModel->getCellText( nColIndex, nRow );
717cdf0e10cSrcweir         }
718cdf0e10cSrcweir     }
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 	return aResult;
721cdf0e10cSrcweir }
722cdf0e10cSrcweir 
GetCellNumber(long nRow,sal_uInt16 nColumnId) const723cdf0e10cSrcweir double DataBrowser::GetCellNumber( long nRow, sal_uInt16 nColumnId ) const
724cdf0e10cSrcweir {
725cdf0e10cSrcweir     double fResult;
726cdf0e10cSrcweir     ::rtl::math::setNan( & fResult );
727cdf0e10cSrcweir 
728cdf0e10cSrcweir     if(( nColumnId >= 1 ) && ( nRow >= 0 ) &&
729cdf0e10cSrcweir         m_apDataBrowserModel.get())
730cdf0e10cSrcweir 	{
731cdf0e10cSrcweir         fResult = m_apDataBrowserModel->getCellNumber(
732cdf0e10cSrcweir             static_cast< sal_Int32 >( nColumnId ) - 1, nRow );
733cdf0e10cSrcweir     }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 	return fResult;
736cdf0e10cSrcweir }
737cdf0e10cSrcweir 
Resize()738cdf0e10cSrcweir void DataBrowser::Resize()
739cdf0e10cSrcweir {
740cdf0e10cSrcweir     sal_Bool bLastUpdateMode = GetUpdateMode();
741cdf0e10cSrcweir 	SetUpdateMode( sal_False );
742cdf0e10cSrcweir 
743cdf0e10cSrcweir     ::svt::EditBrowseBox::Resize();
744cdf0e10cSrcweir     ImplAdjustHeaderControls();
745cdf0e10cSrcweir     SetUpdateMode( bLastUpdateMode );
746cdf0e10cSrcweir }
747cdf0e10cSrcweir 
SetReadOnly(bool bNewState)748cdf0e10cSrcweir bool DataBrowser::SetReadOnly( bool bNewState )
749cdf0e10cSrcweir {
750cdf0e10cSrcweir     bool bResult = m_bIsReadOnly;
751cdf0e10cSrcweir 
752cdf0e10cSrcweir     if( m_bIsReadOnly != bNewState )
753cdf0e10cSrcweir     {
754cdf0e10cSrcweir         m_bIsReadOnly = bNewState;
755cdf0e10cSrcweir         Invalidate();
756cdf0e10cSrcweir         DeactivateCell();
757cdf0e10cSrcweir     }
758cdf0e10cSrcweir 
759cdf0e10cSrcweir     return bResult;
760cdf0e10cSrcweir }
761cdf0e10cSrcweir 
IsReadOnly() const762cdf0e10cSrcweir bool DataBrowser::IsReadOnly() const
763cdf0e10cSrcweir {
764cdf0e10cSrcweir     return m_bIsReadOnly;
765cdf0e10cSrcweir }
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 
SetClean()768cdf0e10cSrcweir void DataBrowser::SetClean()
769cdf0e10cSrcweir {
770cdf0e10cSrcweir     m_bIsDirty = false;
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
SetDirty()773cdf0e10cSrcweir void DataBrowser::SetDirty()
774cdf0e10cSrcweir {
775cdf0e10cSrcweir     if( !m_bLiveUpdate )
776cdf0e10cSrcweir         m_bIsDirty = true;
777cdf0e10cSrcweir }
778cdf0e10cSrcweir 
CursorMoved()779cdf0e10cSrcweir void DataBrowser::CursorMoved()
780cdf0e10cSrcweir {
781cdf0e10cSrcweir 	EditBrowseBox::CursorMoved();
782cdf0e10cSrcweir 
783cdf0e10cSrcweir 	if( GetUpdateMode() && m_aCursorMovedHdlLink.IsSet())
784cdf0e10cSrcweir 		m_aCursorMovedHdlLink.Call( this );
785cdf0e10cSrcweir }
786cdf0e10cSrcweir 
SetCellModifiedHdl(const Link & rLink)787cdf0e10cSrcweir void DataBrowser::SetCellModifiedHdl( const Link& rLink )
788cdf0e10cSrcweir {
789cdf0e10cSrcweir     m_aCellModifiedLink = rLink;
790cdf0e10cSrcweir }
791cdf0e10cSrcweir 
MouseButtonDown(const BrowserMouseEvent & rEvt)792cdf0e10cSrcweir void DataBrowser::MouseButtonDown( const BrowserMouseEvent& rEvt )
793cdf0e10cSrcweir {
794cdf0e10cSrcweir     if( !m_bDataValid )
795cdf0e10cSrcweir         ShowWarningBox();
796cdf0e10cSrcweir     else
797cdf0e10cSrcweir         EditBrowseBox::MouseButtonDown( rEvt );
798cdf0e10cSrcweir }
799cdf0e10cSrcweir 
ShowWarningBox()800cdf0e10cSrcweir void DataBrowser::ShowWarningBox()
801cdf0e10cSrcweir {
802cdf0e10cSrcweir     WarningBox( this, WinBits( WB_OK ),
803cdf0e10cSrcweir                 String( SchResId( STR_INVALID_NUMBER ))).Execute();
804cdf0e10cSrcweir }
805cdf0e10cSrcweir 
ShowQueryBox()806cdf0e10cSrcweir bool DataBrowser::ShowQueryBox()
807cdf0e10cSrcweir {
808cdf0e10cSrcweir     QueryBox* pQueryBox = new QueryBox( this, WB_YES_NO, String( SchResId( STR_DATA_EDITOR_INCORRECT_INPUT )));
809cdf0e10cSrcweir 
810cdf0e10cSrcweir     return ( pQueryBox->Execute() == RET_YES );
811cdf0e10cSrcweir }
812cdf0e10cSrcweir 
IsDataValid()813cdf0e10cSrcweir bool DataBrowser::IsDataValid()
814cdf0e10cSrcweir {
815cdf0e10cSrcweir     bool bValid = true;
816cdf0e10cSrcweir     const sal_Int32 nRow = lcl_getRowInData( GetCurRow());
817cdf0e10cSrcweir     const sal_Int32 nCol = lcl_getColumnInData( GetCurColumnId());
818cdf0e10cSrcweir 
819cdf0e10cSrcweir     if( m_apDataBrowserModel->getCellType( nCol, nRow ) == DataBrowserModel::NUMBER )
820cdf0e10cSrcweir     {
821cdf0e10cSrcweir         sal_uInt32 nDummy = 0;
822cdf0e10cSrcweir         double fDummy = 0.0;
823cdf0e10cSrcweir         String aText( m_aNumberEditField.GetText());
824cdf0e10cSrcweir 
825cdf0e10cSrcweir         if( aText.Len() > 0 &&
826cdf0e10cSrcweir             m_spNumberFormatterWrapper.get() &&
827cdf0e10cSrcweir             m_spNumberFormatterWrapper->getSvNumberFormatter() &&
828cdf0e10cSrcweir             ! m_spNumberFormatterWrapper->getSvNumberFormatter()->IsNumberFormat(
829cdf0e10cSrcweir               aText, nDummy, fDummy ))
830cdf0e10cSrcweir         {
831cdf0e10cSrcweir             bValid = false;
832cdf0e10cSrcweir         }
833cdf0e10cSrcweir     }
834cdf0e10cSrcweir 
835cdf0e10cSrcweir     return bValid;
836cdf0e10cSrcweir }
837cdf0e10cSrcweir 
IsEnableItem()838cdf0e10cSrcweir bool DataBrowser::IsEnableItem()
839cdf0e10cSrcweir {
840cdf0e10cSrcweir     return m_bDataValid;
841cdf0e10cSrcweir }
842cdf0e10cSrcweir 
CellModified()843cdf0e10cSrcweir void DataBrowser::CellModified()
844cdf0e10cSrcweir {
845cdf0e10cSrcweir     m_bDataValid = IsDataValid();
846cdf0e10cSrcweir     SetDirty();
847cdf0e10cSrcweir     if( m_aCellModifiedLink.IsSet())
848cdf0e10cSrcweir         m_aCursorMovedHdlLink.Call( this );
849cdf0e10cSrcweir }
850cdf0e10cSrcweir 
SetDataFromModel(const Reference<chart2::XChartDocument> & xChartDoc,const Reference<uno::XComponentContext> & xContext)851cdf0e10cSrcweir void DataBrowser::SetDataFromModel(
852cdf0e10cSrcweir     const Reference< chart2::XChartDocument > & xChartDoc,
853cdf0e10cSrcweir     const Reference< uno::XComponentContext > & xContext )
854cdf0e10cSrcweir {
855cdf0e10cSrcweir     if( m_bLiveUpdate )
856cdf0e10cSrcweir     {
857cdf0e10cSrcweir         m_xChartDoc.set( xChartDoc );
858cdf0e10cSrcweir     }
859cdf0e10cSrcweir     else
860cdf0e10cSrcweir     {
861cdf0e10cSrcweir         Reference< util::XCloneable > xCloneable( xChartDoc, uno::UNO_QUERY );
862cdf0e10cSrcweir         if( xCloneable.is())
863cdf0e10cSrcweir             m_xChartDoc.set( xCloneable->createClone(), uno::UNO_QUERY );
864cdf0e10cSrcweir     }
865cdf0e10cSrcweir 
866cdf0e10cSrcweir     m_apDataBrowserModel.reset( new DataBrowserModel( m_xChartDoc, xContext ));
867cdf0e10cSrcweir     m_spNumberFormatterWrapper.reset(
868cdf0e10cSrcweir         new NumberFormatterWrapper(
869cdf0e10cSrcweir             Reference< util::XNumberFormatsSupplier >( m_xChartDoc, uno::UNO_QUERY )));
870cdf0e10cSrcweir 
871cdf0e10cSrcweir     if( m_spNumberFormatterWrapper.get() )
872cdf0e10cSrcweir         m_aNumberEditField.SetFormatter( m_spNumberFormatterWrapper->getSvNumberFormatter() );
873cdf0e10cSrcweir 
874cdf0e10cSrcweir     RenewTable();
875cdf0e10cSrcweir 
876cdf0e10cSrcweir     const sal_Int32 nColCnt  = m_apDataBrowserModel->getColumnCount();
877cdf0e10cSrcweir     const sal_Int32 nRowCnt =  m_apDataBrowserModel->getMaxRowCount();
878cdf0e10cSrcweir     if( nRowCnt && nColCnt )
879cdf0e10cSrcweir     {
880cdf0e10cSrcweir         GoToRow( 0 );
881cdf0e10cSrcweir         GoToColumnId( 1 );
882cdf0e10cSrcweir     }
883cdf0e10cSrcweir     SetClean();
884cdf0e10cSrcweir }
885cdf0e10cSrcweir 
InsertColumn()886cdf0e10cSrcweir void DataBrowser::InsertColumn()
887cdf0e10cSrcweir {
888cdf0e10cSrcweir     sal_Int32 nColIdx = lcl_getColumnInDataOrHeader( GetCurColumnId(), m_aSeriesHeaders );
889cdf0e10cSrcweir 
890cdf0e10cSrcweir 	if( nColIdx >= 0 &&
891cdf0e10cSrcweir         m_apDataBrowserModel.get())
892cdf0e10cSrcweir 	{
893cdf0e10cSrcweir         // save changes made to edit-field
894cdf0e10cSrcweir         if( IsModified() )
895cdf0e10cSrcweir             SaveModified();
896cdf0e10cSrcweir 
897cdf0e10cSrcweir         m_apDataBrowserModel->insertDataSeries( nColIdx );
898cdf0e10cSrcweir 		RenewTable();
899cdf0e10cSrcweir 	}
900cdf0e10cSrcweir }
901cdf0e10cSrcweir 
InsertTextColumn()902cdf0e10cSrcweir void DataBrowser::InsertTextColumn()
903cdf0e10cSrcweir {
904cdf0e10cSrcweir     sal_Int32 nColIdx = lcl_getColumnInDataOrHeader( GetCurColumnId(), m_aSeriesHeaders );
905cdf0e10cSrcweir 
906cdf0e10cSrcweir 	if( nColIdx >= 0 &&
907cdf0e10cSrcweir         m_apDataBrowserModel.get())
908cdf0e10cSrcweir 	{
909cdf0e10cSrcweir         // save changes made to edit-field
910cdf0e10cSrcweir         if( IsModified() )
911cdf0e10cSrcweir             SaveModified();
912cdf0e10cSrcweir 
913cdf0e10cSrcweir         m_apDataBrowserModel->insertComplexCategoryLevel( nColIdx );
914cdf0e10cSrcweir 		RenewTable();
915cdf0e10cSrcweir 	}
916cdf0e10cSrcweir }
917cdf0e10cSrcweir 
RemoveColumn()918cdf0e10cSrcweir void DataBrowser::RemoveColumn()
919cdf0e10cSrcweir {
920cdf0e10cSrcweir     sal_Int32 nColIdx = lcl_getColumnInDataOrHeader( GetCurColumnId(), m_aSeriesHeaders );
921cdf0e10cSrcweir 
922cdf0e10cSrcweir 	if( nColIdx >= 0 &&
923cdf0e10cSrcweir         m_apDataBrowserModel.get())
924cdf0e10cSrcweir 	{
925cdf0e10cSrcweir         // save changes made to edit-field
926cdf0e10cSrcweir         if( IsModified() )
927cdf0e10cSrcweir             SaveModified();
928cdf0e10cSrcweir 
929cdf0e10cSrcweir         m_bDataValid = true;
930cdf0e10cSrcweir         m_apDataBrowserModel->removeDataSeriesOrComplexCategoryLevel( nColIdx );
931cdf0e10cSrcweir         RenewTable();
932cdf0e10cSrcweir 	}
933cdf0e10cSrcweir }
934cdf0e10cSrcweir 
InsertRow()935cdf0e10cSrcweir void DataBrowser::InsertRow()
936cdf0e10cSrcweir {
937cdf0e10cSrcweir  	sal_Int32 nRowIdx = lcl_getRowInData( GetCurRow());
938cdf0e10cSrcweir 
939cdf0e10cSrcweir  	if( nRowIdx >= 0 &&
940cdf0e10cSrcweir         m_apDataBrowserModel.get())
941cdf0e10cSrcweir     {
942cdf0e10cSrcweir         // save changes made to edit-field
943cdf0e10cSrcweir         if( IsModified() )
944cdf0e10cSrcweir             SaveModified();
945cdf0e10cSrcweir 
946cdf0e10cSrcweir         m_apDataBrowserModel->insertDataPointForAllSeries( nRowIdx );
947cdf0e10cSrcweir 		RenewTable();
948cdf0e10cSrcweir 	}
949cdf0e10cSrcweir }
950cdf0e10cSrcweir 
RemoveRow()951cdf0e10cSrcweir void DataBrowser::RemoveRow()
952cdf0e10cSrcweir {
953cdf0e10cSrcweir  	sal_Int32 nRowIdx = lcl_getRowInData( GetCurRow());
954cdf0e10cSrcweir 
955cdf0e10cSrcweir  	if( nRowIdx >= 0 &&
956cdf0e10cSrcweir         m_apDataBrowserModel.get())
957cdf0e10cSrcweir     {
958cdf0e10cSrcweir         // save changes made to edit-field
959cdf0e10cSrcweir         if( IsModified() )
960cdf0e10cSrcweir             SaveModified();
961cdf0e10cSrcweir 
962cdf0e10cSrcweir         m_bDataValid = true;
963cdf0e10cSrcweir         m_apDataBrowserModel->removeDataPointForAllSeries( nRowIdx );
964cdf0e10cSrcweir 		RenewTable();
965cdf0e10cSrcweir 	}
966cdf0e10cSrcweir }
967cdf0e10cSrcweir 
SwapColumn()968cdf0e10cSrcweir void DataBrowser::SwapColumn()
969cdf0e10cSrcweir {
970cdf0e10cSrcweir     sal_Int32 nColIdx = lcl_getColumnInDataOrHeader( GetCurColumnId(), m_aSeriesHeaders );
971cdf0e10cSrcweir 
972cdf0e10cSrcweir 	if( nColIdx >= 0 &&
973cdf0e10cSrcweir         m_apDataBrowserModel.get())
974cdf0e10cSrcweir 	{
975cdf0e10cSrcweir         // save changes made to edit-field
976cdf0e10cSrcweir         if( IsModified() )
977cdf0e10cSrcweir             SaveModified();
978cdf0e10cSrcweir 
979cdf0e10cSrcweir         m_apDataBrowserModel->swapDataSeries( nColIdx );
980cdf0e10cSrcweir 
981cdf0e10cSrcweir         // keep cursor in swapped column
982cdf0e10cSrcweir         if( GetCurColumnId() < ColCount() - 1 )
983cdf0e10cSrcweir 		{
984cdf0e10cSrcweir             Dispatch( BROWSER_CURSORRIGHT );
985cdf0e10cSrcweir 		}
986cdf0e10cSrcweir         RenewTable();
987cdf0e10cSrcweir 	}
988cdf0e10cSrcweir }
989cdf0e10cSrcweir 
SwapRow()990cdf0e10cSrcweir void DataBrowser::SwapRow()
991cdf0e10cSrcweir {
992cdf0e10cSrcweir  	sal_Int32 nRowIdx = lcl_getRowInData( GetCurRow());
993cdf0e10cSrcweir 
994cdf0e10cSrcweir  	if( nRowIdx >= 0 &&
995cdf0e10cSrcweir         m_apDataBrowserModel.get())
996cdf0e10cSrcweir     {
997cdf0e10cSrcweir         // save changes made to edit-field
998cdf0e10cSrcweir         if( IsModified() )
999cdf0e10cSrcweir             SaveModified();
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir         m_apDataBrowserModel->swapDataPointForAllSeries( nRowIdx );
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir         // keep cursor in swapped row
1004cdf0e10cSrcweir         if( GetCurRow() < GetRowCount() - 1 )
1005cdf0e10cSrcweir 		{
1006cdf0e10cSrcweir             Dispatch( BROWSER_CURSORDOWN );
1007cdf0e10cSrcweir 		}
1008cdf0e10cSrcweir         RenewTable();
1009cdf0e10cSrcweir 	}
1010cdf0e10cSrcweir }
1011cdf0e10cSrcweir 
SetCursorMovedHdl(const Link & rLink)1012cdf0e10cSrcweir void DataBrowser::SetCursorMovedHdl( const Link& rLink )
1013cdf0e10cSrcweir {
1014cdf0e10cSrcweir     m_aCursorMovedHdlLink = rLink;
1015cdf0e10cSrcweir }
1016cdf0e10cSrcweir 
1017cdf0e10cSrcweir // implementations for ::svt::EditBrowseBox (pure virtual methods)
PaintCell(OutputDevice & rDev,const Rectangle & rRect,sal_uInt16 nColumnId) const1018cdf0e10cSrcweir void DataBrowser::PaintCell(
1019cdf0e10cSrcweir     OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
1020cdf0e10cSrcweir {
1021cdf0e10cSrcweir     Point aPos( rRect.TopLeft());
1022cdf0e10cSrcweir     aPos.X() += 1;
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir     String aText = GetCellText( m_nSeekRow, nColumnId );
1025cdf0e10cSrcweir     Size TxtSize( GetDataWindow().GetTextWidth( aText ), GetDataWindow().GetTextHeight());
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir     // clipping
1028cdf0e10cSrcweir     if( aPos.X() < rRect.Right() || aPos.X() + TxtSize.Width() > rRect.Right() ||
1029cdf0e10cSrcweir         aPos.Y() < rRect.Top() || aPos.Y() + TxtSize.Height() > rRect.Bottom())
1030cdf0e10cSrcweir         rDev.SetClipRegion( rRect );
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir     // allow for a disabled control ...
1033cdf0e10cSrcweir     sal_Bool bEnabled = IsEnabled();
1034cdf0e10cSrcweir     Color aOriginalColor = rDev.GetTextColor();
1035cdf0e10cSrcweir     if( ! bEnabled )
1036cdf0e10cSrcweir         rDev.SetTextColor( GetSettings().GetStyleSettings().GetDisableColor() );
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir     // TEST
1039cdf0e10cSrcweir //     if( nColumnId == 1 )
1040cdf0e10cSrcweir //         // categories
1041cdf0e10cSrcweir //         rDev.SetFillColor( Color( 0xff, 0xff, 0xff ));
1042cdf0e10cSrcweir //     else if( nColumnId == 2 )
1043cdf0e10cSrcweir //         // x-values
1044cdf0e10cSrcweir //         rDev.SetFillColor( Color( 0xf0, 0xf0, 0xff ));
1045cdf0e10cSrcweir //     else
1046cdf0e10cSrcweir //         // y-values
1047cdf0e10cSrcweir //         rDev.SetFillColor( Color( 0xff, 0xff, 0xf0 ));
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir //     rDev.DrawRect( rRect );
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir     // draw the text
1052cdf0e10cSrcweir     rDev.DrawText( aPos, aText );
1053cdf0e10cSrcweir 
1054cdf0e10cSrcweir     // reset the color (if necessary)
1055cdf0e10cSrcweir     if( ! bEnabled )
1056cdf0e10cSrcweir         rDev.SetTextColor( aOriginalColor );
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir     if( rDev.IsClipRegion())
1059cdf0e10cSrcweir         rDev.SetClipRegion();
1060cdf0e10cSrcweir }
1061cdf0e10cSrcweir 
SeekRow(long nRow)1062cdf0e10cSrcweir sal_Bool DataBrowser::SeekRow( long nRow )
1063cdf0e10cSrcweir {
1064cdf0e10cSrcweir     if( ! EditBrowseBox::SeekRow( nRow ))
1065cdf0e10cSrcweir         return sal_False;
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir     if( nRow < 0 )
1068cdf0e10cSrcweir         m_nSeekRow = - 1;
1069cdf0e10cSrcweir     else
1070cdf0e10cSrcweir         m_nSeekRow = nRow;
1071cdf0e10cSrcweir 
1072cdf0e10cSrcweir     return sal_True;
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir 
IsTabAllowed(sal_Bool bForward) const1075cdf0e10cSrcweir sal_Bool DataBrowser::IsTabAllowed( sal_Bool bForward ) const
1076cdf0e10cSrcweir {
1077cdf0e10cSrcweir     long nRow = GetCurRow();
1078cdf0e10cSrcweir     long nCol = GetCurColumnId();
1079cdf0e10cSrcweir 
1080cdf0e10cSrcweir     // column 0 is header-column
1081cdf0e10cSrcweir     long nBadCol = bForward
1082cdf0e10cSrcweir         ? GetColumnCount() - 1
1083cdf0e10cSrcweir         : 1;
1084cdf0e10cSrcweir     long nBadRow = bForward
1085cdf0e10cSrcweir         ? GetRowCount() - 1
1086cdf0e10cSrcweir         : 0;
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir     if( !m_bDataValid )
1089cdf0e10cSrcweir     {
1090cdf0e10cSrcweir         const_cast< DataBrowser* >( this )->ShowWarningBox();
1091cdf0e10cSrcweir         return sal_False;
1092cdf0e10cSrcweir     }
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir     return ( nRow != nBadRow ||
1095cdf0e10cSrcweir              nCol != nBadCol );
1096cdf0e10cSrcweir }
1097cdf0e10cSrcweir 
GetController(long nRow,sal_uInt16 nCol)1098cdf0e10cSrcweir ::svt::CellController* DataBrowser::GetController( long nRow, sal_uInt16 nCol )
1099cdf0e10cSrcweir {
1100cdf0e10cSrcweir     if( m_bIsReadOnly )
1101cdf0e10cSrcweir         return 0;
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir     if( CellContainsNumbers( nRow, nCol ))
1104cdf0e10cSrcweir     {
1105cdf0e10cSrcweir         m_aNumberEditField.UseInputStringForFormatting();
1106cdf0e10cSrcweir         m_aNumberEditField.SetFormatKey( GetNumberFormatKey( nRow, nCol ));
1107cdf0e10cSrcweir         return m_rNumberEditController;
1108cdf0e10cSrcweir     }
1109cdf0e10cSrcweir 
1110cdf0e10cSrcweir     return m_rTextEditController;
1111cdf0e10cSrcweir }
1112cdf0e10cSrcweir 
InitController(::svt::CellControllerRef & rController,long nRow,sal_uInt16 nCol)1113cdf0e10cSrcweir void DataBrowser::InitController(
1114cdf0e10cSrcweir     ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol )
1115cdf0e10cSrcweir {
1116cdf0e10cSrcweir     if( rController == m_rTextEditController )
1117cdf0e10cSrcweir     {
1118cdf0e10cSrcweir         String aText( GetCellText( nRow, nCol ) );
1119cdf0e10cSrcweir         m_aTextEditField.SetText( aText );
1120cdf0e10cSrcweir         m_aTextEditField.SetSelection( Selection( 0, aText.Len() ));
1121cdf0e10cSrcweir     }
1122cdf0e10cSrcweir     else if( rController == m_rNumberEditController )
1123cdf0e10cSrcweir     {
1124cdf0e10cSrcweir         // treat invalid and empty text as Nan
1125cdf0e10cSrcweir         m_aNumberEditField.EnableNotANumber( true );
1126cdf0e10cSrcweir         if( ::rtl::math::isNan( GetCellNumber( nRow, nCol )))
1127cdf0e10cSrcweir             m_aNumberEditField.SetTextValue( String());
1128cdf0e10cSrcweir         else
1129cdf0e10cSrcweir             m_aNumberEditField.SetValue( GetCellNumber( nRow, nCol ) );
1130cdf0e10cSrcweir         String aText( m_aNumberEditField.GetText());
1131cdf0e10cSrcweir         m_aNumberEditField.SetSelection( Selection( 0, aText.Len()));
1132cdf0e10cSrcweir     }
1133cdf0e10cSrcweir     else
1134cdf0e10cSrcweir     {
1135cdf0e10cSrcweir         DBG_ERROR( "Invalid Controller" );
1136cdf0e10cSrcweir     }
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir 
CellContainsNumbers(sal_Int32 nRow,sal_uInt16 nCol) const1139cdf0e10cSrcweir bool DataBrowser::CellContainsNumbers( sal_Int32 nRow, sal_uInt16 nCol ) const
1140cdf0e10cSrcweir {
1141cdf0e10cSrcweir     if( ! m_apDataBrowserModel.get())
1142cdf0e10cSrcweir         return false;
1143cdf0e10cSrcweir     return (m_apDataBrowserModel->getCellType( lcl_getColumnInData( nCol ), lcl_getRowInData( nRow )) ==
1144cdf0e10cSrcweir             DataBrowserModel::NUMBER);
1145cdf0e10cSrcweir }
1146cdf0e10cSrcweir 
GetNumberFormatKey(sal_Int32 nRow,sal_uInt16 nCol) const1147cdf0e10cSrcweir sal_uInt32 DataBrowser::GetNumberFormatKey( sal_Int32 nRow, sal_uInt16 nCol ) const
1148cdf0e10cSrcweir {
1149cdf0e10cSrcweir     if( ! m_apDataBrowserModel.get())
1150cdf0e10cSrcweir         return 0;
1151cdf0e10cSrcweir     return m_apDataBrowserModel->getNumberFormatKey( lcl_getColumnInData( nCol ), lcl_getRowInData( nRow ));
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir 
isDateString(rtl::OUString aInputString,double & fOutDateValue)1154cdf0e10cSrcweir bool DataBrowser::isDateString( rtl::OUString aInputString, double& fOutDateValue )
1155cdf0e10cSrcweir {
1156cdf0e10cSrcweir     sal_uInt32 nNumberFormat=0;
1157cdf0e10cSrcweir     SvNumberFormatter* pSvNumberFormatter = m_spNumberFormatterWrapper.get() ? m_spNumberFormatterWrapper->getSvNumberFormatter() : 0;
1158*9ec58d04SHerbert Dürr     if( !aInputString.isEmpty() &&  pSvNumberFormatter && pSvNumberFormatter->IsNumberFormat( aInputString, nNumberFormat, fOutDateValue ) )
1159cdf0e10cSrcweir     {
1160cdf0e10cSrcweir         Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( m_xChartDoc, uno::UNO_QUERY );
1161cdf0e10cSrcweir         Reference< util::XNumberFormats > xNumberFormats;
1162cdf0e10cSrcweir         if( xNumberFormatsSupplier.is() )
1163cdf0e10cSrcweir              xNumberFormats = Reference< util::XNumberFormats >( xNumberFormatsSupplier->getNumberFormats() );
1164cdf0e10cSrcweir         if( DiagramHelper::isDateNumberFormat( nNumberFormat, xNumberFormats ) )
1165cdf0e10cSrcweir             return true;
1166cdf0e10cSrcweir     }
1167cdf0e10cSrcweir     return false;
1168cdf0e10cSrcweir }
1169cdf0e10cSrcweir 
SaveModified()1170cdf0e10cSrcweir sal_Bool DataBrowser::SaveModified()
1171cdf0e10cSrcweir {
1172cdf0e10cSrcweir     if( ! IsModified() )
1173cdf0e10cSrcweir         return sal_True;
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir     sal_Bool bChangeValid = sal_True;
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir     const sal_Int32 nRow = lcl_getRowInData( GetCurRow());
1178cdf0e10cSrcweir     const sal_Int32 nCol = lcl_getColumnInData( GetCurColumnId());
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir     DBG_ASSERT( nRow >= 0 || nCol >= 0, "This cell should not be modified!" );
1181cdf0e10cSrcweir 
1182cdf0e10cSrcweir     SvNumberFormatter* pSvNumberFormatter = m_spNumberFormatterWrapper.get() ? m_spNumberFormatterWrapper->getSvNumberFormatter() : 0;
1183cdf0e10cSrcweir     switch( m_apDataBrowserModel->getCellType( nCol, nRow ))
1184cdf0e10cSrcweir     {
1185cdf0e10cSrcweir         case DataBrowserModel::NUMBER:
1186cdf0e10cSrcweir         {
1187cdf0e10cSrcweir             sal_uInt32 nDummy = 0;
1188cdf0e10cSrcweir             double fDummy = 0.0;
1189cdf0e10cSrcweir             String aText( m_aNumberEditField.GetText());
1190cdf0e10cSrcweir             // an empty string is valid, if no numberformatter exists, all
1191cdf0e10cSrcweir             // values are treated as valid
1192cdf0e10cSrcweir             if( aText.Len() > 0 && pSvNumberFormatter &&
1193cdf0e10cSrcweir                 ! pSvNumberFormatter->IsNumberFormat( aText, nDummy, fDummy ) )
1194cdf0e10cSrcweir             {
1195cdf0e10cSrcweir                 bChangeValid = sal_False;
1196cdf0e10cSrcweir             }
1197cdf0e10cSrcweir             else
1198cdf0e10cSrcweir             {
1199cdf0e10cSrcweir                 double fData = m_aNumberEditField.GetValue();
1200cdf0e10cSrcweir                 bChangeValid = m_apDataBrowserModel->setCellNumber( nCol, nRow, fData );
1201cdf0e10cSrcweir             }
1202cdf0e10cSrcweir         }
1203cdf0e10cSrcweir         break;
1204cdf0e10cSrcweir         case DataBrowserModel::TEXTORDATE:
1205cdf0e10cSrcweir         {
1206cdf0e10cSrcweir             OUString aText( m_aTextEditField.GetText() );
1207cdf0e10cSrcweir             double fDateValue=0.0;
1208cdf0e10cSrcweir             bChangeValid = sal_False;
1209cdf0e10cSrcweir             if( isDateString( aText, fDateValue ) )
1210cdf0e10cSrcweir                 bChangeValid = m_apDataBrowserModel->setCellAny( nCol, nRow, uno::makeAny( fDateValue ) );
1211cdf0e10cSrcweir             if(!bChangeValid)
1212cdf0e10cSrcweir                 bChangeValid = m_apDataBrowserModel->setCellAny( nCol, nRow, uno::makeAny( aText ) );
1213cdf0e10cSrcweir         }
1214cdf0e10cSrcweir         break;
1215cdf0e10cSrcweir         case DataBrowserModel::TEXT:
1216cdf0e10cSrcweir         {
1217cdf0e10cSrcweir             OUString aText( m_aTextEditField.GetText());
1218cdf0e10cSrcweir             bChangeValid = m_apDataBrowserModel->setCellText( nCol, nRow, aText );
1219cdf0e10cSrcweir         }
1220cdf0e10cSrcweir         break;
1221cdf0e10cSrcweir     }
1222cdf0e10cSrcweir 
1223cdf0e10cSrcweir     // the first valid change changes this to true
1224cdf0e10cSrcweir     if( bChangeValid )
1225cdf0e10cSrcweir     {
1226cdf0e10cSrcweir         RowModified( GetCurRow(), GetCurColumnId());
1227cdf0e10cSrcweir         ::svt::CellController* pCtrl = GetController( GetCurRow(), GetCurColumnId());
1228cdf0e10cSrcweir         if( pCtrl )
1229cdf0e10cSrcweir             pCtrl->ClearModified();
1230cdf0e10cSrcweir         SetDirty();
1231cdf0e10cSrcweir     }
1232cdf0e10cSrcweir 
1233cdf0e10cSrcweir     return bChangeValid;
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir 
EndEditing()1236cdf0e10cSrcweir bool DataBrowser::EndEditing()
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir     if( IsModified())
1239cdf0e10cSrcweir         SaveModified();
1240cdf0e10cSrcweir 
1241cdf0e10cSrcweir     // apply changes made to series headers
1242cdf0e10cSrcweir     ::std::for_each( m_aSeriesHeaders.begin(), m_aSeriesHeaders.end(), impl::applyChangesFunctor());
1243cdf0e10cSrcweir 
1244cdf0e10cSrcweir     if( m_bDataValid )
1245cdf0e10cSrcweir         return true;
1246cdf0e10cSrcweir     else
1247cdf0e10cSrcweir         return ShowQueryBox();
1248cdf0e10cSrcweir }
1249cdf0e10cSrcweir 
GetFirstVisibleColumNumber() const1250cdf0e10cSrcweir sal_Int16 DataBrowser::GetFirstVisibleColumNumber() const
1251cdf0e10cSrcweir {
1252cdf0e10cSrcweir     return GetFirstVisibleColNumber();
1253cdf0e10cSrcweir }
1254cdf0e10cSrcweir 
ColumnResized(sal_uInt16 nColId)1255cdf0e10cSrcweir void DataBrowser::ColumnResized( sal_uInt16 nColId )
1256cdf0e10cSrcweir {
1257cdf0e10cSrcweir     sal_Bool bLastUpdateMode = GetUpdateMode();
1258cdf0e10cSrcweir 	SetUpdateMode( sal_False );
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     EditBrowseBox::ColumnResized( nColId );
1261cdf0e10cSrcweir     ImplAdjustHeaderControls();
1262cdf0e10cSrcweir     SetUpdateMode( bLastUpdateMode );
1263cdf0e10cSrcweir }
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir // 	virtual void    MouseMove( const MouseEvent& rEvt );
1266cdf0e10cSrcweir 
EndScroll()1267cdf0e10cSrcweir void DataBrowser::EndScroll()
1268cdf0e10cSrcweir {
1269cdf0e10cSrcweir     sal_Bool bLastUpdateMode = GetUpdateMode();
1270cdf0e10cSrcweir 	SetUpdateMode( sal_False );
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir     EditBrowseBox::EndScroll();
1273cdf0e10cSrcweir     RenewSeriesHeaders();
1274cdf0e10cSrcweir 
1275cdf0e10cSrcweir     SetUpdateMode( bLastUpdateMode );
1276cdf0e10cSrcweir }
1277cdf0e10cSrcweir 
RenewSeriesHeaders()1278cdf0e10cSrcweir void DataBrowser::RenewSeriesHeaders()
1279cdf0e10cSrcweir {
1280cdf0e10cSrcweir     Window * pWin = this->GetParent();
1281cdf0e10cSrcweir     if( !pWin )
1282cdf0e10cSrcweir         pWin = this;
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir     clearHeaders();
1285cdf0e10cSrcweir     DataBrowserModel::tDataHeaderVector aHeaders( m_apDataBrowserModel->getDataHeaders());
1286cdf0e10cSrcweir     Link aFocusLink( LINK( this, DataBrowser, SeriesHeaderGotFocus ));
1287cdf0e10cSrcweir     Link aSeriesHeaderChangedLink( LINK( this, DataBrowser, SeriesHeaderChanged ));
1288cdf0e10cSrcweir     bool bIsHighContrast = pWin ? (pWin->GetSettings().GetStyleSettings().GetHighContrastMode()) : false;
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir     for( DataBrowserModel::tDataHeaderVector::const_iterator aIt( aHeaders.begin());
1291cdf0e10cSrcweir          aIt != aHeaders.end(); ++aIt )
1292cdf0e10cSrcweir     {
1293cdf0e10cSrcweir         ::boost::shared_ptr< impl::SeriesHeader > spHeader( new impl::SeriesHeader( pWin ));
1294cdf0e10cSrcweir         Reference< beans::XPropertySet > xSeriesProp( aIt->m_xDataSeries, uno::UNO_QUERY );
1295cdf0e10cSrcweir         sal_Int32 nColor = 0;
1296cdf0e10cSrcweir         if( xSeriesProp.is() &&
1297cdf0e10cSrcweir             ( xSeriesProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Color"))) >>= nColor ))
1298cdf0e10cSrcweir             spHeader->SetColor( Color( nColor ));
1299cdf0e10cSrcweir         spHeader->SetChartType( aIt->m_xChartType, aIt->m_bSwapXAndYAxis, bIsHighContrast );
1300cdf0e10cSrcweir         spHeader->SetSeriesName(
1301cdf0e10cSrcweir             String( DataSeriesHelper::getDataSeriesLabel(
1302cdf0e10cSrcweir                         aIt->m_xDataSeries,
1303cdf0e10cSrcweir                         (aIt->m_xChartType.is() ?
1304cdf0e10cSrcweir                          aIt->m_xChartType->getRoleOfSequenceForSeriesLabel() :
1305cdf0e10cSrcweir                          OUString( RTL_CONSTASCII_USTRINGPARAM("values-y"))))));
1306cdf0e10cSrcweir         spHeader->SetRange( aIt->m_nStartColumn + 1, aIt->m_nEndColumn + 1 );
1307cdf0e10cSrcweir         spHeader->SetGetFocusHdl( aFocusLink );
1308cdf0e10cSrcweir         spHeader->SetEditChangedHdl( aSeriesHeaderChangedLink );
1309cdf0e10cSrcweir         m_aSeriesHeaders.push_back( spHeader );
1310cdf0e10cSrcweir     }
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir     ImplAdjustHeaderControls();
1313cdf0e10cSrcweir }
1314cdf0e10cSrcweir 
ImplAdjustHeaderControls()1315cdf0e10cSrcweir void DataBrowser::ImplAdjustHeaderControls()
1316cdf0e10cSrcweir {
1317cdf0e10cSrcweir     sal_uInt16 nColCount = this->GetColumnCount();
1318cdf0e10cSrcweir     sal_uInt32 nCurrentPos = this->GetPosPixel().getX();
1319cdf0e10cSrcweir     sal_uInt32 nMaxPos = nCurrentPos + this->GetOutputSizePixel().getWidth();
1320cdf0e10cSrcweir     sal_uInt32 nStartPos = nCurrentPos;
1321cdf0e10cSrcweir 
1322cdf0e10cSrcweir     // width of header column
1323cdf0e10cSrcweir     nCurrentPos +=  this->GetColumnWidth( 0 );
1324cdf0e10cSrcweir     tSeriesHeaderContainer::iterator aIt( m_aSeriesHeaders.begin());
1325cdf0e10cSrcweir     sal_uInt16 i = this->GetFirstVisibleColumNumber();
1326cdf0e10cSrcweir     while( (aIt != m_aSeriesHeaders.end()) && ((*aIt)->GetStartColumn() < i) )
1327cdf0e10cSrcweir         ++aIt;
1328cdf0e10cSrcweir     for( ; i < nColCount && aIt != m_aSeriesHeaders.end(); ++i )
1329cdf0e10cSrcweir     {
1330cdf0e10cSrcweir         if( (*aIt)->GetStartColumn() == i )
1331cdf0e10cSrcweir             nStartPos = nCurrentPos;
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir         nCurrentPos += (this->GetColumnWidth( i ));
1334cdf0e10cSrcweir 
1335cdf0e10cSrcweir         if( (*aIt)->GetEndColumn() == i )
1336cdf0e10cSrcweir         {
1337cdf0e10cSrcweir             if( nStartPos < nMaxPos )
1338cdf0e10cSrcweir             {
1339cdf0e10cSrcweir                 (*aIt)->SetPixelPosX( nStartPos + 2 );
1340cdf0e10cSrcweir                 (*aIt)->SetPixelWidth( nCurrentPos - nStartPos - 3 );
1341cdf0e10cSrcweir             }
1342cdf0e10cSrcweir             else
1343cdf0e10cSrcweir                 // do not hide, to get focus events. Move outside the dialog for "hiding"
1344cdf0e10cSrcweir                 (*aIt)->SetPixelPosX( nMaxPos + 42 );
1345cdf0e10cSrcweir             ++aIt;
1346cdf0e10cSrcweir         }
1347cdf0e10cSrcweir     }
1348cdf0e10cSrcweir }
1349cdf0e10cSrcweir 
IMPL_LINK(DataBrowser,SeriesHeaderGotFocus,impl::SeriesHeaderEdit *,pEdit)1350cdf0e10cSrcweir IMPL_LINK( DataBrowser, SeriesHeaderGotFocus, impl::SeriesHeaderEdit*, pEdit )
1351cdf0e10cSrcweir {
1352cdf0e10cSrcweir     if( pEdit )
1353cdf0e10cSrcweir     {
1354cdf0e10cSrcweir         pEdit->SetShowWarningBox( !m_bDataValid );
1355cdf0e10cSrcweir 
1356cdf0e10cSrcweir         if( !m_bDataValid )
1357cdf0e10cSrcweir             GoToCell( 0, 0 );
1358cdf0e10cSrcweir         else
1359cdf0e10cSrcweir         {
1360cdf0e10cSrcweir             //DeactivateCell();
1361cdf0e10cSrcweir             MakeFieldVisible( GetCurRow(), static_cast< sal_uInt16 >( pEdit->getStartColumn()), true /* bComplete */ );
1362cdf0e10cSrcweir             ActivateCell();
1363cdf0e10cSrcweir             m_aCursorMovedHdlLink.Call( this );
1364cdf0e10cSrcweir         }
1365cdf0e10cSrcweir     }
1366cdf0e10cSrcweir     return 0;
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
IMPL_LINK(DataBrowser,SeriesHeaderChanged,impl::SeriesHeaderEdit *,pEdit)1369cdf0e10cSrcweir IMPL_LINK( DataBrowser, SeriesHeaderChanged, impl::SeriesHeaderEdit*, pEdit )
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir     if( pEdit )
1372cdf0e10cSrcweir     {
1373cdf0e10cSrcweir         Reference< chart2::XDataSeries > xSeries(
1374cdf0e10cSrcweir             m_apDataBrowserModel->getDataSeriesByColumn( pEdit->getStartColumn() - 1 ));
1375cdf0e10cSrcweir         Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
1376cdf0e10cSrcweir         if( xSource.is())
1377cdf0e10cSrcweir         {
1378cdf0e10cSrcweir             Reference< chart2::XChartType > xChartType(
1379cdf0e10cSrcweir                 m_apDataBrowserModel->getHeaderForSeries( xSeries ).m_xChartType );
1380cdf0e10cSrcweir             if( xChartType.is())
1381cdf0e10cSrcweir             {
1382cdf0e10cSrcweir                 Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
1383cdf0e10cSrcweir                     DataSeriesHelper::getDataSequenceByRole( xSource, xChartType->getRoleOfSequenceForSeriesLabel()));
1384cdf0e10cSrcweir                 if( xLabeledSeq.is())
1385cdf0e10cSrcweir                 {
1386cdf0e10cSrcweir                     Reference< container::XIndexReplace > xIndexReplace( xLabeledSeq->getLabel(), uno::UNO_QUERY );
1387cdf0e10cSrcweir                     if( xIndexReplace.is())
1388cdf0e10cSrcweir                         xIndexReplace->replaceByIndex(
1389cdf0e10cSrcweir                             0, uno::makeAny( OUString( pEdit->GetText())));
1390cdf0e10cSrcweir                 }
1391cdf0e10cSrcweir             }
1392cdf0e10cSrcweir         }
1393cdf0e10cSrcweir     }
1394cdf0e10cSrcweir     return 0;
1395cdf0e10cSrcweir }
1396cdf0e10cSrcweir 
GetTotalWidth() const1397cdf0e10cSrcweir sal_Int32 DataBrowser::GetTotalWidth() const
1398cdf0e10cSrcweir {
1399cdf0e10cSrcweir     sal_uLong nWidth = 0;
1400cdf0e10cSrcweir 	for ( sal_uInt16 nCol = 0; nCol < ColCount(); ++nCol )
1401cdf0e10cSrcweir 		nWidth += GetColumnWidth( nCol );
1402cdf0e10cSrcweir 	return static_cast< sal_Int32 >( nWidth );
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir 
1405cdf0e10cSrcweir } // namespace chart
1406