PowerPoint: label slide titles and stop reading them twice (#20990)
Fixes #9379
Summary of the issue:
In Microsoft PowerPoint, NVDA reads the slide title twice. In a slide show, and when a slide is reported after a slide change, the slide name is built as Slide N (title). The slide text that follows is built from every shape on the slide, including the title shape, so the title is spoken again as the first line of the content. In editing views, the document window's name also includes the full slide name with its title, so the title is repeated when focus moves to the slide, and again when the title shape itself is focused.
There is also no clear boundary between the title and the rest of the slide, so it is hard to tell which text is the title and where the body starts.
Description of user facing changes:
In Microsoft PowerPoint:
The slide title is announced with a label, for example Slide 3 - Slide title: Quarterly results, instead of Slide 3 (Quarterly results).
In a slide show, the text of a slide starts with Slide title: <title>, then Slide contents, then the body text. The title is no longer read a second time as content. It is still in the reviewable text, so it can be reached with line navigation and say all.
Text in another shape that happens to match the title is still read. Only the designated title shape is skipped.
In editing (normal) view, the document pane reports only the slide number (for example Slide 3 - Slide), because the selected slide or title shape already reports the title.
A title shape with no alternative-text title is now named Slide title instead of Title placeholder. This also covers a text box set as the slide title with Check Accessibility > Set as Slide Title.
Slide contents is announced once when focus moves from the title into a non-title shape or its text, or when entering a new slide. It is not repeated for each body shape.
Speaker notes are unchanged and get no section labels.
Title-only, untitled, empty and blank-title slides work as before: no empty Slide contents label, and the existing empty-slide message is kept.
New translatable strings:
Slide title: {title}
Slide title
Slide contents
Description of developer facing changes:
New properties in appModules/powerpnt.py:
Slide.titleShape: the PowerPoint title shape, or None.
Slide.titleText: the title text with vertical tab and carriage return line breaks normalized and surrounding whitespace removed.
Slide.slideNumberLabel: the translated Slide {slideNumber} label.
Shape.isSlideTitle: whether the shape is the current slide's title shape. This is always False in the notes page view.