20 #include <rtl/ustrbuf.hxx>
26 #include <com/sun/star/frame/XModel.hpp>
27 #include <com/sun/star/text/XBookmarksSupplier.hpp>
28 #include <officecfg/Office/Common.hxx>
35 #include <bookmark.hxx>
38 #include <strings.hrc>
49 m_xBookmarksBox->unselect_all();
53 OUString sTmp = m_xEditBox->get_text();
55 const sal_Int32 nLen = sTmp.getLength();
58 const sal_Int32 nTmpLen = sTmp.getLength();
60 if (sTmp.getLength() != nTmpLen)
63 const bool bHasForbiddenChars = sTmp.getLength() != nLen;
64 m_xForbiddenChars->set_visible(bHasForbiddenChars);
65 if (bHasForbiddenChars)
70 sal_Int32 nSelectedEntries = 0;
71 sal_Int32 nEntries = 0;
72 sal_Int32 nTokenIndex = 0;
73 while (!sTmp.isEmpty() && nTokenIndex >= 0)
76 if (m_xBookmarksBox->GetBookmarkByName(aToken))
78 m_xBookmarksBox->SelectByName(aToken);
85 m_xInsertBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 0 && !bHasForbiddenChars
89 m_xDeleteBtn->set_sensitive(nEntries > 0 && nSelectedEntries == nEntries && !m_bAreProtected);
90 m_xGotoBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1);
91 m_xRenameBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1 && !m_bAreProtected);
97 if (!ValidateBookmarks())
100 int nSelectedRows(0);
102 m_xBookmarksBox->selected_foreach([
this, &nSelectedRows](
weld::TreeIter& rEntry) {
105 = weld::fromId<sw::mark::IMark*>(m_xBookmarksBox->get_id(rEntry));
106 OUString sRemoved = pBookmark->
GetName();
109 SfxRequest aReq(rSh.GetView().GetViewFrame(), FN_DELETE_BOOKMARK);
112 aTableBookmarks.erase(std::remove(aTableBookmarks.begin(), aTableBookmarks.end(),
113 std::make_pair(pBookmark, sRemoved)),
114 aTableBookmarks.end());
125 m_xBookmarksBox->remove_selection();
129 m_xDeleteBtn->set_sensitive(
false);
130 m_xGotoBtn->set_sensitive(
false);
131 m_xRenameBtn->set_sensitive(
false);
132 m_xInsertBtn->set_sensitive(
false);
140 GotoSelectedBookmark();
146 if (!ValidateBookmarks())
149 if (!m_xBookmarksBox->has_focus())
152 OUStringBuffer sEditBoxText;
153 int nSelectedRows = 0;
154 m_xBookmarksBox->selected_foreach(
157 = weld::fromId<sw::mark::IMark*>(m_xBookmarksBox->get_id(rEntry));
158 const OUString& sEntryName = pBookmark->
GetName();
159 if (!sEditBoxText.isEmpty())
160 sEditBoxText.append(
";");
161 sEditBoxText.append(sEntryName);
167 m_xInsertBtn->set_sensitive(
false);
168 m_xGotoBtn->set_sensitive(nSelectedRows == 1);
169 m_xRenameBtn->set_sensitive(nSelectedRows == 1 && !m_bAreProtected);
170 m_xDeleteBtn->set_sensitive(!m_bAreProtected);
171 m_xEditBox->set_text(sEditBoxText.makeStringAndClear());
175 m_xInsertBtn->set_sensitive(!m_bAreProtected);
176 m_xGotoBtn->set_sensitive(
false);
177 m_xRenameBtn->set_sensitive(
false);
178 m_xDeleteBtn->set_sensitive(
false);
184 if (!ValidateBookmarks())
186 auto xSelected = m_xBookmarksBox->get_selected();
191 = weld::fromId<sw::mark::IMark*>(m_xBookmarksBox->get_id(*xSelected));
192 uno::Reference<frame::XModel>
xModel = rSh.GetView().GetDocShell()->GetBaseModel();
193 uno::Reference<text::XBookmarksSupplier> xBkms(xModel, uno::UNO_QUERY);
194 uno::Reference<container::XNameAccess> xNameAccess = xBkms->getBookmarks();
196 uno::Reference<uno::XInterface> xTmp;
198 uno::Reference<container::XNamed> xNamed(xTmp, uno::UNO_QUERY);
208 m_xDeleteBtn->set_sensitive(
false);
209 m_xGotoBtn->set_sensitive(
false);
210 m_xRenameBtn->set_sensitive(
false);
211 m_xInsertBtn->set_sensitive(
false);
218 OUString sBookmark = m_xEditBox->get_text();
219 rSh.SetBookmark2(
vcl::KeyCode(), sBookmark, m_xHideCB->get_active(),
220 m_xConditionED->get_text());
227 bool bHide = rBox.get_active();
228 m_xConditionED->set_sensitive(bHide);
229 m_xConditionFT->set_sensitive(bHide);
266 std::vector<std::pair<sw::mark::IMark*, OUString>>::const_iterator aListIter
276 if (aListIter->first != *ppBookmark || aListIter->second != (*ppBookmark)->GetName())
304 :
SfxDialogController(pParent,
"modules/swriter/ui/insertbookmark.ui",
"InsertBookmarkDialog")
306 , m_nLastBookmarksCount(0)
308 , m_xEditBox(m_xBuilder->weld_entry(
"name"))
309 , m_xInsertBtn(m_xBuilder->weld_button(
"insert"))
310 , m_xDeleteBtn(m_xBuilder->weld_button(
"delete"))
311 , m_xGotoBtn(m_xBuilder->weld_button(
"goto"))
312 , m_xRenameBtn(m_xBuilder->weld_button(
"rename"))
313 , m_xHideCB(m_xBuilder->weld_check_button(
"hide"))
314 , m_xConditionFT(m_xBuilder->weld_label(
"condlabel"))
315 , m_xConditionED(new
ConditionEdit(m_xBuilder->weld_entry(
"withcond")))
316 , m_xBookmarksBox(new
BookmarkTable(m_xBuilder->weld_tree_view(
"bookmarks")))
317 , m_xForbiddenChars(m_xBuilder->weld_label(
"lbForbiddenChars"))
366 =
m_xDialog->get_window_state(WindowStateMask::Pos | WindowStateMask::Size);
374 m_xBookmarksBox->make_sorted();
378 bool bSortAtoZ = m_xBookmarksBox->get_sort_order();
381 if (nColumn == m_xBookmarksBox->get_sort_column())
383 bSortAtoZ = !bSortAtoZ;
384 m_xBookmarksBox->set_sort_order(bSortAtoZ);
388 int nOldSortColumn = m_xBookmarksBox->get_sort_column();
389 if (nOldSortColumn != -1)
390 m_xBookmarksBox->set_sort_indicator(
TRISTATE_INDET, nOldSortColumn);
391 m_xBookmarksBox->set_sort_column(nColumn);
405 m_xControl->set_column_fixed_widths({ 40, 110, 150, 160 });
406 m_xControl->set_selection_mode(SelectionMode::Multiple);
411 std::unique_ptr<weld::TreeIter> xIter(
m_xControl->make_iterator());
424 sal_Int32 nBookmarkTextLen = 0;
425 bool bPulledAll =
false;
426 bool bPulling =
false;
427 static const sal_Int32 nMaxTextLen = 50;
435 if (nBookmarkNodeTextPos == sBookmarkNodeText.getLength())
437 nBookmarkNodeTextPos = std::max<sal_Int32>(0, nBookmarkNodeTextPos - nMaxTextLen);
439 if (nBookmarkNodeTextPos == 0)
442 nBookmarkTextLen = sBookmarkNodeText.getLength() - nBookmarkNodeTextPos;
444 bool bExceedsLength = nBookmarkTextLen > nMaxTextLen;
445 nBookmarkTextLen = std::min<sal_Int32>(nMaxTextLen, nBookmarkTextLen);
447 =
o3tl::trim(sBookmarkNodeText.subView(nBookmarkNodeTextPos, nBookmarkTextLen));
449 sBookmarkNodeText +=
"...";
450 else if (bPulling && !bPulledAll)
451 sBookmarkNodeText =
"..." + sBookmarkNodeText;
455 if (pBookmark->
IsHidden() || !sHideCondition.isEmpty())
456 sHidden =
SwResId(STR_BOOKMARK_YES);
461 m_xControl->set_text(nRow, sBookmarkNodeText, 2);
463 m_xControl->set_text(nRow, sHideCondition, 4);
468 std::unique_ptr<weld::TreeIter> xRet;
471 if (pBookmark->
GetName() == sName)
487 return weld::fromId<sw::mark::IMark*>(
m_xControl->get_id(*xEntry));
500 OUString sDefaultBookmarkName =
SwResId(STR_BOOKMARK_DEF_NAME);
501 sal_Int32 nHighestBookmarkId = 0;
507 if (
o3tl::getToken(sName, 0,
' ', nIndex) == sDefaultBookmarkName)
510 nHighestBookmarkId = std::max<sal_Int32>(nHighestBookmarkId, nCurrBookmarkId);
513 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.
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
const IDocumentSettingAccess & getIDocumentSettingAccess() const
Provides access to the document setting interface.
IMPL_LINK(SwInsertBookmarkDlg, ChangeHideHdl, weld::Toggleable &, rBox, void)
virtual short Execute()=0
bool HaveBookmarksChanged()
std::unique_ptr< weld::Label > m_xForbiddenChars
Used by the UI to modify the document model.
OUString SwResId(TranslateId aId)
virtual const OUString & GetHideCondition() const =0
virtual const_iterator_t findMark(const OUString &rMark) const =0
Finds a mark by name.
IMPL_LINK_NOARG(SwInsertBookmarkDlg, ModifyHdl, weld::Entry &, void)
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
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
void SetWindowState(const OUString &sState)
static const char cSeparator
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
OUString GetWindowState() const
OUString GetNameProposal() const
void select(const weld::TreeIter &rIter)
void SelectByName(const OUString &sName)
std::vector< std::pair< sw::mark::IMark *, OUString > > aTableBookmarks
OUString toId(const void *pValue)
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
std::u16string_view trim(std::u16string_view str)
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
constexpr OUStringLiteral sHidden
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 std::unique_ptr< ILazyDeleter > deleteMark(const IDocumentMarkAccess::const_iterator_t &ppMark, bool isMoveNodes)=0
Deletes a mark.
virtual bool IsHidden() const =0
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
bool m_bDetectedRangeSegmentation false