Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <com/sun/star/chart/ChartDataRowSource.hpp>
22 : #include <com/sun/star/chart2/data/XDataProvider.hpp>
23 : #include <com/sun/star/chart2/data/XDataReceiver.hpp>
24 : #include <com/sun/star/beans/PropertyState.hpp>
25 :
26 : #include <sot/storage.hxx>
27 : #include <sot/clsids.hxx>
28 :
29 : #include "edtwin.hxx"
30 : #include "wrtsh.hxx"
31 : #include "cmdid.h"
32 : #include "frmatr.hxx"
33 : #include "view.hxx"
34 : #include "basesh.hxx"
35 : #include "swundo.hxx"
36 : #include "tablemgr.hxx"
37 : #include "frmfmt.hxx"
38 : #include "instable.hxx"
39 : #include "swerror.h"
40 : #include "table.hrc"
41 : #include "swabstdlg.hxx"
42 : #include "swcli.hxx"
43 : #include "docsh.hxx"
44 : #include "unotbl.hxx"
45 : #include "unochart.hxx"
46 :
47 : using namespace ::com::sun::star;
48 :
49 : /*------------------------------------------------------------------------
50 : Beschreibung: Zeilenhoehe einstellen (Dialog)
51 : ------------------------------------------------------------------------*/
52 :
53 :
54 0 : void SwTableFUNC::ColWidthDlg( Window *pParent )
55 : {
56 0 : InitTabCols();
57 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
58 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
59 :
60 0 : VclAbstractDialog* pDlg = pFact->CreateSwTableWidthDlg(pParent, *this);
61 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
62 0 : pDlg->Execute();
63 0 : delete pDlg;
64 0 : }
65 :
66 : /*--------------------------------------------------------------------
67 : Beschreibung: Breite ermitteln
68 : --------------------------------------------------------------------*/
69 :
70 :
71 0 : SwTwips SwTableFUNC::GetColWidth(sal_uInt16 nNum) const
72 : {
73 0 : SwTwips nWidth = 0;
74 :
75 0 : if( aCols.Count() > 0 )
76 : {
77 0 : if(aCols.Count() == GetColCount())
78 : {
79 0 : nWidth = (SwTwips)((nNum == aCols.Count()) ?
80 0 : aCols.GetRight() - aCols[nNum-1] :
81 0 : nNum == 0 ? aCols[nNum] - aCols.GetLeft() :
82 0 : aCols[nNum] - aCols[nNum-1]);
83 : }
84 : else
85 : {
86 0 : SwTwips nRValid = nNum < GetColCount() ?
87 0 : aCols[(sal_uInt16)GetRightSeparator((int)nNum)]:
88 0 : aCols.GetRight();
89 : SwTwips nLValid = nNum ?
90 0 : aCols[(sal_uInt16)GetRightSeparator((int)nNum - 1)]:
91 0 : aCols.GetLeft();
92 0 : nWidth = nRValid - nLValid;
93 : }
94 : }
95 : else
96 0 : nWidth = aCols.GetRight();
97 :
98 0 : return nWidth;
99 : }
100 :
101 :
102 :
103 0 : SwTwips SwTableFUNC::GetMaxColWidth( sal_uInt16 nNum ) const
104 : {
105 : OSL_ENSURE(nNum <= aCols.Count(), "Index out of Area");
106 :
107 0 : if ( GetColCount() > 0 )
108 : {
109 : // Die max. Breite ergibt sich aus der eigenen Breite und
110 : // der Breite der Nachbarzellen um je MINLAY verringert
111 : SwTwips nMax = nNum == 0 ?
112 0 : GetColWidth(1) - MINLAY :
113 0 : nNum == GetColCount() ?
114 0 : GetColWidth( nNum-1 ) - MINLAY :
115 0 : GetColWidth(nNum - 1) + GetColWidth( nNum + 1 ) - 2 * MINLAY;
116 :
117 0 : return nMax + GetColWidth(nNum) ;
118 : }
119 : else
120 0 : return GetColWidth(nNum);
121 : }
122 :
123 :
124 :
125 0 : void SwTableFUNC::SetColWidth(sal_uInt16 nNum, SwTwips nNewWidth )
126 : {
127 : // aktuelle Breite setzen
128 : // alle folgenden Verschieben
129 0 : sal_Bool bCurrentOnly = sal_False;
130 :
131 0 : if ( aCols.Count() > 0 )
132 : {
133 0 : if(aCols.Count() != GetColCount())
134 0 : bCurrentOnly = sal_True;
135 0 : SwTwips nWidth = GetColWidth(nNum);
136 :
137 0 : int nDiff = (int)(nNewWidth - nWidth);
138 0 : if( !nNum )
139 0 : aCols[ static_cast< sal_uInt16 >(GetRightSeparator(0)) ] += nDiff;
140 0 : else if( nNum < GetColCount() )
141 : {
142 0 : if(nDiff < GetColWidth(nNum + 1) - MINLAY)
143 0 : aCols[ static_cast< sal_uInt16 >(GetRightSeparator(nNum)) ] += nDiff;
144 : else
145 : {
146 0 : int nDiffLeft = nDiff - (int)GetColWidth(nNum + 1) + (int)MINLAY;
147 0 : aCols[ static_cast< sal_uInt16 >(GetRightSeparator(nNum)) ] += (nDiff - nDiffLeft);
148 0 : aCols[ static_cast< sal_uInt16 >(GetRightSeparator(nNum - 1)) ] -= nDiffLeft;
149 : }
150 : }
151 : else
152 0 : aCols[ static_cast< sal_uInt16 >(GetRightSeparator(nNum-1)) ] -= nDiff;
153 : }
154 : else
155 0 : aCols.SetRight( Min( nNewWidth, aCols.GetRightMax()) );
156 :
157 0 : pSh->StartAllAction();
158 0 : pSh->SetTabCols( aCols, bCurrentOnly );
159 0 : pSh->EndAllAction();
160 0 : }
161 :
162 :
163 :
164 0 : void SwTableFUNC::InitTabCols()
165 : {
166 : OSL_ENSURE(pSh, "no Shell");
167 :
168 0 : if( pFmt && pSh)
169 0 : pSh->GetTabCols( aCols );
170 0 : }
171 :
172 :
173 :
174 0 : SwTableFUNC::SwTableFUNC(SwWrtShell *pShell, sal_Bool bCopyFmt)
175 0 : : pFmt(pShell->GetTableFmt()),
176 : pSh(pShell),
177 0 : bCopy(bCopyFmt)
178 : {
179 : // gfs. das Format fuer die Bearbeitung kopieren
180 0 : if( pFmt && bCopy )
181 0 : pFmt = new SwFrmFmt( *pFmt );
182 0 : }
183 :
184 :
185 :
186 0 : SwTableFUNC::~SwTableFUNC()
187 : {
188 0 : if(bCopy)
189 0 : delete pFmt;
190 0 : }
191 :
192 0 : void SwTableFUNC::UpdateChart()
193 : {
194 : //Update der Felder in der Tabelle vom User ausgeloesst, alle
195 : //Charts zu der Tabelle werden auf den neuesten Stand gebracht.
196 0 : SwFrmFmt *pFmt2 = pSh->GetTableFmt();
197 0 : if ( pFmt2 && pSh->HasOLEObj( pFmt2->GetName() ) )
198 : {
199 0 : pSh->StartAllAction();
200 0 : pSh->UpdateCharts( pFmt2->GetName() );
201 0 : pSh->EndAllAction();
202 : }
203 0 : }
204 :
205 0 : uno::Reference< frame::XModel > SwTableFUNC::InsertChart(
206 : uno::Reference< chart2::data::XDataProvider > &rxDataProvider,
207 : sal_Bool bFillWithData,
208 : const rtl::OUString &rCellRange,
209 : SwFlyFrmFmt** ppFlyFrmFmt )
210 : {
211 0 : uno::Reference< frame::XModel > xChartModel;
212 0 : pSh->StartUndo( UNDO_UI_INSERT_CHART );
213 0 : pSh->StartAllAction();
214 :
215 0 : String aName;
216 0 : if (pSh->IsCrsrInTbl())
217 : {
218 0 : aName = pSh->GetTableFmt()->GetName();
219 : // insert node before table
220 0 : pSh->MoveTable( fnTableCurr, fnTableStart );
221 0 : pSh->Up( sal_False, 1, sal_False );
222 0 : if ( pSh->IsCrsrInTbl() )
223 : {
224 0 : if ( aName != pSh->GetTableFmt()->GetName() )
225 0 : pSh->Down( sal_False, 1, sal_False ); // two adjacent tables
226 : }
227 0 : pSh->SplitNode();
228 : }
229 :
230 : // insert chart
231 0 : ::rtl::OUString aObjName;
232 0 : comphelper::EmbeddedObjectContainer aCnt;
233 : uno::Reference < embed::XEmbeddedObject > xObj =
234 0 : aCnt.CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID ).GetByteSequence(), aObjName );
235 :
236 0 : ::svt::EmbeddedObjectRef aEmbObjRef( xObj, ::com::sun::star::embed::Aspects::MSOLE_CONTENT );
237 0 : if ( xObj.is() )
238 : {
239 :
240 0 : SwFlyFrmFmt* pTmp = 0;
241 0 : pSh->InsertOleObject( aEmbObjRef, &pTmp );
242 0 : if (ppFlyFrmFmt)
243 0 : *ppFlyFrmFmt = pTmp;
244 :
245 0 : uno::Reference< embed::XComponentSupplier > xCompSupp( xObj, uno::UNO_QUERY );
246 0 : if( xCompSupp.is())
247 : {
248 0 : xChartModel.set( xCompSupp->getComponent(), uno::UNO_QUERY );
249 0 : if( xChartModel.is() )
250 0 : xChartModel->lockControllers(); //#i79578# don't request a new replacement image for charts to often - block change notifications
251 : }
252 :
253 : // set the table name at the OLE-node
254 0 : if (aName.Len())
255 0 : pSh->SetChartName( aName );
256 : }
257 0 : pSh->EndAllAction();
258 :
259 0 : if ( xObj.is() )
260 : {
261 : // Let the chart be activated after the inserting
262 0 : SfxInPlaceClient* pClient = pSh->GetView().FindIPClient( xObj, &pSh->GetView().GetEditWin() );
263 0 : if ( !pClient )
264 : {
265 0 : pClient = new SwOleClient( &pSh->GetView(), &pSh->GetView().GetEditWin(), aEmbObjRef );
266 0 : pSh->SetCheckForOLEInCaption( sal_True );
267 : }
268 0 : pSh->CalcAndSetScale( aEmbObjRef );
269 : //#50270# Error brauchen wir nicht handeln, das erledigt das
270 : //DoVerb in der SfxViewShell
271 0 : ErrCode nErr = pClient->DoVerb( SVVERB_SHOW );
272 : (void) nErr;
273 : }
274 :
275 0 : uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xChartModel, uno::UNO_QUERY );
276 0 : if (bFillWithData && xDataReceiver.is() && rxDataProvider.is())
277 : {
278 0 : xDataReceiver->attachDataProvider( rxDataProvider );
279 :
280 0 : uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pSh->GetView().GetDocShell()->GetModel(), uno::UNO_QUERY );
281 0 : xDataReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
282 :
283 : // default values for ranges that do not consist of a single row or column
284 0 : bool bHasCategories = true;
285 0 : bool bFirstCellAsLabel = true;
286 0 : chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
287 :
288 : SwRangeDescriptor aDesc;
289 0 : FillRangeDescriptor( aDesc, rCellRange );
290 0 : bool bSingleRowCol = aDesc.nTop == aDesc.nBottom || aDesc.nLeft == aDesc.nRight;
291 0 : if (bSingleRowCol)
292 : {
293 0 : aDesc.Normalize();
294 0 : sal_Int32 nRowLen = aDesc.nRight - aDesc.nLeft + 1;
295 0 : sal_Int32 nColLen = aDesc.nBottom - aDesc.nTop + 1;
296 :
297 0 : bHasCategories = false;
298 0 : if (nRowLen == 1 && nColLen == 1)
299 0 : bFirstCellAsLabel = false;
300 0 : else if (nRowLen > 1)
301 0 : eDataRowSource = chart::ChartDataRowSource_ROWS;
302 0 : else if (nColLen > 1)
303 0 : eDataRowSource = chart::ChartDataRowSource_COLUMNS;
304 : else {
305 : OSL_FAIL("unexpected state" );
306 : }
307 : }
308 :
309 0 : uno::Sequence< beans::PropertyValue > aArgs( 4 );
310 0 : aArgs[0] = beans::PropertyValue(
311 : ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellRangeRepresentation")), -1,
312 0 : uno::makeAny( rCellRange ), beans::PropertyState_DIRECT_VALUE );
313 0 : aArgs[1] = beans::PropertyValue(
314 : ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasCategories")), -1,
315 0 : uno::makeAny( bHasCategories ), beans::PropertyState_DIRECT_VALUE );
316 0 : aArgs[2] = beans::PropertyValue(
317 : ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstCellAsLabel")), -1,
318 0 : uno::makeAny( bFirstCellAsLabel ), beans::PropertyState_DIRECT_VALUE );
319 0 : aArgs[3] = beans::PropertyValue(
320 : ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataRowSource")), -1,
321 0 : uno::makeAny( eDataRowSource ), beans::PropertyState_DIRECT_VALUE );
322 0 : xDataReceiver->setArguments( aArgs );
323 : }
324 :
325 0 : pSh->EndUndo( UNDO_UI_INSERT_CHART );
326 :
327 0 : if( xChartModel.is() )
328 0 : xChartModel->unlockControllers(); //#i79578# don't request a new replacement image for charts to often
329 0 : return xChartModel;
330 : }
331 :
332 0 : sal_uInt16 SwTableFUNC::GetCurColNum() const
333 : {
334 0 : sal_uInt16 nPos = pSh->GetCurTabColNum();
335 0 : sal_uInt16 nCount = 0;
336 0 : for(sal_uInt16 i = 0; i < nPos; i++ )
337 0 : if(aCols.IsHidden(i))
338 0 : nCount ++;
339 0 : return nPos - nCount;
340 : }
341 :
342 :
343 :
344 :
345 0 : sal_uInt16 SwTableFUNC::GetColCount() const
346 : {
347 0 : sal_uInt16 nCount = 0;
348 0 : for(sal_uInt16 i = 0; i < aCols.Count(); i++ )
349 0 : if(aCols.IsHidden(i))
350 0 : nCount ++;
351 0 : return aCols.Count() - nCount;
352 : }
353 :
354 :
355 :
356 0 : int SwTableFUNC::GetRightSeparator(int nNum) const
357 : {
358 : OSL_ENSURE( nNum < (int)GetColCount() ,"Index out of range");
359 0 : int i = 0;
360 0 : while( nNum >= 0 )
361 : {
362 0 : if( !aCols.IsHidden( static_cast< sal_uInt16 >(i)) )
363 0 : nNum--;
364 0 : i++;
365 : }
366 0 : return i - 1;
367 30 : }
368 :
369 :
370 :
371 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|