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 : #include "scitems.hxx"
21 :
22 : #include <svl/slstitm.hxx>
23 : #include <svl/stritem.hxx>
24 : #include <svl/whiter.hxx>
25 : #include <unotools/moduleoptions.hxx>
26 : #include <svtools/cliplistener.hxx>
27 : #include <svtools/insdlg.hxx>
28 : #include <sot/formats.hxx>
29 : #include <svx/hlnkitem.hxx>
30 : #include <sfx2/app.hxx>
31 : #include <sfx2/bindings.hxx>
32 : #include <sfx2/childwin.hxx>
33 : #include <sfx2/objface.hxx>
34 : #include <sfx2/request.hxx>
35 : #include <sfx2/viewfrm.hxx>
36 : #include <sfx2/sidebar/EnumContext.hxx>
37 : #include <svx/clipfmtitem.hxx>
38 : #include <svx/sidebar/ContextChangeEventMultiplexer.hxx>
39 : #include <editeng/langitem.hxx>
40 :
41 : #include "cellsh.hxx"
42 : #include "sc.hrc"
43 : #include "docsh.hxx"
44 : #include "attrib.hxx"
45 : #include "scresid.hxx"
46 : #include "tabvwsh.hxx"
47 : #include "impex.hxx"
48 : #include "formulacell.hxx"
49 : #include "scmod.hxx"
50 : #include "globstr.hrc"
51 : #include "transobj.hxx"
52 : #include "drwtrans.hxx"
53 : #include "scabstdlg.hxx"
54 : #include "dociter.hxx"
55 : #include "postit.hxx"
56 : #include "cliputil.hxx"
57 : #include "clipparam.hxx"
58 : #include "markdata.hxx"
59 : #include <gridwin.hxx>
60 :
61 : #define ScCellShell
62 : #define CellMovement
63 : #include "scslots.hxx"
64 :
65 6120 : TYPEINIT1( ScCellShell, ScFormatShell );
66 :
67 144542 : SFX_IMPL_INTERFACE(ScCellShell, ScFormatShell)
68 :
69 52 : void ScCellShell::InitInterface_Impl()
70 : {
71 : GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_SERVER,
72 52 : RID_OBJECTBAR_FORMAT);
73 :
74 52 : GetStaticInterface()->RegisterPopupMenu(ScResId(RID_POPUP_CELLS));
75 52 : }
76 :
77 348 : ScCellShell::ScCellShell(ScViewData* pData) :
78 : ScFormatShell(pData),
79 : pImpl( new CellShell_Impl() ),
80 348 : bPastePossible(false)
81 : {
82 348 : SetHelpId(HID_SCSHELL_CELLSH);
83 348 : SetName(OUString("Cell"));
84 348 : SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Cell));
85 348 : }
86 :
87 1035 : ScCellShell::~ScCellShell()
88 : {
89 345 : if ( pImpl->m_pClipEvtLstnr )
90 : {
91 154 : pImpl->m_pClipEvtLstnr->AddRemoveListener( GetViewData()->GetActiveWin(), false );
92 :
93 : // The listener may just now be waiting for the SolarMutex and call the link
94 : // afterwards, in spite of RemoveListener. So the link has to be reset, too.
95 154 : pImpl->m_pClipEvtLstnr->ClearCallbackLink();
96 :
97 154 : pImpl->m_pClipEvtLstnr->release();
98 : }
99 :
100 345 : delete pImpl->m_pLinkedDlg;
101 345 : delete pImpl->m_pRequest;
102 345 : delete pImpl;
103 690 : }
104 :
105 1780 : void ScCellShell::GetBlockState( SfxItemSet& rSet )
106 : {
107 1780 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
108 1780 : ScRange aMarkRange;
109 1780 : ScMarkType eMarkType = GetViewData()->GetSimpleArea( aMarkRange );
110 1780 : bool bSimpleArea = (eMarkType == SC_MARK_SIMPLE);
111 : bool bOnlyNotBecauseOfMatrix;
112 1780 : bool bEditable = pTabViewShell->SelectionEditable( &bOnlyNotBecauseOfMatrix );
113 1780 : ScDocument* pDoc = GetViewData()->GetDocument();
114 1780 : ScDocShell* pDocShell = GetViewData()->GetDocShell();
115 1780 : ScMarkData& rMark = GetViewData()->GetMarkData();
116 : SCCOL nCol1, nCol2;
117 : SCROW nRow1, nRow2;
118 1780 : nCol1 = aMarkRange.aStart.Col();
119 1780 : nRow1 = aMarkRange.aStart.Row();
120 1780 : nCol2 = aMarkRange.aEnd.Col();
121 1780 : nRow2 = aMarkRange.aEnd.Row();
122 :
123 1780 : SfxWhichIter aIter(rSet);
124 1780 : sal_uInt16 nWhich = aIter.FirstWhich();
125 6195 : while ( nWhich )
126 : {
127 2635 : bool bDisable = false;
128 2635 : bool bNeedEdit = true; // need selection be editable?
129 2635 : switch ( nWhich )
130 : {
131 : case FID_FILL_TO_BOTTOM: // fill to top / bottom
132 : {
133 0 : bDisable = !bSimpleArea || (nRow1 == 0 && nRow2 == 0);
134 0 : if ( !bDisable && bEditable )
135 : { // do not damage matrix
136 : bDisable = pDoc->HasSelectedBlockMatrixFragment(
137 0 : nCol1, nRow1, nCol2, nRow1, rMark ); // first row
138 : }
139 : }
140 0 : break;
141 : case FID_FILL_TO_TOP:
142 : {
143 0 : bDisable = (!bSimpleArea) || (nRow1 == MAXROW && nRow2 == MAXROW);
144 0 : if ( !bDisable && bEditable )
145 : { // do not damage matrix
146 : bDisable = pDoc->HasSelectedBlockMatrixFragment(
147 0 : nCol1, nRow2, nCol2, nRow2, rMark ); // last row
148 : }
149 : }
150 0 : break;
151 : case FID_FILL_TO_RIGHT: // fill to left / right
152 : {
153 0 : bDisable = !bSimpleArea || (nCol1 == 0 && nCol2 == 0);
154 0 : if ( !bDisable && bEditable )
155 : { // do not damage matrix
156 : bDisable = pDoc->HasSelectedBlockMatrixFragment(
157 0 : nCol1, nRow1, nCol1, nRow2, rMark ); // first column
158 : }
159 : }
160 0 : break;
161 : case FID_FILL_TO_LEFT:
162 : {
163 0 : bDisable = (!bSimpleArea) || (nCol1 == MAXCOL && nCol2 == MAXCOL);
164 0 : if ( !bDisable && bEditable )
165 : { // do not damage matrix
166 : bDisable = pDoc->HasSelectedBlockMatrixFragment(
167 0 : nCol2, nRow1, nCol2, nRow2, rMark ); // last column
168 : }
169 : }
170 0 : break;
171 :
172 : case SID_RANDOM_NUMBER_GENERATOR_DIALOG:
173 : case SID_SAMPLING_DIALOG:
174 : case SID_DESCRIPTIVE_STATISTICS_DIALOG:
175 : case SID_ANALYSIS_OF_VARIANCE_DIALOG:
176 : case SID_CORRELATION_DIALOG:
177 : case SID_COVARIANCE_DIALOG:
178 : {
179 0 : bDisable = !bSimpleArea;
180 : }
181 0 : break;
182 :
183 : case FID_FILL_SERIES: // fill block
184 : case SID_OPENDLG_TABOP: // multiple-cell operations, are at least 2 cells marked?
185 0 : if (pDoc->GetChangeTrack()!=NULL &&nWhich ==SID_OPENDLG_TABOP)
186 0 : bDisable = true;
187 : else
188 0 : bDisable = (!bSimpleArea) || (nCol1 == nCol2 && nRow1 == nRow2);
189 :
190 0 : if ( !bDisable && bEditable && nWhich == FID_FILL_SERIES )
191 : { // do not damage matrix
192 : bDisable = pDoc->HasSelectedBlockMatrixFragment(
193 0 : nCol1, nRow1, nCol2, nRow1, rMark ) // first row
194 0 : || pDoc->HasSelectedBlockMatrixFragment(
195 0 : nCol1, nRow2, nCol2, nRow2, rMark ) // last row
196 0 : || pDoc->HasSelectedBlockMatrixFragment(
197 0 : nCol1, nRow1, nCol1, nRow2, rMark ) // first column
198 0 : || pDoc->HasSelectedBlockMatrixFragment(
199 0 : nCol2, nRow1, nCol2, nRow2, rMark ); // last column
200 : }
201 0 : break;
202 : case FID_FILL_SINGLE_EDIT:
203 0 : bDisable = false;
204 0 : break;
205 : case SID_CUT: // cut
206 : case FID_INS_CELL: // insert cells, just simple selection
207 249 : bDisable = (!bSimpleArea);
208 249 : break;
209 :
210 : case FID_INS_ROW:
211 : case FID_INS_ROWS_BEFORE: // insert rows
212 : case FID_INS_ROWS_AFTER:
213 : case FID_INS_CELLSDOWN:
214 498 : bDisable = (!bSimpleArea) || GetViewData()->SimpleColMarked();
215 498 : break;
216 :
217 : case FID_INS_COLUMN:
218 : case FID_INS_COLUMNS_BEFORE: // insert columns
219 : case FID_INS_COLUMNS_AFTER:
220 : case FID_INS_CELLSRIGHT:
221 498 : bDisable = (!bSimpleArea) || GetViewData()->SimpleRowMarked();
222 498 : break;
223 :
224 : case SID_COPY: // copy
225 : // not editable because of matrix only? Do not damage matrix
226 : //! is not called, when protected AND matrix, we will have
227 : //! to live with this... is caught in Copy-Routine, otherwise
228 : //! work is to be done once more
229 249 : if ( !(!bEditable && bOnlyNotBecauseOfMatrix) )
230 249 : bNeedEdit = false; // allowed when protected/ReadOnly
231 249 : break;
232 :
233 : case SID_AUTOFORMAT: // Autoformat, at least 3x3 selected
234 0 : bDisable = (!bSimpleArea)
235 0 : || ((nCol2 - nCol1) < 2) || ((nRow2 - nRow1) < 2);
236 0 : break;
237 :
238 : case SID_CELL_FORMAT_RESET :
239 : case FID_CELL_FORMAT :
240 : case SID_ENABLE_HYPHENATION :
241 : // not editable because of matrix only? Attribute ok nonetheless
242 643 : if ( !bEditable && bOnlyNotBecauseOfMatrix )
243 0 : bNeedEdit = false;
244 643 : break;
245 :
246 : case FID_VALIDATION:
247 : {
248 0 : if ( pDocShell && pDocShell->IsDocShared() )
249 : {
250 0 : bDisable = true;
251 : }
252 : }
253 0 : break;
254 :
255 : case SID_TRANSLITERATE_HALFWIDTH:
256 : case SID_TRANSLITERATE_FULLWIDTH:
257 : case SID_TRANSLITERATE_HIRAGANA:
258 : case SID_TRANSLITERATE_KATAGANA:
259 0 : ScViewUtil::HideDisabledSlot( rSet, GetViewData()->GetBindings(), nWhich );
260 0 : break;
261 : case SID_CONVERT_FORMULA_TO_VALUE:
262 : {
263 : // Check and see if the marked range has at least one formula cell.
264 0 : bDisable = !pDoc->HasFormulaCell(aMarkRange);
265 : }
266 0 : break;
267 : }
268 2635 : if (!bDisable && bNeedEdit && !bEditable)
269 0 : bDisable = true;
270 :
271 2635 : if (bDisable)
272 0 : rSet.DisableItem(nWhich);
273 2635 : else if (nWhich == SID_ENABLE_HYPHENATION)
274 : {
275 : // toggle slots need a bool item
276 246 : rSet.Put( SfxBoolItem( nWhich, false ) );
277 : }
278 2635 : nWhich = aIter.NextWhich();
279 1780 : }
280 1780 : }
281 :
282 : // functionen, disabled depending on cursor position
283 : // Default:
284 : // SID_INSERT_POSTIT, SID_CHARMAP, SID_OPENDLG_FUNCTION
285 :
286 339 : void ScCellShell::GetCellState( SfxItemSet& rSet )
287 : {
288 339 : ScDocShell* pDocShell = GetViewData()->GetDocShell();
289 339 : ScDocument& rDoc = GetViewData()->GetDocShell()->GetDocument();
290 339 : ScAddress aCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(),
291 678 : GetViewData()->GetTabNo() );
292 :
293 339 : SfxWhichIter aIter(rSet);
294 339 : sal_uInt16 nWhich = aIter.FirstWhich();
295 1048 : while ( nWhich )
296 : {
297 370 : bool bDisable = false;
298 370 : bool bNeedEdit = true; // need cursor position be editable?
299 370 : switch ( nWhich )
300 : {
301 : case SID_THESAURUS:
302 : {
303 0 : CellType eType = rDoc.GetCellType( aCursor );
304 0 : bDisable = ( eType != CELLTYPE_STRING && eType != CELLTYPE_EDIT);
305 0 : if (!bDisable)
306 : {
307 : // test for available languages
308 0 : sal_uInt16 nLang = ScViewUtil::GetEffLanguage( &rDoc, aCursor );
309 0 : bDisable = !ScModule::HasThesaurusLanguage( nLang );
310 : }
311 : }
312 0 : break;
313 : case SID_OPENDLG_FUNCTION:
314 : {
315 0 : ScMarkData aMarkData = GetViewData()->GetMarkData();
316 0 : aMarkData.MarkToSimple();
317 0 : ScRange aRange;
318 0 : aMarkData.GetMarkArea(aRange);
319 0 : if(aMarkData.IsMarked())
320 : {
321 0 : if (!rDoc.IsBlockEditable( aCursor.Tab(), aRange.aStart.Col(),aRange.aStart.Row(),
322 0 : aRange.aEnd.Col(),aRange.aEnd.Row() ))
323 : {
324 0 : bDisable = true;
325 : }
326 0 : bNeedEdit=false;
327 0 : }
328 :
329 : }
330 0 : break;
331 : case SID_INSERT_POSTIT:
332 : {
333 185 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
334 185 : if( rDoc.GetNote(aPos) )
335 : {
336 0 : bDisable = true;
337 : }
338 : else
339 : {
340 185 : bDisable = false;
341 185 : if ( pDocShell && pDocShell->IsDocShared() )
342 : {
343 0 : bDisable = true;
344 : }
345 : }
346 : }
347 185 : break;
348 : case SID_EDIT_POSTIT:
349 : {
350 0 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
351 0 : if( rDoc.GetNote(aPos) )
352 : {
353 0 : bDisable = false;
354 : }
355 : else
356 : {
357 0 : bDisable = true;
358 : }
359 : }
360 0 : break;
361 : }
362 370 : if (!bDisable && bNeedEdit)
363 1110 : if (!rDoc.IsBlockEditable( aCursor.Tab(), aCursor.Col(),aCursor.Row(),
364 1110 : aCursor.Col(),aCursor.Row() ))
365 0 : bDisable = true;
366 370 : if (bDisable)
367 0 : rSet.DisableItem(nWhich);
368 370 : nWhich = aIter.NextWhich();
369 339 : }
370 339 : }
371 :
372 0 : static bool lcl_TestFormat( SvxClipboardFormatItem& rFormats, const TransferableDataHelper& rDataHelper,
373 : SotClipboardFormatId nFormatId )
374 : {
375 0 : if ( rDataHelper.HasFormat( nFormatId ) )
376 : {
377 : // translated format name strings are no longer inserted here,
378 : // handled by "paste special" dialog / toolbox controller instead.
379 : // Only the object type name has to be set here:
380 0 : OUString aStrVal;
381 0 : if ( nFormatId == SotClipboardFormatId::EMBED_SOURCE )
382 : {
383 0 : TransferableObjectDescriptor aDesc;
384 0 : if ( ((TransferableDataHelper&)rDataHelper).GetTransferableObjectDescriptor(
385 : SotClipboardFormatId::OBJECTDESCRIPTOR, aDesc ) )
386 0 : aStrVal = aDesc.maTypeName;
387 : }
388 0 : else if ( nFormatId == SotClipboardFormatId::EMBED_SOURCE_OLE
389 0 : || nFormatId == SotClipboardFormatId::EMBEDDED_OBJ_OLE )
390 : {
391 0 : OUString aSource;
392 0 : SvPasteObjectHelper::GetEmbeddedName( rDataHelper, aStrVal, aSource, nFormatId );
393 : }
394 :
395 0 : if ( !aStrVal.isEmpty() )
396 0 : rFormats.AddClipbrdFormat( nFormatId, aStrVal );
397 : else
398 0 : rFormats.AddClipbrdFormat( nFormatId );
399 :
400 0 : return true;
401 : }
402 :
403 0 : return false;
404 : }
405 :
406 0 : void ScCellShell::GetPossibleClipboardFormats( SvxClipboardFormatItem& rFormats )
407 : {
408 0 : vcl::Window* pWin = GetViewData()->GetActiveWin();
409 0 : bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL );
410 :
411 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pWin ) );
412 :
413 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::DRAWING );
414 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::SVXB );
415 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::GDIMETAFILE );
416 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::PNG );
417 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::BITMAP );
418 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::EMBED_SOURCE );
419 :
420 0 : if ( !bDraw )
421 : {
422 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::LINK );
423 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::STRING );
424 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::DIF );
425 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::RTF );
426 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::HTML );
427 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::HTML_SIMPLE );
428 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::BIFF_8 );
429 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::BIFF_5 );
430 : }
431 :
432 0 : if ( !lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::EMBED_SOURCE_OLE ) )
433 0 : lcl_TestFormat( rFormats, aDataHelper, SotClipboardFormatId::EMBEDDED_OBJ_OLE );
434 0 : }
435 :
436 : // insert, insert contents
437 :
438 154 : static bool lcl_IsCellPastePossible( const TransferableDataHelper& rData )
439 : {
440 154 : bool bPossible = false;
441 154 : if ( ScTransferObj::GetOwnClipboard( NULL ) || ScDrawTransferObj::GetOwnClipboard( NULL ) )
442 0 : bPossible = true;
443 : else
444 : {
445 462 : if ( rData.HasFormat( SotClipboardFormatId::PNG ) ||
446 308 : rData.HasFormat( SotClipboardFormatId::BITMAP ) ||
447 308 : rData.HasFormat( SotClipboardFormatId::GDIMETAFILE ) ||
448 308 : rData.HasFormat( SotClipboardFormatId::SVXB ) ||
449 308 : rData.HasFormat( SotClipboardFormatId::PRIVATE ) ||
450 308 : rData.HasFormat( SotClipboardFormatId::RTF ) ||
451 308 : rData.HasFormat( SotClipboardFormatId::EMBED_SOURCE ) ||
452 308 : rData.HasFormat( SotClipboardFormatId::LINK_SOURCE ) ||
453 308 : rData.HasFormat( SotClipboardFormatId::EMBED_SOURCE_OLE ) ||
454 308 : rData.HasFormat( SotClipboardFormatId::LINK_SOURCE_OLE ) ||
455 308 : rData.HasFormat( SotClipboardFormatId::EMBEDDED_OBJ_OLE ) ||
456 308 : rData.HasFormat( SotClipboardFormatId::STRING ) ||
457 308 : rData.HasFormat( SotClipboardFormatId::SYLK ) ||
458 308 : rData.HasFormat( SotClipboardFormatId::LINK ) ||
459 308 : rData.HasFormat( SotClipboardFormatId::HTML ) ||
460 462 : rData.HasFormat( SotClipboardFormatId::HTML_SIMPLE ) ||
461 154 : rData.HasFormat( SotClipboardFormatId::DIF ) )
462 : {
463 0 : bPossible = true;
464 : }
465 : }
466 154 : return bPossible;
467 : }
468 :
469 0 : IMPL_LINK( ScCellShell, ClipboardChanged, TransferableDataHelper*, pDataHelper )
470 : {
471 0 : if ( pDataHelper )
472 : {
473 0 : bPastePossible = lcl_IsCellPastePossible( *pDataHelper );
474 :
475 0 : SfxBindings& rBindings = GetViewData()->GetBindings();
476 0 : rBindings.Invalidate( SID_PASTE );
477 0 : rBindings.Invalidate( SID_PASTE_SPECIAL );
478 0 : rBindings.Invalidate( SID_PASTE_ONLY_VALUE );
479 0 : rBindings.Invalidate( SID_PASTE_ONLY_TEXT );
480 0 : rBindings.Invalidate( SID_PASTE_ONLY_FORMULA );
481 0 : rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
482 : }
483 0 : return 0;
484 : }
485 :
486 : namespace {
487 :
488 0 : bool checkDestRanges(ScViewData& rViewData)
489 : {
490 0 : ScRange aDummy;
491 0 : ScMarkType eMarkType = rViewData.GetSimpleArea( aDummy);
492 0 : if (eMarkType != SC_MARK_MULTI)
493 : {
494 : // Single destination range.
495 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
496 0 : return false;
497 : }
498 :
499 : // Multiple destination ranges.
500 :
501 0 : ScDocument* pDoc = rViewData.GetDocument();
502 0 : vcl::Window* pWin = rViewData.GetActiveWin();
503 0 : if (!pWin)
504 0 : return false;
505 :
506 0 : ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard(pWin);
507 0 : if (!pOwnClip)
508 : // If it's not a Calc document, we won't be picky.
509 0 : return true;
510 :
511 0 : ScDocument* pClipDoc = pOwnClip->GetDocument();
512 0 : if (!pClipDoc)
513 0 : return false;
514 :
515 0 : ScRange aSrcRange = pClipDoc->GetClipParam().getWholeRange();
516 0 : SCROW nRowSize = aSrcRange.aEnd.Row() - aSrcRange.aStart.Row() + 1;
517 0 : SCCOL nColSize = aSrcRange.aEnd.Col() - aSrcRange.aStart.Col() + 1;
518 :
519 0 : ScMarkData aMark = rViewData.GetMarkData();
520 0 : ScRangeList aRanges;
521 0 : aMark.MarkToSimple();
522 0 : aMark.FillRangeListWithMarks(&aRanges, false);
523 :
524 0 : return ScClipUtil::CheckDestRanges(pDoc, nColSize, nRowSize, aMark, aRanges);
525 : }
526 :
527 : }
528 :
529 416 : void ScCellShell::GetClipState( SfxItemSet& rSet )
530 : {
531 : // SID_PASTE
532 : // SID_PASTE_SPECIAL
533 : // SID_CLIPBOARD_FORMAT_ITEMS
534 :
535 416 : if ( !pImpl->m_pClipEvtLstnr )
536 : {
537 : // create listener
538 154 : pImpl->m_pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScCellShell, ClipboardChanged ) );
539 154 : pImpl->m_pClipEvtLstnr->acquire();
540 154 : vcl::Window* pWin = GetViewData()->GetActiveWin();
541 154 : pImpl->m_pClipEvtLstnr->AddRemoveListener( pWin, true );
542 :
543 : // get initial state
544 154 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pWin ) );
545 154 : bPastePossible = lcl_IsCellPastePossible( aDataHelper );
546 : }
547 :
548 416 : bool bDisable = !bPastePossible;
549 :
550 : // cell protection / multiple selection
551 :
552 416 : if (!bDisable)
553 : {
554 0 : SCCOL nCol = GetViewData()->GetCurX();
555 0 : SCROW nRow = GetViewData()->GetCurY();
556 0 : SCTAB nTab = GetViewData()->GetTabNo();
557 0 : ScDocument& rDoc = GetViewData()->GetDocShell()->GetDocument();
558 0 : if (!rDoc.IsBlockEditable( nTab, nCol,nRow, nCol,nRow ))
559 0 : bDisable = true;
560 :
561 0 : if (!checkDestRanges(*GetViewData()))
562 0 : bDisable = true;
563 : }
564 :
565 416 : if (bDisable)
566 : {
567 416 : rSet.DisableItem( SID_PASTE );
568 416 : rSet.DisableItem( SID_PASTE_SPECIAL );
569 416 : rSet.DisableItem( SID_PASTE_ONLY_VALUE );
570 416 : rSet.DisableItem( SID_PASTE_ONLY_TEXT );
571 416 : rSet.DisableItem( SID_PASTE_ONLY_FORMULA );
572 416 : rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS );
573 : }
574 0 : else if ( rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) != SfxItemState::UNKNOWN )
575 : {
576 0 : SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
577 0 : GetPossibleClipboardFormats( aFormats );
578 0 : rSet.Put( aFormats );
579 : }
580 416 : }
581 :
582 : // only SID_HYPERLINK_GETLINK:
583 :
584 0 : void ScCellShell::GetHLinkState( SfxItemSet& rSet )
585 : {
586 : // always return an item (or inserting will be disabled)
587 : // if the cell at the cursor contains only a link, return that link
588 :
589 0 : SvxHyperlinkItem aHLinkItem;
590 0 : if ( !GetViewData()->GetView()->HasBookmarkAtCursor( &aHLinkItem ) )
591 : {
592 : //! put selected text into item?
593 : }
594 :
595 0 : rSet.Put(aHLinkItem);
596 0 : }
597 :
598 2335 : void ScCellShell::GetState(SfxItemSet &rSet)
599 : {
600 2335 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
601 2335 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
602 2335 : ScViewData* pData = GetViewData();
603 2335 : ScDocument* pDoc = pData->GetDocument();
604 2335 : ScMarkData& rMark = pData->GetMarkData();
605 2335 : SCCOL nPosX = pData->GetCurX();
606 2335 : SCROW nPosY = pData->GetCurY();
607 2335 : SCTAB nTab = pData->GetTabNo();
608 :
609 2335 : SCTAB nTabCount = pDoc->GetTableCount();
610 2335 : SCTAB nTabSelCount = rMark.GetSelectCount();
611 :
612 2335 : SfxWhichIter aIter(rSet);
613 2335 : sal_uInt16 nWhich = aIter.FirstWhich();
614 7377 : while ( nWhich )
615 : {
616 2707 : switch ( nWhich )
617 : {
618 : case SID_DETECTIVE_REFRESH:
619 0 : if (!pDoc->HasDetectiveOperations())
620 0 : rSet.DisableItem( nWhich );
621 0 : break;
622 :
623 : case SID_RANGE_ADDRESS:
624 : {
625 0 : ScRange aRange;
626 0 : if ( pData->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
627 : {
628 0 : sal_uInt16 nFlags = SCA_VALID | SCA_TAB_3D;
629 0 : OUString aStr(aRange.Format(nFlags,pDoc));
630 0 : rSet.Put( SfxStringItem( nWhich, aStr ) );
631 : }
632 : }
633 0 : break;
634 :
635 : case SID_RANGE_NOTETEXT:
636 : {
637 : // always take cursor position, do not use top-left cell of selection
638 0 : OUString aNoteText;
639 0 : if ( const ScPostIt* pNote = pDoc->GetNote(nPosX, nPosY, nTab) )
640 0 : aNoteText = pNote->GetText();
641 0 : rSet.Put( SfxStringItem( nWhich, aNoteText ) );
642 : }
643 0 : break;
644 :
645 : case SID_RANGE_ROW:
646 0 : rSet.Put( SfxInt32Item( nWhich, nPosY+1 ) );
647 0 : break;
648 :
649 : case SID_RANGE_COL:
650 0 : rSet.Put( SfxInt16Item( nWhich, nPosX+1 ) );
651 0 : break;
652 :
653 : case SID_RANGE_TABLE:
654 0 : rSet.Put( SfxInt16Item( nWhich, nTab+1 ) );
655 0 : break;
656 :
657 : case SID_RANGE_VALUE:
658 : {
659 : double nValue;
660 0 : pDoc->GetValue( nPosX, nPosY, nTab, nValue );
661 0 : rSet.Put( ScDoubleItem( nWhich, nValue ) );
662 : }
663 0 : break;
664 :
665 : case SID_RANGE_FORMULA:
666 : {
667 0 : OUString aString;
668 0 : pDoc->GetFormula( nPosX, nPosY, nTab, aString );
669 0 : if( aString.isEmpty() )
670 : {
671 0 : pDoc->GetInputString( nPosX, nPosY, nTab, aString );
672 : }
673 0 : rSet.Put( SfxStringItem( nWhich, aString ) );
674 : }
675 0 : break;
676 :
677 : case SID_RANGE_TEXTVALUE:
678 : {
679 0 : OUString aString = pDoc->GetString(nPosX, nPosY, nTab);
680 0 : rSet.Put( SfxStringItem( nWhich, aString ) );
681 : }
682 0 : break;
683 :
684 : case SID_STATUS_SELMODE:
685 : {
686 : /* 0: STD Click cancels Sel
687 : * 1: ER Click extends selection
688 : * 2: ERG Click defines further selection
689 : */
690 185 : sal_uInt16 nMode = pTabViewShell->GetLockedModifiers();
691 :
692 185 : switch ( nMode )
693 : {
694 0 : case KEY_SHIFT: nMode = 1; break;
695 0 : case KEY_MOD1: nMode = 2; break; // Control-key
696 : case 0:
697 : default:
698 185 : nMode = 0;
699 : }
700 :
701 185 : rSet.Put( SfxUInt16Item( nWhich, nMode ) );
702 : }
703 185 : break;
704 :
705 : case SID_STATUS_DOCPOS:
706 : {
707 185 : OUString aStr = ScGlobal::GetRscString( STR_TABLE_COUNT );
708 :
709 185 : aStr = aStr.replaceFirst("%1", OUString::number( nTab + 1 ) );
710 185 : aStr = aStr.replaceFirst("%2", OUString::number( nTabCount ) );
711 :
712 185 : rSet.Put( SfxStringItem( nWhich, aStr ) ); }
713 185 : break;
714 :
715 : case SID_ROWCOL_SELCOUNT:
716 : {
717 185 : ScRange aMarkRange;
718 185 : GetViewData()->GetSimpleArea( aMarkRange );
719 : SCCOL nCol1, nCol2;
720 : SCROW nRow1, nRow2;
721 185 : nCol1 = aMarkRange.aStart.Col();
722 185 : nRow1 = aMarkRange.aStart.Row();
723 185 : nCol2 = aMarkRange.aEnd.Col();
724 185 : nRow2 = aMarkRange.aEnd.Row();
725 185 : if( nCol2 != nCol1 || nRow1 != nRow2 )
726 : {
727 0 : OUString aStr = ScGlobal::GetRscString( STR_ROWCOL_SELCOUNT );
728 0 : aStr = aStr.replaceAll( "$1", OUString::number( nRow2 - nRow1 + 1 ));
729 0 : aStr = aStr.replaceAll( "$2", OUString::number( nCol2 - nCol1 + 1 ));
730 0 : rSet.Put( SfxStringItem( nWhich, aStr ) );
731 : }
732 : }
733 185 : break;
734 :
735 : // calculations etc. with date/time/Fail/position&size together
736 :
737 : // #i34458# The SfxStringItem belongs only into SID_TABLE_CELL. It no longer has to be
738 : // duplicated in SID_ATTR_POSITION or SID_ATTR_SIZE for SvxPosSizeStatusBarControl.
739 : case SID_TABLE_CELL:
740 : {
741 : // Test, if error under cursor
742 : // (not pDoc->GetErrCode, to avoid erasing circular references)
743 :
744 : // In interpreter may happen via rescheduled Basic
745 185 : if ( pDoc->IsInInterpreter() )
746 0 : rSet.Put( SfxStringItem( nWhich, OUString("...") ) );
747 : else
748 : {
749 185 : sal_uInt16 nErrCode = 0;
750 185 : ScFormulaCell* pCell = pDoc->GetFormulaCell(ScAddress(nPosX, nPosY, nTab));
751 185 : if (pCell)
752 : {
753 0 : if (!pCell->IsRunning())
754 0 : nErrCode = pCell->GetErrCode();
755 : }
756 :
757 185 : OUString aFuncStr;
758 185 : if ( pTabViewShell->GetFunction( aFuncStr, nErrCode ) )
759 185 : rSet.Put( SfxStringItem( nWhich, aFuncStr ) );
760 : }
761 : }
762 185 : break;
763 :
764 : case SID_DATA_SELECT:
765 : // HasSelectionData includes column content and validity,
766 : // page fields have to be checked separately.
767 0 : if ( !pDoc->HasSelectionData( nPosX, nPosY, nTab ) &&
768 0 : !pTabViewShell->HasPageFieldDataAtCursor() )
769 0 : rSet.DisableItem( nWhich );
770 0 : break;
771 :
772 : case SID_STATUS_SUM:
773 : {
774 0 : OUString aFuncStr;
775 0 : if ( pTabViewShell->GetFunction( aFuncStr ) )
776 0 : rSet.Put( SfxStringItem( nWhich, aFuncStr ) );
777 : }
778 0 : break;
779 :
780 : case FID_MERGE_ON:
781 0 : if ( pDoc->GetChangeTrack() || !pTabViewShell->TestMergeCells() )
782 0 : rSet.DisableItem( nWhich );
783 0 : break;
784 :
785 : case FID_MERGE_OFF:
786 0 : if ( pDoc->GetChangeTrack() || !pTabViewShell->TestRemoveMerge() )
787 0 : rSet.DisableItem( nWhich );
788 0 : break;
789 :
790 : case FID_MERGE_TOGGLE:
791 185 : if ( pDoc->GetChangeTrack() )
792 0 : rSet.DisableItem( nWhich );
793 : else
794 : {
795 185 : bool bCanMerge = pTabViewShell->TestMergeCells();
796 185 : bool bCanSplit = pTabViewShell->TestRemoveMerge();
797 185 : if( !bCanMerge && !bCanSplit )
798 185 : rSet.DisableItem( nWhich );
799 : else
800 0 : rSet.Put( SfxBoolItem( nWhich, bCanSplit ) );
801 : }
802 185 : break;
803 :
804 : case FID_INS_ROWBRK:
805 185 : if ( nPosY==0 || (pDoc->HasRowBreak(nPosY, nTab) & BREAK_MANUAL) )
806 185 : rSet.DisableItem( nWhich );
807 185 : break;
808 :
809 : case FID_INS_COLBRK:
810 0 : if ( nPosX==0 || (pDoc->HasColBreak(nPosX, nTab) & BREAK_MANUAL) )
811 0 : rSet.DisableItem( nWhich );
812 0 : break;
813 :
814 : case FID_DEL_ROWBRK:
815 0 : if ( nPosY==0 || (pDoc->HasRowBreak(nPosY, nTab) & BREAK_MANUAL) == 0 )
816 0 : rSet.DisableItem( nWhich );
817 0 : break;
818 :
819 : case FID_DEL_COLBRK:
820 0 : if ( nPosX==0 || (pDoc->HasColBreak(nPosX, nTab) & BREAK_MANUAL) == 0 )
821 0 : rSet.DisableItem( nWhich );
822 0 : break;
823 :
824 : case FID_FILL_TAB:
825 0 : if ( nTabSelCount < 2 )
826 0 : rSet.DisableItem( nWhich );
827 0 : break;
828 :
829 : case SID_SELECT_SCENARIO:
830 : {
831 0 : std::vector<OUString> aList;
832 0 : Color aDummyCol;
833 :
834 0 : if ( !pDoc->IsScenario(nTab) )
835 : {
836 0 : OUString aStr;
837 : sal_uInt16 nFlags;
838 0 : SCTAB nScTab = nTab + 1;
839 0 : bool bSheetProtected = pDoc->IsTabProtected(nTab);
840 :
841 0 : while ( pDoc->IsScenario(nScTab) )
842 : {
843 0 : pDoc->GetName( nScTab, aStr );
844 0 : aList.push_back(aStr);
845 0 : pDoc->GetScenarioData( nScTab, aStr, aDummyCol, nFlags );
846 0 : aList.push_back(aStr);
847 : // Protection is sal_True if both Sheet and Scenario are protected
848 0 : aList.push_back((bSheetProtected && (nFlags & SC_SCENARIO_PROTECT)) ? OUString("1") : OUString("0"));
849 0 : ++nScTab;
850 0 : }
851 : }
852 : else
853 : {
854 0 : OUString aComment;
855 : sal_uInt16 nDummyFlags;
856 0 : pDoc->GetScenarioData( nTab, aComment, aDummyCol, nDummyFlags );
857 : OSL_ENSURE( aList.empty(), "List not empty!" );
858 0 : aList.push_back(aComment);
859 : }
860 :
861 0 : rSet.Put( SfxStringListItem( nWhich, &aList ) );
862 : }
863 0 : break;
864 :
865 : case FID_ROW_HIDE:
866 : case FID_ROW_SHOW:
867 : case FID_COL_HIDE:
868 : case FID_COL_SHOW:
869 : case FID_COL_OPT_WIDTH:
870 : case FID_ROW_OPT_HEIGHT:
871 : case FID_DELETE_CELL:
872 0 : if ( pDoc->IsTabProtected(nTab) || pDocSh->IsReadOnly())
873 0 : rSet.DisableItem( nWhich );
874 0 : break;
875 :
876 : case SID_OUTLINE_MAKE:
877 : {
878 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
879 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
880 : {
881 : //! test for data pilot operation
882 : }
883 0 : else if (pDoc->GetChangeTrack()!=NULL || GetViewData()->IsMultiMarked())
884 : {
885 0 : rSet.DisableItem( nWhich );
886 : }
887 : }
888 0 : break;
889 : case SID_OUTLINE_SHOW:
890 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
891 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
892 : {
893 : //! test for data pilot operation
894 : }
895 0 : else if (!pTabViewShell->OutlinePossible(false))
896 0 : rSet.DisableItem( nWhich );
897 0 : break;
898 :
899 : case SID_OUTLINE_HIDE:
900 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
901 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
902 : {
903 : //! test for data pilot operation
904 : }
905 0 : else if (!pTabViewShell->OutlinePossible(true))
906 0 : rSet.DisableItem( nWhich );
907 0 : break;
908 :
909 : case SID_OUTLINE_REMOVE:
910 : {
911 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
912 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
913 : {
914 : //! test for data pilot operation
915 : }
916 : else
917 : {
918 : bool bCol, bRow;
919 0 : pTabViewShell->TestRemoveOutline( bCol, bRow );
920 0 : if ( !bCol && !bRow )
921 0 : rSet.DisableItem( nWhich );
922 : }
923 : }
924 0 : break;
925 :
926 : case FID_COL_WIDTH:
927 : {
928 : //GetViewData()->GetCurX();
929 0 : SfxUInt16Item aWidthItem( FID_COL_WIDTH, pDoc->GetColWidth( nPosX , nTab) );
930 0 : rSet.Put( aWidthItem );
931 0 : if ( pDocSh->IsReadOnly())
932 0 : rSet.DisableItem( nWhich );
933 :
934 : //XXX disable if not conclusive
935 : }
936 0 : break;
937 :
938 : case FID_ROW_HEIGHT:
939 : {
940 : //GetViewData()->GetCurY();
941 0 : SfxUInt16Item aHeightItem( FID_ROW_HEIGHT, pDoc->GetRowHeight( nPosY , nTab) );
942 0 : rSet.Put( aHeightItem );
943 : //XXX disable if not conclusive
944 0 : if ( pDocSh->IsReadOnly())
945 0 : rSet.DisableItem( nWhich );
946 : }
947 0 : break;
948 :
949 : case SID_DETECTIVE_FILLMODE:
950 0 : rSet.Put(SfxBoolItem( nWhich, pTabViewShell->IsAuditShell() ));
951 0 : break;
952 :
953 : case FID_INPUTLINE_STATUS:
954 : OSL_FAIL( "Old update method. Use ScTabViewShell::UpdateInputHandler()." );
955 0 : break;
956 :
957 : case SID_SCENARIOS: // scenarios:
958 0 : if (!(rMark.IsMarked() || rMark.IsMultiMarked())) // only, if something selected
959 0 : rSet.DisableItem( nWhich );
960 0 : break;
961 :
962 : case FID_NOTE_VISIBLE:
963 : {
964 0 : const ScPostIt* pNote = pDoc->GetNote(nPosX, nPosY, nTab);
965 0 : if ( pNote && pDoc->IsBlockEditable( nTab, nPosX,nPosY, nPosX,nPosY ) )
966 0 : rSet.Put( SfxBoolItem( nWhich, pNote->IsCaptionShown() ) );
967 : else
968 0 : rSet.DisableItem( nWhich );
969 : }
970 0 : break;
971 :
972 : case FID_HIDE_NOTE:
973 : case FID_SHOW_NOTE:
974 : {
975 0 : bool bEnable = false;
976 0 : bool bSearchForHidden = nWhich == FID_SHOW_NOTE;
977 0 : if (!rMark.IsMarked() && !rMark.IsMultiMarked())
978 : {
979 : // Check current cell
980 0 : const ScPostIt* pNote = pDoc->GetNote(nPosX, nPosY, nTab);
981 0 : if ( pNote && pDoc->IsBlockEditable( nTab, nPosX,nPosY, nPosX,nPosY ) )
982 0 : if ( pNote->IsCaptionShown() != bSearchForHidden)
983 0 : bEnable = true;
984 : }
985 : else
986 : {
987 : // Check selection range
988 0 : ScRangeListRef aRangesRef;
989 0 : pData->GetMultiArea(aRangesRef);
990 0 : ScRangeList aRanges = *aRangesRef;
991 0 : std::vector<sc::NoteEntry> aNotes;
992 0 : pDoc->GetNotesInRange(aRanges, aNotes);
993 0 : for(std::vector<sc::NoteEntry>::const_iterator itr = aNotes.begin(),
994 0 : itrEnd = aNotes.end(); itr != itrEnd; ++itr)
995 : {
996 0 : const ScAddress& rAdr = itr->maPos;
997 0 : if( pDoc->IsBlockEditable( rAdr.Tab(), rAdr.Col(), rAdr.Row(), rAdr.Col(), rAdr.Row() ))
998 : {
999 0 : if (itr->mpNote->IsCaptionShown() != bSearchForHidden)
1000 : {
1001 0 : bEnable = true;
1002 0 : break;
1003 : }
1004 : }
1005 0 : }
1006 :
1007 : }
1008 0 : if ( !bEnable )
1009 0 : rSet.DisableItem( nWhich );
1010 : }
1011 0 : break;
1012 :
1013 : case SID_DELETE_NOTE:
1014 : {
1015 0 : bool bEnable = false;
1016 0 : if ( rMark.IsMarked() || rMark.IsMultiMarked() )
1017 : {
1018 0 : if ( pDoc->IsSelectionEditable( rMark ) )
1019 : {
1020 : // look for at least one note in selection
1021 0 : ScRangeList aRanges;
1022 0 : rMark.FillRangeListWithMarks( &aRanges, false );
1023 0 : bEnable = pDoc->ContainsNotesInRange( aRanges );
1024 : }
1025 : }
1026 : else
1027 : {
1028 0 : bEnable = pDoc->IsBlockEditable( nTab, nPosX,nPosY, nPosX,nPosY ) &&
1029 0 : pDoc->GetNote(nPosX, nPosY, nTab);
1030 : }
1031 0 : if ( !bEnable )
1032 0 : rSet.DisableItem( nWhich );
1033 : }
1034 0 : break;
1035 :
1036 : case SID_OPENDLG_CONSOLIDATE:
1037 : case SCITEM_CONSOLIDATEDATA:
1038 : {
1039 0 : if(pDoc->GetChangeTrack()!=NULL)
1040 0 : rSet.DisableItem( nWhich);
1041 : }
1042 0 : break;
1043 :
1044 : case SID_CHINESE_CONVERSION:
1045 : case SID_HANGUL_HANJA_CONVERSION:
1046 0 : ScViewUtil::HideDisabledSlot( rSet, pData->GetBindings(), nWhich );
1047 0 : break;
1048 :
1049 : case FID_USE_NAME:
1050 : {
1051 0 : if ( pDocSh && pDocSh->IsDocShared() )
1052 0 : rSet.DisableItem( nWhich );
1053 : else
1054 : {
1055 0 : ScRange aRange;
1056 0 : if ( pData->GetSimpleArea( aRange ) != SC_MARK_SIMPLE )
1057 0 : rSet.DisableItem( nWhich );
1058 : }
1059 : }
1060 0 : break;
1061 :
1062 : case FID_DEFINE_NAME:
1063 : case FID_INSERT_NAME:
1064 : case FID_ADD_NAME:
1065 : case SID_DEFINE_COLROWNAMERANGES:
1066 : {
1067 0 : if ( pDocSh && pDocSh->IsDocShared() )
1068 : {
1069 0 : rSet.DisableItem( nWhich );
1070 : }
1071 : }
1072 0 : break;
1073 :
1074 : case SID_SPELL_DIALOG:
1075 : {
1076 185 : if ( pDoc && pData && pDoc->IsTabProtected( pData->GetTabNo() ) )
1077 : {
1078 0 : bool bVisible = false;
1079 0 : SfxViewFrame* pViewFrame = ( pTabViewShell ? pTabViewShell->GetViewFrame() : NULL );
1080 0 : if ( pViewFrame && pViewFrame->HasChildWindow( nWhich ) )
1081 : {
1082 0 : SfxChildWindow* pChild = pViewFrame->GetChildWindow( nWhich );
1083 0 : vcl::Window* pWin = ( pChild ? pChild->GetWindow() : NULL );
1084 0 : if ( pWin && pWin->IsVisible() )
1085 : {
1086 0 : bVisible = true;
1087 : }
1088 : }
1089 0 : if ( !bVisible )
1090 : {
1091 0 : rSet.DisableItem( nWhich );
1092 : }
1093 : }
1094 : }
1095 185 : break;
1096 :
1097 : } // switch ( nWitch )
1098 2707 : nWhich = aIter.NextWhich();
1099 2335 : } // while ( nWitch )
1100 2491 : }
1101 :
1102 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|