LibreOffice Module sw (master)  1
glbltree.cxx
Go to the documentation of this file.
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 <o3tl/safeint.hxx>
21 #include <svl/stritem.hxx>
22 #include <sfx2/fcontnr.hxx>
23 #include <sfx2/linkmgr.hxx>
24 #include <sfx2/dispatch.hxx>
25 #include <sfx2/viewfrm.hxx>
26 #include <sfx2/docfile.hxx>
27 #include <sfx2/docfilt.hxx>
28 #include <vcl/commandevent.hxx>
29 #include <vcl/event.hxx>
30 #include <vcl/help.hxx>
31 #include <sot/filelist.hxx>
32 #include <svl/eitem.hxx>
33 #include <vcl/graphicfilter.hxx>
34 #include <vcl/settings.hxx>
35 
36 #include <sfx2/docinsert.hxx>
37 #include <sfx2/filedlghelper.hxx>
38 
39 #include <wrtsh.hxx>
40 #include <view.hxx>
41 #include <docsh.hxx>
42 #include <edglbldc.hxx>
43 #include <section.hxx>
44 #include <tox.hxx>
45 #include <navipi.hxx>
46 #include <edtwin.hxx>
47 #include <toxmgr.hxx>
48 
49 #include <cmdid.h>
50 #include <helpids.h>
51 #include <strings.hrc>
52 #include <bitmaps.hlst>
53 #include <swabstdlg.hxx>
54 #include <memory>
55 
56 using namespace ::com::sun::star::uno;
57 
58 #define GLOBAL_UPDATE_TIMEOUT 2000
59 
61 
62 namespace {
63 
64 class SwGlobalFrameListener_Impl : public SfxListener
65 {
66  bool bValid;
67 public:
68  explicit SwGlobalFrameListener_Impl(SfxViewFrame& rFrame)
69  : bValid(true)
70  {
71  StartListening(rFrame);
72  }
73 
74  virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
75 
76  bool IsValid() const {return bValid;}
77 };
78 
79 }
80 
81 void SwGlobalFrameListener_Impl::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
82 {
83  if( rHint.GetId() == SfxHintId::Dying)
84  bValid = false;
85 }
86 
87 namespace {
88 
90 {
91  IDX_STR_UPDATE = 0,
92  IDX_STR_EDIT_CONTENT = 1,
93  IDX_STR_EDIT_INSERT = 2,
94  IDX_STR_INDEX = 3,
95  IDX_STR_FILE = 4,
96  IDX_STR_NEW_FILE = 5,
97  IDX_STR_INSERT_TEXT = 6,
98  IDX_STR_DELETE = 7,
99  IDX_STR_UPDATE_SEL = 8,
100  IDX_STR_UPDATE_INDEX = 9,
101  IDX_STR_UPDATE_LINK = 10,
102  IDX_STR_UPDATE_ALL = 11,
103  IDX_STR_BROKEN_LINK = 12,
104  IDX_STR_EDIT_LINK = 13
105 };
106 
107 }
108 
109 static const char* GLOBAL_CONTEXT_ARY[] =
110 {
111  STR_UPDATE,
112  STR_EDIT_CONTENT,
113  STR_EDIT_INSERT,
114  STR_INDEX,
115  STR_FILE,
116  STR_NEW_FILE,
117  STR_INSERT_TEXT,
118  STR_DELETE,
119  STR_UPDATE_SEL,
120  STR_UPDATE_INDEX,
121  STR_UPDATE_LINK,
122  STR_UPDATE_ALL,
123  STR_BROKEN_LINK,
124  STR_EDIT_LINK
125 };
126 
127 SwGlobalTree::SwGlobalTree(std::unique_ptr<weld::TreeView> xTreeView, SwNavigationPI* pDialog)
128  : m_xTreeView(std::move(xTreeView))
129  , m_aDropTargetHelper(*this)
130  , m_xDialog(pDialog)
131  , m_pActiveShell(nullptr)
132 {
133  Size aSize(m_xDialog->LogicToPixel(Size(110, 112), MapMode(MapUnit::MapAppFont)));;
134  m_xTreeView->set_size_request(aSize.Width(), aSize.Height());
135 
139  for (sal_uInt16 i = 0; i < GLOBAL_CONTEXT_COUNT; i++)
140  {
141  m_aContextStrings[i] = SwResId(GLOBAL_CONTEXT_ARY[i]);
142  }
144  Select();
145  m_xTreeView->connect_row_activated(LINK(this, SwGlobalTree, DoubleClickHdl));
146  m_xTreeView->connect_changed(LINK(this, SwGlobalTree, SelectHdl));
147  m_xTreeView->connect_focus_in(LINK(this, SwGlobalTree, FocusInHdl));
148  m_xTreeView->connect_key_press(LINK(this, SwGlobalTree, KeyInputHdl));
149  m_xTreeView->connect_popup_menu(LINK(this, SwGlobalTree, CommandHdl));
150  m_xTreeView->connect_query_tooltip(LINK(this, SwGlobalTree, QueryTooltipHdl));
151 }
152 
154 {
155  m_pSwGlblDocContents.reset();
156  m_pDocInserter.reset();
158  m_xDialog.clear();
159 }
160 
162  : DropTargetHelper(rTreeView.get_widget().get_drop_target())
163  , m_rTreeView(rTreeView)
164 {
165 }
166 
168 {
169  sal_Int8 nRet = DND_ACTION_NONE;
170 
172  std::unique_ptr<weld::TreeIter> xDropEntry(rWidget.make_iterator());
173  if (!rWidget.get_dest_row_at_pos(rEvt.maPosPixel, xDropEntry.get(), true))
174  xDropEntry.reset();
175 
176  if (rWidget.get_drag_source() == &rWidget) // internal drag
177  m_rTreeView.MoveSelectionTo(xDropEntry.get());
178  else
179  {
180  TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
181 
182  OUString sFileName;
183  const SwGlblDocContent* pCnt = xDropEntry ?
184  reinterpret_cast<const SwGlblDocContent*>(rWidget.get_id(*xDropEntry).toInt64()) :
185  nullptr;
186  if( aData.HasFormat( SotClipboardFormatId::FILE_LIST ))
187  {
188  nRet = rEvt.mnAction;
189  std::unique_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
190  int nAbsContPos = xDropEntry ?
191  rWidget.get_iter_index_in_parent(*xDropEntry):
192  - 1;
193  size_t nEntryCount = rWidget.n_children();
194 
195  // Get data
196  FileList aFileList;
197  aData.GetFileList( SotClipboardFormatId::FILE_LIST, aFileList );
198  for ( size_t n = aFileList.Count(); n--; )
199  {
200  sFileName = aFileList.GetFile(n);
201  m_rTreeView.InsertRegion(pCnt, &sFileName);
202  // The list of contents must be newly fetched after inserting,
203  // to not work on an old content.
204  if(n)
205  {
207  // If the file was successfully inserted,
208  // then the next content must also be fetched.
209  if(nEntryCount < pTempContents->size())
210  {
211  nEntryCount++;
212  nAbsContPos++;
213  pCnt = (*pTempContents)[ nAbsContPos ].get();
214  }
215  }
216  }
217  }
218  else if( !(sFileName =
219  SwNavigationPI::CreateDropFileName( aData )).isEmpty())
220  {
221  INetURLObject aTemp(sFileName);
222  GraphicDescriptor aDesc(aTemp);
223  if( !aDesc.Detect() ) // accept no graphics
224  {
225  nRet = rEvt.mnAction;
226  m_rTreeView.InsertRegion(pCnt, &sFileName);
227  }
228  }
229  }
230  return nRet;
231 }
232 
234 {
235  // to enable the autoscroll when we're close to the edges
237  rWidget.get_dest_row_at_pos(rEvt.maPosPixel, nullptr, true);
238 
239  sal_Int8 nRet = rEvt.mnAction;
240 
241  if (rWidget.get_drag_source() == &rWidget) // internal drag
242  return nRet;
243 
244  if (IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE) ||
245  IsDropFormatSupported( SotClipboardFormatId::STRING) ||
246  IsDropFormatSupported( SotClipboardFormatId::FILE_LIST) ||
247  IsDropFormatSupported( SotClipboardFormatId::SOLK) ||
248  IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )||
249  IsDropFormatSupported( SotClipboardFormatId::FILECONTENT) ||
250  IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR) ||
251  IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR) ||
252  IsDropFormatSupported( SotClipboardFormatId::FILENAME))
253  {
254  nRet = DND_ACTION_LINK;
255  }
256 
257  return nRet;
258 }
259 
260 IMPL_LINK(SwGlobalTree, CommandHdl, const CommandEvent&, rCEvt, bool)
261 {
262  if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
263  return false;
264 
265  bool bPop = false;
266  if (m_pActiveShell && !m_pActiveShell->GetView().GetDocShell()->IsReadOnly())
267  {
268  std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xTreeView.get(), "modules/swriter/ui/mastercontextmenu.ui"));
269  std::unique_ptr<weld::Menu> xPopup = xBuilder->weld_menu("navmenu");
270 
271  const MenuEnableFlags nEnableFlags = GetEnableFlags();
272 
273  xPopup->set_sensitive("updatesel", bool(nEnableFlags & MenuEnableFlags::UpdateSel));
274 
275  xPopup->set_sensitive("editlink", bool(nEnableFlags & MenuEnableFlags::EditLink));
276 
277  //disabling if applicable
278  xPopup->set_sensitive("insertindex", bool(nEnableFlags & MenuEnableFlags::InsertIdx ));
279  xPopup->set_sensitive("insertfile", bool(nEnableFlags & MenuEnableFlags::InsertFile));
280  xPopup->set_sensitive("insertnewfile", bool(nEnableFlags & MenuEnableFlags::InsertFile));
281  xPopup->set_sensitive("inserttext", bool(nEnableFlags & MenuEnableFlags::InsertText));
282 
283  xPopup->set_sensitive("update", bool(nEnableFlags & MenuEnableFlags::Update));
284  xPopup->set_sensitive("insert", bool(nEnableFlags & MenuEnableFlags::InsertIdx));
285  xPopup->set_sensitive("editcontent", bool(nEnableFlags & MenuEnableFlags::Edit));
286  xPopup->set_sensitive("deleteentry", bool(nEnableFlags & MenuEnableFlags::Delete));
287 
288  OString sCommand = xPopup->popup_at_rect(m_xTreeView.get(), tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1)));
289  if (!sCommand.isEmpty())
290  ExecuteContextMenuAction(sCommand);
291 
292  bPop = true;
293  }
294  return bPop;
295 }
296 
297 void SwGlobalTree::TbxMenuHdl(const OString& rCommand, weld::Menu& rMenu)
298 {
299  const MenuEnableFlags nEnableFlags = GetEnableFlags();
300  if (rCommand == "insert")
301  {
302  rMenu.set_sensitive("insertindex", bool(nEnableFlags & MenuEnableFlags::InsertIdx));
303  rMenu.set_sensitive("insertfile", bool(nEnableFlags & MenuEnableFlags::InsertFile));
304  rMenu.set_sensitive("insertnewfile", bool(nEnableFlags & MenuEnableFlags::InsertFile));
305  rMenu.set_sensitive("inserttext", bool(nEnableFlags & MenuEnableFlags::InsertText));
306  }
307  else if (rCommand == "update")
308  {
309  rMenu.set_sensitive("updatesel", bool(nEnableFlags & MenuEnableFlags::UpdateSel));
310  }
311 }
312 
314 {
315  std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator());
316  bool bEntry = m_xTreeView->get_selected(xEntry.get());
317 
318  sal_uLong nSelCount = m_xTreeView->count_selected_rows();
319  size_t nEntryCount = m_xTreeView->n_children();
320  std::unique_ptr<weld::TreeIter> xPrevEntry;
321  bool bPrevEntry = false;
322  if (bEntry)
323  {
324  xPrevEntry = m_xTreeView->make_iterator(xEntry.get());
325  bPrevEntry = m_xTreeView->iter_previous(*xPrevEntry);
326  }
327 
329  if(nSelCount == 1 || !nEntryCount)
331  if(nSelCount == 1)
332  {
333  nRet |= MenuEnableFlags::Edit;
334  if (bEntry && reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetType() != GLBLDOC_UNKNOWN &&
335  (!bPrevEntry || reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xPrevEntry).toInt64())->GetType() != GLBLDOC_UNKNOWN))
337  if (bEntry && GLBLDOC_SECTION == reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(*xEntry).toInt64())->GetType())
339  }
340  else if(!nEntryCount)
341  {
343  }
344  if(nEntryCount)
346  if(nSelCount)
348  return nRet;
349 }
350 
351 IMPL_LINK(SwGlobalTree, QueryTooltipHdl, const weld::TreeIter&, rIter, OUString)
352 {
353  OUString sEntry;
354 
355  const SwGlblDocContent* pCont = reinterpret_cast<const SwGlblDocContent*>(m_xTreeView->get_id(rIter).toInt64());
356  if (pCont && GLBLDOC_SECTION == pCont->GetType())
357  {
358  const SwSection* pSect = pCont->GetSection();
359  sEntry = pSect->GetLinkFileName().getToken(0, sfx2::cTokenSeparator);
360  if (!pSect->IsConnectFlag())
361  sEntry = m_aContextStrings[IDX_STR_BROKEN_LINK] + sEntry;
362  }
363 
364  return sEntry;
365 }
366 
368 {
369  Select();
370 }
371 
373 {
374  int nSelCount = m_xTreeView->count_selected_rows();
375  int nSel = m_xTreeView->get_selected_index();
376  int nAbsPos = nSel != -1 ? nSel : 0;
377  SwNavigationPI* pNavi = GetParentWindow();
378  bool bReadonly = !m_pActiveShell ||
380  pNavi->m_xGlobalToolBox->set_item_sensitive("edit", nSelCount == 1 && !bReadonly);
381  pNavi->m_xGlobalToolBox->set_item_sensitive("insert", nSelCount <= 1 && !bReadonly);
382  pNavi->m_xGlobalToolBox->set_item_sensitive("update", m_xTreeView->n_children() > 0 && !bReadonly);
383  pNavi->m_xGlobalToolBox->set_item_sensitive("moveup",
384  nSelCount == 1 && nAbsPos && !bReadonly);
385  pNavi->m_xGlobalToolBox->set_item_sensitive("movedown",
386  nSelCount == 1 && nAbsPos < m_xTreeView->n_children() - 1 && !bReadonly);
387 
388 }
389 
391 {
392  int nSource = m_xTreeView->get_selected_index();
393 
394  int nDest = pDropEntry ? m_xTreeView->get_iter_index_in_parent(*pDropEntry)
395  : m_pSwGlblDocContents->size();
396 
398  *m_pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
399  Update( false ))
400  Display();
401 }
402 
404 {
405  if (Update(false))
406  Display();
407 }
408 
409 IMPL_LINK(SwGlobalTree, KeyInputHdl, const KeyEvent&, rKEvt, bool)
410 {
411  bool bHandled = false;
412  const vcl::KeyCode aCode = rKEvt.GetKeyCode();
413  if (aCode.GetCode() == KEY_RETURN)
414  {
415  switch (aCode.GetModifier())
416  {
417  case KEY_MOD2:
418  // Switch boxes
419  GetParentWindow()->ToggleTree();
420  bHandled = true;
421  break;
422  }
423  }
424  return bHandled;
425 }
426 
427 void SwGlobalTree::Display(bool bOnlyUpdateUserData)
428 {
429  size_t nCount = m_pSwGlblDocContents->size();
430  size_t nChildren = m_xTreeView->n_children();
431  if (bOnlyUpdateUserData && nChildren == m_pSwGlblDocContents->size())
432  {
433  std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
434  bool bEntry = m_xTreeView->get_iter_first(*xEntry);
435  for (size_t i = 0; i < nCount && bEntry; i++)
436  {
437  const SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get();
438  OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCont)));
439  m_xTreeView->set_id(*xEntry, sId);
440  if (pCont->GetType() == GLBLDOC_SECTION && !pCont->GetSection()->IsConnectFlag())
441  m_xTreeView->set_font_color(*xEntry, COL_LIGHTRED);
442  else
443  m_xTreeView->set_font_color(*xEntry, COL_AUTO);
444  bEntry = m_xTreeView->iter_next(*xEntry);
445  assert(bEntry || i == nCount - 1);
446  }
447  }
448  else
449  {
450  int nOldSelEntry = m_xTreeView->get_selected_index();
451  OUString sEntryName; // Name of the entry
452  int nSelPos = -1;
453  if (nOldSelEntry != -1)
454  {
455  sEntryName = m_xTreeView->get_text(nOldSelEntry);
456  nSelPos = nOldSelEntry;
457  }
458  m_xTreeView->freeze();
459  m_xTreeView->clear();
461  Update( false );
462 
463  int nSelEntry = -1;
464  for (size_t i = 0; i < nCount; ++i)
465  {
466  const SwGlblDocContent* pCont = (*m_pSwGlblDocContents)[i].get();
467 
468  OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pCont)));
469  OUString sEntry;
470  OUString aImage;
471  switch (pCont->GetType())
472  {
473  case GLBLDOC_UNKNOWN:
474  sEntry = m_aContextStrings[IDX_STR_INSERT_TEXT];
475  break;
476  case GLBLDOC_TOXBASE:
477  {
478  const SwTOXBase* pBase = pCont->GetTOX();
479  sEntry = pBase->GetTitle();
480  aImage = RID_BMP_NAVI_INDEX;
481  }
482  break;
483  case GLBLDOC_SECTION:
484  {
485  const SwSection* pSect = pCont->GetSection();
486  sEntry = pSect->GetSectionName();
487  aImage = RID_BMP_DROP_REGION;
488  }
489  break;
490  }
491 
492  m_xTreeView->append(sId, sEntry);
493  if (!aImage.isEmpty())
494  m_xTreeView->set_image(i, aImage);
495 
496  if (pCont->GetType() == GLBLDOC_SECTION && !pCont->GetSection()->IsConnectFlag())
497  m_xTreeView->set_font_color(i, COL_LIGHTRED);
498 
499  if (sEntry == sEntryName)
500  nSelEntry = i;
501  }
502  m_xTreeView->thaw();
503  if (nSelEntry != -1)
504  m_xTreeView->select(nSelEntry);
505  else if (nSelPos != -1 && o3tl::make_unsigned(nSelPos) < nCount)
506  m_xTreeView->select(nSelPos);
507  else if (nCount)
508  m_xTreeView->select(0);
509  Select();
510  }
511 }
512 
513 void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* pFileName )
514 {
515  Sequence< OUString > aFileNames;
516  if ( !pFileName )
517  {
518  m_pDocInserter.reset(new ::sfx2::DocumentInserter(GetParentWindow()->GetFrameWeld(), "swriter", sfx2::DocumentInserter::Mode::InsertMulti));
519  m_pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) );
520  }
521  else if ( !pFileName->isEmpty() )
522  {
523  aFileNames.realloc(1);
524  INetURLObject aFileName;
525  aFileName.SetSmartURL( *pFileName );
526  aFileNames.getArray()[0] = aFileName.GetMainURL( INetURLObject::DecodeMechanism::NONE );
527  InsertRegion( pCont, aFileNames );
528  }
529 }
530 
532 {
533  sal_uInt16 nSlot = 0;
534  switch( pCont->GetType() )
535  {
536  case GLBLDOC_UNKNOWN:
538  break;
539  case GLBLDOC_TOXBASE:
540  {
541  const SwTOXBase* pBase = pCont->GetTOX();
542  if(pBase)
543  nSlot = FN_INSERT_MULTI_TOX;
544  }
545  break;
546  case GLBLDOC_SECTION:
547  {
548  OpenDoc(pCont);
549 
550  nSlot = 0;
551  pCont = nullptr;
552  }
553  break;
554  }
555  if(pCont)
556  GotoContent(pCont);
557  if(nSlot)
558  {
560  if(Update( false ))
561  Display();
562  }
563 }
564 
565 void SwGlobalTree::ExecuteContextMenuAction(const OString& rSelectedPopupEntry)
566 {
567  bool bUpdateHard = false;
568 
569  int nEntry = m_xTreeView->get_selected_index();
570  SwGlblDocContent* pCont = nEntry != -1 ? reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64()) : nullptr;
571  // If a RequestHelp is called during the dialogue,
572  // then the content gets lost. Because of that a copy
573  // is created in which only the DocPos is set correctly.
574  std::unique_ptr<SwGlblDocContent> pContCopy;
575  if(pCont)
576  pContCopy.reset(new SwGlblDocContent(pCont->GetDocPos()));
578  sal_uInt16 nSlot = 0;
579  if (rSelectedPopupEntry == "updatesel")
580  {
581  // Two passes: first update the areas, then the directories.
582  m_xTreeView->selected_foreach([this](weld::TreeIter& rSelEntry){
583  SwGlblDocContent* pContent = reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(rSelEntry).toInt64());
584  if (GLBLDOC_SECTION == pContent->GetType() &&
585  pContent->GetSection()->IsConnected())
586  {
587  const_cast<SwSection*>(pContent->GetSection())->UpdateNow();
588  }
589  return false;
590  });
591  m_xTreeView->selected_foreach([this](weld::TreeIter& rSelEntry){
592  SwGlblDocContent* pContent = reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(rSelEntry).toInt64());
593  if (GLBLDOC_TOXBASE == pContent->GetType())
594  m_pActiveShell->UpdateTableOf(*pContent->GetTOX());
595  return false;
596  });
597 
598  bUpdateHard = true;
599  }
600  else if (rSelectedPopupEntry == "updateindex")
601  {
602  nSlot = FN_UPDATE_TOX;
603  bUpdateHard = true;
604  }
605  else if (rSelectedPopupEntry == "updatelinks" || rSelectedPopupEntry == "updateall")
606  {
607  m_pActiveShell->GetLinkManager().UpdateAllLinks(true, false, nullptr);
608  if (rSelectedPopupEntry == "updateall")
609  nSlot = FN_UPDATE_TOX;
610  pCont = nullptr;
611  bUpdateHard = true;
612  }
613  else if (rSelectedPopupEntry == "edit")
614  {
615  OSL_ENSURE(pCont, "edit without entry ? " );
616  if (pCont)
617  {
618  EditContent(pCont);
619  }
620  }
621  else if (rSelectedPopupEntry == "editlink")
622  {
623  OSL_ENSURE(pCont, "edit without entry ? " );
624  if (pCont)
625  {
627  pCont->GetSection()->GetSectionName());
628  rDispatch.ExecuteList(FN_EDIT_REGION, SfxCallMode::ASYNCHRON,
629  { &aName });
630  }
631  }
632  else if (rSelectedPopupEntry == "deleteentry")
633  {
634  // If several entries selected, then after each delete the array
635  // must be refilled. So you do not have to remember anything,
636  // deleting begins at the end.
637  std::vector<int> aRows = m_xTreeView->get_selected_rows();
638  std::sort(aRows.begin(), aRows.end());
639 
640  std::unique_ptr<SwGlblDocContents> pTempContents;
642  for (auto iter = aRows.rbegin(); iter != aRows.rend(); ++iter)
643  {
645  pTempContents ? *pTempContents : *m_pSwGlblDocContents,
646  *iter);
647  pTempContents.reset(new SwGlblDocContents);
648  m_pActiveShell->GetGlobalDocContent(*pTempContents);
649  }
650  pTempContents.reset();
652  pCont = nullptr;
653  }
654  else if (rSelectedPopupEntry == "insertindex")
655  {
656  if(pContCopy)
657  {
658  SfxItemSet aSet(
660  svl::Items<
664  RES_COL, RES_COL,
665  SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
666  FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE>{});
667 
669  ScopedVclPtr<AbstractMultiTOXTabDialog> pDlg(pFact->CreateMultiTOXTabDialog(
670  m_xDialog->GetFrameWeld(), aSet,
672  nullptr,
673  true));
674  if(RET_OK == pDlg->Execute())
675  {
676  SwTOXDescription& rDesc = pDlg->GetTOXDescription(
677  pDlg->GetCurrentTOXType());
678  SwTOXMgr aMgr(m_pActiveShell);
679  SwTOXBase* pToInsert = nullptr;
680  if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet()))
681  m_pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert );
682  }
683  pCont = nullptr;
684  }
685  }
686  else if (rSelectedPopupEntry == "insertfile")
687  {
688  m_pDocContent = std::move(pContCopy);
689  InsertRegion( m_pDocContent.get() );
690  pCont = nullptr;
691  }
692  else if (rSelectedPopupEntry == "insertnewfile")
693  {
694  SfxViewFrame* pGlobFrame = m_pActiveShell->GetView().GetViewFrame();
695  SwGlobalFrameListener_Impl aFrameListener(*pGlobFrame);
696 
697  // Creating a new doc
698  SfxStringItem aFactory(SID_NEWDOCDIRECT,
699  SwDocShell::Factory().GetFilterContainer()->GetName());
700 
701  const SfxFrameItem* pItem = static_cast<const SfxFrameItem*>(
702  rDispatch.ExecuteList(SID_NEWDOCDIRECT,
703  SfxCallMode::SYNCHRON, { &aFactory }));
704 
705  // save at
706  SfxFrame* pFrame = pItem ? pItem->GetFrame() : nullptr;
707  SfxViewFrame* pViewFrame = pFrame ? pFrame->GetCurrentViewFrame() : nullptr;
708  if (pViewFrame)
709  {
710  const SfxBoolItem* pBool = static_cast<const SfxBoolItem*>(
711  pViewFrame->GetDispatcher()->Execute(
712  SID_SAVEASDOC, SfxCallMode::SYNCHRON ));
713  SfxObjectShell& rObj = *pViewFrame->GetObjectShell();
714  const SfxMedium* pMedium = rObj.GetMedium();
715  OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::ToIUri));
716  // Insert the area with the Doc-Name
717  // Bring the own Doc in the foreground
718  if(aFrameListener.IsValid() && !sNewFile.isEmpty())
719  {
720  pGlobFrame->ToTop();
721  // Due to the update the entries are invalid
722  if (nEntry != -1)
723  {
724  Update( false );
725  Display();
726  m_xTreeView->select(nEntry);
727  Select();
728  nEntry = m_xTreeView->get_selected_index();
729  pCont = nEntry != -1 ? reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64()) : nullptr;
730  }
731  else
732  {
733  nEntry = -1;
734  pCont = nullptr;
735  }
736  if(pBool->GetValue())
737  {
738  InsertRegion(pCont, &sNewFile);
739  pViewFrame->ToTop();
740  }
741  else
742  pViewFrame->GetDispatcher()->Execute(SID_CLOSEWIN, SfxCallMode::SYNCHRON);
743  }
744  else
745  {
746  pViewFrame->ToTop();
747  return;
748  }
749  }
750  }
751  else if (rSelectedPopupEntry == "inserttext")
752  {
753  if (pCont)
755  else
756  {
757  m_pActiveShell->SplitNode(); // Empty document
758  m_pActiveShell->Up( false );
759  }
761  }
762  else if (rSelectedPopupEntry == "update")
763  pCont = nullptr;
764 
765  if (pCont)
766  GotoContent(pCont);
767  if (nSlot)
768  rDispatch.Execute(nSlot);
769  if (Update(bUpdateHard))
770  Display();
771 }
772 
774 {
775  if (!m_xTreeView->has_focus() && Update(false))
776  Display();
777 }
778 
780 {
782 
783  switch( pCont->GetType() )
784  {
785  case GLBLDOC_UNKNOWN:
787  break;
788  case GLBLDOC_TOXBASE:
789  {
790  const OUString sName = pCont->GetTOX()->GetTOXName();
791  if (!m_pActiveShell->GotoNextTOXBase(&sName))
793  }
794  break;
795  case GLBLDOC_SECTION:
796  break;
797  }
798 
799 }
800 
802 {
804  m_xTreeView->show();
805 }
806 
808 {
810  m_xTreeView->hide();
811 }
812 
813 void SwGlobalTree::ExecCommand(const OString &rCmd)
814 {
815  int nEntry = m_xTreeView->get_selected_index();
816  if (nEntry == -1)
817  return;
818  if (rCmd == "edit")
819  {
820  const SwGlblDocContent* pCont = reinterpret_cast<const SwGlblDocContent*>(
821  m_xTreeView->get_id(nEntry).toInt64());
822  EditContent(pCont);
823  }
824  else
825  {
826  if (m_xTreeView->count_selected_rows() == 1)
827  {
828  bool bMove = false;
829  sal_uLong nSource = nEntry;
830  sal_uLong nDest = nSource;
831  if (rCmd == "movedown")
832  {
833  size_t nEntryCount = m_xTreeView->n_children();
834  bMove = nEntryCount > nSource + 1;
835  nDest+= 2;
836  }
837  else if (rCmd == "moveup")
838  {
839  bMove = 0 != nSource;
840  nDest--;
841  }
842  if( bMove && m_pActiveShell->MoveGlobalDocContent(
843  *m_pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
844  Update( false ))
845  Display();
846  }
847  }
848 }
849 
850 bool SwGlobalTree::Update(bool bHard)
851 {
852  SwView* pActView = GetParentWindow()->GetCreateView();
853  bool bRet = false;
854  if (pActView && pActView->GetWrtShellPtr())
855  {
856  const SwWrtShell* pOldShell = m_pActiveShell;
857  m_pActiveShell = pActView->GetWrtShellPtr();
858  if(m_pActiveShell != pOldShell)
859  {
860  m_pSwGlblDocContents.reset();
861  }
863  {
865  bRet = true;
867  }
868  else
869  {
870  bool bCopy = false;
871  std::unique_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
872  m_pActiveShell->GetGlobalDocContent(*pTempContents);
873  size_t nChildren = m_xTreeView->n_children();
874  if (pTempContents->size() != m_pSwGlblDocContents->size() ||
875  pTempContents->size() != nChildren)
876  {
877  bRet = true;
878  bCopy = true;
879  }
880  else
881  {
882  for(size_t i = 0; i < pTempContents->size() && !bCopy; i++)
883  {
884  SwGlblDocContent* pLeft = (*pTempContents)[i].get();
885  SwGlblDocContent* pRight = (*m_pSwGlblDocContents)[i].get();
887  OUString sTemp = m_xTreeView->get_text(i);
888  if (
889  eType != pRight->GetType() ||
890  (
891  eType == GLBLDOC_SECTION &&
892  pLeft->GetSection()->GetSectionName() != sTemp
893  ) ||
894  (
895  eType == GLBLDOC_TOXBASE &&
896  pLeft->GetTOX()->GetTitle() != sTemp
897  )
898  )
899  {
900  bCopy = true;
901  }
902  }
903  }
904  if (bCopy || bHard)
905  {
906  *m_pSwGlblDocContents = std::move( *pTempContents );
907  bRet = true;
908  }
909  }
910  }
911  else
912  {
913  m_xTreeView->clear();
915  m_pSwGlblDocContents->clear();
916  }
917  // FIXME: Implement a test for changes!
918  return bRet;
919 }
920 
922 {
923  const OUString sFileName(pCont->GetSection()->GetLinkFileName().getToken(0,
925  bool bFound = false;
926  const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
927  while( !bFound && pCurr )
928  {
929  if(pCurr->GetMedium() &&
931  {
932  bFound = true;
934  Application::PostUserEvent(LINK(this, SwGlobalTree, ShowFrameHdl));
935  pCurr = nullptr;
936  }
937  else
938  pCurr = SfxObjectShell::GetNext(*pCurr);
939  }
940  if(!bFound)
941  {
942  SfxStringItem aURL(SID_FILE_NAME, sFileName);
943  SfxBoolItem aReadOnly(SID_DOC_READONLY, false);
944  SfxStringItem aTargetFrameName( SID_TARGETNAME, "_blank" );
945  SfxStringItem aReferer(SID_REFERER, m_pActiveShell->GetView().GetDocShell()->GetTitle());
947  ExecuteList(SID_OPENDOC, SfxCallMode::ASYNCHRON,
948  { &aURL, &aReadOnly, &aReferer, &aTargetFrameName });
949  }
950 }
951 
952 IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl, weld::TreeView&, bool)
953 {
954  int nEntry = m_xTreeView->get_cursor_index();
955  SwGlblDocContent* pCont = reinterpret_cast<SwGlblDocContent*>(m_xTreeView->get_id(nEntry).toInt64());
956  if (pCont->GetType() == GLBLDOC_SECTION)
957  OpenDoc(pCont);
958  else
959  {
960  GotoContent(pCont);
961  m_pActiveShell->GetView().GetEditWin().GrabFocus();
962  }
963  return false;
964 }
965 
967 {
968  return m_xDialog;
969 }
970 
971 IMPL_STATIC_LINK_NOARG(SwGlobalTree, ShowFrameHdl, void*, void)
972 {
973  SfxViewFrame* pFirst = pShowShell ? SfxViewFrame::GetFirst(pShowShell) : nullptr;
974  if (pFirst)
975  pFirst->ToTop();
977 }
978 
979 void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles )
980 {
981  sal_Int32 nFiles = _rFiles.getLength();
982  if (!nFiles)
983  return;
984 
985  size_t nEntryCount = m_xTreeView->n_children();
986 
987  bool bMove = _pContent == nullptr;
988  const OUString* pFileNames = _rFiles.getConstArray();
990  rSh.StartAction();
991  // after insertion of the first new content the 'pCont' parameter becomes invalid
992  // find the index of the 'anchor' content to always use a current anchor content
993  size_t nAnchorContent = m_pSwGlblDocContents->size() - 1;
994  if (!bMove)
995  {
996  for (size_t nContent = 0; nContent < m_pSwGlblDocContents->size();
997  ++nContent)
998  {
999  if( *_pContent == *(*m_pSwGlblDocContents)[ nContent ] )
1000  {
1001  nAnchorContent = nContent;
1002  break;
1003  }
1004  }
1005  }
1006  SwGlblDocContents aTempContents;
1007  for ( sal_Int32 nFile = 0; nFile < nFiles; ++nFile )
1008  {
1009  //update the global document content after each inserted document
1010  rSh.GetGlobalDocContent(aTempContents);
1011  SwGlblDocContent* pAnchorContent = nullptr;
1012  OSL_ENSURE(aTempContents.size() > (nAnchorContent + nFile), "invalid anchor content -> last insertion failed");
1013  if ( aTempContents.size() > (nAnchorContent + nFile) )
1014  pAnchorContent = aTempContents[nAnchorContent + nFile].get();
1015  else
1016  pAnchorContent = aTempContents.back().get();
1017  OUString sFileName(pFileNames[nFile]);
1018  INetURLObject aFileUrl;
1019  aFileUrl.SetSmartURL( sFileName );
1020  OUString sSectionName(aFileUrl.GetLastName(
1022  sal_uInt16 nSectCount = rSh.GetSectionFormatCount();
1023  OUString sTempSectionName(sSectionName);
1024  sal_uInt16 nAddNumber = 0;
1025  sal_uInt16 nCount = 0;
1026  // if applicable: add index if the range name is already in use.
1027  while ( nCount < nSectCount )
1028  {
1029  const SwSectionFormat& rFormat = rSh.GetSectionFormat(nCount);
1030  if ((rFormat.GetSection()->GetSectionName() == sTempSectionName)
1031  && rFormat.IsInNodesArr())
1032  {
1033  nCount = 0;
1034  nAddNumber++;
1035  sTempSectionName = sSectionName + ":" + OUString::number( nAddNumber );
1036  }
1037  else
1038  nCount++;
1039  }
1040 
1041  if ( nAddNumber )
1042  sSectionName = sTempSectionName;
1043 
1044  SwSectionData aSectionData(SectionType::Content, sSectionName);
1045  aSectionData.SetProtectFlag(true);
1046  aSectionData.SetHidden(false);
1047 
1048  aSectionData.SetLinkFileName(sFileName);
1049  aSectionData.SetType(SectionType::FileLink);
1050  aSectionData.SetLinkFilePassword( OUString() );
1051 
1052  rSh.InsertGlobalDocContent( *pAnchorContent, aSectionData );
1053  }
1054  if (bMove)
1055  {
1056  Update( false );
1058  *m_pSwGlblDocContents, nEntryCount, nEntryCount + nFiles, nEntryCount - nFiles );
1059  }
1060  rSh.EndAction();
1061  Update( false );
1062  Display();
1063 
1064 }
1065 
1066 IMPL_LINK( SwGlobalTree, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg, void )
1067 {
1068  if ( ERRCODE_NONE != _pFileDlg->GetError() )
1069  return;
1070 
1071  SfxMediumList aMedList(m_pDocInserter->CreateMediumList());
1072  if ( aMedList.empty() )
1073  return;
1074 
1075  Sequence< OUString >aFileNames( aMedList.size() );
1076  OUString* pFileNames = aFileNames.getArray();
1077  sal_Int32 nPos = 0;
1078  for (const std::unique_ptr<SfxMedium>& pMed : aMedList)
1079  {
1080  OUString sFileName = pMed->GetURLObject().GetMainURL( INetURLObject::DecodeMechanism::NONE )
1081  + OUStringChar(sfx2::cTokenSeparator)
1082  + pMed->GetFilter()->GetFilterName()
1083  + OUStringChar(sfx2::cTokenSeparator);
1084  pFileNames[nPos++] = sFileName;
1085  }
1086  InsertRegion( m_pDocContent.get(), aFileNames );
1087  m_pDocContent.reset();
1088 }
1089 
1090 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SfxViewFrame * GetViewFrame() const
bool GetValue() const
long Width() const
MenuEnableFlags GetEnableFlags() const
Definition: glbltree.cxx:313
virtual int get_iter_index_in_parent(const TreeIter &rIter) const =0
const SfxPoolItem * ExecuteList(sal_uInt16 nSlot, SfxCallMode nCall, std::initializer_list< SfxPoolItem const * > args, std::initializer_list< SfxPoolItem const * > internalargs=std::initializer_list< SfxPoolItem const * >())
#define FN_UPDATE_TOX
Definition: cmdid.h:502
URL aURL
const Value & back() const
void EditContent(const SwGlblDocContent *pCont)
Definition: glbltree.cxx:531
const css::datatransfer::dnd::DropTargetDropEvent maDropEvent
void SplitNode(bool bAutoFormat=false)
Definition: wrtsh1.cxx:991
virtual void set_sensitive(const OString &rIdent, bool bSensitive)=0
#define FN_EDIT_REGION
Definition: cmdid.h:108
SwNavigationPI * GetParentWindow()
Definition: glbltree.cxx:966
bool MoveGlobalDocContent(const SwGlblDocContents &rArr, size_t nFromPos, size_t nToPos, size_t nNewPos)
Definition: edglbldc.cxx:297
OUString GetTitle(sal_uInt16 nMaxLen=0) const
void Notify(SwFlyFrame *pFly, SwPageFrame *pOld, const SwRect &rOld, const SwRect *pOldRect=nullptr)
Notify the background based on the difference between old and new rectangle.
Definition: frmtool.cxx:3127
const char aData[]
Definition: ww8scan.hxx:47
sfx2::LinkManager & GetLinkManager()
Definition: editsh.cxx:592
SfxFrame * GetFrame() const
constexpr TypedWhichId< SwFormatCol > RES_COL(109)
long Height() const
signed char sal_Int8
constexpr TypedWhichId< SwFormatFrameSize > RES_FRM_SIZE(89)
SfxDispatcher * GetDispatcher()
void ExecuteContextMenuAction(const OString &rSelectedPopupEntry)
Definition: glbltree.cxx:565
sal_uIntPtr sal_uLong
std::unique_ptr< SwGlblDocContents > m_pSwGlblDocContents
Definition: conttree.hxx:300
#define GLOBAL_CONTEXT_COUNT
Definition: swcont.hxx:48
const sal_Unicode cTokenSeparator
virtual TreeView * get_drag_source() const =0
sal_Int64 n
static const SfxObjectShell * pShowShell
Definition: conttree.hxx:305
SwGlobalTree & m_rTreeView
Definition: conttree.hxx:281
virtual sal_Int8 AcceptDrop(const AcceptDropEvent &rEvt) override
Definition: glbltree.cxx:233
std::unique_ptr< weld::Toolbar > m_xGlobalToolBox
Definition: navipi.hxx:67
bool IsConnected() const
Definition: section.hxx:224
static weld::Builder * CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false)
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
sal_uInt16 GetCode() const
void EnterStdMode()
Definition: select.cxx:550
SwEditWin & GetEditWin()
Definition: view.hxx:401
OUString GetLastName(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString const & GetLinkFileName() const
Definition: section.cxx:545
virtual SfxObjectShell * GetObjectShell() override
virtual short Execute()=0
bool HasFormat(SotClipboardFormatId nFormat) const
SfxHintId GetId() const
const SwWrtShell * GetActiveWrtShell() const
Definition: conttree.hxx:376
virtual std::unique_ptr< TreeIter > make_iterator(const TreeIter *pOrig=nullptr) const =0
SwWrtShell & GetWrtShell() const
Definition: view.hxx:398
Used by the UI to modify the document model.
Definition: wrtsh.hxx:90
IMPL_STATIC_LINK_NOARG(SwGlobalTree, ShowFrameHdl, void *, void)
Definition: glbltree.cxx:971
constexpr::Color COL_AUTO(0xFF, 0xFF, 0xFF, 0xFF)
#define GLOBAL_UPDATE_TIMEOUT
Definition: glbltree.cxx:58
const SwView & GetView() const
Definition: wrtsh.hxx:428
bool GotoNextTOXBase(const OUString *pName=nullptr)
Definition: move.cxx:646
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
int nCount
bool GotoPrevTOXBase(const OUString *=nullptr)
jump to previous index
Definition: crstrvl.cxx:315
virtual int n_children() const =0
#define DND_ACTION_NONE
static OUString CreateDropFileName(TransferableDataHelper &rData)
Definition: navipi.cxx:886
SwGlobalTreeDropTarget(SwGlobalTree &rTreeView)
Definition: glbltree.cxx:161
virtual OUString get_id(int pos) const =0
SfxViewFrame * GetCurrentViewFrame() const
sal_uInt16 GetModifier() const
size_type size() const
bool Update(bool bHard)
Definition: glbltree.cxx:850
void UpdateTableOf(const SwTOXBase &rTOX, const SfxItemSet *pSet=nullptr)
Definition: wrtsh2.cxx:327
const SwSectionFormat & GetSectionFormat(size_t nFormat) const
Definition: edsect.cxx:141
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_LIGHTRED
const char * sName
void GotoContent(const SwGlblDocContent *)
Definition: glbltree.cxx:779
MenuEnableFlags
Definition: conttree.hxx:54
SfxItemPool & GetPool() const
DocumentType eType
std::unique_ptr< sfx2::DocumentInserter > m_pDocInserter
Definition: conttree.hxx:303
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
Definition: dialoghelp.cxx:20
void clear()
bool Up(bool bSelect, sal_uInt16 nCount=1, bool bBasicCall=false)
Definition: move.cxx:141
virtual bool get_dest_row_at_pos(const Point &rPos, weld::TreeIter *pResult, bool bDnDMode)=0
int i
const OUString & GetSectionName() const
Definition: section.hxx:168
void EndAction(const bool bIdleEnd=false, const bool DoSetPosX=false)
Definition: crsrsh.cxx:239
void DeleteGlobalDocContent(const SwGlblDocContents &rArr, size_t nPos)
Definition: edglbldc.cxx:233
static void SetShowShell(const SfxObjectShell *pSet)
Definition: conttree.hxx:328
void Select()
Definition: glbltree.cxx:372
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
::rtl::Reference< Content > pContent
IMPL_LINK_NOARG(SwGlobalTree, SelectHdl, weld::TreeView &, void)
Definition: glbltree.cxx:367
virtual void Start() override
OUString GetFile(size_t nIndex) const
size
static SwAbstractDialogFactory * Create()
Definition: swabstdlg.cxx:36
Display
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
OUString SwResId(const char *pId)
Definition: swmodule.cxx:165
#define DND_ACTION_LINK
size_t Count() const
constexpr sal_uInt16 KEY_MOD2
void SetTimeout(sal_uInt64 nTimeoutMs)
void GrabFocus()
GlobalDocContentType
Definition: edglbldc.hxx:29
const OUString & GetTitle() const
Definition: tox.hxx:709
void GetGlobalDocContent(SwGlblDocContents &rArr) const
Definition: edglbldc.cxx:54
void GotoGlobalDocContent(const SwGlblDocContent &rPos)
Definition: edglbldc.cxx:334
void TbxMenuHdl(const OString &rCommand, weld::Menu &rMenu)
Definition: glbltree.cxx:297
SwDocShell * GetDocShell()
Definition: view.cxx:1108
bool IsReadOnly() const
void InsertRegion(const SwGlblDocContent *_pContent, const css::uno::Sequence< OUString > &_rFiles)
constexpr sal_uInt16 KEY_RETURN
void StartAction()
Definition: crsrsh.cxx:222
void HideTree()
Definition: glbltree.cxx:807
SwView * GetCreateView() const
Definition: navipi.cxx:1073
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
const SwTOXBase * GetTOX() const
Definition: edglbldc.hxx:53
size_t GetSectionFormatCount() const
Definition: edsect.cxx:113
AutoTimer m_aUpdateTimer
Definition: conttree.hxx:296
virtual const SfxItemSet * GetOutputItemSet() const =0
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint)
SwWrtShell * m_pActiveShell
Definition: conttree.hxx:299
void InsertGlobalDocContent(const SwGlblDocContent &rPos, SwSectionData &rNew)
Definition: edglbldc.cxx:131
SwWrtShell * GetWrtShellPtr() const
Definition: view.hxx:399
constexpr TypedWhichId< SvxBrushItem > RES_BACKGROUND(105)
void Stop()
VclPtr< SwNavigationPI > m_xDialog
Definition: conttree.hxx:295
#define HID_NAVIGATOR_GLOB_TREELIST
Definition: helpids.h:41
#define ERRCODE_NONE
static SfxObjectShell * GetFirst(const std::function< bool(const SfxObjectShell *)> &isObjectShell=nullptr, bool bOnlyVisible=true)
void UpdateAllLinks(bool bAskUpdate, bool bUpdateGrfLinks, weld::Window *pParentWin)
GlobalDocContentType GetType() const
Query contents.
Definition: edglbldc.hxx:50
void ExecCommand(const OString &rCmd)
Definition: glbltree.cxx:813
OUString aName
void OpenDoc(const SwGlblDocContent *)
Definition: glbltree.cxx:921
RET_OK
bool IsConnectFlag() const
Definition: section.hxx:238
const SwSection * GetSection() const
Definition: edglbldc.hxx:51
Reference< XExecutableDialog > m_xDialog
bool GetFileList(SotClipboardFormatId nFormat, FileList &rFileList)
const INetURLObject & GetURLObject() const
void MoveSelectionTo(weld::TreeIter *pDropTarget)
Definition: glbltree.cxx:390
void Display(bool bOnlyUpdateUserData=false)
Definition: glbltree.cxx:427
std::unique_ptr< weld::TreeView > m_xTreeView
Definition: conttree.hxx:293
void SetInvokeHandler(const Link< Timer *, void > &rLink)
constexpr TypedWhichId< SvxLRSpaceItem > RES_LR_SPACE(91)
bool IsDropFormatSupported(SotClipboardFormatId nFormat) const
virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent &rEvt) override
Definition: glbltree.cxx:167
IMPL_LINK(SwGlobalTree, CommandHdl, const CommandEvent &, rCEvt, bool)
Definition: glbltree.cxx:260
OUString sId
static SfxViewFrame * GetFirst(const SfxObjectShell *pDoc=nullptr, bool bOnlyVisible=true)
weld::TreeView & get_widget()
Definition: conttree.hxx:353
static SfxObjectShell * GetNext(const SfxObjectShell &rPrev, const std::function< bool(const SfxObjectShell *)> &isObjectShell=nullptr, bool bOnlyVisible=true)
#define FN_PARAM_TOX_TYPE
Definition: cmdid.h:805
const SfxPoolItem * Execute(sal_uInt16 nSlot, SfxCallMode nCall=SfxCallMode::SLOT, const SfxPoolItem **pArgs=nullptr, sal_uInt16 nModi=0, const SfxPoolItem **pInternalArgs=nullptr)
OUString m_aContextStrings[GLOBAL_CONTEXT_COUNT]
Definition: conttree.hxx:297
SwGlobalTree(std::unique_ptr< weld::TreeView > xTreeView, SwNavigationPI *pDialog)
Definition: glbltree.cxx:127
static const char * GLOBAL_CONTEXT_ARY[]
Definition: glbltree.cxx:109
std::unique_ptr< SwGlblDocContent > m_pDocContent
Definition: conttree.hxx:302
SwSection * GetSection() const
Definition: section.cxx:672
bool Detect(bool bExtendedInfo=false)
sal_Int8 mnAction
virtual CurTOXType GetCurrentTOXType() const =0
#define FN_INSERT_MULTI_TOX
Definition: cmdid.h:280
virtual SwTOXDescription & GetTOXDescription(CurTOXType eTOXTypes)=0
GLOBAL_CONTEXT_IDX
Definition: glbltree.cxx:89
void ShowTree()
Definition: glbltree.cxx:801
sal_uLong GetDocPos() const
Definition: edglbldc.hxx:55
Definition: view.hxx:144
sal_uInt16 nPos
bool UpdateOrInsertTOX(const SwTOXDescription &rDesc, SwTOXBase **ppBase, const SfxItemSet *pSet)
Definition: toxmgr.cxx:266
bool SetSmartURL(OUString const &rTheAbsURIRef, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
const OUString & GetTOXName() const
Definition: tox.hxx:475
::std::vector< std::unique_ptr< SfxMedium > > SfxMediumList
bool IsInNodesArr() const
Definition: section.cxx:916
SfxMedium * GetMedium() const