20 #include <rtl/ustrbuf.hxx>
24 #include <com/sun/star/frame/XModel.hpp>
25 #include <com/sun/star/text/XBookmarksSupplier.hpp>
26 #include <officecfg/Office/Common.hxx>
36 #include <strings.hrc>
47 m_xBookmarksBox->unselect_all();
51 OUString sTmp = m_xEditBox->get_text();
53 const sal_Int32 nLen = sTmp.getLength();
56 const sal_Int32 nTmpLen = sTmp.getLength();
58 if (sTmp.getLength() != nTmpLen)
61 const bool bHasForbiddenChars = sTmp.getLength() != nLen;
62 m_xForbiddenChars->set_visible(bHasForbiddenChars);
63 if (bHasForbiddenChars)
68 sal_Int32 nSelectedEntries = 0;
69 sal_Int32 nEntries = 0;
70 sal_Int32 nTokenIndex = 0;
71 while (!sTmp.isEmpty() && nTokenIndex >= 0)
74 if (m_xBookmarksBox->GetBookmarkByName(aToken))
76 m_xBookmarksBox->SelectByName(aToken);
83 m_xInsertBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 0 && !bHasForbiddenChars
87 m_xDeleteBtn->set_sensitive(nEntries > 0 && nSelectedEntries == nEntries && !m_bAreProtected);
88 m_xGotoBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1);
89 m_xRenameBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1 && !m_bAreProtected);
95 if (!ValidateBookmarks())
100 m_xBookmarksBox->selected_foreach([
this, &nSelectedRows](
weld::TreeIter& rEntry) {
103 =
reinterpret_cast<sw::mark::IMark*
>(m_xBookmarksBox->get_id(rEntry).toInt64());
104 OUString sRemoved = pBookmark->
GetName();
107 SfxRequest aReq(rSh.GetView().GetViewFrame(), FN_DELETE_BOOKMARK);
110 aTableBookmarks.erase(std::remove(aTableBookmarks.begin(), aTableBookmarks.end(),
111 std::make_pair(pBookmark, sRemoved)),
112 aTableBookmarks.end());
123 m_xBookmarksBox->remove_selection();
127 m_xDeleteBtn->set_sensitive(
false);
128 m_xGotoBtn->set_sensitive(
false);
129 m_xRenameBtn->set_sensitive(
false);
130 m_xInsertBtn->set_sensitive(
false);
138 GotoSelectedBookmark();
144 if (!ValidateBookmarks())
147 if (!m_xBookmarksBox->has_focus())
150 OUStringBuffer sEditBoxText;
151 int nSelectedRows = 0;
152 m_xBookmarksBox->selected_foreach(
155 =
reinterpret_cast<sw::mark::IMark*
>(m_xBookmarksBox->get_id(rEntry).toInt64());
156 const OUString& sEntryName = pBookmark->
GetName();
157 if (!sEditBoxText.isEmpty())
158 sEditBoxText.append(
";");
159 sEditBoxText.append(sEntryName);
165 m_xInsertBtn->set_sensitive(
false);
166 m_xGotoBtn->set_sensitive(nSelectedRows == 1);
167 m_xRenameBtn->set_sensitive(nSelectedRows == 1 && !m_bAreProtected);
168 m_xDeleteBtn->set_sensitive(!m_bAreProtected);
169 m_xEditBox->set_text(sEditBoxText.makeStringAndClear());
173 m_xInsertBtn->set_sensitive(!m_bAreProtected);
174 m_xGotoBtn->set_sensitive(
false);
175 m_xRenameBtn->set_sensitive(
false);
176 m_xDeleteBtn->set_sensitive(
false);
182 if (!ValidateBookmarks())
184 auto xSelected = m_xBookmarksBox->get_selected();
189 =
reinterpret_cast<sw::mark::IMark*
>(m_xBookmarksBox->get_id(*xSelected).toInt64());
190 uno::Reference<frame::XModel>
xModel = rSh.GetView().GetDocShell()->GetBaseModel();
191 uno::Reference<text::XBookmarksSupplier> xBkms(xModel, uno::UNO_QUERY);
192 uno::Reference<container::XNameAccess> xNameAccess = xBkms->getBookmarks();
194 uno::Reference<uno::XInterface> xTmp;
196 uno::Reference<container::XNamed> xNamed(xTmp, uno::UNO_QUERY);
206 m_xDeleteBtn->set_sensitive(
false);
207 m_xGotoBtn->set_sensitive(
false);
208 m_xRenameBtn->set_sensitive(
false);
209 m_xInsertBtn->set_sensitive(
false);
216 OUString sBookmark = m_xEditBox->get_text();
217 rSh.SetBookmark2(
vcl::KeyCode(), sBookmark, m_xHideCB->get_active(),
218 m_xConditionED->get_text());
225 bool bHide = rBox.get_active();
226 m_xConditionED->set_sensitive(bHide);
227 m_xConditionFT->set_sensitive(bHide);
264 std::vector<std::pair<sw::mark::IMark*, OUString>>::const_iterator aListIter
274 if (aListIter->first != *ppBookmark || aListIter->second != (*ppBookmark)->GetName())
302 :
SfxDialogController(pParent,
"modules/swriter/ui/insertbookmark.ui",
"InsertBookmarkDialog")
304 , m_nLastBookmarksCount(0)
306 , m_xEditBox(m_xBuilder->weld_entry(
"name"))
307 , m_xInsertBtn(m_xBuilder->weld_button(
"insert"))
308 , m_xDeleteBtn(m_xBuilder->weld_button(
"delete"))
309 , m_xGotoBtn(m_xBuilder->weld_button(
"goto"))
310 , m_xRenameBtn(m_xBuilder->weld_button(
"rename"))
311 , m_xHideCB(m_xBuilder->weld_check_button(
"hide"))
312 , m_xConditionFT(m_xBuilder->weld_label(
"condlabel"))
313 , m_xConditionED(new
ConditionEdit(m_xBuilder->weld_entry(
"withcond")))
314 , m_xBookmarksBox(new
BookmarkTable(m_xBuilder->weld_tree_view(
"bookmarks")))
315 , m_xForbiddenChars(m_xBuilder->weld_label(
"lbForbiddenChars"))
358 m_xBookmarksBox->make_sorted();
362 bool bSortAtoZ = m_xBookmarksBox->get_sort_order();
365 if (nColumn == m_xBookmarksBox->get_sort_column())
367 bSortAtoZ = !bSortAtoZ;
368 m_xBookmarksBox->set_sort_order(bSortAtoZ);
372 int nOldSortColumn = m_xBookmarksBox->get_sort_column();
373 if (nOldSortColumn != -1)
374 m_xBookmarksBox->set_sort_indicator(
TRISTATE_INDET, nOldSortColumn);
375 m_xBookmarksBox->set_sort_column(nColumn);
391 std::vector<int> aWidths;
392 aWidths.push_back(40);
393 aWidths.push_back(110);
394 aWidths.push_back(150);
395 aWidths.push_back(60);
397 m_xControl->set_selection_mode(SelectionMode::Multiple);
402 std::unique_ptr<weld::TreeIter> xIter(
m_xControl->make_iterator());
415 sal_Int32 nBookmarkTextLen = 0;
416 bool bPulledAll =
false;
417 bool bPulling =
false;
418 static const sal_Int32 nMaxTextLen = 50;
426 if (nBookmarkNodeTextPos == sBookmarkNodeText.getLength())
428 nBookmarkNodeTextPos = std::max<sal_Int32>(0, nBookmarkNodeTextPos - nMaxTextLen);
430 if (nBookmarkNodeTextPos == 0)
433 nBookmarkTextLen = sBookmarkNodeText.getLength() - nBookmarkNodeTextPos;
435 bool bExceedsLength = nBookmarkTextLen > nMaxTextLen;
436 nBookmarkTextLen = std::min<sal_Int32>(nMaxTextLen, nBookmarkTextLen);
437 sBookmarkNodeText = sBookmarkNodeText.copy(nBookmarkNodeTextPos, nBookmarkTextLen).trim();
439 sBookmarkNodeText +=
"...";
440 else if (bPulling && !bPulledAll)
441 sBookmarkNodeText =
"..." + sBookmarkNodeText;
445 sHidden =
SwResId(STR_BOOKMARK_YES);
449 m_xControl->append(OUString::number(reinterpret_cast<sal_Int64>(pMark)), sPageNum);
451 m_xControl->set_text(nRow, sBookmarkNodeText, 2);
453 m_xControl->set_text(nRow, sHideCondition, 4);
458 std::unique_ptr<weld::TreeIter> xRet;
462 if (pBookmark->
GetName() == sName)
491 OUString sDefaultBookmarkName =
SwResId(STR_BOOKMARK_DEF_NAME);
492 sal_Int32 nHighestBookmarkId = 0;
499 if (sName.getToken(0,
' ', nIndex) == sDefaultBookmarkName)
501 sal_Int32 nCurrBookmarkId = sName.getToken(0,
' ', nIndex).toInt32();
502 nHighestBookmarkId = std::max<sal_Int32>(nHighestBookmarkId, nCurrBookmarkId);
505 return sDefaultBookmarkName +
" " + OUString::number(nHighestBookmarkId + 1);
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
#define LINK(Instance, Class, Member)
virtual void SetForbiddenChars(const OUString &rSet)=0
static constexpr OUStringLiteral aForbiddenChars
virtual ~SwInsertBookmarkDlg() override
virtual const OUString & GetName() const =0
std::unique_ptr< weld::TreeView > m_xControl
const OUString & GetText() const
virtual sal_Int32 getBookmarksCount() const =0
returns the number of IBookmarks.
wrapper iterator: wraps iterator of implementation while hiding MarkBase class; only IMark instances ...
std::unique_ptr< weld::Button > m_xInsertBtn
std::unique_ptr< weld::Label > m_xConditionFT
static SW_DLLPUBLIC MarkType GetType(const ::sw::mark::IMark &rMark)
Returns the MarkType used to create the mark.
Provides access to the marks of a document.
const IDocumentSettingAccess & getIDocumentSettingAccess() const
Provides access to the document setting interface.
virtual short Execute()=0
bool HaveBookmarksChanged()
std::unique_ptr< weld::Label > m_xForbiddenChars
Used by the UI to modify the document model.
virtual const OUString & GetHideCondition() const =0
virtual const_iterator_t findMark(const OUString &rMark) const =0
Finds a mark by name.
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
std::unique_ptr< weld::Button > m_xRenameBtn
const IDocumentMarkAccess * getIDocumentMarkAccess() const
Provides access to the document bookmark interface.
std::unique_ptr< weld::CheckButton > m_xHideCB
std::unique_ptr< weld::TreeIter > GetRowByBookmarkName(const OUString &sName)
sal_Int32 m_nLastBookmarksCount
std::unique_ptr< ConditionEdit > m_xConditionED
virtual std::unique_ptr< ILazyDeleter > deleteMark(const IDocumentMarkAccess::const_iterator_t &ppMark)=0
Deletes a mark.
PaM is Point and Mark: a selection of the document model.
virtual const_iterator_t getBookmarksEnd() const =0
returns a STL-like random access iterator to the end of the sequence of IBookmarks.
SwInsertBookmarkDlg(weld::Window *pParent, SwWrtShell &rSh)
SwAbstractDialogFactory & GetFactory()
std::unique_ptr< weld::Button > m_xDeleteBtn
std::unique_ptr< BookmarkTable > m_xBookmarksBox
static const char cSeparator
OUString SwResId(const char *pId)
OUString GetNameProposal() const
IMPL_LINK_NOARG(SwInsertBookmarkDlg, ModifyHdl, weld::Entry &, void)
void select(const weld::TreeIter &rIter)
void SelectByName(const OUString &sName)
std::vector< std::pair< sw::mark::IMark *, OUString > > aTableBookmarks
void GotoMark(const ::sw::mark::IMark *const pMark)
BookmarkTable(std::unique_ptr< weld::TreeView > xControl)
bool ValidateBookmarks()
Check if displayed bookmarks are up-to date, if not update them.
std::unique_ptr< weld::TreeIter > get_selected() const
virtual const_iterator_t getBookmarksBegin() const =0
returns a STL-like random access iterator to the begin of the sequence the IBookmarks.
sal_Int32 GetIndex() const
Reference< XExecutableDialog > m_xDialog
std::unique_ptr< weld::Entry > m_xEditBox
virtual bool get(DocumentSettingId id) const =0
Return the specified document setting.
virtual const SwPosition & GetMarkEnd() const =0
std::unique_ptr< weld::Button > m_xGotoBtn
virtual VclPtr< AbstractSwRenameXNamedDlg > CreateSwRenameXNamedDlg(weld::Widget *pParent, css::uno::Reference< css::container::XNamed > &xNamed, css::uno::Reference< css::container::XNameAccess > &xNameAccess)=0
void AppendItem(const SfxPoolItem &)
Reference< XModel > xModel
sw::mark::IMark * GetBookmarkByName(const OUString &sName)
virtual const SwPosition & GetMarkStart() const =0
void GotoSelectedBookmark()
void InsertBookmark(sw::mark::IMark *pMark)
virtual bool IsExpanded() const =0
virtual bool IsHidden() const =0
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
IMPL_LINK(SwInsertBookmarkDlg, ChangeHideHdl, weld::ToggleButton &, rBox, void)