38 Commits
Author SHA1 Message Date
Bayram Çiçek f2531aab9b tdf#145726: Calc: print empty rows that carry a border
- a form with a header row and a hundred empty bordered rows below it
printed only the header row. Calc drops a run of 84 or more equally
formatted rows below the last cell with content, and everything under
it, so the print range ended at the last row with data. The borders
were on screen all along, so only printing, the print preview and the
PDF export showed it.

- the run is measured from the last row with data, so typing changed
the result. On a form whose borders end at row 100, text in row 16 left
84 rows below it and the borders stayed away, text in row 17 left 83
and the whole form printed.

- ScDocument::IsPrintEmpty prints a page that carries a border and no
content, and suppresses one carrying only a colour. A bordered run is
therefore kept now, unless it is wider than SC_VISATTR_BORDER_STOP in
its own length or in its distance below the data, which is the whole
column case i30830 is about. The length stays the same as the sheet is
filled in, the distance stops a chain of shorter bordered ranges
reaching the sheet end. Neither measure applies to a run under
SC_VISATTR_STOP rows, because a run that short was never dropped.

- the print range also sets where Ctrl+End lands, how far the desktop
scrolls and what range is written out on save, so all three grow with
it. In the browser the scroll extent comes from the cell area, so it
stays where it was.

- a run has to meet one more condition than before to be dropped, so no
document prints less than it did, and the ones hitting this bug print
more.

- the tests say a bordered form is printed, a colour under the content
does not pull the print area down, a border too wide or too far down
does not either, a frame round a whole column leaves the printout
ending at the last row with content, and a form is printed wherever the
content ends, including when a font change splits it in two.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I44d041cdbbcde7bfa69b53035f5bebc8d59f9bdd
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/14112
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
(cherry picked from commit 00e5de0a8bd89e5f5c9f7b19fef85331354c4458)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211943
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2026-10-08 00:28:25 +02:00
Bayram Çiçek 3e131896fc starmath OOXML: keep the color of the lines and signs in a formula
A fraction whose terms are red came back with red terms and a black
bar, and a colored square root came back with a black root sign.

The formula draws these parts itself, so their color is not in the
text. It sits in the m:ctrlPr of the fraction or the root, which
neither filter read.

Read m:ctrlPr on import and keep the color while the parts inside are
read, so the command comes out once around the whole fraction rather
than repeated on the bar and on both terms. An inner color beats an
outer one, which is how the parser treats nested commands. A border box
that Writer does not draw is dropped, and the color it named stays on
the content that is left.

Write m:ctrlPr back on export wherever a node has a color of its own, but
only for a DOCX. A slide or a sheet does not declare the w namespace that
the color needs. The fraction, the brackets, the root, the accent, the
over and underline, the overbrace and underbrace, the border box and the
n-ary operator each have a property element that can hold one.

Added the testMathFractionBarColor unit test.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ic13c9e59756806932f61a6fb51e4919a49cdfcd6
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/10047
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 568ac1d9bdfc8bd43995dbd3626e73084d4f90d6)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211416
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2026-09-24 13:12:27 +02:00
Bayram Çiçek 5c8b89c3b6 starmath OOXML: keep the font color of text in a formula
Steps to reproduce:
1) Write a formula with a color command, such as color red { 1 }.
2) Save the document as DOCX and open it again.
The formula comes back at the default color, and the color command has
gone from its text.

A run is one stretch of text with a single set of formatting. In a
formula each run carries two property elements. The import already read
the math element m:rPr. The font color sits in the text element w:rPr.
The import skipped that one as an unexpected tag, and the export never
wrote it.

Read w:color on import and put a color command around the text of that
run. A color that StarMath has a name for is written with that name, so
a formula written as color red reads the same way after a round trip.
Other colors become hexadecimal digits, which the parser reads only in
upper case. A value of auto leaves the default color in place, and so
does black, which keeps ordinary formulas clean and lets the color
follow a dark document theme.

The braces of a color command hold an expression, and a run holds
whatever text the document put in it. A run of operators is written as a
literal, which is an expression and keeps the color. A run that does not
parse for any other reason keeps no color command, so the formula reads
the way it did before any color was carried over. The import never
writes command text that fails to parse.

On export, write w:color for a run whose node has a color of its own, but
only for a DOCX. A slide or a sheet never declares the w namespace, so the
color stays out of a presentation or a spreadsheet. The tree has been
arranged by then, so a surrounding color command has already reached the
leaf nodes.

The color of the lines and signs a formula draws, such as a fraction
bar, travels elsewhere and is not covered here.

Added the testMathColor and testMathObjectColorOmittedInSlide unit tests.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I4207aab6a363e5f841de58e3f743d9e010609c10
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/10046
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
(cherry picked from commit dfcc0c42df5c774f4087f425cad0af81ecea6b5e)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211415
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2026-09-24 13:05:07 +02:00
Bayram Çiçek 78cbe0b2fb tdf#171366: Calc: use the print dialog orientation on every page
- the printout lost rows when the user set Orientation to Landscape in
the File - Print dialog. Only the first page used the landscape paper.
The pages after it kept the portrait page breaks, so they took more rows
than fitted on the paper. The preview was correct, so only the paper and
the PDF showed the problem.

- ScModelObj::render() built a second ScPrintFunc after every page, so
that the document would hold the page style's page size again. That
object shared its page break vectors with m_pPrintState and recalculated
them for the portrait paper, so the next page read the wrong breaks.
render() now counts the pages once, after the last page.
  - "tdf#166107: remove unnecessary resetPrintArea()" added the second
  ScPrintFunc, https://gerrit.libreoffice.org/c/core/+/183948
  (eccf4cd57a)

- sc::PrintPageRanges kept its results in a shared_ptr and its input by
value. One copy could recalculate the shared result while another copy
still read its own input as a match. PrintPageRanges shares the input
along with the results now.

- added testTdf171366 to check that the print dialog and the page style
split the sheet at the same rows.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ifa5998278ff899e713b439e33ed04d76f109fbc5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210649
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
Tested-by: Jenkins
2026-09-22 13:48:14 +02:00
Bayram Çiçek c83746be5b tdf#169326: ignore line breaks in ODS
if ODS file saved from XLSX

- follow-up for 992a07788b
- added a unittest.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ie896399ac09d6823586b2327e48a90c5e62593c4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/202167
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2026-03-20 21:01:31 +01:00
Bayram Çiçek 992a07788b tdf#169326: ignore line breaks for existing texts
if there is a reference to other cell(s).

- if there is a line break, recalc the formula even if AutoCalc is disabled.
- added a unittest

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I18e3ed11641193905eb3d6b523e23435e1dc4e9c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201432
Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2026-03-15 13:19:25 +01:00
Bayram Çiçek b6b6abac86 tdf#169326: ignore line break in referenced cells for XLSX
- added bIgnoreLineBreaks to chase if the document is ods or xlsx/xls.
- change if the file is xlsx/xls document in case CELLTYPE_EDIT
- when referencing a cell e.g. "=A1", xlsx/xls document will ignore the line breaks.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I2c04727964b2cf209433d71c7e925a676a47cf60
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201015
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2026-03-10 13:13:52 +01:00
Bayram Çiçek c6d713ec3b impress: fix typing issue after comment save
- after saving a comment, editing was not possible in a textbox until the comment was deleted.
- textboxes are now editable.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I989a18f34b0fb40c5ca46b1d9556298a89bc745e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193436
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194948
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-12-03 14:20:49 +01:00
Bayram Çiçek 1bf9bbea96 tdf#169115: sc: fix use-after-free bug in ScDocument::FillInfo
backtrace:

==203082== Invalid read of size 8
==203082==    at 0x933730C: std::_Hashtable<unsigned short, std::pair<unsigned short const, SfxPoolItem const*>, std::allocator<std::pair<unsigned short const, SfxPoolItem const*> >, std::__detail::_Select1st, std::equal_to<unsigned short>, std::hash<unsigned short>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::size() const (hashtable.h:662)
==203082==    by 0x933B57C: std::_Hashtable<unsigned short, std::pair<unsigned short const, SfxPoolItem const*>, std::allocator<std::pair<unsigned short const, SfxPoolItem const*> >, std::__detail::_Select1st, std::equal_to<unsigned short>, std::hash<unsigned short>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_locate(unsigned short const&) const (hashtable.h:2264)
==203082==    by 0x9339895: std::_Hashtable<unsigned short, std::pair<unsigned short const, SfxPoolItem const*>, std::allocator<std::pair<unsigned short const, SfxPoolItem const*> >, std::__detail::_Select1st, std::equal_to<unsigned short>, std::hash<unsigned short>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::find(unsigned short const&) const (hashtable.h:1929)
==203082==    by 0x93380C6: std::__cxx1998::unordered_map<unsigned short, SfxPoolItem const*, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<unsigned short const, SfxPoolItem const*> > >::find(unsigned short const&) const (unordered_map.h:958)
==203082==    by 0x93367A4: std::__debug::unordered_map<unsigned short, SfxPoolItem const*, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<unsigned short const, SfxPoolItem const*> > >::find(unsigned short const&) const (unordered_map:635)
==203082==    by 0x9329A7D: SfxItemSet::Get(unsigned short, bool) const (itemset.cxx:922)
==203082==    by 0x22AB22AE: ScPatternAttr::GetItem(unsigned short) const (patattr.hxx:167)
==203082==    by 0x22AB7610: ScMergeAttr const& ScPatternAttr::GetItem<ScMergeAttr>(TypedWhichId<ScMergeAttr>) const (patattr.hxx:170)
==203082==    by 0x2305FEAE: lcl_GetMergeRange(short, int, unsigned long, ScDocument const*, RowInfo*, short, int, short, short&, int&, short&, int&) (fillinfo.cxx:110)
==203082==    by 0x230628A1: ScDocument::FillInfo(ScTableInfo&, short, int, short, int, short, double, double, bool, bool, ScMarkData const*) (fillinfo.cxx:710)
==203082==    by 0x24216D6F: ScPrintFunc::PrintArea(short, int, short, int, long, long, bool, bool, bool, bool) (printfun.cxx:1610)
==203082==    by 0x2421B6FC: ScPrintFunc::PrintPage(long, short, int, short, int, bool, ScPreviewLocationData*) (printfun.cxx:2329)
==203082==    by 0x2421D378: ScPrintFunc::DoPrint(MultiSelection const&, long, long, bool, ScPreviewLocationData*) (printfun.cxx:2741)
==203082==    by 0x23F9ABB4: ScModelObj::render(int, com::sun::star::uno::Any const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (docuno.cxx:2824)
==203082==    by 0x2F7769C2: PDFExport::ExportSelection(vcl::pdf::PDFWriter&, com::sun::star::uno::Reference<com::sun::star::view::XRenderable> const&, com::sun::star::uno::Any const&, StringRangeEnumerator const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&, int) (pdfexport.cxx:185)
==203082==    by 0x2F77C1AA: PDFExport::Export(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (pdfexport.cxx:1180)
==203082==    by 0x2F793CBA: PDFFilter::implExport(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (pdffilter.cxx:182)
==203082==    by 0x2F794634: PDFFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (pdffilter.cxx:247)
==203082==    by 0x87819F0: SfxObjectShell::ExportTo(SfxMedium&) (objstor.cxx:2908)
==203082==    by 0x877ADD8: SfxObjectShell::SaveTo_Impl(SfxMedium&, SfxItemSet const*) (objstor.cxx:1929)
==203082==    by 0x8784F5F: SfxObjectShell::PreDoSaveAs_Impl(rtl::OUString const&, rtl::OUString const&, SfxItemSet const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (objstor.cxx:3421)
==203082==    by 0x8783956: SfxObjectShell::CommonSaveAs_Impl(INetURLObject const&, rtl::OUString const&, SfxItemSet&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (objstor.cxx:3212)
==203082==    by 0x8758B98: SfxObjectShell::APISaveAs_Impl(std::basic_string_view<char16_t, std::char_traits<char16_t> >, SfxItemSet&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (objserv.cxx:323)
==203082==    by 0x87EC565: SfxBaseModel::impl_store(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, bool) (sfxbasemodel.cxx:3253)
==203082==    by 0x87E313A: SfxBaseModel::storeToURL(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (sfxbasemodel.cxx:1834)
==203082==    by 0x4A36155: desktop::DispatchWatcher::executeDispatchRequests(std::__debug::vector<desktop::DispatchWatcher::DispatchRequest, std::allocator<desktop::DispatchWatcher::DispatchRequest> > const&, bool, desktop::DispatchRequestFlags*) (dispatchwatcher.cxx:719)
==203082==    by 0x4A51E6E: desktop::RequestHandler::ExecuteCmdLineRequests(desktop::ProcessDocumentsRequest&, bool) (officeipcthread.cxx:1316)
==203082==    by 0x49F1B07: desktop::Desktop::OpenClients() (app.cxx:2221)
==203082==    by 0x49F0158: desktop::Desktop::OpenClients_Impl(void*) (app.cxx:1981)
==203082==    by 0x49EFF3E: desktop::Desktop::LinkStubOpenClients_Impl(void*, void*) (app.cxx:1965)
==203082==    by 0xDD827EE: Link<void*, void>::Call(void*) const (link.hxx:105)
==203082==    by 0xDD7F4DC: ImplHandleUserEvent(ImplSVEvent*) (winproc.cxx:2312)
==203082==    by 0xDD8181B: ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) (winproc.cxx:2869)
==203082==    by 0xE862B5D: SalFrame::CallCallback(SalEvent, void const*) const (salframe.hxx:310)
==203082==    by 0xE8829B1: SvpSalInstance::ProcessEvent(SalUserEventList::SalUserEvent) (svpinst.cxx:291)
==203082==    by 0xE2EBFC0: SalUserEventList::DispatchUserEvents(bool)::{lambda()#1}::operator()() const (salusereventlist.cxx:119)
==203082==    by 0xE2EC299: SalUserEventList::DispatchUserEvents(bool) (salusereventlist.cxx:120)
==203082==    by 0xE8831CA: SvpSalInstance::ImplYield(bool, bool) (svpinst.cxx:444)
==203082==    by 0xE883611: SvpSalInstance::DoYield(bool, bool) (svpinst.cxx:523)
==203082==    by 0xE3A347C: ImplYield(bool, bool) (svapp.cxx:389)
==203082==    by 0xE3A4168: Application::Yield() (svapp.cxx:492)
==203082==    by 0xE3A2E8B: Application::Execute() (svapp.cxx:364)
==203082==    by 0x49EE737: desktop::Desktop::Main() (app.cxx:1681)
==203082==    by 0xE3CC959: ImplSVMain() (svmain.cxx:230)
==203082==    by 0xE3CCA1A: SVMain() (svmain.cxx:248)
==203082==    by 0x4A5AEEC: soffice_main (sofficemain.cxx:122)
==203082==    by 0x40009D0: sal_main (main.c:51)
==203082==    by 0x40009B6: main (main.c:49)
==203082==  Address 0x2c9fb388 is 120 bytes inside a block of size 224 free'd
==203082==    at 0x48508DD: operator delete(void*, unsigned long) (vg_replace_malloc.c:1181)
==203082==    by 0x231265C0: CellAttributeHelper::doUnregister(ScPatternAttr const&) (patattr.cxx:157)
==203082==    by 0x231277BE: CellAttributeHolder::setScPatternAttr(ScPatternAttr const*, bool) (patattr.cxx:362)
==203082==    by 0x22AB2499: ScAttrEntry::setScPatternAttr(ScPatternAttr const*, bool) (attarray.hxx:95)
==203082==    by 0x22AA826B: ScAttrArray::SetPatternAreaImpl(int, int, CellAttributeHolder const&, ScEditDataArray*) (attarray.cxx:574)
==203082==    by 0x22C0939A: ScAttrArray::SetPattern(int, CellAttributeHolder const&) (attarray.hxx:160)
==203082==    by 0x22BEFFA4: ScColumn::ApplyAttr(int, SfxPoolItem const&) (column.cxx:565)
==203082==    by 0x22C79299: ScColumn::SetNumberFormat(int, unsigned int) (column2.cxx:3301)
==203082==    by 0x231EE6EA: ScTable::SetNumberFormat(short, int, unsigned int) (table2.cxx:2331)
==203082==    by 0x22E4DCF0: ScDocument::SetNumberFormat(ScAddress const&, unsigned int) (document.cxx:3768)
==203082==    by 0x230755FF: ScFormulaCell::InterpretTail(ScInterpreterContext&, ScFormulaCell::ScInterpretTailParameter) (formulacell.cxx:2156)
==203082==    by 0x2307385F: ScFormulaCell::Interpret(int, int) (formulacell.cxx:1619)
==203082==    by 0x22CCD0F7: ScFormulaCell::MaybeInterpret() (formulacell.hxx:470)
==203082==    by 0x230776E9: ScFormulaCell::IsValue() (formulacell.cxx:2761)
==203082==    by 0x22D60AEC: lcl_GetCellContent(ScRefCellValue const&, bool, double&, rtl::OUString&, ScDocument const&) (conditio.cxx:774)
==203082==    by 0x22D6334B: ScConditionEntry::IsCellValid(ScRefCellValue const&, ScAddress const&) const (conditio.cxx:1273)
==203082==    by 0x22D66225: ScConditionalFormat::GetData(ScRefCellValue const&, ScAddress const&) const (conditio.cxx:1897)
==203082==    by 0x230608EA: (anonymous namespace)::handleConditionalFormat(ScConditionalFormatList&, o3tl::sorted_vector<unsigned int, std::less<unsigned int>, o3tl::find_unique> const&, ScCellInfo*, ScTableInfo*, ScStyleSheetPool*, ScAddress const&, bool&, bool&, bool) (fillinfo.cxx:293)
==203082==    by 0x23061EB3: ScDocument::FillInfo(ScTableInfo&, short, int, short, int, short, double, double, bool, bool, ScMarkData const*) (fillinfo.cxx:564)
==203082==    by 0x24216D6F: ScPrintFunc::PrintArea(short, int, short, int, long, long, bool, bool, bool, bool) (printfun.cxx:1610)
==203082==    by 0x2421B6FC: ScPrintFunc::PrintPage(long, short, int, short, int, bool, ScPreviewLocationData*) (printfun.cxx:2329)
==203082==    by 0x2421D378: ScPrintFunc::DoPrint(MultiSelection const&, long, long, bool, ScPreviewLocationData*) (printfun.cxx:2741)
[...]

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I4dfd8fca4b799e8f0fae8563e7beaf781fb30d55
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193095
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins
2025-10-29 11:24:00 +01:00
Bayram Çiçek 4afbcee5f1 tdf#167202: sw: do not show line numbering in footnote
if compatibility options are enabled.
- add a unit test.

Change-Id: I87ae611b5917c2b11b3f131dfa66e7f9b19a24cb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191493
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-09-30 10:55:20 +02:00
Bayram Çiçek 2034abc1bb tdf#167689: sc: export x15 namespace for xl/connections.xml
- add support for x15 namespace.
- add a unittest.
- add support for <x15:connection> and <x15:rangePr> elements.
  - support model and sourceName attributes.

<extLst>
  <ext xmlns:x15="..." >
    <x15:connection id="..." model="...">
      <x15:rangePr sourceName="..."/>
    </x15:connection>
  </ext>
</extLst>

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I3b3e380ddd07f251b23333fe9d3959961dd5c19c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190924
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-09-15 09:40:36 +02:00
Bayram Çiçek 8c5fd04f0b tdf#167689: sc: don't export tableType if it does not exist
- and if there is no tableType, there should not be any uniqueName attribute in <tableColumn>
- add a unittest

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I425e9204a31646bd3d6f3986244d906ab4fea1a8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190439
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-09-15 09:38:23 +02:00
Bayram Çiçek d091c60f9a tdf#167689: sc: support tableType attr. in <table> node
and import&export  uniqueName attr. of <tableColumn>.
- also added a unittest

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I98c6b7f6f7260195fc89aaae20a9a34208204186
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190314
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-08-29 09:18:22 +02:00
Bayram Çiçek 4199a5a630 tdf#167689: Calc: check if XML declaration exists
when exporting xl/xmlMaps.xml

follow-up for https://gerrit.libreoffice.org/c/core/+/189044
(657f0112b5)

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Iac5e94774632d74f1b99a32aaa56514396b10792
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189989
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-08-21 13:55:54 +02:00
Bayram Çiçek 657f0112b5 tdf#167689: Calc: add test for xmlMaps.xml
follow-up for https://gerrit.libreoffice.org/c/core/+/188451 (f84f8f2ea4)

- added a unittest for xmlMaps.xml and <xmlColumnPr>
- removed unused aContent variable.
  - this was causing the tests to fail to load the bugdoc during createScDoc("...")
- change Target="/xl/xmlMaps.xml" to Target="xmlMaps.xml" in xl/_rels/workbook.xml.rels
- change xmlns attribute to xmlns:x in xl/tables/table[n].xml
- add XmlColumnPrModel and TableColumnModel
  - these Models can be used for implementing sub-elements.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I5e6ad575b7071f3cf4decb5d90d418b9c54ba107
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189044
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-08-20 09:52:57 +02:00
Bayram Çiçek f84f8f2ea4 tdf#167689: Calc: Support xmlMaps.xml
- add Relationship::XMLMAPS in relationship.inc

- save xl/xmlMaps.xml reference into [Content_Types].xml
  - <Override PartName="/xl/xmlMaps.xml" ContentType="application/xml"/>

- save xl/xmlMaps.xml relationship into xl/_rels/workbook.xml.rels
  - <Relationship Id="." Type=".../relationships/xmlMaps" Target="/xl/xmlMaps.xml"/>

- import & export xl/xmlMaps.xml

- import & export <xmlColumnPr> of <tableColumn> (in xl/tables/table[n].xml)

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I9666fc921afb7332305bc1d9ce3f2a092e376002
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188451
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-08-05 22:11:51 +02:00
Bayram Çiçek aced0ab0ee tdf#167527: adjust field shadings according to line spacing
- we should take line spacing into account for field shadings.
- otherwise, bottom of some letters(e.g. "Ç", "ş", "g", "p") will be cut because of the "field shadings" background layer.
- also check if line spacing type is "proportional" or "fixed".
- add a unittest

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I805551469f712ec6147b025d771d996ef7fd0c95
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187986
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-07-22 13:21:56 +02:00
Bayram Çiçek 8a0b5e4318 tdf#157596: add partly-deleted paragraphs to hidden list during fileopen
- regression from commit 2413f21362
- if a paragraph is partly deleted, add it to the "hidden" list.
- if we delete -at least- a single character from a paragraph (during Record Track Changes is enabled), Writer thinks the whole paragraph and the numbering is deleted. Therefore, the numbering of the paragraph does not get added to the hidden list.
- this patch adds the partly-deleted paragraph numbering to the hidden list during fileopen.
- added a unit test

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ia8852eb7d61b57f15a037b2ffd3e6eec363f90af
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186597
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@collabora.com>
2025-06-26 09:45:50 +02:00
Bayram Çiçek 98164d19c2 tdf#166205: add unittest for first-page-header&footer
make sure header&footer visible on the screen by checking their height.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I5c6f32e7ea8f58d195dea9a8423702f502caf44a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185730
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-05-24 20:35:26 +02:00
Bayram Çiçek 43e49a34a5 tdf#166205: decrease the page height to 5%
to fit header & footer if DocumentSettingId::TAB_OVER_SPACING compatibility flag is set.

- if a doc created in MSO Word and opened in LO Writer, header&footer for the first page were not visible - for some documents.
- this change make them visible now.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: If4548949514eb319a6b1e3af5799d266f53ec753
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185261
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
2025-05-16 14:15:11 +02:00
Bayram Çiçek 89fdd81f17 tdf#166173: add a unittest for enforcement attribute
of documentProtection element.

- tdf166173_enforcement.docx contains:
<w:documentProtection w:edit="forms" w:formatting="1" w:enforcement="0"/>

- after export, enforcement attribute should still has '0' value.

Change-Id: I38b48eca054a40586539b1de336ba51f46714a34
Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184196
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-04-15 11:05:02 +02:00
Bayram Çiçek 29c7e73d13 sw: always export enforcement attribute of documentProtection
otherwise: (in word/settings.xml)
- if a docx document has w:enforcement="0", LO will not
import it. Hence, LO will not export it, too.
- this will cause a lack of enforcement attr. - which
will make the docx "protected" after export from LO - in MSO Word.

Therefore, we have to import enforcement attr. even if it's
value is "0".

Change-Id: I30cf3cd8725151ea5bd9d4e484757e36602707e5
Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184042
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-04-11 16:24:07 +02:00
Bayram Çiçek 765bf4bff2 tdf#123225 - calculate count attribute correctly
in xl/pivotTables/pivotTable*.xml we have e.g. <location ref="A3:B6" firstHeaderRow="1" firstDataRow="1" firstDataCol="1" rowPageCount="1" colPageCount="1"/>

- the 'ref' attribute indicates the cell range of a pivot table.
- 'firstDataRow' specifies the first row of the PivotTable data,
relative to the top left cell in the ref value.
- 'firstDataCol' specifies the first column of the PivotTable data,
relative to the top left cell in the ref value.

if we get the number of rows and cols in the pivot table (using
<location ref="..."), and substract 'firstDataRow' & 'firstDataCol'
from it, we get the correct count attr. value of <row/colItems> during
export from ODS -> XLSX.

- added testTdf123225PivotTableEmptyRowColItems Cppunit test to make
sure that export works with empty row/col items.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ia85a89e429d95492f0f753af3fbf46771d1a2a0f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182529
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2025-03-13 12:12:09 +01:00
Bayram Çiçek 3b3ba9c329 tdf#123225 - export <i t="grand"> of row/colItems
in xl/pivotTables/pivotTable*.xml.

- we should always export (.ods to .xlsx) <rowItems> and <colItems>, even if
the pivot table does not contain col/row items. Otherwise:
  1) Excel will fail to open the xlsx document, you will get an error message.
  2) Excel will open the file without any errors but:
    2.1) context menu -by right clicking on the pivot table- will have less
         or more items than it should have after "refresh".
    2.2) if e.g. trying to sort the items you will get "Cannot determine
         which PivotTable field to sort by" warning.

- we should add t="grand" to the last <i> element. Otherwise, Excel will not
have all functions in the context menu of the pivot table. Especially for the
"Grand Total" column/row cells. we shouldn't need "refresh" to use all
functions/items in the context menu.

- note: it is not completely clear that the last <i> element always gets
t="grand". however, testing on the some docs indicate that t="grand"
should be in the last <i> element.

- added testTdf123225PivotTableNoColItems unit test to check if
<i t="grand"> exported. also, added some useful information in the
comment section for future tests/issues.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I22b42ddb4a27c4b7b88ad8a71376c2c82d5a735a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182242
Tested-by: Jenkins
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-02-27 09:53:36 +01:00
Bayram Çiçek 02398c20b2 tdf#123225 - export <rowItems> and <colItems>
of xl/pivotTables/pivotTable*.xml.

- additionally, export <i> and <x> with their default attribute values.

- <x/> single element has only "v" attribute and its value is
increased by 1 up to the count attribute value of rowItems/colItems.

- it is expected that this will fix function loss in XLSX pivot table's
context menu and there will be no need to refresh the pivot table.
(ODS -> XLSX)

- this is also fix "Cannot determine which PivotTable field to sort by"
warning on Excel if you try to e.g. sort the items - alongside the loss
of functions.

- add testTdf123225PivotTableRowColItems Cpp unit test

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Id44806e666a55500ba3faeb0571e50e407c15791
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181795
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-02-20 09:33:05 +01:00
Bayram Çiçek fd9cfe9ebe sc: autofill: no need to send deleted cell addresses
- with LOK_CALLBACK_TOOLTIP. we already send them with
  SendReferenceMarks (https://gerrit.libreoffice.org/c/core/+/176557)
- also avoid warning "unknown tooltip type - CanvasTileLayer.js" on the
  console

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Id6e6d2c20c7b874d8d57324ed4dd3984a56ac398
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176565
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 02046576573e1547c7cd00cd17faffc87d1ede72)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178790
Tested-by: Jenkins
2024-12-19 12:16:13 +01:00
Bayram Çiçek bf22a14283 sc: send cell addresses of delete-by-autofill
with LOK_CALLBACK_REFERENCE_MARKS

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Ic991f1dd41b99cf6caca7dc408caaf6d4dfeac3c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176557
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit c82ceac1cc544fe77f1ce8aaccc8baa0de938821)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178789
Tested-by: Jenkins
2024-12-19 12:16:05 +01:00
Bayram Çiçek 57d123745a sc: autofill: send to-be-deleted cell addresses
with LOK_CALLBACK_TOOLTIP

also avoid nullptr ViewShells:

-        if (comphelper::LibreOfficeKit::isActive())
+        if (ScTabViewShell* pLOKViewShell
+            = comphelper::LibreOfficeKit::isActive() ? aViewData.GetViewShell() : nullptr)

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I38578297cc1aadefe8c43033cdb14b9460e22c90
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175827
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 459a9401f342210d7f6ab8fe6fa780ae28413ef6)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176825
Tested-by: Jenkins
2024-11-20 12:14:09 +01:00
Bayram Çiçek a9d1324b1d use row&column address for autofill preview popup
Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I2206f13210f57db27d962f931ec9b1ced5ec8cf7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174502
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 2a3053921ee67e305130fc3dee6278c00f737e92)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175917
Tested-by: Jenkins
2024-11-02 20:04:50 +01:00
Bayram Çiçek 886d9d3e25 add autofillpreviewtooltip type for LOK_CALLBACK_TOOLTIP
- during autofilling of cells, there is a preview shows the cell value before filling
- we need to send tooltip text and location info by using LOK_CALLBACK_TOOLTIP

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I9961764007aece9122c03eff7c155e7f3f25d9c4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172589
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
(cherry picked from commit 4a8731411bfdc51d042c6df52d0c2391a03ea028)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173023
Tested-by: Jenkins
2024-09-09 13:04:59 +02:00
Bayram Çiçek f91d74da55 tdf#158857: [Power Query] export xl/drawings/drawing*.xml
xl/drawings/drawing*.xml:
- import&export "macro", "textlink", "fLocksText" and "fPublished" attribute of <sp> element (using GrabBag).
- import&export "descr" and "title" attributes of <cNvPr>
- import "r:id", "invalidUrl", "action", "tgtFrame", "tooltip", "history", "highlightClick", "endSnd" attributes of <hlinkClick>

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: Idd865fc86c3538107e4c9808b0886733c798b01f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170691
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2024-08-16 17:04:59 +02:00
Bayram Çiçek 045ebdb369 tdf#158857: [Power Query] export connections.xml
- import&export connections stream
- insert xl/connections.xml reference to [Content_Types].xml
- add Relationship::CONNECTIONS
- add support for xr16 namespace
- add ../customXml/item1.xml relationship to xl/_rels/workbook.xml.rels
- add import&export support for following xml elements in xl/connections.xml:

<connections>
  <connection>

    <dbPr />

    <olapPr />

    <webPr> (Web Query Properties)
      <tables>
        <m />
	<s />
	<x />
      </tables>
    </webPr>

    <textPr>
      <textFields>
        <textField />
      </textFields>
    </textPr>

    <parameters>
      <parameter />
    </parameters>

    <extLst>
      <ext>
        (Any element in any namespace) <- TODO/LATER
      </ext>
    </extLst>

  </connection>
</connections>

Change-Id: I1d1c10675b3fe5ffd6a35f1b91d4b83401be2cae
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164290
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2024-07-09 10:17:16 +02:00
Bayram Çiçek 9bbb02bcd7 tdf#161502: change Structure label of Function Wizard dialog
- label "Structure:" changed to "Content:"
- this change also removes the duplicated "Structure" text from the dialog which makes the UX better

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I6d70e019b80d4ef0d7207b62e1d0aa6d1f0a3b73
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168161
Tested-by: Pedro Silva <pedro.silva@collabora.com>
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Pedro Silva <pedro.silva@collabora.com>
(cherry picked from commit dc3e624b52e43bb197417b5d9339890afe7c5379)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168612
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Tested-by: Jenkins
2024-06-11 19:52:30 +02:00
Bayram Çiçek e2128b2ea8 add AutoFill menu items - LOK_CALLBACK_CONTEXT_MENU
- added AutoFill menu items "Copy cells" and "Fill series"
- send information with LOK_CALLBACK_CONTEXT_MENU

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I3118f5535f74cfa4ab049e643930df83512b6850
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168086
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
(cherry picked from commit a3f4d31783721f61b8436c5f8032321b4c97de1a)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168531
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2024-06-07 15:55:42 +02:00
Bayram Çiçek 7349142613 tdf#159375: turn cursor into a wait cursor while search
- Tools>Options: change cursor type to "wait cursor" while search is running
- m_xSearchEdit->set_busy_cursor(true) adds a spinner next to/(or in place of) the mouse cursor.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I944db49b14a652b4a52f0d38696f60385ee9f85b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168402
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Tested-by: Jenkins
2024-06-06 10:00:49 +02:00
Bayram Çiçek 35c93c5f8e make AutoFill work for Copy cells and Fill series
FID_FILL_AUTO (.uno:AutoFill):
- added new parameter: SfxBoolItem Copy FN_PARAM_1
  - if the parameter is true, we use "Copy cells", otherwise use "Fill series"

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I639828021dcbba52f6bc21366f23faf7e38bb03e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167726
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 95575b8bd026e3ae4aaddf3a023488d7a5fa0976)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167677
Tested-by: Jenkins
2024-05-16 15:50:03 +02:00
Bayram Çiçek dd3953f705 tdf#159375: remove initialization on Tools>Options
- Initializing some dialogs at the startup of Options
makes it opening very slow on some low-power systems.

- This patch removes this initialization. This means,
all dialogs will be initialized at the time of search.
Therefore, we should wait a bit longer when typing
on the search bar to get the results...

- remove the default parameter "nNumberOfNode" from
initializeFirstNDialog()

- rename initializeFirstNDialog() to initializeAllDialogs()

Change-Id: I4fd9c5673f7edecfe6a6621b6018d5d405f112a6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167023
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
Reviewed-by: Moritz Duge <moritz.duge@allotropia.de>
2024-05-06 16:45:25 +02:00
Bayram Çiçek e0ef57a2d0 sc: make inactive sheets movable and copyable
- move and copy use the same ScViewFunc::MoveTable
function
- added 3 new parameters to "SfxVoidItem Move FID_TAB_MOVE"
  - SfxBoolItem FromContextMenu FN_PARAM_4,
  - SfxUInt16Item ContextMenuIndex FN_PARAM_5,
  - SfxBoolItem MoveOrCopySheetDialog FN_PARAM_6
- moveLeft and moveRight of inactive tabs are implemented
- move and copy of inactive tabs from the Move/Copy Sheet
dialog are implemented
- made Move/Copy Sheet dialog async

Change-Id: I97461780a6c46f601bce9490315cd5cbea9505d4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158078
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Gökay ŞATIR <gokaysatir@collabora.com>
(cherry picked from commit 4d5f8b43b04734805f48b921b98a74fd9ab67d0f)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162385
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2024-01-23 12:41:44 +01:00