summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editeng/source/uno/unotext.cxx38
-rw-r--r--sc/source/core/data/postit.cxx84
-rw-r--r--test/source/sheet/xsheetannotationanchor.cxx2
3 files changed, 97 insertions, 27 deletions
diff --git a/editeng/source/uno/unotext.cxx b/editeng/source/uno/unotext.cxx
index 881cfa32cd89..ee66097f7ec9 100644
--- a/editeng/source/uno/unotext.cxx
+++ b/editeng/source/uno/unotext.cxx
@@ -2117,11 +2117,43 @@ uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextBase::finishParagraph(
}
uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextBase::insertTextPortion(
- const OUString& /*rText*/,
- const uno::Sequence< beans::PropertyValue >& /*rCharAndParaProps*/,
- const uno::Reference< text::XTextRange>& /*rTextRange*/ )
+ const OUString& rText,
+ const uno::Sequence< beans::PropertyValue >& rCharAndParaProps,
+ const uno::Reference< text::XTextRange>& rTextRange )
{
+ SolarMutexGuard aGuard;
+
uno::Reference< text::XTextRange > xRet;
+
+ if (!rTextRange.is())
+ return xRet;
+
+ SvxUnoTextRangeBase* pRange = comphelper::getFromUnoTunnel<SvxUnoTextRange>(rTextRange);
+ if (!pRange)
+ return xRet;
+
+ SvxEditSource *pEditSource = GetEditSource();
+ SvxTextForwarder *pTextForwarder = pEditSource ? pEditSource->GetTextForwarder() : nullptr;
+
+ if (pTextForwarder)
+ {
+ pRange->setString(rText);
+
+ ESelection aSelection(pRange->GetSelection());
+
+ pTextForwarder->RemoveAttribs(aSelection);
+ pEditSource->UpdateData();
+
+ SfxItemSet aItemSet( *pTextForwarder->GetEmptyItemSetPtr() );
+ SvxPropertyValuesToItemSet( aItemSet, rCharAndParaProps,
+ ImplGetSvxTextPortionSfxPropertySet(), pTextForwarder, aSelection.nStartPara );
+ pTextForwarder->QuickSetAttribs( aItemSet, aSelection);
+ rtl::Reference<SvxUnoTextRange> pNewRange = new SvxUnoTextRange( *this );
+ xRet = pNewRange;
+ pNewRange->SetSelection(aSelection);
+ for( const beans::PropertyValue& rProp : rCharAndParaProps )
+ pNewRange->setPropertyValue( rProp.Name, rProp.Value );
+ }
return xRet;
}
diff --git a/sc/source/core/data/postit.cxx b/sc/source/core/data/postit.cxx
index dd1a023445e2..106a249e5666 100644
--- a/sc/source/core/data/postit.cxx
+++ b/sc/source/core/data/postit.cxx
@@ -57,6 +57,13 @@
#include <globstr.hrc>
#include <scresid.hxx>
#include <utility>
+#include <strings.hrc>
+
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/XTextAppend.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <comphelper/propertyvalue.hxx>
using namespace com::sun::star;
@@ -493,8 +500,10 @@ void ScPostIt::SetAuthor( const OUString& rAuthor )
void ScPostIt::AutoStamp()
{
- maNoteData.maDate = ScGlobal::getLocaleData().getDate( Date( Date::SYSTEM ) );
- maNoteData.maAuthor = SvtUserOptions().GetID();
+ maNoteData.maDate = ScGlobal::getLocaleData().getDate( Date( Date::SYSTEM ) ) + " " +
+ ScGlobal::getLocaleData().getTime(DateTime(DateTime::SYSTEM), false);
+ const OUString aAuthor = SvtUserOptions().GetFullName();
+ maNoteData.maAuthor = !aAuthor.isEmpty() ? aAuthor : ScResId(STR_CHG_UNKNOWN_AUTHOR);
}
const OutlinerParaObject* ScPostIt::GetOutlinerObject() const
@@ -793,25 +802,55 @@ void ScPostIt::RemoveCaption()
}
}
+static void lcl_FormatAndInsertAuthorAndDatepara(SdrCaptionObj* pCaption, OUStringBuffer& aUserData, bool bUserWithTrackText)
+{
+ uno::Reference<drawing::XShape> xShape = pCaption->getUnoShape();
+ uno::Reference<text::XText> xText(xShape, uno::UNO_QUERY);
+ uno::Reference<text::XTextAppend> xBodyTextAppend(xText, uno::UNO_QUERY);
+
+ if (xBodyTextAppend.is())
+ {
+ uno::Sequence< beans::PropertyValue > aArgs;
+ if (bUserWithTrackText)
+ {
+ xBodyTextAppend->insertTextPortion(aUserData.makeStringAndClear(), aArgs, xText->getStart());
+ }
+ else
+ {
+ xBodyTextAppend->insertTextPortion("\n--------\n", aArgs, xText->getStart());
+ aArgs = {
+ comphelper::makePropertyValue("CharWeight", uno::Any(awt::FontWeight::BOLD)),
+ };
+ xBodyTextAppend->insertTextPortion(aUserData.makeStringAndClear(), aArgs, xText->getStart());
+ }
+ }
+}
+
rtl::Reference<SdrCaptionObj> ScNoteUtil::CreateTempCaption(
ScDocument& rDoc, const ScAddress& rPos, SdrPage& rDrawPage,
std::u16string_view rUserText, const tools::Rectangle& rVisRect, bool bTailFront )
{
+ bool bUserWithTrackText = false;
OUStringBuffer aBuffer( rUserText );
// add plain text of invisible (!) cell note (no formatting etc.)
SdrCaptionObj* pNoteCaption = nullptr;
const ScPostIt* pNote = rDoc.GetNote( rPos );
if( pNote && !pNote->IsCaptionShown() )
{
- if( !aBuffer.isEmpty() )
- aBuffer.append( "\n--------\n" + pNote->GetText() );
+ if (!aBuffer.isEmpty())
+ {
+ bUserWithTrackText = true;
+ aBuffer.append("\n--------\n");
+ }
+ else
+ {
+ aBuffer.append(pNote->GetAuthor()
+ + ", "
+ + pNote->GetDate());
+ }
pNoteCaption = pNote->GetOrCreateCaption( rPos );
}
- // create a caption if any text exists
- if( !pNoteCaption && aBuffer.isEmpty() )
- return rtl::Reference<SdrCaptionObj>();
-
// prepare visible rectangle (add default distance to all borders)
tools::Rectangle aVisRect(
rVisRect.Left() + SC_NOTECAPTION_BORDERDIST_TEMP,
@@ -826,34 +865,33 @@ rtl::Reference<SdrCaptionObj> ScNoteUtil::CreateTempCaption(
rtl::Reference<SdrCaptionObj> pCaption = aCreator.GetCaption(); // just for ease of use
rDrawPage.InsertObject( pCaption.get() );
-
- // clone the edit text object, unless user text is present, then set this text
- if( pNoteCaption && rUserText.empty() )
+ // clone the edit text object, then seta and format the Author and date text
+ if (pNoteCaption)
{
if( OutlinerParaObject* pOPO = pNoteCaption->GetOutlinerParaObject() )
pCaption->SetOutlinerParaObject( *pOPO );
+ // Setting and formatting rUserText: Author name and date time
+ lcl_FormatAndInsertAuthorAndDatepara(pCaption.get(), aBuffer, bUserWithTrackText);
// set formatting (must be done after setting text) and resize the box to fit the text
if (auto pStyleSheet = pNoteCaption->GetStyleSheet())
pCaption->SetStyleSheet(pStyleSheet, true);
- pCaption->SetMergedItemSetAndBroadcast( pNoteCaption->GetMergedItemSet() );
- tools::Rectangle aCaptRect( pCaption->GetLogicRect().TopLeft(), pNoteCaption->GetLogicRect().GetSize() );
- pCaption->SetLogicRect( aCaptRect );
+ pCaption->SetMergedItemSetAndBroadcast(pNoteCaption->GetMergedItemSet());
}
else
{
- // if pNoteCaption is null, then aBuffer contains some text
- pCaption->SetText( aBuffer.makeStringAndClear() );
+ pCaption->SetText(aBuffer.makeStringAndClear());
if (auto pStyleSheet = rDoc.GetStyleSheetPool()->Find(ScResId(STR_STYLENAME_NOTE), SfxStyleFamily::Frame))
pCaption->SetStyleSheet(static_cast<SfxStyleSheet*>(pStyleSheet), true);
- // adjust caption size to text size
- tools::Long nMaxWidth = ::std::min< tools::Long >( aVisRect.GetWidth() * 2 / 3, SC_NOTECAPTION_MAXWIDTH_TEMP );
- pCaption->SetMergedItem( makeSdrTextAutoGrowWidthItem( true ) );
- pCaption->SetMergedItem( makeSdrTextMinFrameWidthItem( SC_NOTECAPTION_WIDTH ) );
- pCaption->SetMergedItem( makeSdrTextMaxFrameWidthItem( nMaxWidth ) );
- pCaption->SetMergedItem( makeSdrTextAutoGrowHeightItem( true ) );
- pCaption->AdjustTextFrameWidthAndHeight();
}
+ // adjust caption size to text size
+ tools::Long nMaxWidth = ::std::min< tools::Long >( aVisRect.GetWidth() * 2 / 3, SC_NOTECAPTION_MAXWIDTH_TEMP );
+ pCaption->SetMergedItem( makeSdrTextAutoGrowWidthItem( true ) );
+ pCaption->SetMergedItem( makeSdrTextMinFrameWidthItem( SC_NOTECAPTION_WIDTH ) );
+ pCaption->SetMergedItem( makeSdrTextMaxFrameWidthItem( nMaxWidth ) );
+ pCaption->SetMergedItem( makeSdrTextAutoGrowHeightItem( true ) );
+ pCaption->AdjustTextFrameWidthAndHeight();
+
// move caption into visible area
aCreator.AutoPlaceCaption( &aVisRect );
diff --git a/test/source/sheet/xsheetannotationanchor.cxx b/test/source/sheet/xsheetannotationanchor.cxx
index 9fbf4b00d2a0..8c8467d7885a 100644
--- a/test/source/sheet/xsheetannotationanchor.cxx
+++ b/test/source/sheet/xsheetannotationanchor.cxx
@@ -28,7 +28,7 @@ void XSheetAnnotationAnchor::testGetAnnotation()
uno::Reference<sheet::XSheetAnnotation> xAnnotation(xAnchor->getAnnotation(), UNO_SET_THROW);
CPPUNIT_ASSERT_MESSAGE("Unable to get XSheetAnnotation", xAnnotation.is());
- CPPUNIT_ASSERT_MESSAGE("Unable to check: getAuthor()", xAnnotation->getAuthor().isEmpty());
+ CPPUNIT_ASSERT_MESSAGE("Unable to check: getAuthor()", !xAnnotation->getAuthor().isEmpty());
CPPUNIT_ASSERT_MESSAGE("Unable to check: getDate()", !xAnnotation->getDate().isEmpty());
CPPUNIT_ASSERT_MESSAGE("Unable to check: getIsVisible()", !xAnnotation->getIsVisible());
CPPUNIT_ASSERT_EQUAL_MESSAGE("Unable to check: getPosition()", table::CellAddress(0, 2, 3),