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