20#include <config_wasm_strip.h>
22#include <boost/property_tree/json_parser.hpp>
78#include <LibreOfficeKit/LibreOfficeKitEnums.h>
85#define POSTIT_INITIAL_ANCHOR_DISTANCE 20
87#define POSTIT_SPACE_BETWEEN 8
88#define POSTIT_MINIMUMSIZE_WITH_META 60
89#define POSTIT_SCROLL_SIDEBAR_HEIGHT 20
92#define MAX_LOOP_COUNT 50
101 bool comp_pos(
const std::unique_ptr<SwSidebarItem>&
a,
const std::unique_ptr<SwSidebarItem>& b)
105 SwPosition aPosAnchorB = b->GetAnchorPosition();
107 bool aAnchorAInFooter =
false;
108 bool aAnchorBInFooter =
false;
112 aAnchorAInFooter =
true;
114 aAnchorBInFooter =
true;
119 if( aAnchorAInFooter && !aAnchorBInFooter )
123 else if( !aAnchorAInFooter && aAnchorBInFooter )
130 return aPosAnchorA < aPosAnchorB;
139 boost::property_tree::ptree aAnnotation;
140 aAnnotation.put(
"action", (
nType == CommentNotificationType::Add ?
"Add" :
141 (
nType == CommentNotificationType::Remove ?
"Remove" :
142 (
nType == CommentNotificationType::Modify ?
"Modify" :
143 (
nType == CommentNotificationType::Resolve ?
"Resolve" :
"???")))));
144 aAnnotation.put(
"id", nPostItId);
145 if (
nType != CommentNotificationType::Remove && pItem !=
nullptr)
153 aRect.
Pos().getX() + aRect.
SSize().Width(),
154 aRect.
Pos().getY() + aRect.
SSize().Height());
162 std::vector<OString> aRects;
165 const SwRect rect(aRange.getMinX(), aRange.getMinY(), aRange.getWidth(), aRange.getHeight());
171 aAnnotation.put(
"parent", pWin->
CalcParent());
172 aAnnotation.put(
"paraIdParent", pField->
GetParentId());
173 aAnnotation.put(
"author", pField->
GetPar1().toUtf8().getStr());
174 aAnnotation.put(
"text", pField->
GetPar2().toUtf8().getStr());
175 aAnnotation.put(
"resolved", pField->
GetResolved() ?
"true" :
"false");
177 aAnnotation.put(
"anchorPos", aSVRect.
toString());
178 aAnnotation.put(
"textRange", sRects.getStr());
181 boost::property_tree::ptree aTree;
182 aTree.add_child(
"comment", aAnnotation);
183 std::stringstream aStream;
184 boost::property_tree::write_json(aStream, aTree);
185 std::string aPayload = aStream.str();
197 , mpWrtShell(
mpView->GetDocShell()->GetWrtShell())
198 , mpEditWin(&
mpView->GetEditWin())
200 , mbWaitingForCalcRects(false)
201 , mpActivePostIt(nullptr)
207 , mbIsShowAnchor( false )
216 SW_MOD()->GetRedlineAuthor();
247 bool bRemoved =
false;
255 if((*it)->mpPostIt && (*it)->mpPostIt->GetPostItField())
256 lcl_CommentNotification(
mpView, CommentNotificationType::Remove,
nullptr, (*it)->mpPostIt->GetPostItField()->GetPostItId());
258 std::unique_ptr<SwSidebarItem>
p = std::move(*it);
262 p->mpPostIt.disposeAndClear();
267 lcl_CommentNotification(
mpView, CommentNotificationType::Remove,
nullptr, pPostItField->
GetPostItId());
302 if ( postItField->GetBroadcaster() == pItem )
309 if (
auto pSwFormatField =
dynamic_cast< SwFormatField *
>( pItem ))
311 mvPostItFields.push_back(std::make_unique<SwAnnotationItem>(*pSwFormatField, bFocus));
314 assert(
dynamic_cast< const SwFormatField *
>( pItem ) &&
"Mgr::InsertItem: seems like new stuff was added");
316 return pAnnotationItem;
323 [&pBroadcast](
const std::unique_ptr<SwSidebarItem>& pField) { return pField->GetBroadcaster() == pBroadcast; });
326 std::unique_ptr<SwSidebarItem>
p = std::move(*
i);
335 p->mpPostIt.disposeAndClear();
345 if ( pSfxEventHint->GetEventId() == SfxEventHintId::SwEventLayoutFinished )
357 switch ( pFormatHint->Which() )
381 OSL_FAIL(
"Inserted field not in document!" );
403 lcl_CommentNotification(
mpView, CommentNotificationType::Remove,
nullptr, pPostItField->
GetPostItId());
410 if (pFormatHint->GetView()==
mpView)
420 if ( pFormatField == postItField->GetBroadcaster() )
422 if (postItField->mpPostIt)
424 postItField->mpPostIt->SetPostItText();
432 lcl_CommentNotification(
mpView, CommentNotificationType::Modify, postItField.get(), 0);
434 lcl_CommentNotification(
mpView, CommentNotificationType::Resolve, postItField.get(), 0);
447 if ( pFormatField == postItField->GetBroadcaster() )
449 if (postItField->mpPostIt)
452 sal_uInt16 nLangWhichId = 0;
460 postItField->mpPostIt->SetLanguage(
462 postItField->GetFormatField().GetField()->GetLanguage(),
477 case SfxHintId::ModeChanged:
487 case SfxHintId::DocChanged:
499 case SfxHintId::SwSplitNodeOperation:
505 case SfxHintId::Dying:
510 OSL_FAIL(
"Notification for removed SwFormatField was not sent!");
531 if ( &rBC == postItField->GetBroadcaster() )
533 if (postItField->mpPostIt)
535 if (postItField->mpPostIt->IsResolved() &&
541 postItField->mpPostIt->GrabFocus();
547 postItField->mbFocus =
true;
563 bool bChange =
false;
564 bool bRepair =
false;
573 OSL_FAIL(
"PostIt is not in doc or other wrong use");
577 const SwRect aOldAnchorRect( pItem->maLayoutInfo.mPosition );
579 const SwNodeOffset nOldStartNodeIdx( pItem->maLayoutInfo.mnStartNodeIdx );
580 const sal_Int32 nOldStartContent( pItem->maLayoutInfo.mnStartContent );
585 const ::sw::mark::IMark* pAnnotationMark =
586 pTextAnnotationField !=
nullptr ? pTextAnnotationField->
GetAnnotationMark() :
nullptr;
587 if ( pAnnotationMark !=
nullptr )
589 pItem->mLayoutStatus =
592 pItem->GetAnchorPosition(),
597 pItem->mLayoutStatus =
602 || pItem->maLayoutInfo.mPosition != aOldAnchorRect
603 || pItem->mLayoutStatus != eOldLayoutStatus
604 || pItem->maLayoutInfo.mnStartNodeIdx != nOldStartNodeIdx
605 || pItem->maLayoutInfo.mnStartContent != nOldStartContent;
619 pItem->mpPostIt->HideNote();
628 pItem->mpPostIt->HideNote();
633 const tools::ULong aPageNum = pItem->maLayoutInfo.mnPageNumber;
634 if (aPageNum >
mPages.size())
638 for (
tools::ULong j=0; j<aPageNum - nNumberOfPages; ++j)
641 mPages[aPageNum-1]->mvSidebarItems.push_back(pItem.get());
642 mPages[aPageNum-1]->mPageRect = pItem->maLayoutInfo.mPageFrame;
643 mPages[aPageNum-1]->eSidebarPosition = pItem->maLayoutInfo.meSidebarPosition;
674 if (postItField->mbShow && postItField->mpPostIt && postItField->mpPostIt->HasScrollbar())
686 if (lContainerSize < lPageSize)
688 mPages.reserve(lPageSize);
692 else if (lContainerSize > lPageSize)
694 for (
int i=
mPages.size()-1;
i >= lPageSize;--
i)
700 for (
auto const& page :
mPages)
702 page->mvSidebarItems.clear();
704 page->bScrollbar =
false;
722 bool bUpdate =
false;
723 for (std::unique_ptr<SwPostItPageItem>& pPage :
mPages)
726 if (!pPage->mvSidebarItems.empty())
728 std::vector<SwAnnotationWin*> aVisiblePostItList;
733 for (
auto const& pItem : pPage->mvSidebarItems)
744 ? pItem->maLayoutInfo.mPagePrtArea.Left()
745 : pPage->mPageRect.Left() + 350;
754 ? pItem->maLayoutInfo.mPagePrtArea.Right() :
755 pPage->mPageRect.Right() - 350;
766 pPostIt->InitControls();
768 pItem->mpPostIt = pPostIt;
771 if (
static_cast<bool>(pPostIt->CalcParent()))
777 pPostIt->SetChangeTracking(
778 pItem->mLayoutStatus,
780 pPostIt->SetSidebarPosition(pPage->eSidebarPosition);
781 pPostIt->SetFollow(
static_cast<bool>(pPostIt->CalcParent()));
782 aPostItHeight = ( pPostIt->GetPostItTextHeight() < pPostIt->GetMinimumSizeWithoutMeta()
783 ? pPostIt->GetMinimumSizeWithoutMeta()
784 : pPostIt->GetPostItTextHeight() )
785 + pPostIt->GetMetaHeight();
786 pPostIt->SetPosSizePixelRect( mlPageBorder ,
790 pItem->maLayoutInfo.mPosition,
792 pPostIt->ChangeSidebarItem( *pItem );
797 pPostIt->GrabFocus();
798 pItem->mbFocus =
false;
801 aVisiblePostItList.push_back(pPostIt);
802 lNeededHeight += pPostIt->IsFollow() ? aPostItHeight : aPostItHeight+
GetSpaceBetween();
811 if ((!aVisiblePostItList.empty()) &&
ShowNotes())
813 bool bOldScrollbar = pPage->bScrollbar;
815 pPage->bScrollbar =
LayoutByPage(aVisiblePostItList, pPage->mPageRect.SVRect(), lNeededHeight);
817 pPage->bScrollbar =
false;
818 if (!pPage->bScrollbar)
826 tools::Long lOffset = -1 * nScrollSize * (aVisiblePostItList.size() - aAvailableHeight / nScrollSize);
827 if (pPage->lOffset < lOffset)
828 pPage->lOffset = lOffset;
830 bUpdate = (bOldScrollbar != pPage->bScrollbar) || bUpdate;
837 for (
auto const& visiblePostIt : aVisiblePostItList)
839 if (pPage->lOffset != 0)
840 visiblePostIt->TranslateTopPosition(pPage->lOffset);
842 bool bBottom =
mpEditWin->PixelToLogic(
Point(0,visiblePostIt->VirtualPos().Y()+visiblePostIt->VirtualSize().Height())).Y() <= (pPage->mPageRect.Bottom()-aSidebarheight);
843 bool bTop =
mpEditWin->PixelToLogic(
Point(0,visiblePostIt->VirtualPos().Y())).Y() >= (pPage->mPageRect.Top()+aSidebarheight);
844 if ( bBottom && bTop )
854 visiblePostIt->ShowNote();
860 if (
mpEditWin->PixelToLogic(
Point(0,visiblePostIt->VirtualPos().Y())).Y() < (pPage->mPageRect.Top()+aSidebarheight))
863 visiblePostIt->ShowAnchorOnly(
Point( pPage->mPageRect.Left(),
864 pPage->mPageRect.Top()));
866 visiblePostIt->ShowAnchorOnly(
Point( pPage->mPageRect.Right(),
867 pPage->mPageRect.Top()));
872 visiblePostIt->ShowAnchorOnly(
Point(pPage->mPageRect.Left(),
873 pPage->mPageRect.Bottom()));
875 visiblePostIt->ShowAnchorOnly(
Point(pPage->mPageRect.Right(),
876 pPage->mPageRect.Bottom()));
878 OSL_ENSURE(pPage->bScrollbar,
"SwPostItMgr::LayoutByPage(): note overlaps, but bScrollbar is not true");
884 for (
auto const& visiblePostIt : aVisiblePostItList)
886 visiblePostIt->SetPosAndSize();
889 bool bOldScrollbar = pPage->bScrollbar;
890 pPage->bScrollbar =
false;
891 bUpdate = (bOldScrollbar != pPage->bScrollbar) || bUpdate;
894 for (
auto const& visiblePostIt : aVisiblePostItList)
898 if (visiblePostIt->GetSidebarItem().mbPendingLayout)
899 lcl_CommentNotification(
mpView, CommentNotificationType::Add, &visiblePostIt->GetSidebarItem(), 0);
900 else if (visiblePostIt->IsAnchorRectChanged())
902 lcl_CommentNotification(
mpView, CommentNotificationType::Modify, &visiblePostIt->GetSidebarItem(), 0);
903 visiblePostIt->ResetAnchorRectChanged();
908 visiblePostIt->GetSidebarItem().mbPendingLayout =
false;
913 if (pPage->bScrollbar)
915 pPage->bScrollbar =
false;
922 bool bRepair =
false;
927 OSL_FAIL(
"PostIt is not in doc!");
932 if (postItField->mpPostIt)
934 postItField->mpPostIt->HideNote();
935 if (postItField->mpPostIt->HasChildPathFocus())
938 postItField->mpPostIt->GrabFocusToDocument();
961 if (
mPages[aPage-1]->mvSidebarItems.empty() )
963 OSL_FAIL(
"Notes SidePane painted but no rects and page lists calculated!");
967 auto aItem =
mPages[aPage-1]->mvSidebarItems.end();
969 OSL_ENSURE ((*aItem)->mpPostIt,
"BorderOverPageBorder: NULL postIt, should never happen");
970 if ((*aItem)->mpPostIt)
973 const tools::Long aEndValue =
mpEditWin->PixelToLogic(
Point(0,(*aItem)->mpPostIt->GetPosPixel().Y()+(*aItem)->mpPostIt->GetSizePixel().Height())).Y();
974 return aEndValue <=
mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight;
982 assert(nPage <
mPages.size());
983 if (nPage >=
mPages.size())
985 for (
auto const& pItem :
mPages[nPage]->mvSidebarItems)
997 for (
const std::unique_ptr<SwSidebarItem>& pItem :
mvPostItFields)
1003 bool bEnableMapMode = !
mpEditWin->IsMapModeEnabled();
1013 pPostIt->
PaintTile(rRenderContext, aRectangle);
1015 rRenderContext.
Pop();
1023 OSL_ENSURE((lScroll %
GetScrollSize() )==0,
"SwPostItMgr::Scroll: scrolling by wrong value");
1031 for (
auto const& item :
mPages[aPage-1]->mvSidebarItems)
1042 if ( bBottom && bTop)
1065 mPages[aPage-1]->lOffset += lScroll;
1076 if (!
mPages[aPage-1]->bScrollbar)
1082 if ( !(bBottom && bTop))
1089 assert(nScrollSize);
1090 const tools::Long lScroll = bBottom ? (aDiff + ( nScrollSize - (aDiff % nScrollSize))) : (aDiff - (nScrollSize + (aDiff % nScrollSize)));
1099 std::vector<SwPostItPageItem*>::size_type
n=0;
1100 for (
auto const& page :
mPages)
1102 for (
auto const& item : page->mvSidebarItems)
1104 if (item->mpPostIt==pPostIt)
1125 return (
mPages[aPage-1]->lOffset != 0);
1131 default:
return false;
1162 const tools::Long lVisibleHeight = lBottomBorder - lTopBorder;
1163 const size_t nPostItListSize = aVisiblePostItList.size();
1165 bool bScrollbars =
false;
1168 if (nPostItListSize > 0 && lVisibleHeight < lNeededHeight)
1177 for (
auto const& visiblePostIt : aVisiblePostItList)
1178 visiblePostIt->SetSize(
Size(visiblePostIt->VirtualSize().getWidth(),visiblePostIt->GetMinimumSizeWithMeta()));
1182 for (
auto const& visiblePostIt : aVisiblePostItList)
1184 if ( visiblePostIt->VirtualSize().getHeight() > lAverageHeight)
1185 visiblePostIt->SetSize(
Size(visiblePostIt->VirtualSize().getWidth(),lAverageHeight));
1191 if (aVisiblePostItList.size()>1)
1201 for(
auto i = aVisiblePostItList.begin();
i != aVisiblePostItList.end() ; ++
i)
1203 auto aNextPostIt =
i;
1206 if (aNextPostIt != aVisiblePostItList.end())
1208 lTranslatePos = ( (*i)->VirtualPos().Y() + (*i)->VirtualSize().Height()) - (*aNextPostIt)->VirtualPos().Y();
1209 if (lTranslatePos > 0)
1216 if ( (lSpaceUsed <= (*i)->VirtualPos().Y()) || (
i==aVisiblePostItList.begin()))
1219 if ( ((*i)->VirtualPos().Y()- lTranslatePos -
GetSpaceBetween()) > lTopBorder)
1221 if ((*aNextPostIt)->IsFollow())
1228 tools::Long lMoveUp = (*i)->VirtualPos().Y() - lTopBorder;
1229 (*i)->TranslateTopPosition(-1* lMoveUp);
1230 if ((*aNextPostIt)->IsFollow())
1231 (*aNextPostIt)->TranslateTopPosition( (lTranslatePos+
ANCHORLINE_WIDTH) - lMoveUp);
1233 (*aNextPostIt)->TranslateTopPosition( (lTranslatePos+
GetSpaceBetween()) - lMoveUp);
1239 if ((*aNextPostIt)->IsFollow())
1242 (*aNextPostIt)->TranslateTopPosition(lTranslatePos+
GetSpaceBetween());
1248 if (
i==aVisiblePostItList.begin())
1250 tools::Long lMoveDown = lTopBorder - (*i)->VirtualPos().Y();
1254 (*i)->TranslateTopPosition( lMoveDown);
1258 if ( (*aNextPostIt)->IsFollow() )
1266 auto aPrevPostIt =
i;
1268 lTranslatePos = ( (*aPrevPostIt)->VirtualPos().Y() + (*aPrevPostIt)->VirtualSize().Height() ) - (*i)->VirtualPos().Y();
1269 if (lTranslatePos > 0)
1272 if ( ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()+lTranslatePos) < lBottomBorder)
1274 if ( (*i)->IsFollow() )
1281 (*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()) );
1288 if (!bScrollbars && ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height() > lBottomBorder) )
1291 (*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()));
1299 OSL_FAIL(
"PostItMgr::Layout(): We are looping forever");
1307 auto i = aVisiblePostItList.begin();
1308 lTranslatePos = lTopBorder - (*i)->VirtualPos().Y();
1309 if (lTranslatePos>0)
1313 lTranslatePos = lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height());
1314 if (lTranslatePos<0)
1316 (*i)->TranslateTopPosition(lTranslatePos);
1327 std::vector<SwFormatField*> vFormatFields;
1329 for(
auto pFormatField : vFormatFields)
1330 InsertItem(pFormatField, bCheckExistence, bFocus);
1341 postItField->mpPostIt.disposeAndClear();
1342 postItField.reset();
1355 virtual bool operator()(
const SwFormatField* pField)
const = 0;
1356 virtual ~FilterFunctor() {}
1359class IsPostitField :
public FilterFunctor
1368class IsPostitFieldWithAuthorOf :
public FilterFunctor
1372 explicit IsPostitFieldWithAuthorOf(OUString aAuthor)
1373 : m_sAuthor(
std::move(aAuthor))
1384class IsPostitFieldWithPostitId :
public FilterFunctor
1386 sal_uInt32 m_nPostItId;
1388 explicit IsPostitFieldWithPostitId(sal_uInt32 nPostItId)
1389 : m_nPostItId(nPostItId)
1400class IsFieldNotDeleted :
public FilterFunctor
1404 FilterFunctor
const& m_rNext;
1408 const FilterFunctor & rNext)
1415 if (!m_rNext(pField))
1432 std::vector<std::unique_ptr<SwSidebarItem>>& m_aSidebarItems;
1433 std::vector<const SwFormatField*> m_aFormatFields;
1435 FilterFunctor& m_rFilter;
1443 bool bAllInvalidated =
false;
1447 bAllInvalidated = pField ==
nullptr;
1448 if (!bAllInvalidated && m_rFilter(pField))
1451 m_aFormatFields.erase(std::remove(m_aFormatFields.begin(), m_aFormatFields.end(), pField), m_aFormatFields.end());
1457 bAllInvalidated = pField ==
nullptr;
1458 if (!bAllInvalidated && m_rFilter(pField))
1461 m_aFormatFields.push_back(pField);
1465 if (bAllInvalidated)
1472 FieldDocWatchingStack(std::vector<std::unique_ptr<SwSidebarItem>>& in,
SwDocShell &rDocShell, FilterFunctor& rFilter)
1473 : m_aSidebarItems(
in)
1474 , m_rDocShell(rDocShell)
1475 , m_rFilter(rFilter)
1482 EndListeningToAllFields();
1483 m_aFormatFields.clear();
1484 m_aFormatFields.reserve(m_aSidebarItems.size());
1485 for (
auto const& p : m_aSidebarItems)
1488 if (!m_rFilter(&rField))
1491 m_aFormatFields.push_back(&rField);
1494 void EndListeningToAllFields()
1496 for (
auto const& pField : m_aFormatFields)
1501 virtual ~FieldDocWatchingStack()
override
1503 EndListeningToAllFields();
1508 if (m_aFormatFields.empty())
1512 m_aFormatFields.pop_back();
1533 IsPostitFieldWithAuthorOf aFilter(rAuthor);
1535 IsFieldNotDeleted aFilter2(rIDRA, aFilter);
1562 IsPostitFieldWithPostitId aFilter(nPostItId);
1564 IsFieldNotDeleted aFilter2(rIDRA, aFilter);
1586 IsPostitFieldWithPostitId aFilter(nPostItId);
1610 IsPostitFieldWithPostitId aFilter(nPostItId);
1635 IsPostitFieldWithPostitId aFilter(nPostItId);
1660 IsPostitField aFilter;
1662 IsFieldNotDeleted aFilter2(rIDRA, aFilter);
1689 pWin = postItField->mpPostIt;
1701 aDlgAttr.
Put(aEditAttr);
1704 sal_uInt16 nRet = pDlg->Execute();
1707 aDlgAttr.
Put(*pDlg->GetOutputItemSet());
1723 if (!postItField->mpPostIt)
1725 OutlinerView* pOLV = postItField->mpPostIt->GetOutlinerView();
1741 postItField->mpPostIt->UpdateData();
1756 if ( postItField->mpPostIt && (postItField->mpPostIt->GetAuthor() == rAuthor) )
1758 postItField->mbShow =
false;
1759 postItField->mpPostIt->HideNote();
1770 postItField->mbShow =
false;
1771 if (postItField->mpPostIt)
1772 postItField->mpPostIt->HideNote();
1780 postItField->mbShow =
true;
1789 if ( postItField->GetBroadcaster() == pBroadcaster)
1790 return postItField->mpPostIt;
1799 if ( postItField->GetFormatField().GetField() == pField )
1800 return postItField->mpPostIt.get();
1810 return postItField->mpPostIt.get();
1826 [&aPostIt](
const std::unique_ptr<SwSidebarItem>& pField) { return pField->mpPostIt == aPostIt; });
1830 auto iNextPostIt =
i;
1848 if ( (*iNextPostIt)->mpPostIt == aPostIt)
1850 return (*iNextPostIt)->mpPostIt;
1858 for (
auto const& pPage :
mPages)
1860 for(
auto b = pPage->mvSidebarItems.begin(); b!= pPage->mvSidebarItems.end(); ++b)
1866 bool bFollow = (aNext != pPage->mvSidebarItems.end()) && (*aNext)->mpPostIt->IsFollow();
1867 if ( pPage->bScrollbar || bFollow )
1874 if (aNext == pPage->mvSidebarItems.end())
1883 OSL_FAIL(
"SwPostItMgr::GetNextBorder(): We have to find a next border here");
1955 if (
mPages.size() > aPage-1)
1972 OSL_ENSURE(
mPages.size()>nPageNum-1,
"SwPostitMgr:: page container size wrong");
1980 if (
mPages[nPageNum-1]->bScrollbar)
1996 bool bEnableMapMode = !
mpEditWin->IsMapModeEnabled();
2000 for (
const std::unique_ptr<SwSidebarItem>& pItem :
mvPostItFields)
2063 else if (aRectTop.
Contains(aPoint))
2083 pFirstPostIt = postItField->mpPostIt;
2105 for (
const std::unique_ptr<SwPostItPageItem>& pPage :
mPages)
2107 for (
auto const& item : pPage->mvSidebarItems)
2110 if ( item->mbShow && item->mpPostIt && item->mpPostIt->Anchor() )
2113 ?
mpEditWin->LogicToPixel(
Point(
static_cast<tools::Long>(item->mpPostIt->Anchor()->GetSeventhPosition().getX()),0)).X()
2115 aAnchorPosY =
mpEditWin->LogicToPixel(
Point(0,
static_cast<tools::Long>(item->mpPostIt->Anchor()->GetSixthPosition().getY()))).Y() + 1;
2116 item->mpPostIt->SetPosPixel(
Point(aAnchorPosX,aAnchorPosY));
2141 nZoom = fScaleX * 100;
2171 static const Color aArrayNormal[] = {
2176 return aArrayNormal[ aAuthorIndex %
SAL_N_ELEMENTS( aArrayNormal )];
2186 static const Color aArrayLight[] = {
2191 return aArrayLight[ aAuthorIndex %
SAL_N_ELEMENTS( aArrayLight )];
2201 static const Color aArrayAnchor[] = {
2206 return aArrayAnchor[ aAuthorIndex %
SAL_N_ELEMENTS( aArrayAnchor )];
2230 mpView->AttrChangedNotify(
nullptr);
2240 OSL_FAIL(
"Reentrance problem in Layout Manager!");
2241 mbWaitingForCalcRects =
false;
2246 if (CalcRects() || mbLayout)
2256 if ( postItField->mpPostIt )
2257 postItField->mpPostIt->Rescale();
2293 if ( postItField->mpPostIt )
2294 postItField->mpPostIt->SetSpellChecking();
2300 if ( postItField->mpPostIt )
2301 postItField->mpPostIt->SetReadonly(
mbReadOnly );
2307 if ( postItField->mpPostIt )
2308 postItField->mpPostIt->CheckMetaText();
2335 sal_uInt16 aResult = 0;
2435#if !ENABLE_WASM_STRIP_ACCESSIBILITY
2481 const sal_Int32 nIndex )
2494 std::vector< vcl::Window* >* pChildren )
2503 for (
auto const& pPage :
mPages)
2505 for(
auto b = pPage->mvSidebarItems.begin(); b!= pPage->mvSidebarItems.end(); ++b)
2507 if ((*b)->mpPostIt->IsResolved())
2509 (*b)->mpPostIt->SetResolved(
true);
2510 (*b)->mpPostIt->GetSidebarItem().mbShow =
visible;
2522 for (
auto const& pPage :
mPages)
2524 for(
auto b = pPage->mvSidebarItems.begin(); b!= pPage->mvSidebarItems.end(); ++b)
2526 if((*b)->mpPostIt->GetTopReplyNote() == topNote) {
2527 (*b)->mpPostIt->SetResolved(resolved);
const sal_Int16 mnEventId
#define POSTIT_SPACE_BETWEEN
#define POSTIT_MINIMUMSIZE_WITH_META
#define POSTIT_SCROLL_SIDEBAR_HEIGHT
#define POSTIT_INITIAL_ANCHOR_DISTANCE
IMPL_LINK_NOARG(SwPostItMgr, CalcHdl, void *, void)
#define COL_NOTES_SIDEPANE_ARROW_DISABLED
#define COL_NOTES_SIDEPANE_ARROW_ENABLED
static const AllSettings & GetSettings()
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
static void RemoveUserEvent(ImplSVEvent *nUserEvent)
css::util::DateTime GetUNODateTime() const
virtual SwFieldType * GetFieldType(SwFieldIds nResId, const OUString &rName, bool bDbFieldMatching) const =0
virtual bool get(DocumentSettingId id) const =0
Return the specified document setting.
void SetOrigin(const Point &rOrigin)
const Fraction & GetScaleX() const
const Point & GetOrigin() const
void SetSelection(const ESelection &)
sal_Int32 StartSearchAndReplace(const SvxSearchItem &rSearchItem)
ESelection GetSelection() const
Outliner * GetOutliner() const
void SetAttribs(const SfxItemSet &)
void SelectRange(sal_Int32 nFirst, sal_Int32 nCount)
sal_Int32 GetParagraphCount() const
void EnableMapMode(bool bEnable=true)
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
const MapMode & GetMapMode() const
void Push(vcl::PushFlags nFlags=vcl::PushFlags::ALL)
bool IsMapModeEnabled() const
virtual bool IsTextEdit() const final override
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint)
weld::Window * GetFrameWeld() const
SfxViewFrame & GetViewFrame() const
virtual void libreOfficeKitViewCallback(int nType, const char *pPayload) const override
constexpr tools::Long Height() const
void SetBackward(bool bNewBackward)
void SetSearchOptions(const i18nutil::SearchOptions2 &rOpt)
virtual VclPtr< SfxAbstractTabDialog > CreateSwCharDlg(weld::Window *pParent, SwView &pVw, const SfxItemSet &rCoreSet, SwCharDlgMode nDialogMode, const OUString *pFormatStr=nullptr)=0
static SwAbstractDialogFactory * Create()
void InvalidatePosOrSize(const SwFrame *pFrame, const SdrObject *pObj, vcl::Window *pWindow, const SwRect &rOldFrame)
void A11yDispose(const SwFrame *pFrame, const SdrObject *pObj, vcl::Window *pWindow, bool bRecursive=false, bool bCanSkipInvisible=true)
static SfxItemPool * GetAnnotationPool(SwView const &rV)
SwDoc * GetDoc()
returns Doc. But be careful!
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
void StartAllAction()
For all views of this document.
SwUndoId StartUndo(SwUndoId eUndoId=SwUndoId::EMPTY, const SwRewriter *pRewriter=nullptr)
Undo: set up Undo parenthesis, return nUndoId of this parenthesis.
SwUndoId EndUndo(SwUndoId eUndoId=SwUndoId::EMPTY, const SwRewriter *pRewriter=nullptr)
Closes parenthesis of nUndoId, not used by UI.
void EndTextEdit()
Deletes object if required.
size_t IsObjSelected() const
Instances of SwFields and those derived from it occur 0 to n times.
void CollectPostIts(std::vector< SwFormatField * > &rvFormatFields, IDocumentRedlineAccess const &rIDRA, bool HideRedlines)
SwFieldType * GetTyp() const
Base class of the Writer layout elements.
const SwStartNode * FindFooterStartNode() const
const SwStartNode * FindFootnoteStartNode() const
virtual void Notify(const css::uno::Sequence< OUString > &aPropertyNames) override
virtual void ImplCommit() override
bool IsShowAnchor() const
sal_uInt32 GetPostItId() const
virtual OUString GetPar1() const override
Author.
const DateTime & GetDateTime() const
sal_uInt32 GetParentId() const
virtual OUString GetPar2() const override
Text.
void Focus(const SfxBroadcaster &rBC)
void RemoveItem(SfxBroadcaster *pBroadcast)
SwPostItMgr(SwView *aDoc)
sal_Int32 GetInitialAnchorDistance() const
bool ShowScrollbar(const tools::ULong aPage) const
void GrabFocusOnActiveSidebarWin()
sw::annotation::SwAnnotationWin * GetAnnotationWin(const SwPostItField *pField) const
void HideActiveSidebarWin()
std::vector< std::unique_ptr< SwPostItPageItem > > mPages
void SetShadowState(const SwPostItField *pField, bool bCursor=true)
bool ScrollbarHit(const tools::ULong aPage, const Point &aPoint)
sal_Int32 GetMinimumSizeWithMeta() const
sal_uInt16 SearchReplace(const SwFormatField &pField, const i18nutil::SearchOptions2 &rSearchOptions, bool bSrchForward)
void PrepareView(bool bIgnoreCount=false)
std::vector< std::unique_ptr< SwSidebarItem > > mvPostItFields
SwPostItField * GetLatestPostItField()
virtual ~SwPostItMgr() override
void ToggleResolved(sal_uInt32 nPostItId)
static Color GetColorDark(std::size_t aAuthorIndex)
static Color GetColorAnchor(std::size_t aAuthorIndex)
Color GetArrowColor(sal_uInt16 aDirection, tools::ULong aPage) const
FieldShadowState mShadowState
void ToggleInsModeOnActiveSidebarWin()
void MakeVisible(const sw::annotation::SwAnnotationWin *pPostIt)
void ConnectSidebarWinToFrame(const SwFrame &rFrame, const SwFormatField &rFormatField, sw::annotation::SwAnnotationWin &rSidebarWin)
void AddPostIts(bool bCheckExistence=true, bool bFocus=true)
tools::ULong GetSidebarWidth(bool bPx=false) const
bool LayoutByPage(std::vector< sw::annotation::SwAnnotationWin * > &aVisiblePostItList, const tools::Rectangle &rBorder, tools::Long lNeededHeight)
void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
std::unique_ptr< sw::sidebarwindows::SwFrameSidebarWinContainer > mpFrameSidebarWinContainer
void ExecuteFormatAllDialog(SwView &rView)
bool HasActiveAnnotationWin() const
bool HasScrollbars() const
static Color GetColorLight(std::size_t aAuthorIndex)
bool ArrowEnabled(sal_uInt16 aDirection, tools::ULong aPage) const
void DeleteCommentThread(sal_uInt32 nPostItId)
tools::ULong GetSidebarBorderWidth(bool bPx=false) const
tools::Rectangle GetTopScrollRect(const tools::ULong aPage) const
void Scroll(const tools::Long lScroll, const tools::ULong aPage)
VclPtr< SwEditWin > mpEditWin
void PreparePageContainer()
sal_Int32 GetScrollSize() const
std::optional< OutlinerParaObject > mpAnswer
void AutoScroll(const sw::annotation::SwAnnotationWin *pPostIt, const tools::ULong aPage)
vcl::Window * GetSidebarWinForFrameByIndex(const SwFrame &rFrame, const sal_Int32 nIndex)
bool BorderOverPageBorder(tools::ULong aPage) const
sal_uInt16 Replace(SvxSearchItem const *pItem)
VclPtr< sw::annotation::SwAnnotationWin > mpActivePostIt
SW_DLLPUBLIC void UpdateDataOnActiveSidebarWin()
void SetActiveSidebarWin(sw::annotation::SwAnnotationWin *p)
SwSidebarItem * InsertItem(SfxBroadcaster *pItem, bool bCheckExistence, bool bFocus)
void FormatAll(const SfxItemSet &rNewAttr)
bool CheckForRemovedPostIts()
bool HasFrameConnectedSidebarWins(const SwFrame &rFrame)
void ToggleResolvedForThread(sal_uInt32 nPostItId)
void DeleteActiveSidebarWin()
vcl::Window * IsHitSidebarWindow(const Point &rPointLogic)
Get the matching window that is responsible for handling mouse events of rPointLogic,...
sal_uInt16 FinishSearchReplace(const i18nutil::SearchOptions2 &rSearchOptions, bool bSrchForward)
sal_Int32 GetSidebarScrollerHeight() const
tools::Long mbLayoutHeight
void PaintTile(OutputDevice &rRenderContext)
tools::Rectangle GetBottomScrollRect(const tools::ULong aPage) const
sw::annotation::SwAnnotationWin * GetNextPostIt(sal_uInt16 aDirection, sw::annotation::SwAnnotationWin *aPostIt)
sw::annotation::SwAnnotationWin * GetSidebarWin(const SfxBroadcaster *pBroadcaster) const
void DrawNotesForPage(OutputDevice *pOutDev, sal_uInt32 nPage)
void ShowHideResolvedNotes(bool visible)
void GetAllSidebarWinForFrame(const SwFrame &rFrame, std::vector< vcl::Window * > *pChildren)
bool mbWaitingForCalcRects
void DisconnectSidebarWinFromFrame(const SwFrame &rFrame, sw::annotation::SwAnnotationWin &rSidebarWin)
sw::annotation::SwAnnotationWin * GetActiveSidebarWin()
SW_DLLPUBLIC bool HasActiveSidebarWin() const
void AssureStdModeAtShell()
bool IsHit(const Point &aPointPixel)
tools::Long GetNextBorder()
sal_Int32 GetSpaceBetween() const
void UpdateResolvedStatus(const sw::annotation::SwAnnotationWin *topNote)
Of course Writer needs its own rectangles.
void Height(tools::Long nNew)
void Top(const tools::Long nTop)
void Right(const tools::Long nRight)
void Bottom(const tools::Long nBottom)
void Pos(const Point &rNew)
void SSize(const Size &rNew)
tools::Rectangle SVRect() const
void Left(const tools::Long nLeft)
void AddRule(SwUndoArg eWhat, const OUString &rWith)
The root element of a Writer document layout.
bool IsHideRedlines() const
Replacement for sw::DocumentRedlineManager::GetRedlineFlags() (this is layout-level redline hiding).
::sw::mark::IMark * GetAnnotationMark() const
sal_uInt16 GetZoom() const
bool IsShowHiddenChar(bool bHard=false) const
bool IsResolvedPostIts() const
bool IsViewLocked() const
vcl::RenderContext * GetOut() const
const SwViewOption * GetViewOptions() const
const IDocumentSettingAccess & getIDocumentSettingAccess() const
Provides access to the document setting interface.
SwRootFrame * GetLayout() const
sal_uInt16 GetNumPages() const
SwAccessibleMap * GetAccessibleMap()
const IDocumentRedlineAccess & getIDocumentRedlineAccess() const
Provides access to the document redline interface.
void MakeVisible(const SwRect &)
SwWrtShell & GetWrtShell() const
virtual SdrView * GetDrawView() const override
void ExecViewOptions(SfxRequest &)
SwDocShell * GetDocShell()
bool IsSelFrameMode() const
bool GotoField(const SwFormatField &rField)
bool DelRight(bool isReplaceHeuristic=false)
virtual void DrawSelChanged() override
const SwView & GetView() const
reference_type * get() const
const SwRect & GetAnchorRect() const
void PaintTile(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
const std::vector< basegfx::B2DRange > & GetAnnotationTextRanges() const
::sw::sidebarwindows::AnchorOverlayObject * Anchor()
void DrawForPage(OutputDevice *pDev, const Point &rPos)
void SetVirtualPosSize(const Point &aPoint, const Size &aSize)
void TranslateTopPosition(const tools::Long aAmount)
bool IsHitWindow(const Point &rPointLogic)
Is there a matching sub-widget inside this sidebar widget for rPointLogic?
void ToggleResolvedForThread()
sal_uInt32 CalcParent()
Calculate parent postit id of current annotation window.
void SetViewState(::sw::sidebarwindows::ViewState bViewState)
void ShowAnchorOnly(const Point &aPoint)
::sw::sidebarwindows::ShadowOverlayObject * Shadow()
OutlinerView * GetOutlinerView()
const SwPostItField * GetPostItField() const
virtual Point GetPosPixel() const
virtual Size GetSizePixel() const
constexpr ::Color COL_AUTHOR9_DARK(0xD1, 0x76, 0x00)
constexpr ::Color COL_AUTHOR7_LIGHT(0xF2, 0xFE, 0xB5)
constexpr ::Color COL_AUTHOR5_LIGHT(0xFF, 0xE3, 0xE5)
constexpr ::Color COL_AUTHOR8_DARK(0x35, 0x55, 0x6B)
constexpr ::Color COL_AUTHOR8_LIGHT(0xE2, 0xEA, 0xF1)
constexpr ::Color COL_AUTHOR7_NORMAL(0xED, 0xFC, 0xA3)
constexpr ::Color COL_AUTHOR2_LIGHT(0xE9, 0xF2, 0xFF)
constexpr ::Color COL_AUTHOR8_NORMAL(0xD3, 0xDE, 0xE8)
constexpr ::Color COL_AUTHOR1_NORMAL(0xFF, 0xFF, 0x9E)
constexpr ::Color COL_AUTHOR9_LIGHT(0xFF, 0xE7, 0xC7)
constexpr ::Color COL_AUTHOR2_DARK(0x06, 0x46, 0xA2)
constexpr ::Color COL_AUTHOR1_LIGHT(0xFF, 0xFF, 0xC3)
constexpr ::Color COL_AUTHOR3_DARK(0x57, 0x9D, 0x1C)
constexpr ::Color COL_AUTHOR6_DARK(0x00, 0x80, 0x80)
constexpr ::Color COL_WHITE(0xFF, 0xFF, 0xFF)
constexpr ::Color COL_AUTHOR4_NORMAL(0xE4, 0xD2, 0xF5)
constexpr ::Color COL_AUTHOR7_DARK(0x8C, 0x84, 0x00)
constexpr ::Color COL_AUTHOR3_LIGHT(0xE2, 0xFA, 0xCF)
constexpr ::Color COL_AUTHOR5_NORMAL(0xFE, 0xCD, 0xD0)
constexpr ::Color COL_AUTHOR9_NORMAL(0xFF, 0xE2, 0xB9)
constexpr ::Color COL_AUTHOR4_LIGHT(0xEF, 0xE4, 0xF8)
constexpr ::Color COL_AUTHOR5_DARK(0xC5, 0x00, 0x0B)
constexpr ::Color COL_AUTHOR6_NORMAL(0xD2, 0xF6, 0xF6)
constexpr ::Color COL_AUTHOR4_DARK(0x69, 0x2B, 0x9D)
constexpr ::Color COL_AUTHOR6_LIGHT(0xE6, 0xFA, 0xFA)
constexpr ::Color COL_AUTHOR2_NORMAL(0xD8, 0xE8, 0xFF)
constexpr ::Color COL_AUTHOR1_DARK(0xC6, 0x92, 0x00)
constexpr ::Color COL_AUTHOR3_NORMAL(0xDA, 0xF8, 0xC1)
#define EE_TEXTPOS_MAX_COUNT
#define EE_PARA_MAX_COUNT
constexpr TypedWhichId< SvxLanguageItem > EE_CHAR_LANGUAGE_CTL(EE_CHAR_START+16)
constexpr TypedWhichId< SvxLanguageItem > EE_CHAR_LANGUAGE_CJK(EE_CHAR_START+15)
constexpr TypedWhichId< SvxLanguageItem > EE_CHAR_LANGUAGE(EE_CHAR_START+14)
constexpr OUStringLiteral IsReadOnly(u"IsReadOnly")
constexpr sal_uInt16 KEY_PAGEDOWN
constexpr sal_uInt16 KEY_PAGEUP
#define LINK(Instance, Class, Member)
#define SAL_N_ELEMENTS(arr)
SvtScriptType GetScriptTypeOfLanguage(LanguageType nLang)
tools::Long getLayoutHeight(const SwRootFrame *pRoot)
tools::ULong getPageInfo(SwRect &rPageFrame, const SwRootFrame *, const Point &)
SwLayoutStatus getLayoutInfos(SwLayoutInfo &o_rInfo, const SwPosition &rAnchorPos, const sw::mark::IMark *pAnnotationMark=nullptr)
void setSidebarChanged(SwRootFrame *pRoot, bool bBrowseMode)
void setTiledPainting(bool bTiledPainting)
bool isTiledAnnotations()
OString join(std::string_view rSeparator, const std::vector< OString > &rSequence)
bool IsFieldDeletedInModel(IDocumentRedlineAccess const &rIDRA, SwTextField const &rTextField)
OUString toISO8601(const css::util::DateTime &rDateTime)
const SwPostItField * mpShadowField
bool mPositionFromCommentAnchor
If true, the overlay arrow points to the comment anchor, otherwise it points to the commented frame.
Marks a position in the document model.
OUString SwResId(TranslateId aId)
css::drawing::Direction3D aDirection
static void Add(SwRegionRects &rRegion, const SwRect &rRect)