1*cde9e8dcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*cde9e8dcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*cde9e8dcSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*cde9e8dcSAndrew Rist * distributed with this work for additional information 6*cde9e8dcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*cde9e8dcSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*cde9e8dcSAndrew Rist * "License"); you may not use this file except in compliance 9*cde9e8dcSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*cde9e8dcSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*cde9e8dcSAndrew Rist * software distributed under the License is distributed on an 15*cde9e8dcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*cde9e8dcSAndrew Rist * KIND, either express or implied. See the License for the 17*cde9e8dcSAndrew Rist * specific language governing permissions and limitations 18*cde9e8dcSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*cde9e8dcSAndrew Rist *************************************************************/ 21*cde9e8dcSAndrew Rist 22*cde9e8dcSAndrew 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 { 100cdf0e10cSrcweir sal_Int32 lcl_getRowInData( long nRow ) 101cdf0e10cSrcweir { 102cdf0e10cSrcweir return static_cast< sal_Int32 >( nRow ); 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 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 137cdf0e10cSrcweir SeriesHeaderEdit::SeriesHeaderEdit( Window * pParent ) : 138cdf0e10cSrcweir Edit( pParent ), 139cdf0e10cSrcweir m_nStartColumn( 0 ), 140cdf0e10cSrcweir m_bShowWarningBox( false ) 141cdf0e10cSrcweir {} 142cdf0e10cSrcweir SeriesHeaderEdit::~SeriesHeaderEdit() 143cdf0e10cSrcweir {} 144cdf0e10cSrcweir 145cdf0e10cSrcweir void SeriesHeaderEdit::setStartColumn( sal_Int32 nStartColumn ) 146cdf0e10cSrcweir { 147cdf0e10cSrcweir m_nStartColumn = nStartColumn; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir sal_Int32 SeriesHeaderEdit::getStartColumn() const 151cdf0e10cSrcweir { 152cdf0e10cSrcweir return m_nStartColumn; 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir void SeriesHeaderEdit::SetShowWarningBox( bool bShowWarning ) 156cdf0e10cSrcweir { 157cdf0e10cSrcweir m_bShowWarningBox = bShowWarning; 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 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 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 245cdf0e10cSrcweir void SeriesHeader::notifyChanges() 246cdf0e10cSrcweir { 247cdf0e10cSrcweir if( m_aChangeLink.IsSet()) 248cdf0e10cSrcweir m_aChangeLink.Call( m_spSeriesName.get()); 249cdf0e10cSrcweir 250cdf0e10cSrcweir m_bSeriesNameChangePending = false; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir void SeriesHeader::applyChanges() 254cdf0e10cSrcweir { 255cdf0e10cSrcweir if( m_bSeriesNameChangePending ) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir notifyChanges(); 258cdf0e10cSrcweir } 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 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 269cdf0e10cSrcweir sal_Int32 SeriesHeader::GetRelativeAppFontXPosForNameField() 270cdf0e10cSrcweir { 271cdf0e10cSrcweir return nSymbolHeight + nSymbolDistance; 272cdf0e10cSrcweir } 273cdf0e10cSrcweir 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 304cdf0e10cSrcweir void SeriesHeader::SetWidth( sal_Int32 nWidth ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir m_nWidth = nWidth; 307cdf0e10cSrcweir SetPos( m_aPos ); 308cdf0e10cSrcweir } 309cdf0e10cSrcweir 310cdf0e10cSrcweir 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 318cdf0e10cSrcweir void SeriesHeader::SetPixelWidth( sal_Int32 nWidth ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir SetWidth( m_pDevice->PixelToLogic( Size( nWidth, 0 ), MAP_APPFONT ).getWidth()); 321cdf0e10cSrcweir } 322cdf0e10cSrcweir 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 331cdf0e10cSrcweir void SeriesHeader::SetSeriesName( const String & rName ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir m_spSeriesName->SetText( rName ); 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 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 343cdf0e10cSrcweir sal_Int32 SeriesHeader::GetStartColumn() const 344cdf0e10cSrcweir { 345cdf0e10cSrcweir return m_nStartCol; 346cdf0e10cSrcweir } 347cdf0e10cSrcweir 348cdf0e10cSrcweir sal_Int32 SeriesHeader::GetEndColumn() const 349cdf0e10cSrcweir { 350cdf0e10cSrcweir return m_nEndCol; 351cdf0e10cSrcweir } 352cdf0e10cSrcweir 353cdf0e10cSrcweir void SeriesHeader::Show() 354cdf0e10cSrcweir { 355cdf0e10cSrcweir m_spSymbol->Show(); 356cdf0e10cSrcweir m_spSeriesName->Show(); 357cdf0e10cSrcweir m_spColorBar->Show(); 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir void SeriesHeader::SetEditChangedHdl( const Link & rLink ) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir m_aChangeLink = rLink; 363cdf0e10cSrcweir } 364cdf0e10cSrcweir 365cdf0e10cSrcweir IMPL_LINK( SeriesHeader, SeriesNameChanged, void * , EMPTYARG ) 366cdf0e10cSrcweir { 367cdf0e10cSrcweir notifyChanges(); 368cdf0e10cSrcweir return 0; 369cdf0e10cSrcweir } 370cdf0e10cSrcweir 371cdf0e10cSrcweir IMPL_LINK( SeriesHeader, SeriesNameEdited, void * , EMPTYARG ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir m_bSeriesNameChangePending = true; 374cdf0e10cSrcweir return 0; 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir void SeriesHeader::SetGetFocusHdl( const Link& rLink ) 378cdf0e10cSrcweir { 379cdf0e10cSrcweir m_spSeriesName->SetGetFocusHdl( rLink ); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir bool SeriesHeader::HasFocus() const 383cdf0e10cSrcweir { 384cdf0e10cSrcweir return m_spSeriesName->HasFocus(); 385cdf0e10cSrcweir } 386cdf0e10cSrcweir 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 { 440cdf0e10cSrcweir 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 */ 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 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 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 512cdf0e10cSrcweir DataBrowser::~DataBrowser() 513cdf0e10cSrcweir { 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir bool DataBrowser::MayInsertRow() const 517cdf0e10cSrcweir { 518cdf0e10cSrcweir return ! IsReadOnly() 519cdf0e10cSrcweir && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders )); 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir bool DataBrowser::MayInsertColumn() const 523cdf0e10cSrcweir { 524cdf0e10cSrcweir return ! IsReadOnly(); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir bool DataBrowser::MayDeleteRow() const 528cdf0e10cSrcweir { 529cdf0e10cSrcweir return ! IsReadOnly() 530cdf0e10cSrcweir && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders )) 531cdf0e10cSrcweir && ( GetCurRow() >= 0 ) 532cdf0e10cSrcweir && ( GetRowCount() > 1 ); 533cdf0e10cSrcweir } 534cdf0e10cSrcweir 535cdf0e10cSrcweir 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 546cdf0e10cSrcweir bool DataBrowser::MaySwapRows() const 547cdf0e10cSrcweir { 548cdf0e10cSrcweir return ! IsReadOnly() 549cdf0e10cSrcweir && ( !lcl_SeriesHeaderHasFocus( m_aSeriesHeaders )) 550cdf0e10cSrcweir && ( GetCurRow() >= 0 ) 551cdf0e10cSrcweir && ( GetCurRow() < GetRowCount() - 1 ); 552cdf0e10cSrcweir } 553cdf0e10cSrcweir 554cdf0e10cSrcweir 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 571cdf0e10cSrcweir void DataBrowser::clearHeaders() 572cdf0e10cSrcweir { 573cdf0e10cSrcweir ::std::for_each( m_aSeriesHeaders.begin(), m_aSeriesHeaders.end(), impl::applyChangesFunctor()); 574cdf0e10cSrcweir m_aSeriesHeaders.clear(); 575cdf0e10cSrcweir } 576cdf0e10cSrcweir 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 658cdf0e10cSrcweir 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 666cdf0e10cSrcweir String DataBrowser::GetRowString( sal_Int32 nRow ) const 667cdf0e10cSrcweir { 668cdf0e10cSrcweir return String::CreateFromInt32( nRow + 1 ); 669cdf0e10cSrcweir } 670cdf0e10cSrcweir 671cdf0e10cSrcweir 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 723cdf0e10cSrcweir 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 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 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 762cdf0e10cSrcweir bool DataBrowser::IsReadOnly() const 763cdf0e10cSrcweir { 764cdf0e10cSrcweir return m_bIsReadOnly; 765cdf0e10cSrcweir } 766cdf0e10cSrcweir 767cdf0e10cSrcweir 768cdf0e10cSrcweir void DataBrowser::SetClean() 769cdf0e10cSrcweir { 770cdf0e10cSrcweir m_bIsDirty = false; 771cdf0e10cSrcweir } 772cdf0e10cSrcweir 773cdf0e10cSrcweir void DataBrowser::SetDirty() 774cdf0e10cSrcweir { 775cdf0e10cSrcweir if( !m_bLiveUpdate ) 776cdf0e10cSrcweir m_bIsDirty = true; 777cdf0e10cSrcweir } 778cdf0e10cSrcweir 779cdf0e10cSrcweir void DataBrowser::CursorMoved() 780cdf0e10cSrcweir { 781cdf0e10cSrcweir EditBrowseBox::CursorMoved(); 782cdf0e10cSrcweir 783cdf0e10cSrcweir if( GetUpdateMode() && m_aCursorMovedHdlLink.IsSet()) 784cdf0e10cSrcweir m_aCursorMovedHdlLink.Call( this ); 785cdf0e10cSrcweir } 786cdf0e10cSrcweir 787cdf0e10cSrcweir void DataBrowser::SetCellModifiedHdl( const Link& rLink ) 788cdf0e10cSrcweir { 789cdf0e10cSrcweir m_aCellModifiedLink = rLink; 790cdf0e10cSrcweir } 791cdf0e10cSrcweir 792cdf0e10cSrcweir void DataBrowser::MouseButtonDown( const BrowserMouseEvent& rEvt ) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir if( !m_bDataValid ) 795cdf0e10cSrcweir ShowWarningBox(); 796cdf0e10cSrcweir else 797cdf0e10cSrcweir EditBrowseBox::MouseButtonDown( rEvt ); 798cdf0e10cSrcweir } 799cdf0e10cSrcweir 800cdf0e10cSrcweir void DataBrowser::ShowWarningBox() 801cdf0e10cSrcweir { 802cdf0e10cSrcweir WarningBox( this, WinBits( WB_OK ), 803cdf0e10cSrcweir String( SchResId( STR_INVALID_NUMBER ))).Execute(); 804cdf0e10cSrcweir } 805cdf0e10cSrcweir 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 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 838cdf0e10cSrcweir bool DataBrowser::IsEnableItem() 839cdf0e10cSrcweir { 840cdf0e10cSrcweir return m_bDataValid; 841cdf0e10cSrcweir } 842cdf0e10cSrcweir 843cdf0e10cSrcweir void DataBrowser::CellModified() 844cdf0e10cSrcweir { 845cdf0e10cSrcweir m_bDataValid = IsDataValid(); 846cdf0e10cSrcweir SetDirty(); 847cdf0e10cSrcweir if( m_aCellModifiedLink.IsSet()) 848cdf0e10cSrcweir m_aCursorMovedHdlLink.Call( this ); 849cdf0e10cSrcweir } 850cdf0e10cSrcweir 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 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 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 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 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 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 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 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 1012cdf0e10cSrcweir void DataBrowser::SetCursorMovedHdl( const Link& rLink ) 1013cdf0e10cSrcweir { 1014cdf0e10cSrcweir m_aCursorMovedHdlLink = rLink; 1015cdf0e10cSrcweir } 1016cdf0e10cSrcweir 1017cdf0e10cSrcweir // implementations for ::svt::EditBrowseBox (pure virtual methods) 1018cdf0e10cSrcweir 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 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 1075cdf0e10cSrcweir 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 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 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 1139cdf0e10cSrcweir 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 1147cdf0e10cSrcweir 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 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; 1158cdf0e10cSrcweir if( aInputString.getLength() > 0 && 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 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 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 1250cdf0e10cSrcweir sal_Int16 DataBrowser::GetFirstVisibleColumNumber() const 1251cdf0e10cSrcweir { 1252cdf0e10cSrcweir return GetFirstVisibleColNumber(); 1253cdf0e10cSrcweir } 1254cdf0e10cSrcweir 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 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 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 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 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 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 1397cdf0e10cSrcweir 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