22 #include <string_view>
36 #include <content.hxx>
48 #include <strings.hrc>
50 #include <bitmaps.hlst>
52 #include <navicfg.hxx>
56 #include <drawview.hxx>
79 u"" RID_BMP_CONTENT_TABLE,
80 u"" RID_BMP_CONTENT_RANGENAME,
81 u"" RID_BMP_CONTENT_DBAREA,
82 u"" RID_BMP_CONTENT_GRAPHIC,
83 u"" RID_BMP_CONTENT_OLEOBJECT,
84 u"" RID_BMP_CONTENT_NOTE,
85 u"" RID_BMP_CONTENT_AREALINK,
86 u"" RID_BMP_CONTENT_DRAWING
92 if ( !aManualDoc.isEmpty() )
95 while ( pObjSh && !pSh )
97 if ( pObjSh->
GetTitle() == aManualDoc )
98 pSh = dynamic_cast<ScDocShell*>( pObjSh );
124 , pParentWindow(pNavigatorDlg)
127 , pHiddenDocument(nullptr)
128 , bisInNavigatoeDlg(false)
130 , m_nAsyncMouseReleaseId(nullptr)
165 SCSTR_CONTENT_RANGENAME,
166 SCSTR_CONTENT_DBAREA,
167 SCSTR_CONTENT_GRAPHIC,
168 SCSTR_CONTENT_OLEOBJECT,
170 SCSTR_CONTENT_AREALINK,
171 SCSTR_CONTENT_DRAWING
185 auto const aImage(
aContentBmps[static_cast<int>(nType) - 1]);
218 if (!pParent ||
m_xTreeView->iter_has_child(*pParent))
237 OSL_FAIL(
"InsertContent without parent");
249 std::unique_ptr<weld::TreeIter> xParent(
m_xTreeView->make_iterator(pEntry));
270 std::unique_ptr<weld::TreeIter> xIterEntry(
m_xTreeView->make_iterator(xParent.get()));
271 bool bIterEntry =
m_xTreeView->iter_children(*xIterEntry);
272 while (!bFound && bIterEntry)
274 if (
m_xTreeView->iter_compare(*pEntry, *xIterEntry) == 0)
276 rnChildIndex = nEntry;
279 bIterEntry =
m_xTreeView->iter_next_sibling(*xIterEntry);
317 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator());
320 GetEntryIndexes(nType, nChild, xEntry.get());
329 if ( !aManualDoc.isEmpty() )
330 pParentWindow->SetCurrentDoc( aManualDoc );
335 pParentWindow->SetCurrentTableStr( aText );
339 pParentWindow->SetCurrentCellStr( aText );
349 if (!aRangeStr.isEmpty())
350 pParentWindow->SetCurrentCellStr( aRangeStr );
357 pParentWindow->SetCurrentObject( aText );
363 pParentWindow->SetCurrentTable( aPos.
Tab() );
364 pParentWindow->SetCurrentCell( aPos.
Col(), aPos.
Row() );
372 if (pLink && pSrcDoc)
376 pParentWindow->SetCurrentCellStr( aRangeStr );
397 LaunchAsyncStoreNavigatorSettings();
403 m_nAsyncMouseReleaseId =
nullptr;
404 StoreNavigatorSettings();
422 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator());
429 GetEntryIndexes(nType, nChild, xEntry.get());
448 if ( bisInNavigatoeDlg )
455 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator());
458 GetEntryIndexes(nType, nChild, xEntry.get());
466 if (!aManualDoc.isEmpty())
467 pParentWindow->SetCurrentDoc( aManualDoc );
481 bool bHasMakredObject =
false;
483 std::unique_ptr<weld::TreeIter> xBeginEntry(
m_xTreeView->make_iterator(pParent));
484 bool bBeginEntry =
false;
486 bBeginEntry =
m_xTreeView->iter_children(*xBeginEntry);
489 OUString aTempText(
m_xTreeView->get_text(*xBeginEntry));
492 bHasMakredObject =
true;
495 bBeginEntry =
m_xTreeView->iter_next(*xBeginEntry);
497 if (!bHasMakredObject && pScTabViewShell)
499 ObjectFresh(nType, xEntry.get());
513 StoreNavigatorSettings();
515 LaunchAsyncStoreNavigatorSettings();
525 switch ( rCEvt.GetCommand() )
527 case CommandEventId::ContextMenu:
531 std::unique_ptr<weld::Menu> xPop(xBuilder->weld_menu(
"contextmenu"));
532 std::unique_ptr<weld::Menu> xDropMenu(xBuilder->weld_menu(
"dragmodesubmenu"));
534 switch (pParentWindow->GetDropMode())
537 xDropMenu->set_active(
"hyperlink",
true);
540 xDropMenu->set_active(
"link",
true);
543 xDropMenu->set_active(
"copy",
true);
548 std::unique_ptr<weld::Menu> xDocMenu(xBuilder->weld_menu(
"displaymenu"));
558 if ( dynamic_cast<const ScDocShell*>( pSh) !=
nullptr )
561 OUString aEntry = aName;
562 if ( pSh == pCurrentSh )
563 aEntry += pParentWindow->aStrActive;
565 aEntry += pParentWindow->aStrNotActive;
567 sId =
"document" + OUString::number(i);
568 xDocMenu->append_radio(sId, aEntry);
569 if ( !bHiddenDoc && aName == aManualDoc )
576 sId =
"document" + OUString::number(i);
577 xDocMenu->append_radio(sId, pParentWindow->aStrActiveWin);
578 if (!bHiddenDoc && aManualDoc.isEmpty())
581 if ( !aHiddenTitle.isEmpty() )
583 OUString aEntry = aHiddenTitle + pParentWindow->aStrHidden;
585 sId =
"document" + OUString::number(i);
586 xDocMenu->append_radio(sId, aEntry);
590 xDocMenu->set_active(sActive.toUtf8(),
true);
593 if (sIdent ==
"hyperlink")
594 pParentWindow->SetDropMode(0);
595 else if (sIdent ==
"link")
596 pParentWindow->SetDropMode(1);
597 else if (sIdent ==
"copy")
598 pParentWindow->SetDropMode(2);
599 else if (sIdent.startsWith(
"document"))
601 OUString
aName = xDocMenu->get_label(sIdent);
616 std::unique_ptr<weld::TreeIter> xParent(
m_xTreeView->make_iterator(&rEntry));
622 aHelpText = OUString::number(
m_xTreeView->iter_n_children(rEntry)) +
631 auto nIndex = GetChildIndex(&rEntry);
669 auto nOldPos =
m_xTreeView->vadjustment_get_value();
677 bool bRestorePos = nOldChildren == nNewChildren;
685 std::unique_ptr<weld::TreeIter> xOldEntry;
686 std::unique_ptr<weld::TreeIter> xBeginEntry(
m_xTreeView->make_iterator(pParent));
687 bool bBeginEntry =
false;
689 bBeginEntry =
m_xTreeView->iter_children(*xBeginEntry);
692 OUString aTempText(
m_xTreeView->get_text(*xBeginEntry));
695 xOldEntry =
m_xTreeView->make_iterator(xBeginEntry.get());
698 bBeginEntry =
m_xTreeView->iter_next(*xBeginEntry);
775 OUString createLocalRangeName(std::u16string_view rName, std::u16string_view rTableName)
777 return OUString::Concat(rName) +
" (" + rTableName +
")";
791 std::set<OUString> aSet;
793 for (
const auto& rEntry : *pRangeNames)
795 if (rEntry.second->IsValidReference(aDummy))
796 aSet.
insert(rEntry.second->GetName());
801 if (pLocalRangeName && !pLocalRangeName->
empty())
805 for (
const auto& rEntry : *pLocalRangeName)
807 if (rEntry.second->IsValidReference(aDummy))
808 aSet.insert(createLocalRangeName(rEntry.second->GetName(), aTableName));
813 for (
const auto& rItem : aSet)
830 for (
const auto& rxDB : rDBs)
832 const OUString& aStrName = rxDB->GetName();
840 switch ( nContentType )
843 bRet = ( nObjIdentifier ==
OBJ_GRAF );
846 bRet = ( nObjIdentifier ==
OBJ_OLE2 );
852 OSL_FAIL(
"unknown content type");
871 if (!(pDrawLayer && pShell))
875 for (
SCTAB nTab=0; nTab<nTabCount; nTab++)
877 SdrPage* pPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nTab));
878 OSL_ENSURE(pPage,
"Page ?");
888 if (!aName.isEmpty())
899 SAL_WARN(
"sc",
"InsertContent without parent");
905 pObject = aIter.
Next();
936 OSL_ENSURE(pLinkManager,
"no LinkManager on document?");
937 const ::sfx2::SvBaseLinks& rLinks = pLinkManager->
GetLinks();
938 sal_uInt16
nCount = rLinks.size();
939 for (sal_uInt16
i=0;
i<nCount;
i++)
942 if (
auto pScAreaLink = dynamic_cast<const ScAreaLink*>( pBase))
957 OSL_ENSURE(pLinkManager,
"no LinkManager on document?");
958 const ::sfx2::SvBaseLinks& rLinks = pLinkManager->
GetLinks();
959 sal_uInt16
nCount = rLinks.size();
960 for (sal_uInt16
i=0;
i<nCount;
i++)
963 if (
auto pAreaLink = dynamic_cast<const ScAreaLink*>( pBase))
965 if (nFound == nIndex)
971 OSL_FAIL(
"link not found");
977 OUString aText = rNote.
GetText();
979 while ( (nAt = aText.indexOf(
'\n' )) != -1 )
980 aText = aText.replaceAt( nAt, 1,
" " );
994 std::vector<sc::NoteEntry>
aEntries;
996 for (
const auto& rEntry : aEntries)
1019 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator(pParent));
1020 bool bEntry =
m_xTreeView->iter_children(*xEntry);
1022 std::vector<sc::NoteEntry>
aEntries;
1024 for (
const auto& rEntry : aEntries)
1026 const ScPostIt* pNote = rEntry.mpNote;
1049 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator(pParent));
1050 bool bEntry =
m_xTreeView->iter_children(*xEntry);
1058 if (pDrawLayer && pShell)
1061 for (
SCTAB nTab=0; nTab<nTabCount && bEqual; nTab++)
1063 SdrPage* pPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nTab));
1064 OSL_ENSURE(pPage,
"Page ?");
1069 while (pObject && bEqual)
1083 pObject = aIter.
Next();
1097 bool bFound =
false;
1120 p->
GetArea(nTab, nCol1, nRow1, nCol2, nRow2);
1121 rRange =
ScRange(nCol1, nRow1, nTab, nCol2, nRow2, nTab);
1132 bool bDisallow =
true;
1148 aEditView.
MarkObj(pObject, pPV);
1173 pTransferObj->SetDragSourceObj( *pObject, nTab );
1176 SC_MOD()->SetDragObject(
nullptr, pTransferObj.get() );
1190 bool bDisallow =
true;
1195 aMark.SetMarkArea( rRange );
1203 rSrcDoc.
CopyToClip(aClipParam, pClipDoc.get(), &aMark,
false,
false);
1213 pTransferObj->SetDragSource( pSrcShell, aMark );
1214 pTransferObj->SetDragSourceFlags( nFlags );
1216 SC_MOD()->SetDragObject( pTransferObj.get(), nullptr );
1229 rUnsetDragIcon =
true;
1231 StoreNavigatorSettings();
1233 bool bDisallow =
true;
1235 std::unique_ptr<ScDocumentLoader> pDocLoader;
1242 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator());
1246 GetEntryIndexes(nType, nChild, xEntry.get());
1259 aDocName = aHiddenName;
1272 bool bDoLinkTrans =
false;
1276 sal_uInt16 nDropMode = pParentWindow->GetDropMode();
1277 switch ( nDropMode )
1281 OUString aUrl = aDocName +
"#" + aText;
1285 if (!aDocName.isEmpty())
1293 bDoLinkTrans =
true;
1298 if ( !aDocName.isEmpty() )
1306 bDoLinkTrans =
true;
1311 bDoLinkTrans =
true;
1325 OUString aFilter, aOptions;
1326 OUString
aURL = aHiddenName;
1328 if (!pDocLoader->IsError())
1329 pSrcShell = pDocLoader->GetDocShell();
1332 pSrcShell = GetManualOrCurrent();
1348 if ( rSrcDoc.
GetTable( aText, nTab ) )
1369 if (!aLinkURL.isEmpty())
1370 m_xTransferObj->SetLinkURL(aLinkURL, aLinkText);
1384 OUString aDocName = rUrl;
1385 sal_Int32
nPos = aDocName.indexOf(
'#');
1387 aDocName = aDocName.copy(0, nPos);
1389 OUString
aURL = aDocName;
1390 OUString aFilter, aOptions;
1426 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator());
1429 std::unique_ptr<weld::TreeIter> xParent(
m_xTreeView->make_iterator(xEntry.get()));
1506 OUString aRealName = rName;
1507 sal_Int32 nLen = rName.getLength();
1510 aRealName = rName.copy( 0, nActiveStart );
1513 aRealName = rName.copy( 0, nNotActiveStart );
1515 bool bLoaded =
false;
1520 while ( pSh && !bLoaded )
1522 if ( dynamic_cast<const ScDocShell*>( pSh) !=
nullptr )
1523 if ( pSh->
GetTitle() == aRealName )
1540 OSL_FAIL(
"SelectDoc: not found");
1548 if (pParent || !
m_xTreeView->iter_has_child(*pParent))
1551 std::unique_ptr<weld::TreeIter> xEntry(
m_xTreeView->make_iterator(pParent));
1552 bool bEntry =
m_xTreeView->iter_children(*xEntry);
1611 if( nRootSel == nEntry )
1616 std::unique_ptr<weld::TreeIter> xEntry;
1643 std::unique_ptr<weld::TreeIter> xCurEntry(
m_xTreeView->make_iterator());
SfxViewFrame * GetViewFrame() const
#define LINK(Instance, Class, Member)
ScContentId GetRootSelected() const
SC_DLLPUBLIC ScDBCollection * GetDBCollection() const
ScAddress GetNotePos(sal_uLong nIndex)
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
constexpr sal_uInt16 KEY_MOD1
OUString GetTitle(sal_uInt16 nMaxLen=0) const
const ScAreaLink * GetLink(sal_uLong nIndex)
void SetExpanded(ScContentId nIndex, bool bExpand)
std::unique_ptr< ContentProperties > pData
const OUString & GetName() const
SC_DLLPUBLIC ScRangeName * GetRangeName(SCTAB nTab) const
bool NoteStringsChanged()
constexpr sal_uInt16 KEY_F5
const wchar_t *typedef int(__stdcall *DllNativeUnregProc)(int
VclPtr< ScNavigatorDlg > pParentWindow
void SetManualDoc(const OUString &rName)
static weld::Builder * CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false)
SdrObject * GetObjectByName(std::u16string_view rName)
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
sal_uInt16 GetCode() const
Contains settings of the navigator listbox.
o3tl::enumarray< ScContentId, sal_uInt16 > pPosList
static SfxObjectShell * Current()
constexpr sal_uInt16 KEY_SPACE
virtual SdrObjKind GetObjIdentifier() const
virtual SfxObjectShell * GetObjectShell() override
void FillTransferableObjectDescriptor(TransferableObjectDescriptor &rDesc) const
EmbeddedObjectRef * pObject
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
void GetDocNames(const OUString *pSelEntry)
sal_uLong GetChildSelected() const
std::unique_ptr< weld::TreeView > m_xTreeView
static void SetGlobalDrawPersist(SfxObjectShell *pPersist)
OUString GetTitle() const
void SetRootType(ScContentId nNew)
SC_DLLPUBLIC SCROW MaxRow() const
SC_DLLPUBLIC SCTAB GetTableCount() const
Additional class containing cell annotation data.
static SfxViewShell * Current()
SC_DLLPUBLIC bool GetTable(const OUString &rName, SCTAB &rTab) const
sal_uInt16 GetModifier() const
SdrPageView * ShowSdrPage(SdrPage *pPage) override
bool IsExpanded(ScContentId nIndex) const
void ApplyNavigatorSettings(bool bRestoreScrollPos=false, int nScrollPos=0)
Applies the navigator settings to the listbox.
static bool IsPartOfType(ScContentId nContentType, sal_uInt16 nObjIdentifier)
ScDrawView * GetScDrawView()
ScViewData & GetViewData()
virtual void enable_drag_source(rtl::Reference< TransferDataContainer > &rTransferrable, sal_uInt8 eDNDConstants)=0
rtl::Reference< ScLinkTransferObj > m_xTransferObj
static void RemoveUserEvent(ImplSVEvent *nUserEvent)
void InitRoot(ScContentId nType)
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
SC_DLLPUBLIC ScRangeData * findByUpperName(const OUString &rName)
void SelectCurrentViewObject(std::u16string_view rName)
SC_DLLPUBLIC SCCOL MaxCol() const
ScDocument * GetDocument()
virtual std::unique_ptr< SdrModel > CreateMarkedObjModel() const
const SvBaseLinks & GetLinks() const
void InsertContent(ScContentId nType, const OUString &rValue)
static OUString lcl_GetDBAreaRange(const ScDocument *pDoc, const OUString &rDBName)
static OUString lcl_NoteString(const ScPostIt &rNote)
void SelectTable(SCTAB nTab, bool bNew)
ScAddress GetNotePosition(size_t nIndex) const
std::unique_ptr< ScDocument, o3tl::default_delete< ScDocument > > ScDocumentUniquePtr
ScSheetLimits & GetSheetLimits() const
SC_DLLPUBLIC OUString Format(const ScDocument &rDocument, ScRefFlags nFlags=ScRefFlags::ZERO, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, bool bFullAddressNotation=false) const
Returns string with formatted cell range from aStart to aEnd, according to provided address conventio...
static ScTabViewShell * GetTabViewShell()
const SdrPage * GetPage(sal_uInt16 nPgNum) const
const ScRange & GetDestArea() const
void SetDrawShell(bool bActive)
OUString ScResId(const char *pId)
static const char * SCSTR_CONTENT_ARY[]
OUString GetText() const
Returns the caption text of this note.
ImplSVEvent * m_nAsyncMouseReleaseId
ScDocShell * GetManualOrCurrent()
void ObjectFresh(ScContentId nType, const weld::TreeIter *pEntry=nullptr)
IMPL_LINK_NOARG(ScContentTree, ContentDoubleClickHdl, weld::TreeView &, bool)
ScContentTree(std::unique_ptr< weld::TreeView > xTreeView, ScNavigatorDlg *pNavigatorDlg)
const OUString & GetFile() const
bool HasSelectedBlockMatrixFragment(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScMarkData &rMark) const
void SetDragJump(ScDocument *pLocalDoc, const OUString &rTarget, const OUString &rText)
void GetArea(SCTAB &rTab, SCCOL &rCol1, SCROW &rRow1, SCCOL &rCol2, SCROW &rRow2) const
constexpr sal_uInt16 KEY_RETURN
sal_uLong GetChildIndex(const weld::TreeIter *pEntry) const
Returns the child index of the specified listbox entry.
ScDBData * findByUpperName(const OUString &rName)
void SetChildSelected(sal_uLong nIndex)
void GetDrawNames(ScContentId nType)
SdrObject * GetNamedObject(std::u16string_view rName, sal_uInt16 nId, SCTAB &rFoundTab) const
Stores global named database ranges.
const ScContentId pTypeList[int(ScContentId::LAST)+1]
IMPL_LINK(ScContentTree, KeyInputHdl, const KeyEvent &, rKEvt, bool)
std::unique_ptr< weld::TreeIter > m_xScratchIter
void LaunchAsyncStoreNavigatorSettings()
void Refresh(ScContentId nType=ScContentId::ROOT)
void LoadFile(const OUString &rUrl)
static bool lcl_GetRange(const ScDocument &rDoc, ScContentId nType, const OUString &rName, ScRange &rRange)
static ScNavigatorSettings * GetNavigatorSettings()
static SfxObjectShell * GetFirst(const std::function< bool(const SfxObjectShell *)> &isObjectShell=nullptr, bool bOnlyVisible=true)
std::unique_ptr< weld::TreeView > m_xTreeView
void SelectEntryByName(const ScContentId nRoot, std::u16string_view rName)
bool DoInitNew(SfxMedium *pMedium=nullptr)
const INetURLObject & GetURLObject() const
static OUString GetVisibleName(const SdrObject *pObj)
static SC_DLLPUBLIC const CharClass * getCharClassPtr()
void SetRootType(ScContentId nNew)
const ScDocument & GetDocument() const
static bool lcl_DoDragCells(ScDocShell *pSrcShell, const ScRange &rRange, ScDragSrc nFlags, weld::TreeView &rTreeView)
void GetEntryIndexes(ScContentId &rnRootIndex, sal_uLong &rnChildIndex, const weld::TreeIter *pEntry) const
Returns the indexes of the specified listbox entry.
SC_DLLPUBLIC bool IsValidReference(ScRange &rRef) const
SdrPageView * GetSdrPageView() const
const std::u16string_view aContentBmps[]
OUString GetURLNoPass(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
void SetRootSelected(ScContentId nIndex)
ScDocument * pHiddenDocument
ScXMLEditAttributeMap::Entry const aEntries[]
SfxObjectShell * GetDocumentShell() const
#define SAL_WARN(area, stream)
ScDocument * GetSourceDocument()
static SfxObjectShell * GetNext(const SfxObjectShell &rPrev, const std::function< bool(const SfxObjectShell *)> &isObjectShell=nullptr, bool bOnlyVisible=true)
static void ReleaseFocus()
bool MarkObj(const Point &rPnt, short nTol=-2, bool bToggle=false, bool bDeep=false)
void ClearType(ScContentId nType)
bool DrawNamesChanged(ScContentId nType)
This struct stores general clipboard parameters associated with a ScDocument instance created in clip...
SC_DLLPUBLIC sfx2::LinkManager * GetLinkManager()
void StoreNavigatorSettings() const
Stores the current listbox state in the navigator settings.
SdrModel * GetModel() const
void SelectDoc(const OUString &rName)
void SetDragLink(const OUString &rDoc, const OUString &rTab, const OUString &rArea)
o3tl::enumarray< ScContentId, std::unique_ptr< weld::TreeIter > > m_aRootNodes
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
SC_DLLPUBLIC bool insert(ScRangeData *p, bool bReuseFreeIndex=true)
Insert object into set.
bool GetObjectIsMarked(const SdrObject *pObject)
SC_DLLPUBLIC void CopyToClip(const ScClipParam &rClipParam, ScDocument *pClipDoc, const ScMarkData *pMarks, bool bKeepScenarioFlags, bool bIncludeObjects)
static bool lcl_DoDragObject(ScDocShell *pSrcShell, std::u16string_view rName, ScContentId nType, weld::TreeView &rTreeView)
const sal_uLong SC_CONTENT_NOCHILD
SC_DLLPUBLIC void GetAllNoteEntries(std::vector< sc::NoteEntry > &rNotes) const
SfxMedium * GetMedium() const