The Document Foundation Planet


April 14, 2021

Official TDF Blog

Czech Writer Guide 6.4 is now available

Zdeněk Crhonek from the Czech LibreOffice community writes:

The Czech team has completed its translation of the Writer Guide 6.4. Big thanks to all volunteers, especially to Radomír Strnad, who initiated the translation and translated more then half of the chapters. Translators: Petr Kuběj, Zdeněk Crhonek, Petr Valach, Vendula Crhonková, Ludmila Chládková and Zuzana Pitříková; text corrections Petr Valach, Barbora Aydin, Marcela Tomešová, Ludmila Klatovská, Nicole Borkeszová, Alžběta Motlová and Vendula Crhonková; localized pictures Roman Toman and technical support Miloš Šrámek.

The Czech translation of the Writer guide 6.4 is available for download here. The team also updated Math and Calc guides, both are available in actual version 7.0.

The team now continues with translating the Impress guide, and we always looking for new translators. Join us!

by Mike Saunders at April 14, 2021 09:20 AM

Miklos Vajna

Improving borders of merged table cells in Writer

Writer now has better support for Word-compatible border rending when it comes to vertically merged cells in tables.

First, thanks Docmosis who made this work by Collabora possible.


Both Word and Writer allow specifying borders for any kind of table cells. When the user creates a vertically merged cell, there is a covering cell and there is one or more covered table cells.

The Writer approach is to render the cell borders according to the properties of the covering cell. This has the benefit that each edge of the table cell has a single border style (e.g. dashed or hairline).

The Word approach is to render the cell borders as if there would be no vertical merge, according to the properties of the covered cell. This has the benefit that merging the content of cells vertically doesn’t change the border rendering, but it also requires more complex code for painting.

Results so far

Writer can now detect that your tables originate from Word formats and render table borders the Word way in that case.

Here is how the new rendering result look like:
Figure 1. Writer rendering in compatibility mode, new output

And here is how it used to look like:
Figure 2. Writer rendering in compatibility mode, old output

And finally the reference rendering is:
Figure 3. Writer rendering in compatibility mode, reference output

You can see that the B4 and B5 cells are covered, they had some unwanted border on their left side and this is now gone.

How is this implemented?

If you would like to know a bit more about how this works, continue reading… :-)

  • First, some building blocks were introduced: SwCellFrame::GetCoveredCellInRow() can look up a covered cell in a certain row, provided that this cell covers it

  • Building on top of this, SwCellFrame::GetCoveredCells() can provide a list of cell frames which are covered by the current cell, due to vertical merge. This is needed, because previously the layout didn’t have to consider properties of covered cells, so while the document model had this information, it was not visible to the layout in a convenient way

  • Using the above functionality, SwTabFramePainter::Insert() can suppress painting of certain border lines in Word compatibility mode

  • Finally, the code change can be covered with a test by recording the rendering and asserting the vertical positions of border points: we can check that all the positions belong to the 1st, 2nd or 3rd rows, and not to a row below them

Want to start using this?

Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF’s next release (7.2).

by Miklos Vajna at April 14, 2021 07:00 AM

April 13, 2021

Official TDF Blog

Dates for LibreOffice Virtual Conference

Our traditional LibreOffice Conference will be a fully virtual event for the second consecutive year, from September 23 (Thursday) to September 25 (Saturday), 2021. Unfortunately, the uncertainty still surrounding the COVID-19 pandemic and its effect on travel, conference planning, logistics and possibility for attendees to come to the conference – coupled with the unpredictability of the current vaccination campaign – are reasons for shifting the event to online also in 2021.

We all know how important and rewarding is a face-to-face meeting for a large free open source community such as the LibreOffice one, spanning over all continents and representing well over 100 native language communities. For the second year in a row, we will be forced to attend the conference from our houses and offices around the world, trying to make the most out of a virtual event which will be extremely rich in term of contents but not as rich in term of physical interactions.

We will publish the Call for Papers by the end of April. In the meantime, if you have a suggestion for the organizers – something you think we can improve, or a topic that should be covered by the Call for Papers, or just an idea to make the virtual conference more engaging for the attendees – you can send an email to or a message to the Telegram group

by Italo Vignoli at April 13, 2021 10:02 AM

April 12, 2021

Michael Meeks

2021-04-12 Monday

  • Mail chew, planning call, catch up with Eloy.

April 12, 2021 09:00 PM

Excommunicating a heretic

Young & foolish?

In 1988 as a scrawny eleven-year old arrival alone at boarding school, perhaps the only Quaker in a thousand strong body; I wore a white poppy to the large Remembrance Day commemorations. I recall the interest and forceful objections of my peers and elders - some with armed service connections, and my impassioned pleas for a personal pacifism. No doubt there were some who were intellectual defenders of the doctrine of Just War: (love's response to a neighbour threatened), as I myself became later in life - but I suspect that the fun of picking on those who are noticeably different was the dominant motivation. I imagine a majority of those in the Free Software community have suffered similar or more traumatic experiences, associated with being noticeably and vocally different; of being outstanding in one area & yet weak in others: perhaps socially and/or athletically. Hopefully that lets us empathise with others who are oppressed. That's why in this debate I think the purest motives on both sides here are closest to this: What is love's response to a neighbour who is threatened? and then what is proportional?

Disclaimer: something must be done

Recently RMS returned to the FSF board with to my mind an indefensible lack of grace & engagement with his critics. This seems to unfortunately intersect with the absence of good, representative governance structures for eg. GPL users to affect license direction. People started on-line petitions in liu of voting to either remove the FSF board or to unconditionally support RMS. Spoiler alert - there is something to annoy everyone here. I don't believe either of these stated positions is helpful and one of them is actively dangerous. I expect RMS to demonstrate hard-core leadership by preparing for his inevitable political or physical death, and building good governance structures that can live on and continue his work. It is not a time to do nothing. KDE's, statement seemed constructive, Debian had a middle ground option, and even RedHat's position was not so extreme. I sincerely hope that the FSF can be improved and continue to reflect RMS' vision of Software Freedom.

Its not all awful

The open letter to remove the FSF board contains much that is deeply problematic, yet there are some sensible pieces, take this one:

While these ideas have been popularized in some form by Richard M. Stallman, he does not speak for us. We do not condone his actions and opinions. We do not acknowledge his leadership or the leadership of the Free Software Foundation as it stands today.

Notice the credit, and yet creating distance, notice the sensible tone, and the moderate approach. I would like to think that the several thousand people signing up to this, many of whom I like, some of whom I've really enjoyed working with are primarily saying only what this paragraph says. If so - good, I can understand that. Unfortunately alongside this reasonableness are some very profound problems that needlessly makes this one of the most divisive initiatives I've seen in free-software:

Attacking people's beliefs?

The rational here seems really damaging:

"He has shown himself to be misogynist, ableist, and transphobic, among other serious accusations of impropriety [impiety?]. These sorts of beliefs have no place in the free software, digital rights, and tech communities. ... There has been enough tolerance of RMS’s repugnant ideas ... we will not continue suffering his behaviour, ... or otherwise holding him and his hurtful and dangerous ideology as acceptable. ... We ask for contributors to free software projects to take a stand against bigotry and hate within their projects."

This focus on beliefs is unconscionable. Beliefs struggle to exist outside people's heads so I read this as: People who we can plausibly accuse of having misogynistic, ableist or transphobic beliefs have no place in the free software community. This might sound plural and welcoming, and I understand the desire to stick up for those who are marginalized, but it has a number of acute problems.

What is the new orthodoxy?

Which are the views that must be held (or not held) to have a place in free software? Unfortunately the new orthodoxy while having sixteen promoters is unbounded - we are not given a comprehensive creed. We do have some very precise examples on what is not acceptable though. Lets take trans-phobia. Apparently RMS while not on the autistic spectrum, does have a phobia. However - exactly what that phobia is is rather less than clear. Many (including I suspect RMS) are convinced that he is not transphobic. There seems to be a somewhat complex difference in the doctrine of how best to de-gender pronouns which causes the problem.

Interestingly the ableist issue when I skimmed the snippets seems to be rooted in a specific view on the ethics of abortion. As a young woman finds herself unexpectedly alone at a crossroads of life-changing consequence it is hard not to have deep compassion for her! Indeed, my wife has spent some years giving space and a listening ear, to help women think through their choices at this crisis point. Views vary widely here, but it seems that even among abortion activists the (perhaps comforting) view that there is zero moral dimension: that the act is no more significant than clipping your fingernails is a rather extreme one. Nevertheless if you hold it I expect it makes it much harder to critique selective abortion - whether for sex, disability or (as technology advances) more eugenic Gattaca-style scenarios. I read RMS' deeply disturbing advice on selecting for ability (which is sadly common) as flowing from this understanding. Should an affirmation of the wonderful, unique, created in the image of God value of all persons at some point in this process be mandatory for inclusion in our community? A tough one.

Apparently the signatories of this document also think that having mysogynistic beliefs is grounds for excommunication from the free software community. Who chose these three beliefs? where did they appear from? are there any more things we should not believe? Presumably traditional convictions around marriage are also grounds, cf. the Brendan Eich hysteria but; what else?

On excommunicating heretics

The paradox of intolerance is often aired to lazily avoid spending any thought justifying this sort of statement & action. One day I hope to have time to read The Open Society and its Enemies and its counterpoint. The vital need is to respect the dignity, protect the property, and cherish the lives of others - particularly those who have historically suffered. I can see how this is especially important to trans people, and I take no pleasure in seeing them offended. Having said that there are also many groups who have suffered historically in horrible ways. History is indeed littered with examples of well meaning intolerance going badly wrong. It is also clearly the case that some speech is unacceptable (but beliefs!?). The interesting question here is really where to draw the line. No doubt it feels good to stand up for a vulnerable marginalized community by excluding those with whom they disagree. I do wonder whether that is easier than trying to understand and accurately portray both sides - or "putting the work in to understand other human beings".

This is fun! lets find more heretics!

It seems to me there is a substantial convergence of views between RMS and this new orthodoxy - so it should be far easier to find those whose beliefs diverge significantly. Luckily very detailed descriptions exist of what very large groups of people believe around the world. Many have different ideas of how best to love those with whom they disagree. For example Male and Female he created them - towards a path of dialogue on the question of gender theory in education. (published 2019 under Pope Francis). That should be easy to caricature in order to exclude people from the Free Software community. I think it would also be easy to argue that a loyal Catholic faithfully upholding the Churches' teaching has beliefs that are more easy to caricature as mysogynist than RMS'. I really don't want to pick on Catholics (who just happen to be rather good at multi-lingual write-ups of their doctrines), so how about a random update from the Church of England. Of course - in each case adherents would reject such a caricature and these labels; no doubt they would also have powerful convictions on when life begins. But perhaps that's all a bit Euro-centric - so how about Wikipedia on Islam, or we can spend all day cycling through major belief systems each representing hundreds of millions of people, and collectively billions. Almost all of these will have some element that will conflict with or upset the opinions of someone else. Most of these belief systems are mutually contradictory and/or mutually offensive at some level to adherents of others. So there should be no shortage of beliefs for which we can excommunicate others.

I hear the common objection: "But I have a friend who is a <insert religion> and they don't believe anything (like that) - perhaps we can only exclude the ones that actually believe these things?". I'm sure you do have such a friend, and so do I. Clearly no world religion has a monolithic interpretation. The balance between revelation & personal experience, the hermeneutics and theology varies extraordinarily widely. That results in sets of people under the same apparent umbrella holding widely different beliefs; even if we can assuming that you truly know what your friend believes; and this is before we get into more esoteric Spaghetti Monster style creeds.

All that aside - I see no way to argue for excluding RMS on the basis of his beliefs (ie. he is not progressive-orthodox enough) without also loosing a big chunk of the rest of the world as well. Please notice - nothing in the statement that so many signed says this is specific to leaders, or being a prominent person, each belief itself is grounds: "these sort of beliefs have no place in the free software community?". Why pick belief as a rationale?

Potential allies in surprising places

An acquaintance of a friend spent many decades smuggling 'pornographic literature' into the Eastern Block - (very good for marriage enrichment). He also founded a non-profit Open Doors, here's a quote from the pre-amble to their watch list:

In the most populated countries on earth, [people] live in a surveillance state ... China has also developed widespread facial recognition software and established laws requiring facial scans to purchase a phone. When taken together, these two technological advances mean the government can track individuals like never before ... China is also rolling out a country-wide Social Credit System (SCS) by which authorities plan to reward "good" citizenship and punish "bad."

Do people with those beliefs, who are actively working to educate, lobby, change hearts & minds to guard society and help others - have common cause with us in the "digital rights community"? - or do they need excommunicating too? It is interesting that Open Doors provide one of the more conservative estimates of the ~thousand(s) of Christians killed each year specifically for their faith. I worry about an ethnocentricity that extrapolates from the USA's poisonous cultural divisions to erase the oppression of minorities around the globe. It is not acceptable to consider the impact of community policies based only on the Silicon Valley population & culture.

Transient heretics in surprising places

Another interesting problem with orthodoxy is the surprising belligerence and infighting that it can breed - often on minor issues. This is familiar from the innumerable schisms in small churches. A joke is told in the aftermath of a church dividing; of an old friend checking in with one of the new leaders: "Ah, these are terrible faithless times - we've split again over doctrine, and now it's just me and my brother. And to be honest - I'm not so sure about him!". I was interested to see the story of eg. Valerie Aurora: an extremely smart & dynamic feminist who is a leading expert on the latest diversity topics. Yet she was somehow ejected from Double Union the hacker/maker space she co-founded because of inadvertently infringing the code of conduct that she ~wrote. I fear living in a world where even outwardly conforming to the latest progressive orthodoxy would tax the wisdom of Solomon.

Prophets of a new creed

It is interesting to read about the beliefs of some of the people involved here; sadly I don't know Molly - but I've had the privilege of working with Matthew Garrett in his early days on GNOME - and a smarter, more charismatic, outspoken, iconoclastic(?), amusing person it's hard to find - quite apart from his amazing depth of contribution to Free Software. I was interested to try to quickly skim Molly & Matthew's beliefs based on what they write and see how they measure up.

Before doing that - let me re-assert that I take the freedoms of speech, conscience and expression extremely seriously as self-evidently vital for the functioning of an open society, though not absolute. While I want everybody to live in a physically safe space, I want to discuss views robustly in an atmosphere of respectful enquiry, with complete freedom and openness. It is not my intention to enlarge the sphere of (self) censorship.

There is however a kind of humour whose value (if any) is drawn from trampling the personal & sacred to elicit a response; is it nervous schadenfreude for those thus offended? (in this case those who love Christ more than friends or family). I don't see many cursing with ~obsolete god's names eg. Marduk so what can we learn from:

I'd prefer five words such as: challenging, fascinating, absorbing, collaborative, rewarding myself - but I'd hate to live in a world devoid of humour. Another example - I was interested by Molly's re-tweet on another hot potato (as always well worth reading the primary source court judgement rather than the dubious spin below):

To me it is curious that someone can champion excluding people over their heterodox beliefs, while simultaneously shouting things like the below; perhaps some irony overload here:

Apparently it is easy to end up championing the gentle treatment of a sexual minority while thinking it is funny to be gratuitously offensive to other minorities. Surely it can be offensive enough to respectfully state ones position. Still - in a world where there is a broad freedom of belief, conscience and speech, possibly some humour can cut through the gloom. A possibly tragic, possibly humorous but probably co-incidental aside here is that some chunk of this is based on an excessive focus on a small divergence in linguistic orthodoxy; when this was a hallmark of the GNU-slash-Linux campaigns of the past.

Perhaps you think it is deeply unfair to examine people's public twitter feeds - which occur outside the context of a project - to determine whether their beliefs are aligned with the standards they demand from others. Actually - I tend to agree. For good reason any sensible code of conduct excludes speech and behaviour outside its immediate project context. Not so this statement - its scope is everyone, everywhere and all of the time - even historic beliefs.

But possibly you think that it is ok to attack the privileged to defend the weak; that it is proportional to agitate to end someone's career in order to avoid the risk of a friendly minority member inadvertently working alongside someone who has some subset of beliefs that differ from theirs.

Saint Obama: the world is complicated

I was encouraged recently to watch this, and I excerpt the first part:

This idea of purity, never compromised, always politically woke & all that stuff - you should get over that quickly. The world is messy, there are ambiguities, people who do really good stuff have flaws.

(his Catholic vice-president also seems to be doing well as of late too). I expect that any model of people that doesn't tolerate the complexity and malleability of human experience and belief will ultimately not represent the world well. That will lead to disappointment. You should get over that quickly. I'm certainly far from perfect, my views change over time, perhaps the same is true for you. As Lincoln pointed out that Those who look for the bad in people will surely find it, I'm often guilty of that myself.


Should we fear a world-view that locates most of the world's problems in other people? The flaws I'm most concerned about are my own (which are more than obvious though I'm certain I have more that you can locate). It is because of those flaws that I need to live in a place that is patient and loving.

Should we fear a world-view that builds a path to redemption via being maximally unpleasant to others who disagree? Or is it better to try hard to "Act justly and to love mercy and to walk humbly with your God" (Micah 6).

Is being offended occasionally by others' (truly objectionable) beliefs the price of collaborating with people with diverse viewpoints, discussing anything and everything without boundaries and learning? Not always a small price to pay, but is it not necessary? Surely it is the case that each member of outlying groups benefits from mutual tolerance. Indeed we often celebrate the amazing contributions to society of those who (at the time) were viewed to have unacceptably fringe beliefs & practices. Becoming a less tolerant society is potentially polarizing and dangerous.

What is love's response to a neighbour in need in this instance? Probably it is to vigorously encourage RMS to setup a representative governance so actual users of the GPL family can determine its post-RMS future. Perhaps it is to loudly re-iterate the obvious: that RMS does not represent you or me - and that we don't share the details of his unusual politics; to make more obvious that personal views are disjoint from organizations' missions, and to ensure we are able to choose our representatives in a secret ballot. But love's response is certainly not to let Free Software get twisted into a new and narrow orthodoxy consumed by gender politics to its own harm and the exclusion of others. We should remain a broad, tolerant and inclusive church even when it hurts. We used to be focused on liberty & freedom - I miss that.

"We ask for contributors to free software projects to take a stand against bigotry and hate within their projects."

Bigotry - a stubborn and complete intolerance of any creed, belief, or opinion that differs from one's own.

Postscript A - why religious tolerance?

It seems obvious to me that this new orthodoxy combined with political power is rather dangerous. Perhaps those who have not grown up with some of the common stories would do well to read them. How about the fiery furnace - takes two minutes of your life; but why is it so hard to show due respect to the pagan government's request? is that really breaking the 2nd commandment? Or - if you have a very strong stomach - try just eat the pork: why won't they obey orders from an authority (Epiphanes: 'god manifest') - perhaps interesting? What requirements or forced conformity might be too much? Is there a shortcut via coercion to truly change society to how I want it to look? or is winsome persuasion the best way? Of course there is a shameful record of burnings, division & bigotry - often over rather small divergences in orthodoxy throughout the Church's history, without even getting into where major creeds interacted at a larger world scale. Then again I'm sympathetic to the Pastafarian concern that arbitrarily unreasonable creeds can be created, and that other points of view have no systematic orthodoxy to protect them which seems unfair: surely it is so: so lets treat all people fairly when our worlds collide.

Postscript B - hiring people

"We want to hire diverse people - but only if they are exactly like us."

One of the things that has saddened me most among those I've worked with in the past is that it is now acceptable for people to say that they would not hire people with beliefs that I know many wonderful, excellent, Christian programmers have. There is a rising tide of intolerance of those that are perceived not to kowtow to the new progressive orthodoxy.

Generally an attitude of graciously accepting others' hostility has held, along with avoiding law-suits. I fear though that as attacks on believers' presence in Free Software get more explicit there will be a slowly growing realization of the problem here. Not to pick on Mozilla (though they did sign this problematic statement) but I'm curious how views that are 'traumatic and damaging' can be accommodated there. I think it is past time to start monitoring religious affiliation as well as ethnicity as part of diversity.

Can any company explain how These sorts of beliefs have no place in the free software, digital rights, and tech communities can intersect with companies that build products around such communities? Surely we can find lots of quotes saying how important community is to developing software. Surely we can find statements that employees are members of such communities. So is it really credible to a-priori exclude masses of people on the basis of their beliefs from your employee pool? Does that extend to refusing to hire people based on their beliefs? Or perhaps people with incompatible beliefs just get inferior jobs inside the company partitioned away from those communities? Certainly - I feel far from safe & welcome applying to one of the listed companies there without further re-assurance. It is deeply ironic that in the past one of the (baseless) explanations from some of the more reasonable people I talk with for excluding believers from management is that they might discriminate when hiring.

If this statement was focused on leaders, it could be characterized as installing a new glass-ceiling for any who are not progressive-orthodox. Even if it were re-written as a criteria for leaders - I'm still far from sure we will get better leaders by selecting for conformity rather than competence.

As the virtual becomes increasingly more important than the physical for some people's livelihoods hopefully we can all agree that encouraging equitable behaviour online is a good thing.

Postscript C - (goes without saying)

As should not need saying: these views are mine, my own. I don't speak for my employer, nor any projects I'm affiliated with, nor my Church, or my friends. Feel free to borrow any you find persuasive or reject any you find objectionable.

April 12, 2021 02:00 PM

Official TDF Blog

Community Member Monday: Gökçe Kuler

Today we’re talking to Gökçe Kuler from our Turkish LibreOffice community…

Tell us a bit about yourself!

I’m from Aydın, Turkey. Currently I’m studying in my final years at the Computer Engineering department of Çanakkale Onsekiz Mart University. I’m interested in free software – and enjoy working with free software projects and learning new things aboutthemit. I met free software when I started university via my advisor Necdet Yücel.

I like playing the guitar and the kalimba. Also, I recently started painting with acrylic paints. I’m vegetarian, and actively participate in animal protection and gender equality projects.

You recently solved your first bug in LibreOffice. How did that go?

In our final years at the university, we work on a project together with an advisor. My advisor Necdet Yücel offered to work on LibreOffice as a graduation project, and then Gülşah Köse mentored me to get involved.

Firstly, I prepared my working environment – then we decided to work on an unit test instead of a bug. I completed it, and sent it to Gerrit. I was very happy when I got my first “merged” email. After that, we selected a new bug, about a dialog. I solved it too and wrote a blog post. It’s a really good feeling, to contribute to such a big free software project.

Recently, I’ve started working on a new bug in Impress and progressing with it. I will continue contributing to LibreOffice.

Do you have any tips for other people new LibreOffice contributors?

Instead of starting with a complex bug, I suggest starting with small things like a missing unit test, or they can even fix a typo. In this process, we get the opportunity to learn about LibreOffice development tools like Git, Gerrit, Jenkins etc…

In this way, the mechanisms in the project can be better understood, and self-confidence is gained to solve a bug. In addition, LibreOffice is a huge project and I think it is very important to read the project code in detail to understand what we work on.

Thanks to Gökçe for all her contributions to LibreOffice! Anyone with C++ knowledge can dive in and explore our codebase. There’s lots to learn, but we’re making it easier to get involved with Easy Hacks and channels for communication. Join us!

by Mike Saunders at April 12, 2021 01:31 PM

Writer Guide 7.1 is just out!

The LibreOffice documentation team is happy to announce the immediate availability of the Writer Guide 7.1

The book is a complete guide for users who want to explore the best resources of LibreOffice Writer, the word processor of the LibreOffice suite. Covering advanced topics such as styles, illustrations, indexes and table of contents, master documents, form design, document automation and more, this guide will bring your word processing skills to a professional level.

The Writer Guide 7.1 is a joint effort of Jean Weber and Kees Kriek, who reviewed and updated The LibreOffice 6.4 Writer Guide with the new features of LibreOffice 7.1, released last February.

“I enjoy writing user documentation for LibreOffice because it gives me an excuse to learn about new and improved features that I might otherwise not know about. The team members are good to work with, friendly and helpful. I especially want to thank Kees Kriek for reviewing all the chapters of this book.”

Jean Weber

Kees Kriek

The Writer Guide 7.1 is available for download at and a printed copy at will soon be available.

by Olivier Hallot at April 12, 2021 01:35 AM

April 11, 2021

Michael Meeks

2021-04-11 Sunday

  • Sermon in the car on the way to R&A's - lovely to meet L - in person: another, wonderful nephew - exciting times, and tired parents. Lots of crypto mining going on, thank goodness for an increasingly de-carbonized electricity grid. Home, slugging, bed.

April 11, 2021 09:00 PM

April 10, 2021

Michael Meeks

2021-04-10 Saturday

  • Up, patch porting, gave a talk at LinuxTag - lovely to hear lots of spoken German again.
  • Improved garage lighting, helped J. re-paint window frame, J. opaqued the family bathroom window - nice.

April 10, 2021 09:00 PM

April 09, 2021

Michael Meeks

2021-04-09 Friday

  • Plugged at slides, sync with Thorsten, parents through for lunch on the way back northwards. More slide-work and playing with Moodle. Eventually poked at comment serialization to OOXML - some code!

April 09, 2021 09:00 PM

Miklos Vajna

My hack week at Collabora: improvements to gutter margin in Writer

As mentioned in a previous such report, a hack week is when we are allowed to hack on anything we want in LibreOffice / Collabora Office / Collabora Online for a few days at Collabora. I used this time to implement core support for RTL gutter margin in Writer.


I posted about Writer gutter margin in general back in February, and two follow-up requests accumulated around this new feature since then.

First, the gutter margin could be on the left or at the top for non-mirrored documents, which initially sounded like a complete solution, but later it turned out that right-to-left (RTL) documents want it on the right.

Second, there was a request from the OASIS TC to to implement the ODF filter differently for gutter margin.

Neither of these is simple to do, so this hackweek was a good opportunity to address these problems.

Results so far

Here is the layout and user interface for RTL gutter looks like:
Figure 1. RTL gutter margin in Writer, layout and UI

You can see how the gutter is on the right (not the left) and you can alter this behavior with a dedicated checkbox on the UI.

How is this implemented?

If you would like to know a bit more about how this works, continue reading… :-)

Finally I had a little bit of remaining time, so I addressed a request from the OASIS ODF TC:

Want to start using this?

Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF’s next release (7.2).

by Miklos Vajna at April 09, 2021 12:48 PM

April 07, 2021

LibreOffice QA Blog

QA/Dev Report: March 2021

General Activities

  1. LibreOffice 7.0.5 was released on March 12
  2. LibreOffice 7.1.1 was released on March 4
  3. LibreOffice was accepted as a project for the Googgle Summer of Code 2021 program
  4. Ilmari Lauhakangas (TDF) created a new wiki widget to help with navigating the Calc function documentation
  5. Steve Fanning made corrections to the Help content for Calc’s database functions
  6. Jean-Pierre Ledure worked on the ScriptForge library
  7. Alain Romedenne and Rafael Lima improved the Help content for the ScriptForge library. Rafael also updated Slide menu help for Impress and added an example for using hyperlink to folders in Writer and Calc
  8. Adolfo Jayme Barrientos and Johnny_M made smaller fixes and cleanups to Help pages
  9. Olivier Hallot (TDF) improved the Help for Java, Special characters dialog, font embedding and made cleanups
  10. Seth Chaiklin made nearly 50 changes and additions to Help, with topics including list formatting, menus, chapter numbering, page styles and shortcuts. He also made many improvements to tooltips and labels in LibreOffice. Among the people he worked with on perfecting the changes were Mike Kaganski (Collabora) and Dieter Praas.
  11. Akshit Kushwaha changed the QR code encoder library to zxing-cpp, which will allow implementing barcode support. René Engelhard and Mike Kaganski helped with code reviews.
  12. Panos Korovesis made a Writer code cleanup
  13. Jan-Marek Glogowski and Thorsten Behrens (allotropia) worked on the WASM build in a feature branch
  14. Fridrich Štrba made many improvements to libcdr (Corel DRAW importer) and release 0.1.7 was added to LibreOffice
  15. Lionel Elie Mamane fixed an SQL query crash
  16. Vert D fixed refresh showing the wrong category in the Template manager
  17. Gábor Kelemen (NISZ) assigned F4 as a shortcut for Image Properties in Writer and fixed importing WordArt effects textDeflate and textInflateTop from PPTX files
  18. Balázs Sántha improved the performance of Writer change tracking
  19. John fixed an initialisation bug in Basic
  20. Michael Stahl (allotropia) made many internal improvements to the handling of digital signatures, fixed a shape z-index issue with ODF export and implemented BackgroundFullSize property for ODF pages
  21. Jun Nogata added mixed Gregorian and Japanese gengou date formats
  22. Arpit Bandejiya made it so Basic CCur function accepts negative values
  23. Tibor Nagy and Attila Szűcs (NISZ) fixed overlapping wrapped rotated Calc cell contents and an extra page break in DOCX table export. Tibor also fixed losing table cell vertical alignment in PPTX export
  24. Bartosz Kosiorek fixed EMF issues with line width and region filling
  25. Mark Hung fixed a crash when undoing cell merge in Impress
  26. Dipanshu Garg added a UNO command for selection cycling (word, sentence, paragraph, all at cursor), so it can be used with a keyboard shortcut (F8). Dipanshu also made paragraph-anchored objects move more logically
  27. Armin Le Grand (allotropia) fixed incorrect resizing of OLE objects in Writer
  28. Tünde Tóth (NISZ) made several improvements to Calc AutoFilter, including XLSX to compatibility
  29. Eike Rathke (Red Hat) improved date format handling in order to support mixed Gregorian and Japanese gengou calendars, made Calc named ranges UI representation clearer and fixed a problem with Calc LOOKUP function
  30. Bayram Çiçek made restart prompting more logical when installing an extension
  31. Andreas Heinisch fixed an incrementing problem with autofilling dates in Calc, made it so hidden whitespaces in Calc’s AutoFilter dialog are indicated with quotes, fixed detecting end of month when autofilling dates in Calc, added a full HD image resolution option to Impress HTML export and with help from Tomoyuki Kubota, fixed referring to Calc named ranges when using the Excel R1C1 formula syntax
  32. Regina Henschel fixed a 3D shape origin problem and saving 3D wordart from PowerPoint back to PPTX
  33. László Németh (NISZ) fixed losing comment ranges and bad strikethroughs in tracked deletions, fixed a crash when undoing accept all changes, made deleted comments show antialiased lines, fixed losing DOCX tables in footnotes and endnotes and made Style Inspector support RDF metadata
  34. Ayhan Yalçınsoy rearranged the items in UI options
  35. Aditya Pratap Singh and Vikram Bais created their first unit tests
  36. Arnaud Versini made some code cleanups in Basic and animations
  37. Marco Cecchetti improved Impress slides JavaScript export
  38. Julien Nabet renamed “No-width No Break” character to “Word Joiner”, fixed an AutoCorrect crash and fixed PDF exported form buttons not working in Adobe Reader
  39. Rizal Muttaqin made updates to all icon themes
  40. Thorsten Wagner fixed blurry text on macOS 11 with Retina displays, blank tab names in dialog frames on macOS 11 and scrolling artifacts in bitmap images on macOS
  41. Michael Weghorn made many improvements to the Android version and improved the accessibility of Calc’s formatting toolbar
  42. Gülşah Köse (Collabora) implemented PPTX import support for clipped graphics
  43. Szymon Kłos (Collabora) made Calc AutoFilter dropdown button scale according to zoom level, improved Style preview performance and made it so fontwork objects can not be inserted outside the view area
  44. Mike Kaganski (Collabora) fixed an annoying Windows clipboard bug with help from jasonkres and Telesto, fixed a Navigator section listing order issue, made the Mail Merge toolbar visible whenever there is a data source, fixed issues with unnecessary password prompts in protected Mail Merge documents and made code cleanups and improvements to unit tests
  45. Vasily Melenchuk (CIB) fixed a header/footer issue with exported DOCX files
  46. Tomaž Vajngerl (Collabora) worked on the new UNO object inspector and made internal improvements to graphics handling code
  47. Christian Lohmaier (TDF) fixed language pack installation on macOS
  48. Tor Lillqvist (Collabora) worked on the iOS and Android versions, among other things improving pasting support on iOS and enabling thesauruses.
  49. Samuel Mehrbrodt (allotropia) made it so buttons in documents can be triggered with their mnemonic without first focusing on them
  50. Svante Schubert made many improvements to the XSL transformations of HTML export
  51. Heiko Tietze (TDF) fixed image blurriness in tips of the day and added scaling value to Draw’s statusbar
  52. Xisco Faulí (TDF) made nearly 60 improvements and additions to unit and UI tests
  53. Balázs Varga (NISZ) improved the XLSX import of autofilters and improved Mail Merge performance
  54. Attila Bakos (NISZ) fixed broken As character anchoring of Writer text boxes and improved DOCX header/footer compatibility
  55. Luboš Luňák (Collabora) improved image dragging performance in Writer, made crash fixes and improved font handling performance, PNG handling and Skia integration
  56. Daniel Arato (NISZ) made it so headers/footers in a Writer document are not lost when checking a “Same content on…” option, optimised DOCX export regarding header images and, together with Attila Bakos, fixed losing of header/footer undo stack
  57. Mert Tumer (Collabora) fixed an Impress slidesorter crash
  58. Stephan Bergmann (Red Hat) made many code cleanups and test fixes
  59. Justin Luth (Collabora/SIL) continued with character highlight fixes, fixed old issues with tabstops, superscript formatting in DOCX import and paragraph backgrounds and spacing in DOCX export
  60. Miklos Vajna (Collabora) continued improving gutter margins and made improvements to the bibliography feature
  61. Áron Budea (Collabora) fixed an exception crash when opening a DOCX with a certain type of table
  62. Dante Doménech made many internal improvements to Math
  63. Noel Grandin (Collabora) improved macOS widget look and feel, added a script to install build dependencies on different Linux distributions, helped Tomaž with graphics handling improvements and made many code cleanups, crash fixes and optimisations
  64. Caolán McNamara (Red Hat) made the Analog Clock sidebar extension demo work again, made a couple of accessibility fixes, fixed a scrolling issue in conditional formatting dialog, continued on the last stretch of the massive UI backend work and made many cleanups and crash fixes
  65. Jim Raykowski improved the selection mode control in the statusbar, made it so heading levels are displayed in the selection dialog for “Target in document” hyperlinks, fixed Writer’s “Add selection” functionality, made drawing objects have names upon creation in Writer and Calc, fixed table selection from the Navigator not selecting the whole table in Writer and improved the Outline folding feature

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

654 bugs, 69 of which are enhancements, have been reported by 414 people.

Top 10 Reporters

  1. Telesto ( 34 )
  2. Mike Kaganski ( 21 )
  3. NISZ LibreOffice Team ( 20 )
  4. ( 18 )
  5. Xisco Faulí ( 14 )
  6. Eyal Rozenberg ( 11 )
  7. Jean-François Fortin Tam ( 10 )
  8. Regina Henschel ( 8 )
  9. Christian Lehmann ( 8 )
  10. Matheod ( 7 )

Triaged Bugs

698 bugs have been triaged by 101 people.

Top 10 Triagers

  1. Dieter ( 111 )
  2. Xisco Faulí ( 88 )
  3. Timur ( 64 )
  4. Buovjaga ( 57 )
  5. Roman Kuznetsov ( 48 )
  6. Heiko Tietze ( 31 )
  7. Olivier Hallot ( 27 )
  8. V Stuart Foote ( 25 )
  9. Julien Nabet ( 24 )
  10. Mike Kaganski ( 18 )

Resolution of resolved bugs

637 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

224 bugs have been fixed by 51 people.

Top 10 Fixers

  1. Caolán McNamara ( 16 )
  2. Seth Chaiklin ( 12 )
  3. Luboš Luňák ( 9 )
  4. Jim Raykowski ( 8 )
  5. Mike Kaganski ( 8 )
  6. László Németh ( 7 )
  7. Justin Luth ( 7 )
  8. Michael Weghorn ( 6 )
  9. Miklos Vajna ( 6 )
  10. Xisco Fauli ( 5 )

List of critical bugs fixed

  1. tdf#116983 Paste is sometimes deactivated in (context) menu even though text is copied to clipboard and CTRL+V functioning (steps: Comment 0 and Comment 13 and Comment 28 and Comment 78) ( Thanks to Mike Kaganski )
  2. tdf#127217 PDF export: LibreOffice 6.3 option buttons in forms not working in Adobe Reader (OK in other readers) ( Thanks to Julien Nabet )
  3. tdf#134607 LO7RC1 – LANGPACK macOS – many versions fail to recognize LibreOffice 7.0 / 7.1 installation as valid on Catalina and Big Sur ( Thanks to Christian Lohmaier )
  4. tdf#138122 LibreOffice text blurry on Retina displays on macOS 11 ( Thanks to Thorsten Wagner )

List of high severity bugs fixed

  1. tdf#118693 FILEOPEN: Drawing has incorrect size ( Thanks to Xisco Fauli )
  2. tdf#122717 FILEOPEN DOCX: Horizontal line has wrong size/position and vertical line rendered horizontally ( Thanks to Xisco Fauli )
  3. tdf#122894 FILEOPEN DOC: Crash: SwFrame::RemoveFromLayout() ( Thanks to Caolán McNamara )
  4. tdf#136956 CRASH: Undoing merge cell ( Thanks to Mark Hung )
  5. tdf#138314 Blank tab names in dialog frames, macOS 11 Big Sur ( Thanks to Thorsten Wagner )
  6. tdf#140136 When we click on the FILTERED dropdown + sign it CHECKS and UNCHECKS all along with expanding and contracting ( Thanks to Attila Szűcs )
  7. tdf#140606 PDF: EXPORT: Crash in: mergedlo.dll ( Thanks to Tomaž Vajngerl )
  8. tdf#140668 CRASH: importing docx file ( Thanks to Daniel Arato (NISZ) )
  9. tdf#140863 Error hiding and unhiding sections ( Thanks to Bjoern Michaelsen )
  10. tdf#141166 Crash in: mergedlo.dll: Press “Help” button in Hyperlink dialog ( Thanks to Caolán McNamara )
  11. tdf#141171 FILESAVE: PDF: PNG images are exported as black ( Thanks to Luboš Luňák )
  12. tdf#88442 Global of struct type behave as local variables ( Thanks to John )
  13. tdf#93441 EDITING: cursor jumps to different horizontal position when moving to a different line with Up / Down ( Thanks to Xisco Fauli )
  14. tdf#99913 Importing autofiltered XLSX and selecting cells copies hidden cells, too ( Thanks to Tünde Tóth )

List of crashes fixed

  1. tdf#122894 FILEOPEN DOC: Crash: SwFrame::RemoveFromLayout() ( Thanks to Caolán McNamara )
  2. tdf#133933 CRASH: Undoing paste of table with images of cats ( Thanks to Miklos Vajna )
  3. tdf#136956 CRASH: Undoing merge cell ( Thanks to Mark Hung )
  4. tdf#139350 Crash when create a new odg,ods,odp file ( Thanks to Michael Weghorn )
  5. tdf#140288 Crash with zero-size window when running a macro ( Thanks to Luboš Luňák )
  6. tdf#140539 Crash when I open the help window ( Thanks to Caolán McNamara )
  7. tdf#140590 Crash in: mergedlo.dll: Using Save-As dialog in Tools>Chapter Numbering ( Thanks to Noel Grandin )
  8. tdf#140606 PDF: EXPORT: Crash in: mergedlo.dll ( Thanks to Tomaž Vajngerl )
  9. tdf#140668 CRASH: importing docx file ( Thanks to Daniel Arato (NISZ) )
  10. tdf#140700 calc crash at exit in ScSelectionTransferObj::~ScSelectionTransferObj (steps in comment 18) ( Thanks to Mike Kaganski )
  11. tdf#140754 LibreOffice Calc crash when selecting filters (threaded) ( Thanks to Luboš Luňák )
  12. tdf#140757 EDITING Crash when

by x1sc0 at April 07, 2021 07:25 AM

April 06, 2021

Luboš Luňák

Clang precompiled headers and improving C++ compile times, conclusion

 With Clang12 almost released, I guess it's high time to write a conclusion to the Clang11 changes that improve compilation times with PCHs. I originally planned to do this after the Clang11 release, but with the process to get the changes reviewed and merged having been so tedious I was glad it was finally over and I couldn't at the time muster the little extra effort to also write this down (I spent way more time repeatedly writing 'ping' and waiting for a possible reaction than writing the code, which was really demotivating). But although the new options are described in the Clang11 release notes, I think it'd be useful to write it down in more detail.

First of all, I've already written why C++ developers might care, but a thousand pictures can be worth more than a thousand words saying how this can save you even 60% of the build time:

 In case you'd like to see a similar change in your LibreOffice compilation times, it should be as simple as this:

  1. Get Clang11 or newer and use it to build LibreOffice.
  2. Use --enable-pch (preferably --enable-pch=full) to enable PCH use.
  3. Profit.

You may want to check that your ccache and icecream are not too ancient if you use them, but by now any reasonably recent version should do. And if you need to do changes that would repeatedly trigger larger rebuilds (such as changing a header), the trick to temporarily disable PCH builds is to do 'make BLOCK_PCH=1'. And since PCH builds sometimes cause build errors in non-PCH builds because of missing #include's of headers, it's a good idea to touch all your changed files and do 'make BLOCK_PCH=1' before pushing your change to Gerrit. This is all you should need to know, the LO build system will take care of everything else.

As for the rest of the world, this boils down to the two PCH-related sections in the Clang11 release notes.

The first one is using -fpch-instantiate-templates. It needs to be set when building the PCH, but it will work even if you just add it to the CXXFLAGS used for building everything. Recent enough CMake version should handle this option automatically, I have no idea about other build systems. It should be safe to enable the option for any building with PCH. It's not enabled by default in Clang only because of really corner cases with PCHs that are not self-contained. In other words, as long as your PCH works with an empty .cpp file, it's safe, and if your PCH is not self-contained, you'd be better off fixing that anyway.

The second part using -fpch-codegen -fpch-debuginfo is more complicated, as it requires build system support, and I'm not aware of any build system besides LibreOffice's providing it. This discussion in a CMake ticket provides an example of how to use the option that seems rather simple. For other build systems have a look at the description in the Clang11 release notes for all the details and possible complications, and consider whether it'd be worth it. Which it sometimes may not be, as this graph from my previous post shows (Clang means normal PCH build, Clang+ means only -fpch-instantiate-templates, Clang++ means all 3 options).

Note that you may get rather different results depending on how much you put in your PCHs. Unlike before, now the general rule should be that the more you add to your PCHs, even if shared only by several source files, the faster the builds usually will be. And since these options move building some code to the PCH-related object file, the improvement is usually even better for incremental builds than full rebuilds. I've been using PCHs this way for slightly more than a year, and I forgot already quite some time ago how slow it used to be.

by llunak ( at April 06, 2021 01:38 PM

April 04, 2021

Roman Kuznetsov

Hey, Lubuntu maintainners! Please build LibreOffice with vcl:kf5 instead vcl:qt5!

I should ask you Lubuntu maintainers: please build LibreOffice with vcl:kf5 instead vcl:qt5. Because LibreOffice's vcl:qt5 backend still buggy and unstable. Look at it:


I just tried to use Lubuntu 21.04 beta, opened LibreOffice Writer and I wanted increase a scale of the page. So you can see what I saw: wrong vertical rule, ugly page view, etc.

by Roman Kuznetsov ( at April 04, 2021 05:45 PM

April 02, 2021

Official TDF Blog

The Brazilian Community launches the LibreOffice 7.0 Getting Started Guide in Portuguese

Timothy Brennan Jr.

The Brazilian LibreOffice community is pleased to announce availability of the LibreOffice 7.0 Getting Started Guide in Brazilian Portuguese.

Guia de Introdução

Guia de Introdução 7.0

The guide is intended for Portuguese speaking users who wants to begin their first contact with LibreOffice and needs a manual that expounds all the software’s  features and allows them to immediately start some sophisticated tasks.

The Getting Started Guide describes the important concepts that guided the development of LibreOffice and presents each of its modules: spreadsheets (Calc), presentations (Impress), vector drawings (Draw), texts (Writer), equations (Math), and databases (Base). In addition to these modules, there are several chapters describing important concepts common to all modules such as styles, printing, electronic signature, macros, exporting in various formats, redacting, and document classification.

Making the Getting Started Guide available is the teamwork of Brazilians LibreOffice enthusiasts who have gone to great lengths to produce a comprehensive and accessible guide. The guide is a translation of the guide from English, this time using automatic translation, but with a thorough review of the result by the team, who put in great effort to confirm the concepts presented, but also to improve the Portuguese generated by the automatic translation. The next editions of the Getting Started Guide will be done without translation, but by writing directly in Portuguese the new information introduced in the new versions of LibreOffice.

Vera Cavalcante

“I have dedicated myself intensely in the LibreOffice community, putting effort into the LibreOffice Magazine project of which I was one of the publishers. This edition of the Getting Started Guide was a great opportunity to get back to interacting with LibreOffice and meet new people with the same interest, in a voluntary work context.”, stated Vera Cavalcante, a member of the Brazilian LibreOffice community. “I am very meticulous, and helped correct some translations and (a few) inconsistencies in the software during the process of revising the Guide. In the end, we have better software ”, she added.

Jackson Cavalcanti Jr.

“Joining the translation and proofreading team for the Getting Started Guide was an opportunity to get back to interacting with the LibreOffice community, returning to my participation I had started years ago. The opportunity was very rewarding, not only for self-improvement in the use of the LibreOffice suite but also to learn a lot about document writing.”, said Jackson Cavalcanti Jr. “I used the opportunity to instigate debates about the terms used and the technical vocabulary in Brazilian Portuguese, which allowed me to review some terms used in the software and improve the translation of the LibreOffice suite.” he added.

Timothy Brennan Jr.

“I participated as a novice in the effort of the Getting Started Guide and could see the seriousness of the work and the good spirit of collaboration in the Brazilian team. It has been a teamwork lesson where questions were answered promptly and, at the same time, I learned a lot about elaborating complex documents.”, said Timothy Brennan Jr., a team member. “I have dedicated myself to reviewing some chapters of the Getting Started Guide (Chapters 8, Getting Started with Base and, 10, Print, Export, Send, and Sign). Now I consider myself an expert in LibreOffice as well as any other office suite. It has also been an important professional gain”.

Flávio Schefer

“I am also new to free software projects and revieweing the Getting Started Guide was an opportunity to team up with the Brazilian team and acquire knowledge,” said Flávio Schefer. “I was in a career transition and the knowledge and practices acquired in the team’s work was important during this period”, he added.

Felipe Viggiano, Raul Pacheco da Silva, Túlio Macedo and Olivier Hallot  also participated in the effort.

Felipe Viggiano, Raul Pacheco da Silva, Túlio Macedo e Olivier Hallot

Download the Getting Started Guide in PDF format now (in Brazilian Portuguese) by visiting our library at

by Olivier Hallot at April 02, 2021 04:48 PM

March 24, 2021

LibreOffice Design Blog

The Dos and Don’ts of Writer Templates

As we have seen in the previous posts (1st and 2nd) there are many advantages of using templates. And you should use them whenever is possible, they will help you with consistency across documents and will make your workflow more efficient.…

by Pedro Pinto Silva at March 24, 2021 12:11 PM

Miklos Vajna

Bibliography improvements in LibreOffice Writer

The bibliography feature in Writer allows authors of e.g. scientific papers to track sources: first you can insert bibliography entry fields, then at the end you can generate a bibliography table automatically.

Writer now has two improvements in this area: more information about these entries in the form of a mouse tooltip and clickable URLs in the table.

First, thanks TUBITAK ULAKBIM who made this work by Collabora possible.


Generating a bibliography (table) for a document is a two-step process: first the user inserts bibliography entry fields to refer to sources, then later the bibliography can be auto-generated. It was not great that details of a source was only visible in the Writer edit window after generating the bibliography table. A somewhat related shortcoming was that URLs of sources were handled as plain text, while users expect that references are also clickable, similar to e.g. table of contents.

Results so far

This is how a tooltip looks like, available even if there is no bibliography table yet:
Figure 1. Tooltip for bibliography entry fields

And URLs in the bibliography table are now clickable:
Figure 2. Clickable URLs in the bibliography table

How is this implemented?

If you would like to know a bit more about how this works, continue reading… :-)

As usual, the high-level problem was addressed by a series of incremental development steps:

Want to start using this?

Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF’s next release (7.2).

by Miklos Vajna at March 24, 2021 11:18 AM

Tomaž Vajngerl

Built-in "Xray" like UNO object inspector – Part 3

DevTools implementation has been completed and this is the third and final part of the mini-series. The focus of this part is on the object inspector, but I have also improved or changed other DevTools parts, so first I will briefly mention those.

New menu position

Figure 1: Development Tools location in the menu

The position in menu has changed from "Help / Development Tools" to "Tools / Development Tools". The new position fits better as it is near the position of macro editor and they go hand in hand with each-other.

Updates to the document model tree view

Figure 2: Document model tree view and "Current Selection" toggle button

The left-hand side document model tree view has been changed to use the same approach than the object inspector tree view uses, where the object attached tree view (in this case DocumentModelTreeEntry) has all the behavioural logic for a specific tree view node. This makes it easier to manipulate the tree view and add new nodes (if necessary).

In the document object tree view I have added a top toolbar with "Refresh" (icon) button and I changed the existing “Current Selection” button to a toolbar toggle button, so it looks more consistent as the is only the toolbar now (see figure 2).

In Writer, each paragraph tree view node now has text portion child nodes (as shown in figure 2), to make it possible to quickly inspect all the individual parts of a paragraph.

The object inspector tree view

Figure 3: Top toolbar and tab bar in object inspector

The object inspector shows various information about an object. Each object has a implementation class, which is always shown for the current object (see figure 3).

The other information that the object inspector shows are divided into four main categories:
  • "Interfaces" - the interfaces that the current object implements
  • "Services" - the services that the current object supports
  • "Properties" - the properties of the current object
  • "Methods" - the combined methods that can be called on the current object
On the user interface, the categories are divided with a tab bar (see figure 3). Each tab represents a different categories. The tabs are filled on "entry" - when the user clicks on the tab.

In the code the tabs and tree views are all handled by the ObjectInspectorTreeHandler and the hierarchy of objects attached the tree view that implement the ObjectInspectorNodeInterface (see include/sfx2/devtools/ObjectInspectorTreeHandler.hxx). 

The two major categories are "Properties" and "Methods", which I describe in more detail next.


Figure 4: Object inspector "Properties" tab

There are three types of properties of an object:
  • Properties accessible view XPropertySet.
  • Properties defined as an attribute (marked "[attribute]" in IDL). 
  • Pseudo properties defined by a get and set method. 
All the three types are represented in the properties tab and can be identified by the "Info" column. Attribute properties have an "attribute" flag, pseudo properties have either a "get", "set" or both flags. If neither flags exists, it represents a property that is from XPropertySet. 

In the tree view there are four columns for each property - "Name", "Value", "Type" and already mentioned "Info". The "Name" of the property is always available, but it is possible that two properties have the same name (because of multiple property types). The "Value" shows the value of the property, which is converted to the string, if this is possible (it should be if the property is basic), otherwise a representation string is created. The representation string for objects shows the implementation name ("<Object@SwXTextRange>"), for sequences it shows the size ("<Sequence [5]>") and for structs it just mentions the type ("<Struct>").

A node in the “Properties” tree view can be expanded (if offered) so it is possible to recursively inspect the the objects further. In case the property is a struct, it shows the struct members, and if it is a sequence, it shows the indices each object has in the sequence.

There are special properties, which names start with "@". This are added for convenience, so it is possible to inspect objects, that implement XIndexContainer, XNameContainer or XEnumeration interfaces. When such an object is found, the entries gathered using those interfaces are added to the tree view, and are prefixed with "@". For example "@3" (XIndexContainer)   "@PageStyles" (XNameContainer or XEnumeration). The type of the special property is written in the "Info" column ("index container", "name container" and "enumeration" flags). Note that this functionality is not present in Xray or the Macro editor's debugger, but was added for convenience.

Figure 5: "Properties" tab and the text view

On the bottom of the "Properties" tab there is a text view, which shows the full value of the current selected property. In the tree view, the value shown is always using a short form (shortened to 60 chars with new-line characters removed) to not make the tree view too wide. The full value therefor is written in the text view, where it can be inspected in full and has also a working copy/paste (see figure 5).

Object Stack

Related to the "Properties" is the object stack. It is possible to select an object in the tree view and inspect the object (either using the context menu or the toolbar "Inspect" action). In this case the object in the object inspector will change to the selected one. This is convenient when you are only interested in one object down in the tree view hierarchy and want to inspect only that. In that case the previous object will be added to the stack, and can be returned to with hitting the "Back" button in the toolbar.

Note that going to another object (not using "Inspect" action) will always remove the object stack. 


Figure 6: Object inspector "Methods" tab

The "Methods" tab contains a tree view that shows all the methods, that can be called for the current object. Each method is represented by four columns (see figure 6):
  • "Method" - name of the method
  • "Return type" - the return (simplified) type of the method
  • "Parameters" - list of input parameters, where each one lists the direction ("in", "out" or "in/out"), the parameter name and the simplified type 
  • "Implementation Class" - class/interface where the method is implemented
Currently the types of parameters and return types are simplified, with only basic types, "void", "any", "sequence" and "object" that represents all the objects and the type of the object isn't written. The reason for this is to make it easier to read. 

Future ideas

There are many improvements that can still be made, but aren't included in the current implementation. 

I think it would be quite convenient to have the ability to open a object inspector in mode-less dialog separate to the DevTools, just to quickly look up a property. 

Another big upgrade would also be the ability to change values of basic types for the properties and structs, so it is possible to quickly see what effect the change would have. Similar to changing property values is to call methods with defining the parameters, but only if the parameters are basic types.

My initial vision of DevTools was not that it will be only one tool (object inspector), but more tools just like the development tools in the browser, so I'm sure there will be more useful things integrated over time.

I think there are a lot of ideas you may also have, so please tell me if you have a good one. Of course if you find something that is not working as expected, please let me know.


Many thanks to TDF and users that support the foundation by providing donations, to make this work possible.

by Tomaž Vajngerl ( at March 24, 2021 07:42 AM

March 22, 2021

Olivier Hallot

Exporting LibreOffice Guides to XHTML (Part II)

In the previous blog post I explained the reasons and some issues on exporting LibreOffice Guides to the xHTML format. Now it is time to give more technical details. 

I choose to use the extension writer2xhtml available in the Extension website, because the produced HTML5 look less cluttered than the native XHTML export. Nevertheless there it will be necessary to add some extra HTML5 lines, to load the CSS and a Javascript file.

Invisible changes in chapter files that can go upstream

There are some changes that should go upstream, because it does not change the resulting PDF or ODT book layout.

Each image must be anchored “as character” in the document. The image becomes a character and must be single in the paragraph. The paragraph must be centered in the page, using a style that aligns in the center, for example, the “Figure” paragraph style. The image caption paragraph must have style “Caption”. The wrapping frame that holds the image and the caption must also be anchored “as character” in a paragraph with style “Figure” as well. This arrangement is transparent when producing ODT, PDF and HTML5 documents.

Tips, Notes and Cautions headings use graphics as bullet. Many of these paragraphs have the bullet enabled by direct formatting and this is invisible to the user in LibreOffice, but will show when exporting to HTML5 with an ugly black circle.

Recommended changes that should go upstream

Create a table style, or copy it from the table in the copyright section. Name the style as you want, custom table styles are stored in your user profile. Apply this style to all tables in the chapter. Open the table properties of each table and set alignment to “Centered”, and table width in 90%.

Remove cross references to pages. For example, “See figure 12 on page 30”. At best, use the “above” or “below” in the reference.

Add the sections described in 2,3 and 4 below.

Changes in the working copy of the chapter file.

The original chapter file is optimized for a book format, we need to prepare it for exporting to HTML5 where pagination is different, mostly by smooth scrolling. This involves steps but will not change the chapter contents, only the layout and some formatting

  1. With the images anchored as explained above – a step that may require manual work – move the caption above the image. This can be quickly done by placing the cursor in the caption text and pressing Ctrl+Alt+Up Arrow, to swap the caption paragraph with the image paragraph. Some chapter have dozens of images so it will be nice to have a script to bulk execute this swap.

  2. Wrap the top LibreOffice logo in a Section named “SEC_LOGO”.

  3. Wrap the Guide name in a section named “SEC_GUIDE”.

  4. Wrap the chapter title in a section named “SEC_TITLE”.

  5. Delete the existing table of Contents.

  6. Select the text from the copyright heading to the end of the chapter and wrap in a section named “SEC_DISPLAYAREA”. Ensure you leave some empty paragraphs after the end of the section.

  7. On the bottom of the chapter, after the SEC_DISPLAYAREA section, add 6 new empty sections: SEC_TOC, SEC_BOOK_TOC, SEC_SEARCH, SEC_IMPRINT, SEC_DONATION, SEC_NAV. You can create these 6 sections in an empty document and load it as Autotext, so all section can be inserted in a single command using Autotext (Ctrl+F3).

  8. Insert the chapter table of contents in the SEC_TOC section.

  9. Change the template of the chapter to the provided template

  10. Review the ordered and unordered lists in the chapter. The new template may highlight the spurious bullet and numbering inserted by direct format, and as explained above, is very hard to detect in the original ODT file. Some of these list direct formatting may also be detected in the HTML5 output.

Save your working copy.

Exporting to HTML5

The extension writer2xhtml adds a toolbar for exporting on a click. The extension allows some customization, not used here. The export used “original format” style and 115% font size.

The export is very fast and gives no choice to change the export name, so the exported file has same file name and html as file extension, overwriting existing files with same name and extension.

By default the exported file name opens in the system browser for inspection. The result is not yet what we want, we must apply specific CSS and Javascript for rearranging the layout of the sections. The se files are added in the HTML5 output juste before the </head> closing tag.

<link href="guideposition.css" rel="Stylesheet" type="text/css">
<link href="guideformats.css" rel="Stylesheet" type="text/css">
<script type="text/javascript" src="GS70.js" defer></script>

The CSS files

Two extra CSS files were created, one is guideposition.css and manages the sections position in the page, and has provision for handling other screen sizes such as in tablets. The second CSS file is guideformats.cssthat contains rules to override some attributes such as lists, fonts, font-size, colors, margins, padding and more of the sections.

The Javascript file

This file fills the empty sections we added at the end of the chapter. Contents for donation, guide table of contents (jump between chapters), a legal imprint, a search form (to be implemented) and more. The javascript file is common to all chapter and is custom to the guide.


Exporting the LibreOffice Guides to HTML is another way to offer a rich contents to the public. Guides in HTML format can be installed in servers of schools, libraries, colleges and corporations alongside with a PDF copy, to support a migration project.

The rich set of features of Writer, while allowing the creation of wonderful documents, is also source of concern not only when exporting to formats that are less flexible that ODF, but also to manage the excess of freedom. The changes recommended and the detection of hidden direct formatting in lists are examples. It becomes clear that a set of sanitizing scripts can help to remove spurious formatting, unused legacy styles, detect unwated extra styles and adjust the objects in the documents.

When handling the full set of guides it is easy to dream of an office suite that can execute some "wishes" like "anchor all images as characters and center in line", "change position of caption  in all frames to top", "format all tables with style 'guides' and align to center"... but that is for an office suite of the next generation!!!.

Partial results of all this work can be visualized below. 

The getting started guide in HTML format.

The javascript file

The css files: css1 and css2

The template

The writer2xhtml extension

 Happy documenting!!!!



by Olivier Hallot ( at March 22, 2021 03:25 AM

March 17, 2021

Roman Kuznetsov

Microsoft gave us fix for its stupid KB5000802

So, as I wrote before, MS broke LibreOffice work (and just broke many Windows 10 system) with its stupid update KB5000802.

OK, they gave us the fix for that problem. But it will be optional (!!!!). You should install it manually if you have the problem!

For Windows 10 20H2 and Windows 10 (2004) install KB5001567

For Windows 10 (1909) — KB5001566

For Windows 10 (1809) — KB5001568

For Windows 10 (1803) — KB5001565.

Why they made it different for different builds of ONE OS Windows 10, I don't know. And I think they don't know too.

You can find your Windows 10 build number in system options - system - about (I can show you only Russian variant):

by Roman Kuznetsov ( at March 17, 2021 09:54 AM

March 14, 2021

Marius Popa Adrian

New Flamerobin snapshot available! with a few fixes and small features

New Flamerobin snapshot available! with a few fixes and small features Take a look, test and comment!

by Popa Adrian Marius ( at March 14, 2021 09:47 AM

March 13, 2021

Roman Kuznetsov

Windows 10 is a bullshit. Update KB5000802 breaks LibreOffice work

If you use Windows 10 and you didn't disable its updates then you could got an update KB5000802 pair days ago that breaks LibreOffice work. If your LibreOffice crashes or doesn't print now, then:

- Delete that Windows update KB5000802

- Delete LibreOffice, include a user profile from C:\Users\User_name\AppData\Roaming\LibreOffice

- Reboot Windows

- Reinstall LibreOffice

If these steps didn't help, please write a comment here. Thanks

by Roman Kuznetsov ( at March 13, 2021 09:37 PM

March 12, 2021

LibreOffice Design Blog

The Dos and Don’ts of Impress Templates

  • Don’t substitute templates by sample documents
  • Template ManagerTemplates contain generic content and structure, and are meant to create multiple documents. In contrast, a document is intended for a single use. While both types are more or less the same, the advantage of templates is the handling within the program (→Template Manager).

by Heiko Tietze at March 12, 2021 11:30 AM

March 11, 2021

LibreOffice Design Blog

Templates- ftw!

Templates can seem daunting and overly complex as any new concept. Hopefully this series of articles will help to understand and clarify some of your worries. If you have never heard of templates or if, for any reason, you tend to avoid them- this is for you.…

by Pedro Pinto Silva at March 11, 2021 10:07 AM

March 08, 2021

LibreOffice QA Blog

QA/Dev Report: February 2021

General Activities

  1. LibreOffice 7.1 Community was released on February 3
  2. Steve Fanning made corrections to the Help content for Calc functions
  3. Jean-Pierre Ledure worked on the ScriptForge library
  4. Alain Romedenne and Rafael Lima improved the Help content for the ScriptForge library
  5. Olivier Hallot (TDF) updated the Help for Calc’s View menu and made many smaller fixes and reorganisations in Help
  6. Seth Chaiklin made 27 changes and additions to Help, with topics including menus, styles and AutoCorrect. He also made many improvements to tooltips and labels in LibreOffice
  7. Srijita Mallick and Akshit Shan created their first unit test and their first accessibility improvements
  8. George Bateman added a “Keep asking during this session” checkbox to Calc’s paste import options dialog
  9. Andrzej Hunt (Google) improved the fuzzing setup
  10. Dipanshu Garg made it so information about Calc’s Jumbo sheet status appears in the About dialog
  11. Deb Barkley-Yeung added a unit test for BColorModifier
  12. Andreas Kainz improved the Notebookbar and Sidebar UIs
  13. Justin Luth (Collabora/SIL) fixed character highlight issues related to numbering, fixed a Writer crash related to superscript, a superscript applying issue with DOCX export and a bulleted list copying problem with imported DOC files
  14. David Tardon (Red Hat) made it possible to dump intermediate XML structure of Lotus Word Pro imports into file
  15. Quan Nguyen made it so adding a word in the Spelling dialog immediately applies autocorrection and added rendering support for hiding Chart titles
  16. Andreas Heinisch fixed a problem with sort options not being saved in Calc documents
  17. Shubham Jain wrote new tests for BASIC literals
  18. Anshu Khare added a “No List” list style to make unstyling interaction more clear
  19. Balázs Varga (NISZ) improved the XLSX import and export of autofilters
  20. Tünde Tóth (NISZ) fixed sorting of autofiltered Calc rows, added an option to only select visible Calc cells for copying and fixed clearing of Calc row and column selection when extending selection over filtered rows
  21. Tibor Nagy and Attila Szűcs (NISZ) fixed incorrect multiple conditional formatting rules in the same cell range with XLSX import, fixed hidden Calc columns being printed, fixed DOCX page margins imported as border padding and fixed a missing page break with DOCX export
  22. Áron Budea (Collabora) fixed a password protection regression in Windows 7
  23. Tamás Zolnai (Collabora) fixed broken master slide list after switching view mode
  24. András Timár (Collabora) fixed OOXML chart label import, matching system locale like MSO
  25. Gülşah Köse (Collabora) fixed a PPTX import image cropping issue
  26. Andrew Udvare made a couple of improvements to the macOS build process
  27. Jan-Marek Glogowski (allotropia) fixed incorrect scaling of input method cursor with Qt backend
  28. Luboš Luňák (Collabora) improved idle priority task handling, improved the performance of rendering transformed bitmaps and improved document load times by using zlib’s crc32() function
  29. Michael Weghorn improved the Qt Creator integration
  30. Maxim Monastirsky fixed missing DisplayName property for Writer table styles
  31. Christian Lohmaier (TDF) improved Visual Studio Code integration
  32. Julien Nabet added backepsilon symbol to Math elements panel and fixed a Calc hyperlink insertion crash
  33. Szymon Kłos (Collabora) made it so scrolling a treelist does not leave artifacts on the screen and improved the Style preview widget
  34. Attila Bakos (NISZ) fixed shape and anchor going out of synch in an exported DOCX file and fixed losing Contour shape wrap in DOCX export
  35. Björn Michaelsen continued internal improvements to Writer
  36. Armin Le Grand (allotropia) improved the handling of font scaling in metafile images
  37. Regina Henschel fixed shape handling in RTL Calc sheets, fixed bringing Fontwork objects to front and fixed incorrect anchor type of rotated shapes in imported XLSX files
  38. Michael Stahl (allotropia) fixed copying and deleting tables in sections via the API, fixed hyperlinks in user-defined indexes pointing to certain types of targets and made VML shapes in exported DOCX files compatible with MS Word
  39. Ouyang Leyan made it so no data loss occurs when copying a chart in Calc with errors in formulas and fixed copying of numbers in Calc chart categories into Writer
  40. Eike Rathke (Red Hat) made the CELL() Calc function implementation conform to the ODF 1.2 spec
  41. Dante Doménech made many internal improvements to Math
  42. Rizal Muttaqin made updates to all icon themes regarding find & replace and formatting
  43. Stephan Bergmann (Red Hat) fixed a crash with UNO bootstrapping related to absolute paths and made many code cleanups as well as build and test fixes
  44. Noel Grandin (Collabora) fixed importing of pathological SVG images and made many code cleanups, crash fixes and optimisations
  45. Jim Raykowski made it possible to right-click the style previews in Notebookbar Tabbed and made a couple of improvements to the Outline view functionality
  46. Samuel Mehrbrodt (allotropia) added support for series name in Chart data series labels, implemented chart:regression-moving-type and improved the layout of Chart trendline and data label dialogs
  47. Mike Kaganski (Collabora) made sweeping improvements to unit conversion code, made it so the locale is set when language is defined by command line invocation, improved tests and made code cleanups.
  48. Tomaž Vajngerl (Collabora) worked on the new UNO object inspector and made internal improvements to graphics handling code
  49. László Németh (NISZ) bumped libnumbertext to version 1.0.7, improved the Track Changes toolbar auto-appear behaviour, fixed an XLSX import issue with dashed line styles, greatly improved the performance of importing DOCX footnotes and endnotes and fixed losing comment position in tracked deletions
  50. Caolán McNamara (Red Hat) made it so tabs can show tooltips, Ctrl+A works to select all in Impress comments, continued on the last stretch of the massive UI backend work and made many cleanups and crash fixes
  51. Gábor Kelemen (NISZ) added new shortcuts for Impress pointer as pen functionality
  52. Heiko Tietze (TDF) added templates from the competition and removed some older templates, improved the print dialog and made some improvements to the Start Center
  53. Miklos Vajna (Collabora) continued improving the handling of inserted PDFs and improved Writer’s support for gutter margins
  54. Xisco Faulí (TDF) made the missing unit tests script use Bugzilla API and made over 70 improvements and additions to unit and UI tests
  55. Tor Lillqvist (Collabora) made LibreOffice Vanilla (Mac) version work with embedded Firebird databases and made Calc row height adjustment behaviour less annoying

Kudos to Ilmari Lauhakangas for helping to elaborate this list.

Reported Bugs

659 bugs, 75 of which are enhancements, have been reported by 399 people.

Top 10 Reporters

  1. Telesto ( 80 )
  2. ( 19 )
  3. NISZ LibreOffice Team ( 19 )
  4. Regina Henschel ( 19 )
  5. Xisco Faulí ( 10 )
  6. Petr Valach ( 8 )
  7. Aron Budea ( 7 )
  8. Ulrich Windl ( 7 )
  9. Dieter ( 6 )
  10. Eyal Rozenberg ( 6 )

Triaged Bugs

599 bugs have been triaged by 101 people.

Top 10 Triagers

  1. Xisco Faulí ( 131 )
  2. Heiko Tietze ( 47 )
  3. Buovjaga ( 44 )
  4. Dieter ( 41 )
  5. Timur ( 33 )
  6. Aron Budea ( 20 )
  7. BogdanB ( 17 )
  8. Regina Henschel ( 17 )
  9. Julien Nabet ( 17 )
  10. NISZ LibreOffice Team ( 16 )

Resolution of resolved bugs

522 bugs have been set to RESOLVED.

Check the following sections for more information about bugs resolved as FIXED, WORKSFORME and DUPLICATE.

Fixed Bugs

153 bugs have been fixed by 37 people.

Top 10 Fixers

  1. Caolán McNamara ( 11 )
  2. Seth Chaiklin ( 8 )
  3. László Németh ( 6 )
  4. Heiko Tietze ( 6 )
  5. Regina Henschel ( 5 )
  6. Miklos Vajna ( 5 )
  7. Noel Grandin ( 5 )
  8. Luboš Luňák ( 4 )
  9. Julien Nabet ( 4 )
  10. Tünde Tóth ( 3 )

List of critical bugs fixed

  1. tdf#134607 LO7RC1 – LANGPACK macOS – many versions fail to recognize LibreOffice 7.0 / 7.1 installation as valid on Catalina and Big Sur ( Thanks to Xisco Fauli )
  2. tdf#138068 When there are a lot of pictures, typing the text is very slow (macOS/GTK3/GDI) ( Thanks to Luboš Luňák )
  3. tdf#140280 Crash in: KERNELBASE.dll when double click a slide content box and file is opened read-only ( Thanks to Miklos Vajna )
  4. tdf#140308 Crash import old OpenOffice template (stw, stc, sti, std) ( steps in comment 12 ) ( Thanks to Noel Grandin )

List of high severity bugs fixed

  1. tdf#139511 Impress: Shrinking table by dragging bottom border up or top down not working anymore ( Thanks to Gülşah Köse )
  2. tdf#140437 FILEOPEN: Writer document “Read Error. Format error discovered in the file in sub-document content.xml at 2,1311816(row,col).” ( Thanks to Michael Stahl )
  3. tdf#140444 EDITING: Creating a view from a query crashes whole LO ( Thanks to Caolán McNamara )
  4. tdf#140528 Crash in: swlo.dll In “Save As” dialog in “Tools -Chapter Numbering”, when switching from Numbering to Position tab ( Thanks to Noel Grandin )
  5. tdf#140572 FILESAVE DOCX Crash when saving a file with superscript formatting ( Thanks to Justin Luth )
  6. tdf#36466 Add option to Select Visible Cells Only (to be copied from or copied to) ( Thanks to Tünde Tóth )
  7. tdf#76260 FILEOPEN: slow loading and dump of .docx with lots of footnotes (see Comment 27 and Comment 43) ( Thanks to László Németh )

List of crashes fixed

  1. tdf#137406 Crash when clicking “Apply to Master” in Slide Master mode on Bullets and Numbering dialog ( Thanks to Gokce Kuler )
  2. tdf#139039 PDF export: Error message if filepath is URL coded / crash when saving as DOCX ( Thanks to Miklos Vajna )
  3. tdf#140014 Calc crashes when using COUNTIF, SUMIF, etc. on columns “far away” without data ( Thanks to Noel Grandin )
  4. tdf#140225 Crash in: g_lo_action_group_change_state FILEOPEN ( Thanks to Caolán McNamara )
  5. tdf#140280 Crash in: KERNELBASE.dll when double click a slide content box and file is opened read-only ( Thanks to Miklos Vajna )
  6. tdf#140308 Crash import old OpenOffice template (stw, stc, sti, std) ( steps in comment 12 ) ( Thanks to Noel Grandin )
  7. tdf#140414 Crash pressing Ctrl-K in input line in Calc ( Thanks to Caolán McNamara )
  8. tdf#140444 EDITING: Creating a view from a query crashes whole LO ( Thanks to Caolán McNamara )
  9. tdf#140528 Crash in: swlo.dll In “Save As” dialog in “Tools -Chapter Numbering”, when switching from Numbering to Position tab ( Thanks to Noel Grandin )
  10. tdf#140572 FILESAVE DOCX Crash when saving a file with superscript formatting ( Thanks to Justin Luth )

List of performance issues fixed

  1. tdf#120351 Writer hangs for over 20 minutes loading a 3MB, 450-page DOCX Edit with thousands of endnotes ( Thanks to László Németh )
  2. tdf#138068 When there are a lot of pictures, typing the text is very slow (macOS/GTK3/GDI) ( Thanks to Luboš Luňák )
  3. tdf#139820 Hang: Undoing paste of block with empty cells ( Thanks to Luboš Luňák )
  4. tdf#76260 FILEOPEN: slow loading and dump of .docx with lots of footnotes (see Comment 27 and Comment 43) ( Thanks to László Németh )

List of old bugs ( more than 4 years old ) fixed

  1. tdf#105301 sort options not remembered thoroughly in saved document ( Thanks to Andreas Heinisch )
  2. tdf#36466 Add option to Select Visible Cells Only (to be copied from or copied to) ( Thanks to Tünde Tóth )
  3. tdf#57667 Immediately apply AutoCorrection when added per Spelling and Grammar dialog ( Thanks to Quan Nguyen )
  4. tdf#60237 : Bug in API call StoreAsURL (or in the OO Basic API description) ( Thanks to Andreas Heinisch )
  5. tdf#66409 failure to correctly implement CELL ( Thanks to Eike Rathke )
  6. tdf#76260 FILEOPEN: slow loading and dump of .docx with lots of footnotes (see Comment 27 and Comment 43) ( Thanks to László Németh )
  7. tdf#91920 No support for gutter margins ( Thanks to Miklos Vajna )
  8. tdf#92622 WRITER: context menu “Unstyle selected text” from list style to “no-list” style ( Thanks to Anshu )
  9. tdf#92768 support hiding title objects ( Thanks to Quan Nguyen )
  10. tdf#94235 Ability to add series name to data series label ( Thanks to Samuel Mehrbrodt )


110 bugs have been retested by 33 people.

Top 10 testers

  1. Xisco Faulí ( 37 )
  2. Buovjaga ( 13 )
  3. Telesto ( 6 )
  4. Dieter ( 6 )
  5. Aron Budea ( 5 )
  6. Timur ( 4 )
  7. BogdanB ( 4 )

by x1sc0 at March 08, 2021 12:50 PM

March 03, 2021

Collabora Community

Collabora Online Community Roundup #10

On 1 October 2020, Collabora Online moved to its new home on GitHub, and started settling in the new infrastructure, expanding its fantastic community, and continuing the work to deliver the latest and greatest developments in productivity and collaboration together. Check our new community website for all the details! 😉

Collabora developers also keep fixing and improving our lovely mother project LibreOffice. As all the good work requires some appreciation, let’s take a look at what the seasoned developers of the Collabora team and the volunteer contributors from our community have been doing during the last 2 weeks.

Week in Numbers

On the Collabora Online code repository in the last week, 11 authors have pushed 42 commits to master and 72 commits to all branches. On master, 48 files have changed and there have been 1,567 additions and 835 deletions.

Screenshot of GitHub Pulse for Collabora Online
Development Activity on Collabora Online GitHub Repository from February 15, 2021 to February 22, 2021

New Contributors

Congratulations to Gianni154, Samuel, sowoi, oiselarius and SerjSX for reporting their first issues and improvement requests on our GitHub repository!

  • Thanks to Gianni154 for reporting multiple issues around the iOS app such as the comment function not working properly while the keyboard is active[0], thus giving us the opportunity to improve the experience for our users on iOS even further.
  • Thanks to Samuel for opening an enhancement request to add the Libertinus Font to the CODE docker image, thus letting us know about the preferences of our users on certain configurations.
  • Thanks to sowoi for reporting that empty menus are being shown even when all of their items are disabled on certain integrations, thus giving us the opportunity to improve the user experince of Collabora Online even more.
  • Thanks to oiselarius for letting us know about issues encountered while opening files with the iOS app which reside on some cloud storage services.
  • Thanks to SerjSX for reporting a potential issue on the Android app, and then helping triage the issue which turned out to be a false positive.

Thank you all, and welcome aboard! 🙂

Join the fun!

You can also join the fun, and be part of our next list of new contributors! 🙂

Just go to our GitHub repo, fork it, build it (on Linux or on any platform), grab one of our newcomer-friendly easy hacks, and send your first pull request. And if you get stuck at any point, just drop by one of our communication channels. 😉


Collabora Online Weekly Meeting #13

COOL Weekly Meeting #13 has taken place on Thursday, February 18, 2021 at 11:00:00 am (UTC) with participants both from the community contributors and the Collabora team. We have got a quick update on what’s going on and discussed matters raised by the contributors, as well as having the chance to say hi to fellow members of the community. Topics discussed in the meeting include:

  • During the quick update part by Muhammet Kara, it’s been reported that COOL has got more than 75 new contributors (25+ code contributors) since the move to GitHub, and the COOL Roundup #9, covering more than 2 months of time, is finally out.
  • Pedro Silva has reported that multiple new categories have been added to the Collabora Online community forum along with new icons, and a new navigation bar on the top making it easier to find your way around.

    New navigation bar on the forum
  • Nicolas Christener has given an update on the template contest, informing us that there are 33 submissions so far, with 10 of them being quite promising, and that they will finish the evaluations by Feb 25.
  • Gabriel Masei has confirmed that all the work towards allowing users and integrations to change/choose a toolbar type dynamically has been completed and landed on the main (master) branch.
  • Gökay Åžatır has shared the latest status of the ongoing CanvasTileLayer work, stating that they are now removing the custom scrollbars using the canvas section container and also updating the canvas section container as well, which would improve the user experience on different platforms with an even smoother and more natural look and behavior of scrolling.
  • On the Icon Theming topic, Pedro Silva has reported that Andreas Kainz is going to do some manual tests before moving on.
  • About the ongoing effort of Async Saving, which would improve the performance and the user experience of Collabora Online by allowing seamless/smooth save operations especially when multiple users are working on the same document collaboratively, Jan Holesovsky shared that Ashod Nakashian has already merged some of the initial/preparatory work, doing some clean-up and under-the-hood improvements, and the first step of the good stuff is already on GitHub as pull requests.
  • Andras Timar, on the new release schedule, has informed us that CODE is expected to have more frequent updates with the bleeding edge features and improvements before they go into the next release of COOL.
  • Pedro Silva has reported that the bug which prevented the notebookbar from being scrolled on small screens is now fixed, and all the work has already been merged.
  • Pranam Lashkari has reported that the Invalidation Debugging work by Rashesh Padia has been completed and merged.
  • Muhammet Kara has brought up that there is a small pull request by Gleb Popov which allegedly fixes a build issue on FreeBSD and looks okay, and he has requested a review from Ashod Nakashian, and he is going to merge it if no response or objection in a few days.

Check out the meeting minutes for the details of the meeting, and join us on Thursday, March 04, 2021, at 11:00 am (UTC) to stay in touch with the rest of the community. You may also make your own suggestions for the next meeting by following the link shared in the COOL Telegram group before the next meeting. We’re looking forward to hearing from you live. 😉

Collabora Online (COOL)

  • Thanks to Gökay Åžatır for his work on CanvasTileLayer, which would make COOL have a much crisper and smoother look and feel. See the Weekly Meeting notes above for some more details.
  • Thanks to Pranam Lashkari for fixing a bug which caused the composed shortcuts, such as Ctrl+P to print the document, not to work in read-only mode, and also for making sure the right-click menu properly works also on the first row & column of Calc documents.
  • Thanks to Andras Timar for adding the info on how to build Collabora Online 6.4 docker to the README file, thus improving the documentation for potential new contributors and adopters of COOL, along with various other improvements and maintenance around localization and containerization.
  • Thanks to Dennis Francis for various fixes and improvements around the Canvas layer, which brings a lot of visual and user experience improvements such as smooth zoom animations. You can also now add Mocha tests in Collabora Online to test any existing typescript classes or functions of it, again thanks to him. Check out his blog post for the details.

    Logo of Mocha testing framework
    Mocha is a feature-rich JavaScript test framework running on Node.js and in the browser, making asynchronous testing simple and fun.
  • Thanks to Szymon KÅ‚os for various improvements and fixes especially around the notebookbar and various dialogs, such as adding the Fontwork feature to Calc and making sure dialogs are closed when the user hits the ESC key without the need of explicitly clicking the close button, thus helping COOL become richer in feature and have an even better user experience.
  • Thanks to Tor Lillqvist for adding a new toString() method to use while debugging Collabora Online, thus helping to make the lives of developers a bit easier, and for making sure the view id is included in the tunneled dialogs’ image hash to prevent possible issues while users are collaboratively editing a document.
  • Thanks to Ashod Nakashian for various fixes and improvements towards increasing general stability of COOL and maintainability of the code-base along with tests to make our code-base future-proof, working on the async save feature which will be a major leap towards a much smoother experience for users while collaboratively editing documents, and also for reviewing pull requests of other contributors, and for mentoring them through tough issues.
  • Thanks to Gabriel Masei for adding support for changing the UI mode dynamically between the classical toolbar and the new notebookbar, effectively making Collabora Online easier to customize based on user needs or taste.
    A screenshot of the Collabora Online’s classic toolbar on the Writer module

    A screenshot of the Collabora Online’s new Notebookbar on the Writer module
  • Thanks to Rashesh Padia for improving the debugging facilities of COOL, by adding a separate option in debug mode for sidebar invalidation re-rendering.
  • Thanks to Pedro Silva for various fixes and improvements around the user interface of COOL to make it have a better and more consistent look and feel, especially focusing on the vex widgets lately.
  • Thanks to Henry Castro for making it easier to debug Collabora Online by adding a tag string to extract backtrace logs.
  • Thanks to Umut BayramoÄŸlu for removing some unused variables, thus helping our code-base to become even lighter and easier to maintain.
  • Thanks to Gleb Popov for fixing the build with libc++ by ensuring that std:min() function has the same type of parameters in the code-base.
  • Thanks to Tamás Zolnai for a lot of fixes and improvements around cypress (testing framework), and the testing facilities, and also documenting the interface testing on the README file, thus helping new potential contributors to ensure stability and future-proofness of COOL.
  • Thanks to Miklos Vajna for adding support for gutter margins on Writer documents, which makes it much easier to adhere to binding standards of governments and other institutions for printed materials. Checkout his blog post for details!

    UI for the new gutter margins on Collabora Online

Collabora Online Integrations

  • Thanks to Julius Härtl for reviewing and merging pull requests from other contributors on Collabora Online’s Nextcloud integration.
  • Thanks to Szymon KÅ‚os for improving the user experience of Collabora Online’s Nextcloud integration by making sure the Save As dialog shows the new name after the file is renamed from within the editor.
  • Thanks to Phil Davis for improving the CI and test facilities of Collabora Online’s ownCloud integration by applying latest drone starlark code.
  • Thanks to Artur Neumann for reviewing and merging pull requests from other contributors on Collabora Online’s ownCloud integration.
  • Thanks to Cindy PIASSALE of Jeci for various improvements and clean-ups on Collabora Online’s Alfresco integration, such as adding Collabora Online as a viewer option for supported formats, documenting the new feature on the README file, and also releasing a new version of the integration app.

Honorable Mentions

  • Thanks to Cor Nouws for leading the marketing team, and not stopping there but continuing with testing & reporting bugs, attending to community events, and keeping us all informed about what’s going on. He also attends LibreOffice Design meetings from time to time to help COOL’s mother project LibreOffice have a better UI & UX.
  • Thanks to Eloy Crespo for his efforts to help the project well-funded as always.
  • Thanks to Marc Rodrigues for continuing to keep us updated on various news around Collabora Online and related FOSS projects, and creating a lot of yummy content to read!
  • Thanks to Pedro Silva for improving various points around the COOL Community Page and forum, and also for helping other contributors by providing instructions on their pull requests as well as reviewing them.
  • Thanks to Andras Timar for keeping us organized, maintaining our translation project on Weblate, and delivering hot new releases of our software!
  • Thanks to Yunusemre Åžentürk for various tasks towards keeping our CI chains healthy.
  • Thanks to Jan Holesovsky for doing a lot of research on different topics, and providing mentoring/patch-reviewing/hand-holding/wisdom within the team, in our communication channels, and also on various channels of our lovely mother project LibreOffice.
  • Thanks to Mike Kaganski for his recent work on upgrading our partner & customer ticketing system to make things even sweeter for all of our users. Feel free to check his blog post on Reading from MySQL data with BLOBs dumped to CSV.
  • Your friendly community mentor, Muhammet Kara, is also creating & improving easy hacks, running workshops, helping new contributors solving their setup & build issues and reviewing their pull requests, working on easing the build procedure, improving our GitHub presence bit by bit based on its community guidelines, compiling/composing these community updates…


Last but not least, we can’t thank enough to our translators who constantly help COOL and its friends talk many languages on this earth. Collabora Online speaks many languages, thanks to all of our translators in our translation project, and all of those who previously contributed and keeps contributing to our mother project, LibreOffice.

We’re continuing to work to find good ways to credit translators’ hard work in the product. Please see a list of those involved, and please get in touch if you’re not listed. Many thanks to all those who have worked on translating Online, you rock!

If you would like to help COOL speak your language, you can just go to our translation project on weblate, and start contributing! 😉

Collabora Online translation project on Weblate
Collabora Online translation project on Weblate

Collabora loves LibreOffice!

We’re still contributing to LibreOffice and encourage you too to do so because LibreOffice rocks. 😉

  • Thanks to Miklos Vajna for many improvements and fixes especially around ensuring better support for OOXML formats thus better interoperability with other office suites, such as making sure the creation time of an imported DOCX file ispreserved, and adding support[0][1][2] for gutter margins of DOCX, DOC, ODF and RTF documents. Check out his blog post for details! He also had a FOSDEM talk on Handling PDF digital signatures with PDFium.
    Old render result, missing gutter, in Writer

    New render result, with gutter, in Writer
  • Thanks to Tomaž Vajngerl for continuing his work towards developing a built-in Xray-like UNO object inspector. This effort has been funded by The Document Foundation, so also thanks a lot to the TDF Board of Directors, and the TDF donors who made the work on this tool possible!
  • Thanks to GülÅŸah Köse for various fixes and improvements around importing custom shapes such as making sure crop positions are imported properly and greysale effect is handled properly, and also for adding corresponding tests to ensure those features keep working in the future, thus improving interoperability with other office suites.
  • Thanks to Noel Grandin for doing various code-quality improvements and modernization all around the LibreOffice code-base.
  • Thanks to Tor Lillqvist for a lot of fixes and improvements especially towards better support on macOS and iOS.

The post Collabora Online Community Roundup #10 appeared first on Collabora Office and Collabora Online.

by Muhammet Kara at March 03, 2021 02:15 PM

Gökay Şatir

A Layout Designer For HTML Canvas

    Crisp drawing and perfect look and feel is important for the projects those used by millions of people, like Collabora Online.

    As you know, Collabora Online keeps your data safe on your server. Renders the files on the server side and enables users to work on large documents with many device types easily.

    Documents are rendered in parts on the server, then they are sent to the client. Client merges the tiles and shows it to the user. Parts (tiles) should have no gaps between them and they should be crisp. They should have the very same look as when the document is opened with desktop version of Libre Office.

    Collabora Online achieved this goal many years ago. But the software technologies are evolving very fast, as the time passes, old solutions may not work with the new rules. We realized that rendering tiles by using HTML & CSS & JavaScript collection, may create gaps between the tiles and there may be some other difficulties related to consistency between different browsers. Document was shown but the resulting view wasn't perfect. As the goal is having a perfect view of the documents, we needed another approach: Drawing tiles onto a canvas element.

    Also, documents can have dynamic UI elements, like row and column headers in Calc. When user scrolls the document, row and column numbers should be refreshed according to the viewed part of the document. So this quick drawings also need a canvas to be drawn on.

    Having different canvas elements for drawing the UI and tiles was our first approach. But having them drawn on the same canvas would perform better of course. At the end, we prepared a layout designer for canvas.


    Image 1

    Image 1 shows a screen shot from the layout designer, written in JavaScript. You can see that there are some sections separated from each other with borders. With this layout, if user resizes the browser window, sections are re-located. At the end of the resizing event, section at the right most position will still be at the right most position, the others will keep their relative positions too.

    This layout is created on HTML canvas element using the small class that you can view at CanvasSectionContainer.ts.

    If you are interested on this class, you may also want to have a look at Collabora Online project at our github page.

    You can also view our easy-hacks and even contribute to this great project:)

 Usage Details

    Developer creates a CanvasSectionContainer (s-container for short) class instance and gives it the canvas element that it will work with. s-container will handle all the mouse and touch events and propagate it to the sections it has. Dragging events are also handled by the s-container.

    When s-container is created, it will have no sections. Developer can add as many sections as they need, using createSection or addSection methods. 

Sections will have below properties (potential values are separated with '|'):

    anchor: 'top left' | 'top right' | 'bottom left' | 'bottom right' (Examples: For row & column headers, anchor will be 'top left'. If we would want to draw something sticked to bottom, anchor would be 'bottom left' or 'bottom right').

        One can also anchor sections to other sections' edges. Order is important, first variables are related to top or bottom, next ones are related to left or right.


            1 - [["column header", "bottom", "some section name", "top", "top"], "left"]

                    Explanation: If "column header" section exists, its bottom will be new section's top. If "column header" doesn't exist but "some section name" exists, its top will be new section's top. If neither of them exists, canvas element's top will be used as a fallback anchor.

            2 -  [["column header", "bottom", "ruler", "bottom", "top"], ["row header", "right", "left"]]

    position: [0, 0] | [10, 50] | [x, y] -> Related to anchor. Example: "bottom right": P(0, 0) is bottom right etc. myTopLeft variable is updated according to position and anchor.

    size: [100, 100] | [10, 20] | [maxX, maxY] -> This doesn't restrict the drawable area, that is up to the implementation. Size is not important for expanded directions. Expanded size is assigned after calculations.

    zIndex: Sections with highest zIndex will be drawn on top.

    expand: 'right' | 'left' | 'top' | 'bottom' | 'left right top bottom' (any combination)

    interactable: true | false -> If false, only general events will be fired (onDraw, newDocumentTopLeft, onResize) for this section. Example: Background drawings etc.

    drawingOrder: Sections with the same zIndex values are drawn according to their drawingOrder values. Section with the highest drawing order is drawn on top (for specific zIndex).

        So, in terms of being drawn on top, priority is: zIndex > drawingOrder.

    processingOrder:  Processing order feature is tricky, let's say you want something like this:

| top bar |
| left | | tiles |
| bar | | area |

    Top bar's height will be static most probably. It needs to be processed first, so it can be expanded to right.

    If top bar is processed after tiles area, since "tiles area" will most probably be expanded to all directions, it will leave no space for top bar. So, tiles are will be processed last.

    For above scenario, processing orders would be (with the same zIndex):

    * top bar -> 1

    * left bar -> 2

    * tiles area -> 3

    And their "expand" properties would be like below:

    * top bar: 'right' from position (0, 0)

    * left bar: 'top bottom' from position (0, 200) -> So it will go up and find where top bar ends and then go down and find where canvas ends. One can also anchor left bar to top bar using "anchor" property.

    * tiles area: "top bottom left right" from position like (300, 300) -> So it won't overlap with resulting positions of others. Developer can also use "anchor" property to avoid using pre-assumed positions.

    Other than these properties, sections should implement the event handlers. s-container will catch events and propagate them to sections. There are almost all events for mouse and touch screens. For more details see canvas section container class.

by Gökay ŞATIR ( at March 03, 2021 01:02 PM

March 02, 2021

Olivier Hallot

Exporting LibreOffice Guides to HTML (Part I)

LibreOffice is an open source office suite full of tricky secrets. One of my favorites is the possibility to export a text document to XHTML or HTML5, both are W3C standards supported by most modern web browsers.

But you, the reader, will certainly ask: If I have the Guides in ODT and PDF file format why do I need another format? Why spend energy adding another medium for the LibreOffice Guides? 

There are advantages and drawbacks for the endeavor. On the thumbs up side, the community get a way to read the guides without actually downloading the PDF or ODT file and contents can be accessed with the browser's navigation tools (including bookmarking and more). One example is the current ODF Standard files exported to XHTML, available at the OASIS website.

A second advantage is that (X)HTML pages can be crawled and indexed by search engines robots and the LibreOffice Guides can be found on the search results pages of Bing, Google, DuckDuckGo and others.

Another exciting possibility for distributing the guides in (X)HTML format is that they could be installed on the intranets of schools, colleges and universities, public libraries, also community, public administrationand private company websites. The files are static and don't need a server side scripting languages such as php or asp. Distributing the rich contents of the LibreOffice Guides in a browser readable format will add value to every LibreOffice migration project.

One critical factor in the success of a LibreOffice migration project is how quickly users can transition to the new software and having readily available, easily accessible documentation in different forms should not be underestimated.

How difficult is to convert the Guides to an (X)HTML format?

My experience is that there are some work to do in the ODT side, and some work on the exported (X)HTML. The nice part is that these changes are small and can be partially automated.

LibreOffice has an interesting XHTML export filter. The developers did their best to preserve formatting and document fidelity between different rich text output formats. A second tool I tried is the nice extension writer2xhtml, which also have interesting features.

However reading contents in a browser (or even a tablet and a mobile phone) requires scrolling instead of the usual page turning, as in a printed book.

The layout of the document's content must be adapted to the browser's navigation actions. This requires the layout to be adjusted for on-screen viewing. Besides, it is interesting to also adapt the contents to tablets and perhaps mobile phones.

Luckily, all elements for navigation exist in the ODT file, they are just in the wrong position when exported to XHTML. The approach is to wrap these elements in sections with specific names. After being exported to XHTML these sections are mapped in <div id="name">...</div> and can be accessed by both a CSS and Javascript for pagination and layout.

Here is one layout among many alternatives, for a simple export of our Guides to a browser page layout.

Besides the existing sections in the chapter, we can add other blocks with content of interest, for example a donation section a search form for either an external or internal search, such as Xapian and Omindex.

In the next post, I'll describe the changes needed in the Guide templates and discuss some of the alternate approaches for the task.

Stay tuned!

by Olivier Hallot ( at March 02, 2021 12:11 PM

Jean Hollis Weber

LibreOffice 7.0 Getting Started and Impress Guides

Two more volumes of LO 7.0 user guides were published in January: Getting Started Guide and Impress Guide. They are available in free PDF downloads and in low-cost print editions. See this page for links.

by Jean at March 02, 2021 12:54 AM

LibreOffice 7.1 Community released

On 3 February, The Document Foundation announced the release of LibreOffice 7.1 Community, the volunteer-supported version of the office suite. The Community label emphasises the fact that the software is not targeted at enterprises, and not optimised for their support needs. Blog post with more information.

For enterprise-class deployments, TDF has strongly recommended the LibreOffice Enterprise family of applications from ecosystem partners—for desktop, mobile and cloud—with long-term support options, professional assistance, custom features and other benefits. See LibreOffice in business.

by Jean at March 02, 2021 12:43 AM

March 01, 2021

Tomaž Vajngerl

Built-in "Xray" like UNO object inspector – Part 2

Since my last blog post I've been continuing the work on DevTools and since then a lot of things have progressed. Point & click has been implemented and the object inspector view has been greatly improved to show current object’s properties and methods. In this part I will mainly talk about the point & click and a bit about the current state, and in the next blog I will extensively talk about the object inspector.

Point & click

Figure 1: Current selection button

The idea of this functionality is to provide a way to inspect selected objects in the document, for example an image or a shape. For this, I have implemented a selection change listener (sfx2/source/devtools/SelectionChangeHandler.hxx), whose purpose is to listen to the selection changes that happen in the document and store the latest selection object. It is started when the DevTools docking window is instantiated and shown. I have added a new toggle button “Current Selection” (see Figure 1) to the UI. When the button is selected, it automatically shows the current selected object (gathered with the selection change listener) in the object inspector. 

Figure 2: Current selected shape's properties shown in the object inspector

In the example shown in Figure 2, we can see the shape is selected in the document and its properties are shown in the object inspector. If the "Current Selection" button wouldn't be toggled, then the document top-level object would be shown in the object inspector or the selected object in the DOM tree view.

While the "Current Selection" button is toggled, selecting any object in the DOM tree view (left-hand side tree view) has no effect, however if the current selected object is also present in the current DOM tree view, it will be selected. Note that if the object is not present in the tree, it won't be selected, because the DOM tree view will not force creation of on-demand object because of performance considerations.

Figure 3: "Inspect Object" command in "Customize" dialog 

In addition to showing the selected object, I have added a UNO command named “Inspect Object” (.uno:InspectSelectedObject), which can be added to context menus for objects (See Figure 3). The purpose of this command is to provide a way to open the DevTools docking window and automatically show the current selected object. If a user regularly uses the object inspector, this may be a more convenient way for them to access DevTools. Note that by default the command isn't added to any context menu, this is up to the user. However, if there will be demand to add this to context menus, it can be easily added. 

Figure 4: "Inspect Object" context menu entry on a shape object

The example in Figure 4 shows the context menu of a shape object, where the selected entry is the added "Inspect Object". 

From the implementation standpoint, it was necessary to move the whole DevTools from svx to sfx2 module. This was mainly necessary to get .uno:InspectSelectedObject to work, because we need to signal to DevTools that we want to show the current selection and not the document root in the object inspector. Because the svx depends on sfx2 module, it is not possible to access svx from sfx2 (only the other way around). 

Improvements to object inspector

The object inspector was previously a single tree view only, which had services, interfaces, properties and methods categories as root tree entries. This has now been changed so that the categories are now pages in a tab view, and each category has its own tree view (can be seen in Figure 2). The main problem with one tree view is that columns for each of the categories are different. For example, the properties category has object, value and type categories but the same columns make no sense for methods (which has return type and input parameters). 

For methods it now shows the method name, return type and parameters. The types are currently simplified types, which are easier to read (instead of exact type name of the object it just writes "object"), but the user will want to know the exact type too, so this is a WIP.

For properties it shows the type and value of the property, and it is possible to expand a property if the type is a complex type (object, struct) so it lists nested properties. If the value is an enum, then we get the name of the enum value automatically and show the name instead. 

Support for sequences was also added, so the sequence can be expanded and a list of indices and values is presented. If the current object supports XNameAccess or XIndexAccess, the names and indices are added into the property list, so the user can navigate to those. 

With this additions, it is already easier to inspect objects than it previously was using the Xray tool, and I'm sure it will get even better when it is finished. 

Next steps

The object inspector is already in a very good shape so I encourage everyone to try it and give feedback, what can be improved, changed or added - especially if you use Xray or MRI regularly. 

For the next steps the major focus will be to fix a couple of bugs and crashes (mainly due to missing checks if objects are available), work on the UI, object stack (so it is possible to go back to the previous object) and finalizing all the features of the object inspector. 


Many thanks to TDF and users that support the foundation by providing donations, to make this work possible. 

To be continued...

by Tomaž Vajngerl ( at March 01, 2021 12:49 PM

February 25, 2021

Marius Popa Adrian

Firebird 3.0 Language Reference (English) Released

The Firebird Documentation Team is proud to announce the first release of the English Firebird 3.0 Language Reference (HTML, PDF). You can also find it on the Documentation page. This new Language Reference covers all SQL syntax of Firebird 3.0.The new English Firebird 3.0 Language Reference is based in part on the Russian Firebird 3.0 Language Reference, but is not a direct translation (though

by Popa Adrian Marius ( at February 25, 2021 09:00 AM

February 23, 2021

February 21, 2021

Dennis Francis

Mocha tests in Collabora Online

We have many data structure classes in Collabora Online. Most of them are complex enough to warrant unit tests for their correctness. We already have cypress tests in Online which does integration testing, but we need unit tests for the internal data structure classes too. Mocha testing framework is a good match for this. With this we can do asserts via its BDD interface. In fact we could use any assertion library like Chai or Expect.js. You can now add Mocha tests in Online to test its any existing typescript classes or functions.

Here is a sample mocha test written for CPointSet typescript class:

/// <reference path="../src/layer/vector/CPoint.ts" />
/// <reference path="../src/layer/vector/CPointSet.ts" />

var assert = require('assert');

describe('CPointSet empty() tests', function () {

	describe('new CPointSet()', function () {
		it('should be empty', function () {

How to add a new Mocha test to Online?

Lets write a new test for the function CBounds.parse() as an example:

  • Create a new test file for tests related to CBounds class under loleaflet/mocha_tests/. Lets name it CBounds.test.ts
  • Reference the needed types from CBounds.ts by adding these lines.
/// <reference path="../src/layer/vector/CPoint.ts" />
/// <reference path="../src/layer/vector/CBounds.ts" />
  • Import Nodejs assert.
var assert = require('assert').strict;
  • Add a BDD style description of the set of tests we are going to write for CBounds.parse().
describe('CBounds parse() tests', function () {
    // Write unit tests here.
  • Inside that add a few test cases with descriptions like below:
describe('CBounds.parse() call with an empty string argument',
    function () {
	it('should return undefined', function () {
		assert.equal(CBounds.parse(''), undefined);
  • Now run ‘make check’ inside the loleaflet/ dir to see these tests in action. In current master branch you should see something like below along with the results for the new test you have added.

If interested, do take a look at the commit 8b2eae423cf77e7c725843061898c3968a72c547 that integrated Mocha framework to Online.

by Dennis Francis at February 21, 2021 08:43 AM

February 20, 2021

February 19, 2021

February 18, 2021

Mike Kaganski

Reading from MySQL data with BLOBs dumped to CSV

As part of my recent work in upgrading our partner & customer ticketing system to make things sweeter for all our users I have been assigned a task involving importing data from a CSV that was generated using MySQL’s SELECT ... INTO OUTFILE. The problem was that the source table contained BLOB fields.

The resulting CSV was quite non-standard. MySQL simply does not allow to produce CSVs conforming to RFC 4180: it would not escape double quotes by duplicating them, but would use a dedicated escapement symbol (backslash \ by default); and when using that escapement symbol, it will escape byte 0x00 as two characters: \0 (backslash + character “0”). This needs a non-standard processing – e.g., Python’s csv module can’t restore the binary from such a file, no matter which encoding (like latin_1) you use to read file (Python’s csv module only works with files opened in text mode), or which settings you pass to reader. MySQL may be instructed to not use the escapement symbol (using FIELDS ESCAPED BY ''), and then zero bytes will be output as is, but then the double quotes (byte 0x22) inside all fields (including blobs) will be completely not escaped, making the CSV invalid and unreadable. MySQL should just duplicate double-quotes in this case, and it would work out of the box… But for now, I needed to read from the file with escaping by \ and all the quirks.

I hadn’t had time to look for a CSV reader capable of dealing with such a syntax (actually, I did a brief search, but of course not exhaustive). So I had to come with a home-grown Python code for this:

def readMySQL_CSVLine(binfile):
    rec = []
    field = bytearray()
    is_quoted = False # inside quoted field
    is_escaped = False # immediately after "\"
    is_after_quote = False # inside a quoted field, immediately after
                           # a double quote that is not an opening
                           # quote of a field
    while True:
        ch =
        if len(ch) == 0: # EOF
            if (is_after_quote): # There was an opening quote, then
                                 # closing quote, then EOF; the field
                                 # must be added, even if empty
            elif is_quoted or is_escaped: # Missing closing quote or a
                                          # character following "\"
                if is_escaped: # Invalid last "\"
                    field += b'\\'
            elif len(rec) > 0 or len(field) > 0: # Don't return records
                                                 # for empty last line
            return rec
        if is_escaped:
            is_escaped = False
            if ch == b'0':
                ch = b'\x00'
            elif ch not in b'\n"\\,': # "\" should only escape:
                                      # FIELDS ESCAPED BY,
                                      # FIELDS [OPTIONALLY] ENCLOSED BY,
                                      # FIELDS TERMINATED BY,
                                      # LINES TERMINATED BY,
                                      # and ASCII NUL.
                field += b'\\'
            field += ch
        if ch == b'\n' and (not is_quoted or is_after_quote): # EOL
            return rec
        if ch == b',' and (not is_quoted or is_after_quote): # End of field
            is_quoted = False
            is_after_quote = False
            field = bytearray() # no .clear() here, or else it will clear
                                # content inside rec
        if ch == b'"':
            if is_after_quote: # Normal case of two two consequent quotes -
                               # one escapes the other
                is_after_quote = False
                field += ch
            elif is_quoted:
                is_after_quote = True
            else: # not is_quoted
                if len(field) == 0: # First character in a field
                    is_quoted = True
                else: # a quote in the middle of a field that didn't
                      # start with quotes
                    field += ch
        if is_after_quote: # An invalid non-closing lonely quote in the
                           # middle of a quoted field
            is_after_quote = False
            field += b'"' # Add it as usual character
        if ch == b'\\':
            is_escaped = True
        field += ch

It is used like this:

with open('dumped_table.csv', 'rb') as csv_file:
    while True:
        rec = readMySQL_CSVLine(csv_file)
        if not rec:
        numeric_field, text_field, blob_field = rec
        numeric_field = numeric_field.decode('ascii')
        text_field = text_field.decode('utf-8')
        with open('path/to/file', 'w+b') as outfile:

This worked for me. Of course, it may easily be converted to be a proper iterator, but I just leave it here as is. Hope that this could be useful for someone, until MySQL implement an option to produce a standards-compliant export.

by mikekaganski at February 18, 2021 08:48 PM

February 17, 2021

Rizal Muttaqin

elementary Theme for LibreOffice 7.1: Following Upstream's Brand More Closely

[Please see every image in this posting in new browser tab or window to see a more crisp and clear appearance]

Not having a coherent and consistent design system has been a big problem for LibreOffice Community. But a branding guideline could help to fill the empty room. At least with a brand guideline, I can be grateful that our products are not designed carelessly.

Talking about branding, TDF as the organization behind LibreOffice is not too strict in terms of technical implementation. In fact, LibreOffice has always carried the vision of having an interface that blends with the operating system. Something that sounds very familiar to the FLOSS desktop world. With this kind of vision, it feels like the brand's approach to many design elements - like the interface, for example - on the proprietary operating system becomes a bit strange in my opinion. Obviously, in the world of Windows and macOS, applications usually have their own unique design characteristics without even trying to pretend to be part of the operating system. For example, Microsoft Office, the 2007 version does not have the same interface approach (except maybe the Office button which looks like the Windows Start button) with the Windows XP and Windows Vista interfaces. MS 2010 is the same, even though MS 2013 both adopted a flat appearance like the era of Windows 8 and 8.1 but in terms of interface even icons and background knick-knacks in their windows are different. MS Office 2019 and 365 actually use an interface that has no resemblance to Windows 10 at all (except for the flat part which is trending).

The same is true for the macOS version of MS Office, each version no one really wants to appear like Finder. Before the era of MS Office 2019/365, the skeuomorphism characteristics were indeed maintained, but we can easily say that MS Office looks like MS Office completely.

In contrast to LibreOffice, which until now still wants to carry its FLOSS vision so that it looks like a Win32 application using a flat "skin". Fortunately the Colibre is quite helpful for Windows environment.

OK back to branding. After three years ago, the elementary icon theme was getting quite a massive update. I just realized one thing, it turned out that the icons I made used a color that I had taken out of nowhere. To be sure, I utilized some of the previous elementary icon colors and the rest from the Internet. Arriving at one of the bug report Heiko Tietze gave me a link to the elementary OS branding page which immediately got my attention:

Sweety Color Naming Scheme

I immediately realized that elementaryOS has been providing a collection of brand colors that have very unique and interesting names since when. Notice, to name a bunch of yellows they use the word "banana", for the purple they use the word "grapes". What a clever and very intriguing naming. Without saying what color people should have imagined the color in question. Something LibreOffice should adopt.

Here come one example of random color choices:

Why does the line chart have a lighter green color than the plus sign on the Insert Image icon?

Apart from that, there were many icons that turned out to be unsatisfied in my eye. Like suppose the shape is not elementaryi-ish, for example the Navigator icon: Look at the flat red white needle (or what anything you can say) in the center. Flat is not elementary characteristic!

or the confusing choice of color pairs:

Why did I choose this blue and purple? Was it just because the blue export icon and purple import upstream? Yes, it is true, but from a usability point of view it is not very useful but it actually makes it lame.

In addition, there is also a color selection that makes it even more confusing. Please look at the green color in the table header below and take a look at the icons for inserting those columns and rows in the first left group:

Especially when the size is small like this

The use of orange in the selected table, column and row above is also very unsightly.

After all, there are a number of updates already occurring on this elementary upstream. Suppose thisand this. So, the current icon theme is a bit less relevant.

So, some time ago I decided to massively update the elementary icon theme back and here is the result.

tdf#139219: Proposal to remove green header row part in table icon:

tdf#139048: Update Pencil Element to Be Yellow


tdf#139020: Proposal to Revert All Blue-Violet Color Arrow Pair to One Coherent Color
also, many icon with multiple line elements are now thicker even for small size 


Other updates:

Save icon now use red indicator instead of arrow's shape color change to indicate an unsaved work

New Macro icons