1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "dlg_DataSource.hxx" 28 #include "dlg_DataSource.hrc" 29 #include "Strings.hrc" 30 #include "ResId.hxx" 31 #include "ChartTypeTemplateProvider.hxx" 32 #include "DiagramHelper.hxx" 33 #include "DialogModel.hxx" 34 #include "HelpIds.hrc" 35 36 #include "tp_RangeChooser.hxx" 37 #include "tp_DataSource.hxx" 38 39 // for RET_OK 40 #include <vcl/msgbox.hxx> 41 42 using namespace ::com::sun::star; 43 using namespace ::com::sun::star::chart2; 44 using namespace ::chart; 45 46 using ::com::sun::star::uno::Reference; 47 using ::com::sun::star::uno::Sequence; 48 using ::rtl::OUString; 49 50 // -------------------------------------------------------------------------------- 51 52 53 namespace chart 54 { 55 56 // ---------------------------------------- 57 58 class DocumentChartTypeTemplateProvider : public ChartTypeTemplateProvider 59 { 60 public: 61 DocumentChartTypeTemplateProvider( 62 const Reference< chart2::XChartDocument > & xDoc ); 63 virtual ~DocumentChartTypeTemplateProvider(); 64 65 // ____ ChartTypeTemplateProvider ____ 66 virtual Reference< chart2::XChartTypeTemplate > getCurrentTemplate() const; 67 68 private: 69 Reference< chart2::XChartTypeTemplate > m_xTemplate; 70 }; 71 72 DocumentChartTypeTemplateProvider::DocumentChartTypeTemplateProvider( 73 const Reference< chart2::XChartDocument > & xDoc ) 74 { 75 if( xDoc.is()) 76 { 77 Reference< chart2::XDiagram > xDia( xDoc->getFirstDiagram()); 78 if( xDia.is()) 79 { 80 DiagramHelper::tTemplateWithServiceName aResult( 81 DiagramHelper::getTemplateForDiagram( 82 xDia, 83 Reference< lang::XMultiServiceFactory >( 84 xDoc->getChartTypeManager(), uno::UNO_QUERY ) )); 85 m_xTemplate.set( aResult.first ); 86 } 87 } 88 } 89 90 DocumentChartTypeTemplateProvider::~DocumentChartTypeTemplateProvider() 91 {} 92 93 Reference< chart2::XChartTypeTemplate > DocumentChartTypeTemplateProvider::getCurrentTemplate() const 94 { 95 return m_xTemplate; 96 } 97 98 // ---------------------------------------- 99 100 class DataSourceTabControl : public TabControl 101 { 102 public: 103 DataSourceTabControl( Window* pParent, const ResId& rResId ); 104 ~DataSourceTabControl(); 105 106 virtual long DeactivatePage(); 107 108 void DisableTabToggling(); 109 void EnableTabToggling(); 110 111 private: 112 bool m_bTogglingEnabled; 113 }; 114 115 DataSourceTabControl::DataSourceTabControl( Window* pParent, const ResId& rResId ) : 116 TabControl( pParent, rResId ), 117 m_bTogglingEnabled( true ) 118 {} 119 120 DataSourceTabControl::~DataSourceTabControl() 121 {} 122 123 // Note that the result is long, but is intended to be a bool 124 long DataSourceTabControl::DeactivatePage() 125 { 126 bool bCanDeactivate( TabControl::DeactivatePage() != 0 ); 127 128 bCanDeactivate = (bCanDeactivate && m_bTogglingEnabled); 129 130 return (bCanDeactivate ? 1 : 0 ); 131 } 132 133 void DataSourceTabControl::DisableTabToggling() 134 { 135 m_bTogglingEnabled = false; 136 } 137 138 void DataSourceTabControl::EnableTabToggling() 139 { 140 m_bTogglingEnabled = true; 141 } 142 143 // ---------------------------------------- 144 145 sal_uInt16 DataSourceDialog::m_nLastPageId = 0; 146 147 DataSourceDialog::DataSourceDialog( 148 Window * pParent, 149 const Reference< XChartDocument > & xChartDocument, 150 const Reference< uno::XComponentContext > & xContext ) : 151 152 TabDialog( pParent, SchResId( DLG_DATA_SOURCE )), 153 154 m_xChartDocument( xChartDocument ), 155 m_xContext( xContext ), 156 m_apDocTemplateProvider( new DocumentChartTypeTemplateProvider( xChartDocument )), 157 m_apDialogModel( new DialogModel( xChartDocument, xContext )), 158 159 m_pTabControl( new DataSourceTabControl( this, SchResId( TABCTRL ) )), 160 m_aBtnOK( this, SchResId( BTN_OK ) ), 161 m_aBtnCancel( this, SchResId( BTN_CANCEL ) ), 162 m_aBtnHelp( this, SchResId( BTN_HELP ) ), 163 164 m_pRangeChooserTabePage(0), 165 m_pDataSourceTabPage(0), 166 m_bRangeChooserTabIsValid( true ), 167 m_bDataSourceTabIsValid( true ) 168 { 169 FreeResource(); 170 171 //don't create the tabpages before FreeResource, otherwise the help ids are not matched correctly 172 m_pRangeChooserTabePage = new RangeChooserTabPage( m_pTabControl, *(m_apDialogModel.get()), 173 m_apDocTemplateProvider.get(), this, true /* bHideDescription */ ); 174 m_pDataSourceTabPage = new DataSourceTabPage( m_pTabControl, *(m_apDialogModel.get()), 175 m_apDocTemplateProvider.get(), this, true /* bHideDescription */ ); 176 177 m_pTabControl->InsertPage( TP_RANGECHOOSER, String( SchResId( STR_PAGE_DATA_RANGE ))); 178 m_pTabControl->InsertPage( TP_DATA_SOURCE, String( SchResId( STR_OBJECT_DATASERIES_PLURAL ))); 179 180 m_pTabControl->SetTabPage( TP_RANGECHOOSER, m_pRangeChooserTabePage ); 181 m_pTabControl->SetTabPage( TP_DATA_SOURCE, m_pDataSourceTabPage ); 182 183 m_pTabControl->SelectTabPage( m_nLastPageId ); 184 185 SetHelpId( HID_SCH_DLG_RANGES ); 186 } 187 188 DataSourceDialog::~DataSourceDialog() 189 { 190 delete m_pRangeChooserTabePage; 191 delete m_pDataSourceTabPage; 192 193 m_nLastPageId = m_pTabControl->GetCurPageId(); 194 delete m_pTabControl; 195 } 196 197 short DataSourceDialog::Execute() 198 { 199 short nResult = TabDialog::Execute(); 200 if( nResult == RET_OK ) 201 { 202 if( m_pRangeChooserTabePage ) 203 m_pRangeChooserTabePage->commitPage(); 204 if( m_pDataSourceTabPage ) 205 m_pDataSourceTabPage->commitPage(); 206 } 207 return nResult; 208 } 209 210 void DataSourceDialog::setInvalidPage( TabPage * pTabPage ) 211 { 212 if( pTabPage == m_pRangeChooserTabePage ) 213 m_bRangeChooserTabIsValid = false; 214 else if( pTabPage == m_pDataSourceTabPage ) 215 m_bDataSourceTabIsValid = false; 216 217 if( ! (m_bRangeChooserTabIsValid && m_bDataSourceTabIsValid )) 218 { 219 m_aBtnOK.Enable( sal_False ); 220 OSL_ASSERT( m_pTabControl ); 221 // note: there seems to be no suitable mechanism to address pages by 222 // identifier, at least it is unclear what the page identifiers are. 223 // @todo: change the fixed numbers to identifiers 224 if( m_bRangeChooserTabIsValid ) 225 m_pTabControl->SetCurPageId( m_pTabControl->GetPageId( 1 )); 226 else if( m_bDataSourceTabIsValid ) 227 m_pTabControl->SetCurPageId( m_pTabControl->GetPageId( 0 )); 228 m_pTabControl->DisableTabToggling(); 229 } 230 } 231 232 void DataSourceDialog::setValidPage( TabPage * pTabPage ) 233 { 234 if( pTabPage == m_pRangeChooserTabePage ) 235 m_bRangeChooserTabIsValid = true; 236 else if( pTabPage == m_pDataSourceTabPage ) 237 m_bDataSourceTabIsValid = true; 238 239 if( m_bRangeChooserTabIsValid && m_bDataSourceTabIsValid ) 240 { 241 m_aBtnOK.Enable( sal_True ); 242 OSL_ASSERT( m_pTabControl ); 243 m_pTabControl->EnableTabToggling(); 244 } 245 } 246 247 248 } // namespace chart 249